Changeset - 7b501e1e70d1
[Not reviewed]
version_5
0 1 190
Dennis Fink - 9 years ago 2015-10-10 17:14:35
dennis.fink@c3l.lu
Added video.js for displaying videos and subtitles
191 files changed with 61573 insertions and 1 deletions:
0 comments (0 inline, 0 general)
ennstatus/static/js/video.js/CHANGELOG.md
Show inline comments
 
new file 100644
 
CHANGELOG
 
=========
 

	
 
## HEAD (Unreleased)
 
_(none)_
 

	
 
--------------------
 

	
 
## 5.0.0 (2015-09-29)
 
* @carpasse infer MIME types from file extensions in the HTML5 and Flash techs ([view](https://github.com/videojs/video.js/pull/1974))
 
* @mmcc updated the slider to allow for vertical orientation ([view](https://github.com/videojs/video.js/pull/1816))
 
* @dmlap removed an ie6 hack for flash object embedding ([view](https://github.com/videojs/video.js/pull/1946))
 
* @heff replaced Closure Compiler with Uglify for minification ([view](https://github.com/videojs/video.js/pull/1940))
 
* @OleLaursen added a Danish translation ([view](https://github.com/videojs/video.js/pull/1899))
 
* @dn5 Added new translations (Bosnian, Serbian, Croatian) ([view](https://github.com/videojs/video.js/pull/1897))
 
* @mmcc (and others) converted the whole project to use ES6, Babel and Browserify ([view](https://github.com/videojs/video.js/pull/1976))
 
* @heff converted all classes to use ES6 classes ([view](https://github.com/videojs/video.js/pull/1993))
 
* @mmcc added ES6 default args and template strings ([view](https://github.com/videojs/video.js/pull/2015))
 
* @dconnolly replaced JSON.parse with a safe non-eval JSON parse ([view](https://github.com/videojs/video.js/pull/2077))
 
* @mmcc added a new default skin, switched to SASS, modified the html ([view](https://github.com/videojs/video.js/pull/1999))
 
* @gkatsev removed event.isDefaultPrevented in favor of event.defaultPrevented ([view](https://github.com/videojs/video.js/pull/2081))
 
* @heff added and `extends` function for external subclassing ([view](https://github.com/videojs/video.js/pull/2078))
 
* @forbesjo added the `scrubbing` property ([view](https://github.com/videojs/video.js/pull/2080))
 
* @heff switched to border-box sizing for all player elements ([view](https://github.com/videojs/video.js/pull/2082))
 
* @forbesjo added a vjs-button class to button controls ([view](https://github.com/videojs/video.js/pull/2084))
 
* @bc-bbay Load plugins before controls ([view](https://github.com/videojs/video.js/pull/2094))
 
* @bc-bbay rename onEvent methods to handleEvent ([view](https://github.com/videojs/video.js/pull/2093))
 
* @dmlap added an error message if techOrder is not in options ([view](https://github.com/videojs/video.js/pull/2097))
 
* @dconnolly exported the missing videojs.plugin function ([view](https://github.com/videojs/video.js/pull/2103))
 
* @mmcc added back the captions settings styles ([view](https://github.com/videojs/video.js/pull/2112))
 
* @gkatsev updated the component.js styles to match the new style guide ([view](https://github.com/videojs/video.js/pull/2105))
 
* @gkatsev added error logging for bad JSON formatting ([view](https://github.com/videojs/video.js/pull/2113))
 
* @gkatsev added a sensible toJSON function ([view](https://github.com/videojs/video.js/pull/2114))
 
* @bc-bbay fixed instance where progress bars would go passed 100% ([view](https://github.com/videojs/video.js/pull/2040))
 
* @eXon began Tech 2.0 work, improved how tech events are handled by the player ([view](https://github.com/videojs/video.js/pull/2057))
 
* @gkatsev added get and set global options methods ([view](https://github.com/videojs/video.js/pull/2115))
 
* @heff added support for fluid widths, aspect ratios, and metadata defaults ([view](https://github.com/videojs/video.js/pull/1952))
 
* @heff reorganized all utility functions in the codebase ([view](https://github.com/videojs/video.js/pull/2139))
 
* @eXon made additional tech 2.0 improvements listed in #2126 ([view](https://github.com/videojs/video.js/pull/2166))
 
* @heff Cleaned up and documented src/js/video.js and DOM functions ([view](https://github.com/videojs/video.js/pull/2182))
 
* @mmcc Changed to pure CSS slider handles ([view](https://github.com/videojs/video.js/pull/2132))
 
* @mister-ben updated language support to handle language codes with regions ([view](https://github.com/videojs/video.js/pull/2177))
 
* @heff changed the 'ready' event to always be asynchronous  ([view](https://github.com/videojs/video.js/pull/2188))
 
* @heff fixed instances of tabIndex that did not have a capital I   ([view](https://github.com/videojs/video.js/pull/2204))
 
* @heff fixed a number of IE8 and Flash related issues  ([view](https://github.com/videojs/video.js/pull/2206))
 
* @heff Reverted .video-js inline-block style to fix Flash fullscreen  ([view](https://github.com/videojs/video.js/pull/2217))
 
* @mmcc switched to using button elements for button components ([view](https://github.com/videojs/video.js/pull/2209))
 
* @mmcc increased the size of the progress bar and handle on hover ([view](https://github.com/videojs/video.js/pull/2216))
 
* @mmcc moved the fonts into their own repo ([view](https://github.com/videojs/video.js/pull/2223))
 
* @mmcc deprecated the options() function and removed internal uses ([view](https://github.com/videojs/video.js/pull/2229))
 
* @carpasse enhanced events to allow passing a second data argument ([view](https://github.com/videojs/video.js/pull/2163))
 
* @bc-bbay made the duration display update itself on loadedmetadata ([view](https://github.com/videojs/video.js/pull/2169))
 
* @arwidt added Swedish and Finnish translations ([view](https://github.com/videojs/video.js/pull/2189))
 
* @heff moved all the CDN logic into videojs/cdn ([view](https://github.com/videojs/video.js/pull/2230))
 
* @mmcc fixed the progress handle transition jerkiness ([view](https://github.com/videojs/video.js/pull/2219))
 
* @dmlap added support for the seekable property ([view](https://github.com/videojs/video.js/pull/2208))
 
* @mmcc un-hid the current and remaining times by default ([view](https://github.com/videojs/video.js/pull/2241))
 
* @pavelhoral fixed a bug with user activity that caused the control bar to flicker ([view](https://github.com/videojs/video.js/pull/2299))
 
* @dmlap updated to videojs-swf@4.7.1 to fix a video dimensions issue on subsequent loads ([view](https://github.com/videojs/video.js/pull/2281))
 
* @mmcc added the vjs-big-play-centered class ([view](https://github.com/videojs/video.js/pull/2293))
 
* @thijstriemstra added a logged error when a plugin is missing ([view](https://github.com/videojs/video.js/pull/1931))
 
* @gkatsev fixed the texttrackchange event and text track display for non-native tracks ([view](https://github.com/videojs/video.js/pull/2215))
 
* @mischizzle fixed event.relatedTarget in Firefox ([view](https://github.com/videojs/video.js/pull/2025))
 
* @mboles updated JSDoc comments everywhere to prepare for new docs ([view](https://github.com/videojs/video.js/pull/2270))
 
* @mmcc added a currentTime tooltip to the progress handle ([view](https://github.com/videojs/video.js/pull/2255))
 
* @pavelhoral fixed subclassing without a constructor ([view](https://github.com/videojs/video.js/pull/2308))
 
* @dmlap fixed a vjs_getProperty error caused by a progress check before the swf was ready ([view](https://github.com/videojs/video.js/pull/2316))
 
* @dmlap exported the videojs.log function ([view](https://github.com/videojs/video.js/pull/2317))
 
* @gkatsev updated vttjs to fix a trailing comma JSON error ([view](https://github.com/videojs/video.js/pull/2331))
 
* @gkatsev exported the videojs.bind() function ([view](https://github.com/videojs/video.js/pull/2332))
 
* Insert cloned el back into DOM. Fixes #2214 ([view](https://github.com/videojs/video.js/pull/2334))
 
* @heff sped up testing ([view](https://github.com/videojs/video.js/pull/2254))
 
* pass fs state to player from enterFullscreen, split full-window styles into their own selector ([view](https://github.com/videojs/video.js/pull/2357))
 
* Fixed vertical option for volumeMenuButton ([view](https://github.com/videojs/video.js/pull/2352))
 
* @dmlap switched events to not bubble by default ([view](https://github.com/videojs/video.js/pull/2351))
 
* @dmlap export videojs.createTimeRange ([view](https://github.com/videojs/video.js/pull/2361))
 
* @dmlap export a basic played() on techs ([view](https://github.com/videojs/video.js/pull/2384))
 
* @dmlap use seekable on source handlers when defined ([view](https://github.com/videojs/video.js/pull/2376))
 
* @dmlap fire seeking in the flash tech, not the SWF ([view](https://github.com/videojs/video.js/pull/2372))
 
* @dmlap expose the xhr helper utility ([view](https://github.com/videojs/video.js/pull/2321))
 
* @misteroneill fixed internal extends usage and added a deprecation warning ([view](https://github.com/videojs/video.js/pull/2390))
 
* @eXon added the poster to the options the tech receives ([view](https://github.com/videojs/video.js/pull/2338))
 
* @eXon made sure the volume persists between tech changes ([view](https://github.com/videojs/video.js/pull/2340))
 
* @eXon added the language to the options the tech receives ([view](https://github.com/videojs/video.js/pull/2338))
 
* @mmcc Added "inline" option to MenuButton and updated VolumeMenuButton to be able to utilize it ([view](https://github.com/videojs/video.js/pull/2378))
 
* @misteroneill restore some properties on window.videojs. ([view](https://github.com/videojs/video.js/pull/2395))
 
* @misteroneill restore some 4.x utilities and remove deprecated functionality ([view](https://github.com/videojs/video.js/pull/2406))
 
* @heff use a synchronous ready() internally ([view](https://github.com/videojs/video.js/pull/2392))
 
* @nickygerritsen scrubbing() is a method, not a property ([view](https://github.com/videojs/video.js/pull/2411))
 
* @sirlancelot change "video" to "media" in error messages ([view](https://github.com/videojs/video.js/pull/2409))
 
* @nickygerritsen use the default seekable when a source handler is unset ([view](https://github.com/videojs/video.js/pull/2401))
 
* @gkatsev always use emulated TextTrackLists so tracks survive tech switches ([view](https://github.com/videojs/video.js/pull/2425))
 
* @misteroneill restore Html5.Events ([view](https://github.com/videojs/video.js/pull/2421))
 
* @misteroneill removed the deprecated Component init method ([view](https://github.com/videojs/video.js/pull/2427))
 
* @misteroneill restore videojs.formatTime ([view](https://github.com/videojs/video.js/pull/2420))
 
* @misteroneill include child components with `true` in options ([view](https://github.com/videojs/video.js/pull/2424))
 
* @misteroneill create video.novtt.js in dist builds ([view](https://github.com/videojs/video.js/pull/2447))
 
* @misteroneill pass vtt.js option to tech ([view](https://github.com/videojs/video.js/pull/2448))
 
* @forbesjo updated the sauce labs config and browser versions ([view](https://github.com/videojs/video.js/pull/2450))
 
* @mmcc made sure controls respect muted attribute ([view](https://github.com/videojs/video.js/pull/2408))
 
* @dmlap switched global options back to an object at videojs.options ([view](https://github.com/videojs/video.js/pull/2461))
 
* @ogun fixed a typo in the Turkish translation ([view](https://github.com/videojs/video.js/pull/2460))
 
* @gkatsev fixed text track errors on dispose and in cross-browser testing ([view](https://github.com/videojs/video.js/pull/2466))
 
* @mmcc added type=button to button components ([view](https://github.com/videojs/video.js/pull/2471))
 
* @mmcc Fixed IE by using setAttribute to set 'type' property ([view](https://github.com/videojs/video.js/pull/2487))
 
* @misternoneill fixed vertical slider issues ([view](https://github.com/videojs/video.js/pull/2469))
 
* @gkatsev moved default and player dimensions to style els at the top of HEAD ([view](https://github.com/videojs/video.js/pull/2482))
 
* @gkatsev moved default and player dimensions to style els at the top of HEAD el ([view](https://github.com/videojs/video.js/pull/2482))
 
* @gkatsev removed non-default track auto-disabling ([view](https://github.com/videojs/video.js/pull/2475))
 
* @gkatsev exported event helpers on videojs object ([view](https://github.com/videojs/video.js/pull/2491))
 
* @nickygerritsen fixed texttrack handling in IE10 ([view](https://github.com/videojs/video.js/pull/2481))
 
* @gkatsev deep clone el for iOS to preserve tracks ([view](https://github.com/videojs/video.js/pull/2494))
 
* @forbesjo switched automated testing to BrowserStack ([view](https://github.com/videojs/video.js/pull/2492))
 
* @gkatsev fixed nativeControlsForTouch handling. Defaults to native controls on iphone and native android browsers. ([view](https://github.com/videojs/video.js/pull/2499))
 
* @heff fixed cross-platform track tests by switching to a fake tech ([view](https://github.com/videojs/video.js/pull/2496))
 
* @gkatsev improved tech controls listener handling. ([view](https://github.com/videojs/video.js/pull/2511))
 
* @dmlap move seek on replay into the flash tech ([view](https://github.com/videojs/video.js/pull/2527))
 
* @dmlap @gkatsev improve Flash tech error property and add an error setter to the base tech ([view](https://github.com/videojs/video.js/pull/2517))
 
* @dmlap update to videojs-swf 5.0.0-rc1 ([view](https://github.com/videojs/video.js/pull/2528))
 
* @dmlap expose start and end buffered times ([view](https://github.com/videojs/video.js/pull/2501))
 
* @heff fixed a number of console errors after testing ([view](https://github.com/videojs/video.js/pull/2513))
 
* @gkatsev made the sass files available via npm in src/css ([view](https://github.com/videojs/video.js/pull/2546))
 
* @heff removed playerOptions from plugin options because it created an inconsistency in plugin inits ([view](https://github.com/videojs/video.js/pull/2532))
 
* @heff added a default data attribute to fix the progress handle display in IE8 ([view](https://github.com/videojs/video.js/pull/2547))
 
* @heff added back the default cdn url for the swf ([view](https://github.com/videojs/video.js/pull/2533))
 
* @gkatsev fixed the default state of userActive ([view](https://github.com/videojs/video.js/pull/2557))
 
* @heff fixed event bubbling in IE8 ([view](https://github.com/videojs/video.js/pull/2563))
 
* @heff cleaned up internal duration handling ([view](https://github.com/videojs/video.js/pull/2552))
 
* @heff fixed the UI for live streams ([view](https://github.com/videojs/video.js/pull/2557))
 
* @gkatsev updated opacity of caption settings background color ([view](https://github.com/videojs/video.js/pull/2573))
 
* @gkatsev made all sass variables !default ([view](https://github.com/videojs/video.js/pull/2574))
 
* @heff fixed the inline volume control and made it the default ([view](https://github.com/videojs/video.js/pull/2553))
 
* @forbesjo fixed webkit deprecation warnings ([view](https://github.com/videojs/video.js/pull/2558))
 
* @forbesjo added Android and iOS browser testing ([view](https://github.com/videojs/video.js/pull/2538))
 
* @heff improved css selector strengths ([view](https://github.com/videojs/video.js/pull/2583))
 
* @heff moved scss vars to be private ([view](https://github.com/videojs/video.js/pull/2584))
 
* @heff added a fancy loading spinner ([view](https://github.com/videojs/video.js/pull/2582))
 
* @gkatsev added a mouse-hover time display to the progress bar ([view](https://github.com/videojs/video.js/pull/2569))
 
* @heff added an attributes argument to createEl() ([view](https://github.com/videojs/video.js/pull/2589))
 
* @heff made tech related functions private in the player ([view](https://github.com/videojs/video.js/pull/2590))
 
* @heff removed the loadedalldata event ([view](https://github.com/videojs/video.js/pull/2591))
 
* @dmlap switched to using raynos/xhr for requests ([view](https://github.com/videojs/video.js/pull/2594))
 
* @heff Fixed double loadstart and ready events ([view](https://github.com/videojs/video.js/pull/2605))
 
* @gkatsev fixed potential double default style elements ([view](https://github.com/videojs/video.js/pull/2619))
 
* @imbcmdth extended createTimeRange to support multiple timeranges ([view](https://github.com/videojs/video.js/pull/2604))
 
* @misteroneill rename "extends" to "extend" for ie8 ([view](https://github.com/videojs/video.js/pull/2624))
 
* @forbesjo removed the PhantomJS dependency ([view](https://github.com/videojs/video.js/pull/2622))
 
* @misteroneill re-exposed videojs.TextTrack ([view](https://github.com/videojs/video.js/pull/2625))
 
* @heff removed a second copy of video.novtt.js from dist ([view](https://github.com/videojs/video.js/pull/2630))
 
* @heff fixed timeranges deprecation warnings in tests ([view](https://github.com/videojs/video.js/pull/2627))
 
* @misteroneill updated play control to use its state for icon ([view](https://github.com/videojs/video.js/pull/2636))
 
* @gkatsev exposed isCrossOrigin and used it to enable CORS for textTrack XHRs ([view](https://github.com/videojs/video.js/pull/2633))
 
* @misteroneill fixed tsml to be used as a tag for template strings ([view](https://github.com/videojs/video.js/pull/2629))
 
* @eXon added support for a tech-supplied poster ([view](https://github.com/videojs/video.js/pull/2339))
 
* @heff improved some skin defaults for external styling ([view](https://github.com/videojs/video.js/pull/2642))
 
* @heff changed component child lists to arrays instead of objects ([view](https://github.com/videojs/video.js/pull/2477))
 

	
 
## 4.12.15 (2015-08-31)
 
* @dmlap update to videojs-swf 4.7.4 ([view](https://github.com/videojs/video.js/pull/2463))
 
* @bc-bbay migrate seeking on replay to the flash tech ([view](https://github.com/videojs/video.js/pull/2519))
 
* Updated to v4.7.5 of the swf ([view](https://github.com/videojs/video.js/pull/2531))
 

	
 
## 4.12.14 (2015-08-21)
 
* @gkatsev removed non-default track auto-disabling ([view](https://github.com/videojs/video.js/pull/2468))
 

	
 
## 4.12.13 (2015-08-10)
 
* @dmlap update to videojs-swf v4.7.3 ([view](https://github.com/videojs/video.js/pull/2457))
 

	
 
## 4.12.12 (2015-07-23)
 
* @imbcmdth updated source handlers to use bracket notation so they wont break when using minified videojs ([view](https://github.com/videojs/video.js/pull/2348))
 
* @imbcmdth fix potential triggerReady infinite loop ([view](https://github.com/videojs/video.js/pull/2398))
 

	
 
## 4.12.11 (2015-07-09)
 
* @saxena-gaurav updated swf to 4.7.2 to fix flash of previous video frame ([view](https://github.com/videojs/video.js/pull/2300))
 
* @gkatsev updated the vtt.js version to fix JSON issues ([view](https://github.com/videojs/video.js/pull/2327))
 
* @dmlap fixed an error caused by calling vjs_getProperty on the swf too early ([view](https://github.com/videojs/video.js/pull/2289))
 

	
 
## 4.12.10 (2015-06-23)
 
* @dmlap update to video-js-swf 4.7.1 ([view](https://github.com/videojs/video.js/pull/2280))
 
* @imbcmdth src() should not return blob URLs with MSE source handlers ([view](https://github.com/videojs/video.js/pull/2271))
 

	
 
## 4.12.9 (2015-06-15)
 
* @imbcmdth updated currentSrc to return src instead of blob urls in html5 tech. Fixes #2232 ([view](https://github.com/videojs/video.js/pull/2232))
 
* @imbcmdth fixed async currentSrc behavior ([view](https://github.com/videojs/video.js/pull/2256))
 

	
 
## 4.12.8 (2015-06-05)
 
* @dmlap add the seekable property ([view](https://github.com/videojs/video.js/pull/2207))
 
* @dmlap fix seekable export ([view](https://github.com/videojs/video.js/pull/2227))
 

	
 
## 4.12.7 (2015-05-19)
 
* @tjenkinson Added background-color to vjs-poster to remove transparent borders around scaled poster image ([view](https://github.com/videojs/video.js/pull/2138))
 
* @bc-bbay fixed a bug where the player would try to autoplay when there was no source ([view](https://github.com/videojs/video.js/pull/2127))
 
* @bc-bbay update time display on loadedmetadata ([view](https://github.com/videojs/video.js/pull/2151))
 
* @dmlap update swf to 4.7 to pick up preload fix ([view](https://github.com/videojs/video.js/pull/2170))
 

	
 
## 4.12.6 (2015-05-07)
 
* @saxena-gaurav fixed a bug from disposing after changing techs ([view](https://github.com/videojs/video.js/pull/2125))
 

	
 
## 4.12.5 (2015-03-17)
 
* Updated to videojs-swf v4.5.4 to fix a potential security issue ([view](https://github.com/videojs/video.js/pull/1955))
 

	
 
## 4.12.4 (2015-03-05)
 
* Randomized the Google Analytics calls to stay under the limit ([view](https://github.com/videojs/video.js/pull/1916))
 

	
 
## 4.12.3 (2015-02-28)
 
* @heff fixed setting the source to an empty string ([view](https://github.com/videojs/video.js/pull/1905))
 

	
 
## 4.12.2 (2015-02-27)
 
* @gkatsev fixed disabling of default text tracks ([view](https://github.com/videojs/video.js/pull/1892))
 

	
 
## 4.12.1 (2015-02-19)
 
* @gkatsev fixed the track list reference while switching techs that use emulated tracks ([view](https://github.com/videojs/video.js/pull/1874))
 
* @gkatsev fixed a Firefox error with the captions settings select menu options ([view](https://github.com/videojs/video.js/pull/1877))
 

	
 
## 4.12.0 (2015-02-17)
 
* @PeterDaveHello added a Traditional Chinese translation ([view](https://github.com/videojs/video.js/pull/1729))
 
* @mmcc updated the hide/show functions to use a class instead of inline styles ([view](https://github.com/videojs/video.js/pull/1681))
 
* @mister-ben added better handling of the additional videojs() arguments when the player is already initialized ([view](https://github.com/videojs/video.js/pull/1730))
 
* @anhskohbo added a Vietnamese translation ([view](https://github.com/videojs/video.js/pull/1734))
 
* @Sxmanek added a Czech translation ([view](https://github.com/videojs/video.js/pull/1739))
 
* @jcaron23 added the vjs-scrubbing CSS class and prevented menus from showing while scrubbing ([view](https://github.com/videojs/video.js/pull/1741))
 
* @dmlap fixed URL parsing in IE9 ([view](https://github.com/videojs/video.js/pull/1765))
 
* @gkatsev Fixed issue where ManualTimeUpdatesOff was not de-registering events ([view](https://github.com/videojs/video.js/pull/1793))
 
* @brycefisher Added a guide on player disposal ([view](https://github.com/videojs/video.js/pull/1803))
 
* @toniher added a Catalan translation ([view](https://github.com/videojs/video.js/pull/1794))
 
* @mmcc added a VERSION key to the videojs object ([view](https://github.com/videojs/video.js/pull/1798))
 
* @mmcc fixed an issue with text track hiding introduced in #1681 ([view](https://github.com/videojs/video.js/pull/1804))
 
* @dmlap exported video.js as a named AMD module ([view](https://github.com/videojs/video.js/pull/1844))
 
* @dmlap fixed poster hiding when the loadstart event does not fire ([view](https://github.com/videojs/video.js/pull/1834))
 
* @chikathreesix fixed an object delete error in Chrome ([view](https://github.com/videojs/video.js/pull/1858))
 
* @steverandy fixed an issue with scrolling over the player on touch devices ([view](https://github.com/videojs/video.js/pull/1809))
 
* @mmcc improved tap sensitivity ([view](https://github.com/videojs/video.js/pull/1830))
 
* @mister-ben added a vjs-ended class when playback reaches the end of the timeline ([view](https://github.com/videojs/video.js/pull/1857))
 
* @dmlap Add network and ready state properties ([view](https://github.com/videojs/video.js/pull/1854))
 
* @woollybogger exported the hasClass function ([view](https://github.com/videojs/video.js/pull/1839))
 
* @DevGavin fixed the Chinese translation ([view](https://github.com/videojs/video.js/pull/1841))
 
* @iSimonWeb added font-path variable ([view](https://github.com/videojs/video.js/pull/1847))
 
* @shoshomiga added a Bulgarian translation ([view](https://github.com/videojs/video.js/pull/1849))
 
* @ragecub3 added a Turkish translation ([view](https://github.com/videojs/video.js/pull/1853))
 
* @gkatsev greatly improved text track support and implemented vtt.js as the webvtt parser ([view](https://github.com/videojs/video.js/pull/1749))
 
* @gkatsev fixed captions showing by default in Chrome and Safari ([view](https://github.com/videojs/video.js/pull/1865))
 
* @mister-ben fixed a woff warning in Firefox ([view](https://github.com/videojs/video.js/pull/1870))
 

	
 
## 4.11.4 (2015-01-23)
 
* @heff exported missing source handler functions ([view](https://github.com/videojs/video.js/pull/1787))
 
* @heff fixed type support checking for an empty src string ([view](https://github.com/videojs/video.js/pull/1797))
 
* @carpasse fixed a bug in updating child indexes after removing components ([view](https://github.com/videojs/video.js/pull/1814))
 
* @dmlap fixed a bug where native controls would show after switching techs ([view](https://github.com/videojs/video.js/pull/1811))
 
* @H1D fixed an issue with file extension type detection ([view](https://github.com/videojs/video.js/pull/1818))
 
* @bclwhitaker updated to v4.5.3 of video-js-swf ([view](https://github.com/videojs/video.js/pull/1823))
 

	
 
## 4.11.3 (2014-12-19)
 
* @gdkraus fixed a bug where you could no longer tab-navigate passed a menu button ([view](https://github.com/videojs/video.js/pull/1760))
 
* @matteos exported the setSource functions so source handlers will work in the minified version ([view](https://github.com/videojs/video.js/pull/1753))
 
* @matteos fixed RTMP playback ([view](https://github.com/videojs/video.js/pull/1755))
 

	
 
## 4.11.2 (2014-12-17)
 
* @mmcc fixed a bug where the playback rate menu would not open ([view](https://github.com/videojs/video.js/pull/1716))
 
* @gkatsev fixed an issue with source handlers that caused subclasses of source handler classes to break ([view](https://github.com/videojs/video.js/pull/1746))
 

	
 
## 4.11.1 (2014-12-04)
 
* @heff fixed a code bug in track XHR requests ([view](https://github.com/videojs/video.js/pull/1715))
 

	
 
## 4.11.0 (2014-12-04)
 
* @rutkat updated sliders to use keydown instead of keyup for more responsive key control ([view](https://github.com/videojs/video.js/pull/1616))
 
* @toloudis fixed an issue with checking for an existing source on the video element ([view](https://github.com/videojs/video.js/pull/1651))
 
* @rafalwrzeszcz fixed the Flash object tag markup for strict XML ([view](https://github.com/videojs/video.js/pull/1702))
 
* @thijstriemstra fixed a number of typos in the docs ([view](https://github.com/videojs/video.js/pull/1704))
 
* @heff added the Source Handler interface for handling advanced formats including adaptive streaming ([view](https://github.com/videojs/video.js/pull/1560))
 
* @azawawi added an Arabic translation ([view](https://github.com/videojs/video.js/pull/1692))
 
* @mmcc added functions for better timeout and interval handling ([view](https://github.com/videojs/video.js/pull/1642))
 
* @mmcc fixed the vdata exception when you dispose a player with tracks ([view](https://github.com/videojs/video.js/pull/1710))
 
* @nemesreviz added a Hungarian translation ([view](https://github.com/videojs/video.js/pull/1711))
 
* @heff updated the SWF to the latest version ([view](https://github.com/videojs/video.js/pull/1714))
 

	
 
## 4.10.2 (2014-10-30)
 
* @heff fixed checking for child options in the parent options to allow for 'false' ([view](https://github.com/videojs/video.js/pull/1630))
 
* @heff fixed the VolumeMenuButton options to allow passing 'vertical' to the VolumeBar ([view](https://github.com/videojs/video.js/pull/1631))
 
* @mmcc fixed localization of captions/subtitles menu off buttons ([view](https://github.com/videojs/video.js/pull/1632))
 

	
 
## 4.10.1 (2014-10-29)
 
@heff removed his own stupid error [view](https://github.com/videojs/video.js/commit/a12dd770572a7f16e436e2332eba7ffbb1f1b9b9)
 

	
 
## 4.10.0 (2014-10-28)
 
* @aptx4869 fixed an issue where the native JSON parser wasn't used ([view](https://github.com/videojs/video.js/pull/1565))
 
* @andekande improved the German translation ([view](https://github.com/videojs/video.js/pull/1555))
 
* @OlehTsvirko added a Ukrainian translation ([view](https://github.com/videojs/video.js/pull/1562))
 
* @OlehTsvirko added a Russian translation ([view](https://github.com/videojs/video.js/pull/1563))
 
* @thijstriemstra added a Dutch translation ([view](https://github.com/videojs/video.js/pull/1566))
 
* @heff updated the poster to use CSS styles to display; fixed the poster not showing if not originally set ([view](https://github.com/videojs/video.js/pull/1568))
 
* @mmcc fixed an issue where errors on source tags could get missed ([view](https://github.com/videojs/video.js/pull/1575))
 
* @heff enhanced the event listener API to allow for auto-cleanup of listeners on other componenets and elements ([view](https://github.com/videojs/video.js/pull/1588))
 
* @mmcc fixed an issue with the VolumeButton assuming it was vertical by default ([view](https://github.com/videojs/video.js/pull/1592))
 
* @DevGavin added a Simplified Chinese translation ([view](https://github.com/videojs/video.js/pull/1593))
 
* @heff Added the ability to set options for child components directly in the parent options ([view](https://github.com/videojs/video.js/pull/1599))
 
* @heff turned on the custom html controls for touch devices ([view](https://github.com/videojs/video.js/pull/1617))
 

	
 
## 4.9.1 (2014-10-15)
 
* Bumped to videojs-swf v4.5.1 to fix a data sanitization issue ([view](https://github.com/videojs/video.js/pull/1587))
 

	
 
## 4.9.0 (2014-09-30)
 
* @deedos added a Brazilian Portuguese translation ([view](https://github.com/videojs/video.js/pull/1520))
 
* @baloneysandwiches added a hasClass method ([view](https://github.com/videojs/video.js/pull/1464))
 
* @mynameisstephen fixed an issue where slider event listeners were not being cleaned up ([view](https://github.com/videojs/video.js/pull/1475))
 
* @alexrqs cleaned up the Spanish translation ([view](https://github.com/videojs/video.js/pull/1494))
 
* @t2y added a Japanese translation ([view](https://github.com/videojs/video.js/pull/1497))
 
* @chikathreesix fixed an issue where data-setup options could be missed ([view](https://github.com/videojs/video.js/pull/1514))
 
* @seniorflexdeveloper added new translations and translation updates ([view](https://github.com/videojs/video.js/pull/1530))
 
* @chikathreesix exported the videojs.Flash.embed method ([view](https://github.com/videojs/video.js/pull/1533))
 
* @doublex fixed an issue with IE7 backwards compatibility ([view](https://github.com/videojs/video.js/pull/1542))
 
* @mmcc made it possible to override the font-size of captions and subtitles ([view](https://github.com/videojs/video.js/pull/1547))
 
* @philipgiuliani added an Italian translation ([view](https://github.com/videojs/video.js/pull/1550))
 
* @twentyrogersc fixed the return value when setting the poster source ([view](https://github.com/videojs/video.js/pull/1552))
 
* @heff updated to swf v4.5.0 to fix event issues ([view](https://github.com/videojs/video.js/pull/1554))
 
* @rpless made the VolumeMenuButton volume more accesible via tab navigation ([view](https://github.com/videojs/video.js/pull/1519))
 
* @mmcc added support for audio tags (html5 audio only) ([view](https://github.com/videojs/video.js/pull/1540))
 

	
 
## 4.8.5 (2014-09-25)
 
* Updated to the latest version of the swf to fix HLS playback ([view](https://github.com/videojs/video.js/pull/1538))
 

	
 
## 4.8.4 (2014-09-23)
 
* @gkatsev fixed isFullscreen reporting on iOS devices ([view](https://github.com/videojs/video.js/pull/1511))
 

	
 
## 4.8.3 (2014-09-22)
 
* @heff updated to the latest version of the SWF to 4.4.4 ([view](https://github.com/videojs/video.js/pull/1526))
 

	
 
## 4.8.2 (2014-09-16)
 
* @gkatsev fixed an IE11 bug where pause was not fired when the video ends ([view](https://github.com/videojs/video.js/pull/1512))
 

	
 
## 4.8.1 (2014-09-05)
 
* @dmlap fixed an issue where an error could be fired after player disposal ([view](https://github.com/videojs/video.js/pull/1481))
 
* @dmlap fixed poster error handling ([view](https://github.com/videojs/video.js/pull/1482))
 
* @dmlap fixed an issue with languages and subclassing the player ([view](https://github.com/videojs/video.js/pull/1483))
 
* @mmcc fixed a few CSS issues with the poster and the error 'X' ([view](https://github.com/videojs/video.js/pull/1487))
 
* @MrVaykadji and @Calinou added a french translation ([view](https://github.com/videojs/video.js/pull/1467))
 
* @heff fixed an internal deprecation warning and missing deprecated functions ([view](https://github.com/videojs/video.js/pull/1488))
 

	
 
## 4.8.0 (2014-09-03)
 
* @andekande added a German translation ([view](https://github.com/videojs/video.js/pull/1426))
 
* @mattosborn fixed a bug where getting the video element src would overwrite it ([view](https://github.com/videojs/video.js/pull/1430))
 
* @songpete fixed a bug where keyboard events were bubbling and causing additional actions ([view](https://github.com/videojs/video.js/pull/1455))
 
* @knabar made the inactivity timeout configurable ([view](https://github.com/videojs/video.js/pull/1409))
 
* @seniorflexdeveloper added language files to the distribution for including specific languages ([view](https://github.com/videojs/video.js/pull/1453))
 
* @gkatsev improved handling of null and NaN dimension values ([view](https://github.com/videojs/video.js/pull/1449))
 
* @gkatsev fixed an issue where the controls would break if Flash was initialized too quickly ([view](https://github.com/videojs/video.js/pull/1470))
 
* @mmcc fixed an issue where if no playback tech was supported the error could not be caught ([view](https://github.com/videojs/video.js/pull/1473))
 

	
 
## 4.7.3 (2014-08-20)
 
* Added function for adding new language translations, updated docs, and fixed the notSupportedMessage translation ([view](https://github.com/videojs/video.js/pull/1427))
 
* Exposed the player.selectSource method to allow overriding the source selection order ([view](https://github.com/videojs/video.js/pull/1424))
 

	
 
## 4.7.2 (2014-08-14)
 
* Fixed a case where timeupdate events were not firing, and fixed and issue with the Flash player version ([view](https://github.com/videojs/video.js/pull/1417))
 

	
 
## 4.7.1 (2014-08-06)
 
* Fixed the broken bower.json config ([view](https://github.com/videojs/video.js/pull/1401))
 

	
 
## 4.7.0 (2014-08-05)
 
* Added cross-browser isArray for cross-frame support. fixes #1195 ([view](https://github.com/videojs/video.js/pull/1218))
 
* Fixed support for webvtt chapters. Fixes #676. ([view](https://github.com/videojs/video.js/pull/1221))
 
* Fixed issues around webvtt cue time parsing. Fixed #877, fixed #183. ([view](https://github.com/videojs/video.js/pull/1236))
 
* Fixed an IE11 issue where clicking on the video wouldn't show the controls ([view](https://github.com/videojs/video.js/pull/1291))
 
* Added a composer.json for PHP packages ([view](https://github.com/videojs/video.js/pull/1241))
 
* Exposed the vertical option for slider controls ([view](https://github.com/videojs/video.js/pull/1303))
 
* Fixed an error when disposing a tech using manual timeupdates ([view](https://github.com/videojs/video.js/pull/1312))
 
* Exported missing Player API methods (remainingTime, supportsFullScreen, enterFullWindow, exitFullWindow, preload) ([view](https://github.com/videojs/video.js/pull/1328))
 
* Added a base for running saucelabs tests from grunt ([view](https://github.com/videojs/video.js/pull/1215))
 
* Added additional browsers for saucelabs testing ([view](https://github.com/videojs/video.js/pull/1216))
 
* Added support for listening to multiple events through a types array ([view](https://github.com/videojs/video.js/pull/1231))
 
* Exported the vertical option for the volume slider ([view](https://github.com/videojs/video.js/pull/1378))
 
* Fixed Component trigger function arguments and docs ([view](https://github.com/videojs/video.js/pull/1310))
 
* Now copying all attributes from the original video tag to the generated video element ([view](https://github.com/videojs/video.js/pull/1321))
 
* Added files to be ignored in the bower.json ([view](https://github.com/videojs/video.js/pull/1337))
 
* Fixed an error that could happen if Flash was diposed before the ready callback was fired ([view](https://github.com/videojs/video.js/pull/1340))
 
* The up and down arrows can now be used to control sliders in addition to left and right ([view](https://github.com/videojs/video.js/pull/1345))
 
* Added a player.currentType() function to get the MIME type of the current source ([view](https://github.com/videojs/video.js/pull/1320))
 
* Fixed a potential conflict with other event listener shims ([view](https://github.com/videojs/video.js/pull/1363))
 
* Added support for multiple time ranges in the load progress bar ([view](https://github.com/videojs/video.js/pull/1253))
 
* Added vjs-waiting and vjs-seeking css classnames and updated the spinner to use them ([view](https://github.com/videojs/video.js/pull/1351))
 
* Now restoring the original video tag attributes on a tech change to support webkit-playsinline ([view](https://github.com/videojs/video.js/pull/1369))
 
* Fixed an issue where the user was unable to scroll/zoom page if touching the video ([view](https://github.com/videojs/video.js/pull/1373))
 
* Added "sliding" class for when slider is sliding to help with handle styling ([view](https://github.com/videojs/video.js/pull/1385))
 

	
 
## 4.6.4 (2014-07-11)
 
* Fixed an issue where Flash autoplay would not show the controls ([view](https://github.com/videojs/video.js/pull/1343))
 

	
 
## 4.6.3 (2014-06-12)
 
* Updated to version 4.4.1 of the SWF ([view](https://github.com/videojs/video.js/pull/1285))
 
* Fixed a minification issue with the fullscreen event. fixes #1282 ([view](https://github.com/videojs/video.js/pull/1286))
 

	
 
## 4.6.2 (2014-06-10)
 
* Fixed an issue with the firstplay event not firing when autoplaying ([view](https://github.com/videojs/video.js/pull/1271))
 

	
 
## 4.6.1 (2014-05-20)
 
* Udpated playbackRate menu to work in minified version ([view](https://github.com/videojs/video.js/pull/1223))
 

	
 
## 4.6.0 (2014-05-20)
 
* Updated the UI to support live video ([view](https://github.com/videojs/video.js/pull/1121))
 
* The UI now resets after a source change ([view](https://github.com/videojs/video.js/pull/1124))
 
* Now assuming smart CSS defaults for sliders to prevent reflow on player init ([view](https://github.com/videojs/video.js/pull/1122))
 
* Fixed the title element placement in menus [[view](https://github.com/videojs/video.js/pull/1114)]
 
* Fixed title support for menu buttons ([view](https://github.com/videojs/video.js/pull/1128))
 
* Fixed extra mousemove events on Windows caused by certain apps, not users [[view](https://github.com/videojs/video.js/pull/1068)]
 
* Fixed error due to undefined tech when no source is supported [[view](https://github.com/videojs/video.js/pull/1172)]
 
* Fixed the progress bar not finishing when manual timeupdate events are used [[view](https://github.com/videojs/video.js/pull/1173)]
 
* Added a more informative and styled fallback message for non-html5 browsers [[view](https://github.com/videojs/video.js/pull/1181)]
 
* Added the option to provide an array of child components instead of an object [[view](https://github.com/videojs/video.js/pull/1093)]
 
* Fixed casing on webkitRequestFullscreen [[view](https://github.com/videojs/video.js/pull/1101)]
 
* Made tap events on mobile less sensitive to touch moves [[view](https://github.com/videojs/video.js/pull/1111)]
 
* Fixed the default flag for captions/subtitles tracks [[view](https://github.com/videojs/video.js/pull/1153)]
 
* Fixed compilation failures with LESS v1.7.0 and GRUNT v0.4.4 [[view](https://github.com/videojs/video.js/pull/1180)]
 
* Added better error handling across the library [[view](https://github.com/videojs/video.js/pull/1197)]
 
* Updated captions/subtiles file fetching to support cross-origin requests in older IE browsers [[view](https://github.com/videojs/video.js/pull/1095)]
 
* Added support for playback rate switching [[view](https://github.com/videojs/video.js/pull/1132)]
 
* Fixed an issue with the loadstart event order that caused the big play button to not hide [[view](https://github.com/videojs/video.js/pull/1209)]
 
* Modernized the fullscreen API and added support for IE11 [[view](https://github.com/videojs/video.js/pull/1205)]
 
* Added cross-browser testing with SauceLabs, and added Karma as the default test runner ([view](https://github.com/videojs/video.js/pull/1187))
 
* Fixed saucelabs integration to run on commits in TravisCI ([view](https://github.com/videojs/video.js/pull/1214))
 
* Added a clearer error message when a tech is undefined ([view](https://github.com/videojs/video.js/pull/1210))
 
* Added a cog icon to the font icons ([view](https://github.com/videojs/video.js/pull/1211))
 
* Added a player option to offset the subtitles/captions timing ([view](https://github.com/videojs/video.js/pull/1212))
 

	
 
## 4.5.2 (2014-04-12)
 
* Updated release versioning to include bower.json and component.json
 

	
 
## 4.5.1 (2014-03-27)
 
* Fixed a bug from the last release where canPlaySource was no longer exported
 

	
 
## 4.5.0 (2014-03-27)
 
* Added component(1) support ([view](https://github.com/videojs/video.js/pull/1032))
 
* Captions now move down when controls are hidden ([view](https://github.com/videojs/video.js/pull/1053))
 
* Added the .less source file to the distribution files ([view](https://github.com/videojs/video.js/pull/1056))
 
* Changed src() to return the current selected source ([view](https://github.com/videojs/video.js/pull/968))
 
* Added a grunt task for opening the next issue that needs addressing ([view](https://github.com/videojs/video.js/pull/1059))
 
* Fixed Android 4.0+ devices' check for HLS support ([view](https://github.com/videojs/video.js/pull/1084))
 

	
 
## 4.4.3 (2014-03-06)
 
* Fixed bugs in IE9 Windows 7N with no Media Player ([view](https://github.com/videojs/video.js/pull/1060))
 
* Fixed a bug with setPoster() in the minified version ([view](https://github.com/videojs/video.js/pull/1062))
 

	
 
## 4.4.2 (2014-02-24)
 
* Fixed module.exports in minified version ([view](https://github.com/videojs/video.js/pull/1038))
 

	
 
## 4.4.1 (2014-02-18)
 
* Added .npmignore so dist files wouldn't be ignored in packages
 

	
 
## 4.4.0 (2014-02-18)
 
* Made the poster updateable after initialization ([view](https://github.com/videojs/video.js/pull/838))
 
* Exported more textTrack functions ([view](https://github.com/videojs/video.js/pull/815))
 
* Moved player ID generation to support video tags with no IDs ([view](https://github.com/videojs/video.js/pull/845))
 
* Moved to using QUnit as a dependency ([view](https://github.com/videojs/video.js/pull/850))
 
* Added the util namespace for public utility functions ([view](https://github.com/videojs/video.js/pull/862))
 
* Fixed an issue with calling duration before Flash is loaded ([view](https://github.com/videojs/video.js/pull/861))
 
* Added player methods to externs so they can be overridden ([view](https://github.com/videojs/video.js/pull/878))
 
* Fixed html5 playback when switching between media techs ([view](https://github.com/videojs/video.js/pull/887))
 
* Fixed Firefox+Flash mousemove events so controls don't hide permanently ([view](https://github.com/videojs/video.js/pull/899))
 
* Fixed a test for touch detection ([view](https://github.com/videojs/video.js/pull/962))
 
* Updated the src file list for karma tests ([view](https://github.com/videojs/video.js/pull/948))
 
* Added more tests for API properties after minification ([view](https://github.com/videojs/video.js/pull/906))
 
* Updated projet to use npm version of videojs-swf ([view](https://github.com/videojs/video.js/pull/930))
 
* Added support for dist zipping on windows ([view](https://github.com/videojs/video.js/pull/944))
 
* Fixed iOS fullscreen issue ([view](https://github.com/videojs/video.js/pull/977))
 
* Fixed touch event bubbling ([view](https://github.com/videojs/video.js/pull/992))
 
* Fixed ARIA role attribute for button and slider ([view](https://github.com/videojs/video.js/pull/988))
 
* Fixed an issue where a component's dispose event would bubble up ([view](https://github.com/videojs/video.js/pull/981))
 
* Quieted down deprecation warnings ([view](https://github.com/videojs/video.js/pull/971))
 
* Updated the seek handle to contain the current time ([view](https://github.com/videojs/video.js/pull/902))
 
* Added requirejs and browserify support (UMD) ([view](https://github.com/videojs/video.js/pull/998))
 

	
 
## 4.3.0 (2013-11-04)
 
* Added Karma for cross-browser unit testing ([view](https://github.com/videojs/video.js/pull/714))
 
* Unmuting when the volume is changed ([view](https://github.com/videojs/video.js/pull/720))
 
* Fixed an accessibility issue with the big play button ([view](https://github.com/videojs/video.js/pull/777))
 
* Exported user activity methods ([view](https://github.com/videojs/video.js/pull/783))
 
* Added a classname to center the play button and new spinner options ([view](https://github.com/videojs/video.js/pull/784))
 
* Added API doc generation ([view](https://github.com/videojs/video.js/pull/801))
 
* Added support for codecs in Flash mime types ([view](https://github.com/videojs/video.js/pull/805))
 

	
 
## 4.2.2 (2013-10-15)
 
* Fixed a race condition that would cause videos to fail in Firefox ([view](https://github.com/videojs/video.js/pull/776))
 

	
 
## 4.2.1 (2013-09-09)
 
* Fixed an infinite loop caused by loading the library asynchronously ([view](https://github.com/videojs/video.js/pull/727))
 

	
 
## 4.2.0 (2013-09-04)
 
* Added LESS as a CSS preprocessor for the default skin ([view](https://github.com/videojs/video.js/pull/644))
 
* Exported MenuButtons for use in the API ([view](https://github.com/videojs/video.js/pull/648))
 
* Fixed ability to remove listeners added with one() ([view](https://github.com/videojs/video.js/pull/659))
 
* Updated buffered() to account for multiple loaded ranges ([view](https://github.com/videojs/video.js/pull/643))
 
* Exported createItems() for custom menus ([view](https://github.com/videojs/video.js/pull/654))
 
* Preventing media events from bubbling up the DOM ([view](https://github.com/videojs/video.js/pull/630))
 
* Major reworking of the control bar and many issues fixed ([view](https://github.com/videojs/video.js/pull/672))
 
* Fixed an issue with minifiying the code on Windows systems ([view](https://github.com/videojs/video.js/pull/683))
 
* Added support for RTMP streaming through Flash ([view](https://github.com/videojs/video.js/pull/605))
 
* Made tech.features available to external techs ([view](https://github.com/videojs/video.js/pull/705))
 
* Minor code improvements ([view](https://github.com/videojs/video.js/pull/706))
 
* Updated time formatting to support NaN and Infinity ([view](https://github.com/videojs/video.js/pull/627))
 
* Fixed an `undefined` error in cases where no tech is loaded ([view](https://github.com/videojs/video.js/pull/632))
 
* Exported addClass and removeClass for player components ([view](https://github.com/videojs/video.js/pull/661))
 
* Made the fallback message customizable ([view](https://github.com/videojs/video.js/pull/638))
 
* Fixed an issue with the loading spinner placement and rotation ([view](https://github.com/videojs/video.js/pull/694))
 
* Fixed an issue with fonts being flaky in IE8
 

	
 
## 4.1.0 (2013-06-28)
 
* Turned on method queuing for unready playback technologies (flash) [view](https://github.com/videojs/video.js/pull/553)
 
* Blocking user text selection on player components [view](https://github.com/videojs/video.js/pull/524)
 
* Exported requestFullScreen() and cancelFullScreen() in the minified version [view](https://github.com/videojs/video.js/pull/555)
 
* Exported the global players reference, videojs.players [view](https://github.com/videojs/video.js/pull/560)
 
* Added google analytics to the CDN version ([view](https://github.com/videojs/video.js/pull/568))
 
* Exported fadeIn/fadeOut for the Component API ([view](https://github.com/videojs/video.js/pull/581))
 
* Fixed an IE poster error when autoplaying ([view](https://github.com/videojs/video.js/pull/593))
 
* Exported bufferedPercent for the API ([view](https://github.com/videojs/video.js/pull/588))
 
* Augmented user agent detection, specifically for Android versions ([view](https://github.com/videojs/video.js/pull/470))
 
* Fixed IE9 canPlayType error ([view](https://github.com/videojs/video.js/pull/606))
 
* Fixed various issues with captions ([view](https://github.com/videojs/video.js/pull/609))
 

	
 
## 4.0.4 (2013-06-11)
 
* Added google analytics to current CDN version. ([view](https://github.com/videojs/video.js/pull/571))
 

	
 
## 4.0.3 (2013-05-28)
 
* Fixed an bug with exiting fullscreen. [view](https://github.com/videojs/video.js/pull/546)
 

	
 
## 4.0.2 (2013-05-23)
 
* Correct version number for CDN swf url. Minify CSS. [view](https://github.com/videojs/video.js/pull/535)
 

	
 
## 4.0.1 (2013-05-22)
 
* Fixed old IE font loading [view](https://github.com/videojs/video.js/pull/532)
 

	
 
## 4.0.0 (2013-05-09)
 
* Improved performance through an 18% size reduction using Google Closure Compiler in advanced mode
 
* Greater stability through an automated cross-browser/device test suite using TravisCI, Bunyip, and Browserstack.
 
* New plugin interface and plugin listing for extending Video.js
 
* New default skin design that uses font icons for greater customization
 
* Responsive design and retina display support
 
* Improved accessibility through better ARIA support
 
* Moved to Apache 2.0 license
 
* 100% JavaScript development tool set including Grunt
 
* Updated docs to use Github markdown
 
* Allow disabling of default components
 
* Duration is now setable (need ed for HLS m3u8 files)
 
* Event binders (on/off/one) now return the player instance
 
* Stopped player from going back to beginning on ended event
 
* Added support for percent width/height and fluid layouts
 
* Improved load order of elements to reduce reflow
 
* Changed addEvent function name to 'on'
 
* Removed conflicting array.indexOf function
 
* Added exitFullScreen to support BlackBerry devices (pull/143)
 

	
 
## 3.2.0 (2012-03-20)
 
* Updated docs with more options.
 
* Overhauled HTML5 Track support.
 
* Fixed Flash always autoplaying when setting source.
 
* Fixed localStorage context
 
* Updated 'fullscreenchange' event to be called even if the user presses escape to exit fullscreen.
 
* Automatically converting URsource URL to absolute for Flash fallback.
 
* Created new 'loadedalldata' event for when  the source is completely downloaded
 
* Improved player.destroy(). Now removes elements and references.
 
* Refactored API to be more immediately available.
 

	
 
### Patches
 
* 3.2.1 (2012-04-06) Fixed setting width/height with javascript options
 
* 3.2.2 (2012-05-02) Fixed error with multiple controls fading listeners
 
* 3.2.3 (2012-11-12) Fixed chrome spinner continuing on seek
 

	
 
## 3.1.0 (2012-01-30)
 
* Added CSS fix for Firefox 9 fullscreen (in the rare case that it's enabled)
 
* Replaced swfobject with custom embed to save file size.
 
* Added  flash iframe-mode, an experimental method for getting around flash reloading issues.
 
* Fixed issue with volume knob position. Improved controls fading.
 
* Fixed ian issue with triggering fullscreen a second time.
 
* Fixed issue with getting attributes in Firefox 3.0
 
* Escaping special characters in source URL for Flash
 
* Added a check for if Firefox is enabled which fixes a Firefox 9 issue
 
* Stopped spinner from showing on 'stalled' events since browsers sometimes don't show that they've recovered.
 
* Fixed CDN Version which was breaking dev.html
 
* Made full-window mode more independent
 
* Added rakefile for release generation
 

	
 
## 3.0.0 (2012-01-10)
 
* Same HTML/CSS Skin for both HTML5 and Flash video
 
* Super lightweight Flash fallback player for browsers that don’t support HTML5 video
 
* Free CDN hosting
 

	
 
### Patches
 
* 3.0.2 (2012-01-12) Started tracking changes with zenflow
 
* 3.0.3 (2012-01-12) Added line to docs to test zenflow
 
* 3.0.4 (2012-01-12) Fixing an undefined source when no sources exist on load
 
* 3.0.5 (2012-01-12) Removed deprecated event.layerX and layerY
 
* 3.0.6 (2012-01-12) Fixed wrong URL for CDN in docs
 
* 3.0.7 (2012-01-12) Fixed an ie8 breaking bug with the poster
 
* 3.0.8 (2012-01-23) Fixed issue with controls not hiding in IE due to no opacity support
ennstatus/static/js/video.js/CONTRIBUTING.md
Show inline comments
 
new file 100644
 
CONTRIBUTING
 
============
 
So you want to help out? Great! There's a number of ways you can get involved.
 

	
 
  * [File and discuss issues](#filing-issues)
 
  * [Contribute code](#contributing-code)
 
  * [Build and share plugins](docs/guides/plugins.md)
 
  * [Answer questions on Stack Overflow](http://stackoverflow.com/questions/tagged/video.js)
 

	
 
There's also other Video.js projects where you can help. (check the [video.js org](https://github.com/videojs) for an up-to-date list of projects)
 

	
 
  * [Videojs.com](https://github.com/videojs/videojs.com)
 
  * [Video.js flash player](https://github.com/videojs/video-js-swf)
 
  * [Player skin designer](https://github.com/videojs/designer)
 
  * [Contribflow](https://github.com/zencoder/contribflow)
 

	
 
Filing issues
 
-------------
 
[GitHub Issues](https://github.com/videojs/video.js/issues) are used for all discussions around the codebase, including **bugs**, **features**, and other **enhancements**.
 

	
 
### Reporting a Bug
 

	
 
**A bug is a demonstrable problem** that is caused by the code in the repository. Good bug reports are extremely helpful. Thank You!
 

	
 
Guidelines for bug reports:
 

	
 
1. Use the [GitHub issue search](https://github.com/videojs/video.js/issues) — check if the issue has already been reported.
 

	
 
2. Check if the issue has already been fixed — try to reproduce it using the latest `master` branch in the repository.
 

	
 
3. Isolate the problem — **create a [reduced test case](http://css-tricks.com/6263-reduced-test-cases/)** with a live example. You can possibly use [this JSBin example](http://jsbin.com/axedog/7/edit) as a starting point.
 

	
 
A good bug report should be as detailed as possible, so that others won't have to follow up for the essential details.
 

	
 
Here's an example:
 

	
 
> Short yet concise Bug Summary
 
>
 
> Description:
 
> Happens on Windows 7 and OSX. Seen with IE9, Firefox 19 OSX, Chrome 21, Flash 11.6 and 11.2
 
>
 
> 1. This is the first step
 
> 2. This is the second step
 
> 3. Further steps, etc.
 
>
 
> Expected:
 
> (describe the expected outcome of the steps above)
 
>
 
> Actual:
 
> (describe what actually happens)
 
>
 
> `<url>` (a link to the reduced test case, if it exists)
 
>
 
> Any other information you want to share that is relevant to the issue being
 
> reported. This might include the lines of code that you have identified as
 
> causing the bug, and potential solutions (and your opinions on their
 
> merits).
 

	
 
**[File a bug report](https://github.com/videojs/video.js/issues/new)**
 

	
 
### Requesting a Feature
 

	
 
1. [Check the plugin list](https://github.com/videojs/video.js/wiki/Plugins) for any plugins that may already support the feature.
 

	
 
2. [Search the issues](https://github.com/videojs/video.js/issues) for any previous requests for the same feature, and give a thumbs up or +1 on existing requests.
 

	
 
2. If no previous requests exist, create a new issue. Please be as clear as possible about why the feautre is needed and the intended use case.
 

	
 
**[Request a feature](https://github.com/videojs/video.js/issues/new)**
 

	
 
Contributing code
 
-----------------
 

	
 
To contibute code you'll need to be able to build a copy of Video.js and run tests locally. There are a few requirements before getting started.
 

	
 
- Node.js -- Video.js uses Node for build and test automation. Node is available for Windows, Mac OS X, Linux, and SunOS, as well as source code if that doesn't scare you. [Download and install Node.js](http://nodejs.org/download/)
 

	
 
- grunt-cli -- Install grunt-cli globally so that you will have the correct version of grunt available for any project that needs it.
 

	
 
  On Unix-based systems, you'll have to do this as a superuser:
 

	
 
```bash
 
sudo npm install -g grunt-cli
 
```
 
  On Windows, you can just run:
 

	
 
```bash
 
npm install -g grunt-cli
 
```
 

	
 
- Contribflow -- A homegrown git workflow tool for managing feature/hotfix branches and submitting pull requests. If you have your own preferred git workflow, contribflow isn't required, but the following instructions will assume you're using it.
 

	
 
  On Unix-based systems, you'll have to do this as a superuser:
 

	
 
```bash
 
sudo npm install -g contribflow
 
```
 

	
 
  On Windows, you can just run:
 

	
 
```bash
 
npm install -g contribflow
 
```
 

	
 
### Building your own copy of Video.js
 

	
 
First, [fork](http://help.github.com/fork-a-repo/) the video.js git repository. At the top of every github page, there is a Fork button. Click it, and the forking process will copy Video.js into your own GitHub account.
 

	
 
Clone your fork of the repo into your code directory
 

	
 
```bash
 
git clone https://github.com/<your-username>/video.js.git
 
```
 

	
 
Navigate to the newly cloned directory
 

	
 
```bash
 
cd video.js
 
```
 

	
 
Assign the original repo to a remote called "upstream"
 

	
 
```
 
git remote add upstream https://github.com/videojs/video.js.git
 
```
 

	
 
>In the future, if you want to pull in updates to video.js that happened after you cloned the main repo, you can run:
 
>
 
> ```bash
 
> git checkout master
 
> git pull upstream master
 
> ```
 

	
 
Install the required node.js modules using node package manager
 

	
 
```bash
 
npm install
 
```
 

	
 
> A note to Windows developers: If you run npm commands, and you find that your command prompt colors have suddenly reversed, you can configure npm to set color to false to prevent this from happening.
 
> `npm config set color false`
 
> Note that this change takes effect when a new command prompt window is opened; the current window will not be affected.
 

	
 
Build a local copy of video.js and run tests
 

	
 
```bash
 
grunt
 
grunt test
 
```
 

	
 
Video.js is also configured to run tests with Karma. Karma is installed as a grunt plugin to run QUnit tests in real browsers, as opposed to simply running the tests in phantomjs, a headless browser. To run the tests with Karma:
 

	
 
```bash
 
grunt karma:dev
 
```
 

	
 
At this point you should have a built copy of video.js in a directory named `dist`, and all tests should be passing.
 

	
 
### Making Changes
 

	
 
Whether you're adding something new, making something better, or fixing a bug, you'll first want to search the [GitHub issues](https://github.com/videojs/video.js/issues) and [plugins list](https://github.com/videojs/video.js/wiki/Plugins) to make sure you're aware of any previous discussion or work. If an unclaimed issue exists, claim it via a comment. If no issue exists for your change, submit one, follwing the [issue filing guidelines](#filing-issues).
 

	
 
There are two categories of changes in video.js land, features and hotfixes (Video.js follows a branching model similar to [gitflow](http://nvie.com/posts/a-successful-git-branching-model/)). Hotfixes are for urgent fixes that need to be released immediately as a patch. Features are for everything else (including non-urgent fixes). If you think you have a hotfix scenario, verify that (via comment) before starting the work. We'll focus on features here, but you can swap `hotfix` for `feature` in any command.
 

	
 
Start a new development branch
 

	
 
```bash
 
contrib feature start
 
```
 

	
 
You'll be prompted to name the branch.  After that, contrib will create the branch locally, and use git to push it up to your origin, and track it.  You're now ready to start building your feature or fixing that bug! Be sure to read the [Code Style Guide](#code-style-guide).
 

	
 
While you're developing, you can ensure your changes are working by writing tests (in the `test` directory) and running `grunt test`.
 

	
 
There's also a sandbox directory where you can add any file and it won't get tracked as a change. To start you can copy the example index file and see a working version of a player (using the local source code) by loading it in a browser.
 

	
 
```bash
 
cp sandbox/index.html.example sandbox/index.html
 
open sandbox/index.html
 
```
 

	
 

	
 
### Testing Locally
 
A simple Connect server is available via the Grunt plugin. The commands below will allow you to setup a test sandbox and begin development.
 

	
 
```bash
 
cp sandbox/index.html.example sandbox/index.html
 
grunt connect
 
open http://localhost:9999/sandbox/index.html
 
```
 

	
 
> NOTES regarding local testing in Chrome 21+ (as of 2013/01/01)
 
> Flash files that are local and loaded into a locally accessed page (file:///) will NOT run.
 
> To get around this you can do either of the following:
 
>
 
> 1. Do your development and testing using a local HTTP server. See Grunt commands above.
 
>
 
> 2. [Disable the version of Flash included with Chrome](http://helpx.adobe.com/flash-player/kb/flash-player-google-chrome.html#How_can_I_run_debugger_or_alternate_versions_of_Flash_Player_in_Google_Chrome) and enable a system-wide version of Flash instead.
 

	
 
Commit and push changes as you go (using git directly). Write thorough descriptions of your changes in your commit messages.
 

	
 
```bash
 
git add .
 
git commit -av
 
git push
 
```
 

	
 
> GitHub allows you to close an issue through your commit message using the [fixes](https://github.com/blog/831-issues-2-0-the-next-generation) keyword.
 
>
 
> ```bash
 
> My commit message. fixes #123
 
> Testing: (briefly describe any testing here, for example, 'unit tests and cross-browser manual tests around playback and network interruption')
 
> ```
 

	
 
### Submitting your changes
 

	
 
First, thoroughly test your feature or fix, including writing tests to make sure your change doesn't get regressed in a future update. If you're fixing a bug, we recommend in addition to testing the fix itself, to do some testing around the areas that your fix has touched. For example, a brief smoketest of the player never hurts.
 

	
 
Make sure your changes are pushed to origin
 

	
 
```bash
 
git push
 
```
 

	
 
Use contrib to submit a pull request (make sure you're in your feature branch)
 

	
 
```bash
 
contrib feature submit
 
```
 

	
 
You'll be prompted for title and description for the Pull Request.  After that, contrib will use Git to submit your pull request to video.js.
 

	
 
You're Done! (except for cleanup.) To clean up your feature or hotfix branch:
 

	
 
First, checkout your feature or issue branch:
 

	
 
```bash
 
git checkout (branchname)
 
```
 

	
 
Run this command to clean up your feature:
 

	
 
```bash
 
contrib feature delete
 
```
 

	
 
Run this command to clean up your bug fix:
 

	
 
```bash
 
contrib hotfix delete
 
```
 
> PLEASE NOTE: THIS WILL DELETE YOUR LOCAL AND REMOTE COPIES OF THE FEATURE.
 
> This is meant to clean up your local and remote branches, so make sure any changes you don't want to lose have been pulled into the parent project or another branch first.
 

	
 
Code Style Guide
 
----------------
 
Please follow [Google's JavaScript Style Guide](http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml) to the letter. If your editor supports [.editorconfig](http://editorconfig.org/#download) it will make it easier to manage differences from your own coding style.
 

	
 
### Style examples include:
 
* Two space indents.
 
* Delimit strings with single-quotes `'`, not double-quotes `"`.
 
* No trailing whitespace, except in markdown files where a linebreak must be forced.
 
* No more than [one assignment](http://benalman.com/news/2012/05/multiple-var-statements-javascript/) per `var` statement.
 
* Prefer `if` and `else` to ["clever"](http://programmers.stackexchange.com/a/25281) uses of `? :` conditional or `||`, `&&` logical operators.
 
* **When in doubt, follow the conventions you see used in the source already.**
 

	
 
If you happen to find something in the codebase that does not follow the style guide, that's a good opportunity to make your first contribution!
 

	
 
---
 
### Doc Credit
 
This doc was inspired by some great contribution guide examples including [contribute.md template](https://github.com/contribute-md/contribute-md-template),
 
[grunt](https://github.com/gruntjs/grunt/wiki/Contributing),
 
[html5 boilerplate](https://github.com/h5bp/html5-boilerplate/blob/master/CONTRIBUTING.md),
 
[jquery](https://github.com/jquery/jquery/blob/master/CONTRIBUTING.md),
 
and [node.js](https://github.com/joyent/node/wiki/Contributing).
ennstatus/static/js/video.js/Gruntfile.js
Show inline comments
 
new file 100644
 
require('babel/register');
 

	
 
// Need to `require` a separate Grunt file so we can use ES6 syntax via
 
// Babel's require hook.
 
module.exports = function(grunt) {
 
  require('./build/grunt.js')(grunt);
 
};
ennstatus/static/js/video.js/LICENSE
Show inline comments
 
new file 100644
 
Copyright Brightcove, Inc.
 

	
 
   Licensed under the Apache License, Version 2.0 (the "License");
 
   you may not use this file except in compliance with the License.
 
   You may obtain a copy of the License at
 

	
 
       http://www.apache.org/licenses/LICENSE-2.0
 

	
 
   Unless required by applicable law or agreed to in writing, software
 
   distributed under the License is distributed on an "AS IS" BASIS,
 
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
   See the License for the specific language governing permissions and
 
   limitations under the License.
 
\ No newline at end of file
ennstatus/static/js/video.js/README.md
Show inline comments
 
new file 100644
 
## Please Note!
 
The master branch is now the development branch for 5.0 and should be considered unstable until the first 5.0 release. If you're looking for the most recent stable release, please refer to the [stable branch](https://github.com/videojs/video.js/tree/stable).
 

	
 

	
 
![Video.js logo](https://i.cloudup.com/C3nAUZ-l4c.png)
 

	
 
# [Video.js - HTML5 Video Player](http://videojs.com)  [![Build Status](https://travis-ci.org/videojs/video.js.svg?branch=master)](https://travis-ci.org/videojs/video.js)
 

	
 
> Video.js is a web video player built from the ground up for an HTML5 world. It supports HTML5 and Flash video, as well as YouTube and Vimeo (through [plugins](https://github.com/videojs/video.js/wiki/Plugins)). It supports video playback on desktops and mobile devices. This project was started mid 2010, and the player is now used on over ~~50,000~~ 100,000 websites.
 

	
 
## Quick start
 
Thanks to the awesome folks over at [Fastly](http://www.fastly.com/), there's a free, CDN hosted version of Video.js that anyone can use. Simply add these includes to your document's
 
`<head>`:
 

	
 
```html
 
<link href="http://vjs.zencdn.net/4.12/video-js.css" rel="stylesheet">
 
<script src="http://vjs.zencdn.net/4.12/video.js"></script>
 
```
 

	
 
Then, whenever you want to use Video.js you can simply use the `<video>` element as your normally would, but with an additional `data-setup` attribute containing any Video.js options. These options
 
can include any Video.js option plus potential [plugin](https://github.com/videojs/video.js/wiki/Plugins) options, just make sure they're valid JSON!
 

	
 
```html
 
<video id="really-cool-video" class="video-js vjs-default-skin" controls
 
 preload="auto" width="640" height="264" poster="really-cool-video-poster.jpg"
 
 data-setup='{}'>
 
  <source src="really-cool-video.mp4" type='video/mp4'>
 
  <source src="really-cool-video.webm" type='video/webm'>
 
  <p class="vjs-no-js">
 
    To view this video please enable JavaScript, and consider upgrading to a web browser
 
    that <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>
 
  </p>
 
</video>
 
```
 

	
 
If you don't want to use auto-setup, you can leave off the `data-setup` attribute and initialize a video element manually.
 

	
 
```javascript
 
var player = videojs('really-cool-video', { /* Options */ }, function() {
 
  console.log('Good to go!');
 

	
 
  this.play(); // if you don't trust autoplay for some reason
 

	
 
  // How about an event listener?
 
  this.on('ended', function() {
 
    console.log('awww...over so soon?');
 
  });
 
});
 
```
 

	
 
If you're ready to dive in, the [documentation](docs/index.md) is the first place to go for more information. Generally the
 
[player API docs](docs/api/vjs.Player.md) are the most pertinent.
 

	
 
## Contributing
 
Video.js is a free and open source library, and we appreciate any help you're willing to give. Check out the [contributing guide](CONTRIBUTING.md).
 

	
 
_Video.js uses [BrowserStack](https://browserstack.com) for compatibility testing_
 
## Building your own Video.js from source
 
To build your own custom version read the section on [contributing code](CONTRIBUTING.md#contributing-code) and ["Building your own copy"](CONTRIBUTING.md#building-your-own-copy-of-videojs) in the contributing guide.
 
## License
 

	
 
Video.js is licensed under the Apache License, Version 2.0. [View the license file](LICENSE)
 

	
 
Copyright 2014-2015 Brightcove, Inc.
ennstatus/static/js/video.js/dist/alt/video.novtt.js
Show inline comments
 
new file 100644
 
/**
 
 * @license
 
 * Video.js 5.0.0 <http://videojs.com/>
 
 * Copyright Brightcove, Inc. <https://www.brightcove.com/>
 
 * Available under Apache License Version 2.0
 
 * <https://github.com/videojs/video.js/blob/master/LICENSE>
 
 */
 

	
 
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.videojs = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
 
(function (global){
 
var topLevel = typeof global !== 'undefined' ? global :
 
    typeof window !== 'undefined' ? window : {}
 
var minDoc = _dereq_('min-document');
 

	
 
if (typeof document !== 'undefined') {
 
    module.exports = document;
 
} else {
 
    var doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];
 

	
 
    if (!doccy) {
 
        doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;
 
    }
 

	
 
    module.exports = doccy;
 
}
 

	
 
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
 
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9nbG9iYWwvZG9jdW1lbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9wTGV2ZWwgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6XG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB7fVxudmFyIG1pbkRvYyA9IHJlcXVpcmUoJ21pbi1kb2N1bWVudCcpO1xuXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQ7XG59IGVsc2Uge1xuICAgIHZhciBkb2NjeSA9IHRvcExldmVsWydfX0dMT0JBTF9ET0NVTUVOVF9DQUNIRUA0J107XG5cbiAgICBpZiAoIWRvY2N5KSB7XG4gICAgICAgIGRvY2N5ID0gdG9wTGV2ZWxbJ19fR0xPQkFMX0RPQ1VNRU5UX0NBQ0hFQDQnXSA9IG1pbkRvYztcbiAgICB9XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IGRvY2N5O1xufVxuIl19
 
},{"min-document":3}],2:[function(_dereq_,module,exports){
 
(function (global){
 
if (typeof window !== "undefined") {
 
    module.exports = window;
 
} else if (typeof global !== "undefined") {
 
    module.exports = global;
 
} else if (typeof self !== "undefined"){
 
    module.exports = self;
 
} else {
 
    module.exports = {};
 
}
 

	
 
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
 
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9nbG9iYWwvd2luZG93LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBzZWxmO1xufSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHt9O1xufVxuIl19
 
},{}],3:[function(_dereq_,module,exports){
 

	
 
},{}],4:[function(_dereq_,module,exports){
 
var getNative = _dereq_('../internal/getNative');
 

	
 
/* Native method references for those with the same name as other `lodash` methods. */
 
var nativeNow = getNative(Date, 'now');
 

	
 
/**
 
 * Gets the number of milliseconds that have elapsed since the Unix epoch
 
 * (1 January 1970 00:00:00 UTC).
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Date
 
 * @example
 
 *
 
 * _.defer(function(stamp) {
 
 *   console.log(_.now() - stamp);
 
 * }, _.now());
 
 * // => logs the number of milliseconds it took for the deferred function to be invoked
 
 */
 
var now = nativeNow || function() {
 
  return new Date().getTime();
 
};
 

	
 
module.exports = now;
 

	
 
},{"../internal/getNative":20}],5:[function(_dereq_,module,exports){
 
var isObject = _dereq_('../lang/isObject'),
 
    now = _dereq_('../date/now');
 

	
 
/** Used as the `TypeError` message for "Functions" methods. */
 
var FUNC_ERROR_TEXT = 'Expected a function';
 

	
 
/* Native method references for those with the same name as other `lodash` methods. */
 
var nativeMax = Math.max;
 

	
 
/**
 
 * Creates a debounced function that delays invoking `func` until after `wait`
 
 * milliseconds have elapsed since the last time the debounced function was
 
 * invoked. The debounced function comes with a `cancel` method to cancel
 
 * delayed invocations. Provide an options object to indicate that `func`
 
 * should be invoked on the leading and/or trailing edge of the `wait` timeout.
 
 * Subsequent calls to the debounced function return the result of the last
 
 * `func` invocation.
 
 *
 
 * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
 
 * on the trailing edge of the timeout only if the the debounced function is
 
 * invoked more than once during the `wait` timeout.
 
 *
 
 * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
 
 * for details over the differences between `_.debounce` and `_.throttle`.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Function
 
 * @param {Function} func The function to debounce.
 
 * @param {number} [wait=0] The number of milliseconds to delay.
 
 * @param {Object} [options] The options object.
 
 * @param {boolean} [options.leading=false] Specify invoking on the leading
 
 *  edge of the timeout.
 
 * @param {number} [options.maxWait] The maximum time `func` is allowed to be
 
 *  delayed before it's invoked.
 
 * @param {boolean} [options.trailing=true] Specify invoking on the trailing
 
 *  edge of the timeout.
 
 * @returns {Function} Returns the new debounced function.
 
 * @example
 
 *
 
 * // avoid costly calculations while the window size is in flux
 
 * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
 
 *
 
 * // invoke `sendMail` when the click event is fired, debouncing subsequent calls
 
 * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {
 
 *   'leading': true,
 
 *   'trailing': false
 
 * }));
 
 *
 
 * // ensure `batchLog` is invoked once after 1 second of debounced calls
 
 * var source = new EventSource('/stream');
 
 * jQuery(source).on('message', _.debounce(batchLog, 250, {
 
 *   'maxWait': 1000
 
 * }));
 
 *
 
 * // cancel a debounced call
 
 * var todoChanges = _.debounce(batchLog, 1000);
 
 * Object.observe(models.todo, todoChanges);
 
 *
 
 * Object.observe(models, function(changes) {
 
 *   if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {
 
 *     todoChanges.cancel();
 
 *   }
 
 * }, ['delete']);
 
 *
 
 * // ...at some point `models.todo` is changed
 
 * models.todo.completed = true;
 
 *
 
 * // ...before 1 second has passed `models.todo` is deleted
 
 * // which cancels the debounced `todoChanges` call
 
 * delete models.todo;
 
 */
 
function debounce(func, wait, options) {
 
  var args,
 
      maxTimeoutId,
 
      result,
 
      stamp,
 
      thisArg,
 
      timeoutId,
 
      trailingCall,
 
      lastCalled = 0,
 
      maxWait = false,
 
      trailing = true;
 

	
 
  if (typeof func != 'function') {
 
    throw new TypeError(FUNC_ERROR_TEXT);
 
  }
 
  wait = wait < 0 ? 0 : (+wait || 0);
 
  if (options === true) {
 
    var leading = true;
 
    trailing = false;
 
  } else if (isObject(options)) {
 
    leading = !!options.leading;
 
    maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);
 
    trailing = 'trailing' in options ? !!options.trailing : trailing;
 
  }
 

	
 
  function cancel() {
 
    if (timeoutId) {
 
      clearTimeout(timeoutId);
 
    }
 
    if (maxTimeoutId) {
 
      clearTimeout(maxTimeoutId);
 
    }
 
    lastCalled = 0;
 
    maxTimeoutId = timeoutId = trailingCall = undefined;
 
  }
 

	
 
  function complete(isCalled, id) {
 
    if (id) {
 
      clearTimeout(id);
 
    }
 
    maxTimeoutId = timeoutId = trailingCall = undefined;
 
    if (isCalled) {
 
      lastCalled = now();
 
      result = func.apply(thisArg, args);
 
      if (!timeoutId && !maxTimeoutId) {
 
        args = thisArg = undefined;
 
      }
 
    }
 
  }
 

	
 
  function delayed() {
 
    var remaining = wait - (now() - stamp);
 
    if (remaining <= 0 || remaining > wait) {
 
      complete(trailingCall, maxTimeoutId);
 
    } else {
 
      timeoutId = setTimeout(delayed, remaining);
 
    }
 
  }
 

	
 
  function maxDelayed() {
 
    complete(trailing, timeoutId);
 
  }
 

	
 
  function debounced() {
 
    args = arguments;
 
    stamp = now();
 
    thisArg = this;
 
    trailingCall = trailing && (timeoutId || !leading);
 

	
 
    if (maxWait === false) {
 
      var leadingCall = leading && !timeoutId;
 
    } else {
 
      if (!maxTimeoutId && !leading) {
 
        lastCalled = stamp;
 
      }
 
      var remaining = maxWait - (stamp - lastCalled),
 
          isCalled = remaining <= 0 || remaining > maxWait;
 

	
 
      if (isCalled) {
 
        if (maxTimeoutId) {
 
          maxTimeoutId = clearTimeout(maxTimeoutId);
 
        }
 
        lastCalled = stamp;
 
        result = func.apply(thisArg, args);
 
      }
 
      else if (!maxTimeoutId) {
 
        maxTimeoutId = setTimeout(maxDelayed, remaining);
 
      }
 
    }
 
    if (isCalled && timeoutId) {
 
      timeoutId = clearTimeout(timeoutId);
 
    }
 
    else if (!timeoutId && wait !== maxWait) {
 
      timeoutId = setTimeout(delayed, wait);
 
    }
 
    if (leadingCall) {
 
      isCalled = true;
 
      result = func.apply(thisArg, args);
 
    }
 
    if (isCalled && !timeoutId && !maxTimeoutId) {
 
      args = thisArg = undefined;
 
    }
 
    return result;
 
  }
 
  debounced.cancel = cancel;
 
  return debounced;
 
}
 

	
 
module.exports = debounce;
 

	
 
},{"../date/now":4,"../lang/isObject":33}],6:[function(_dereq_,module,exports){
 
/** Used as the `TypeError` message for "Functions" methods. */
 
var FUNC_ERROR_TEXT = 'Expected a function';
 

	
 
/* Native method references for those with the same name as other `lodash` methods. */
 
var nativeMax = Math.max;
 

	
 
/**
 
 * Creates a function that invokes `func` with the `this` binding of the
 
 * created function and arguments from `start` and beyond provided as an array.
 
 *
 
 * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters).
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Function
 
 * @param {Function} func The function to apply a rest parameter to.
 
 * @param {number} [start=func.length-1] The start position of the rest parameter.
 
 * @returns {Function} Returns the new function.
 
 * @example
 
 *
 
 * var say = _.restParam(function(what, names) {
 
 *   return what + ' ' + _.initial(names).join(', ') +
 
 *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
 
 * });
 
 *
 
 * say('hello', 'fred', 'barney', 'pebbles');
 
 * // => 'hello fred, barney, & pebbles'
 
 */
 
function restParam(func, start) {
 
  if (typeof func != 'function') {
 
    throw new TypeError(FUNC_ERROR_TEXT);
 
  }
 
  start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);
 
  return function() {
 
    var args = arguments,
 
        index = -1,
 
        length = nativeMax(args.length - start, 0),
 
        rest = Array(length);
 

	
 
    while (++index < length) {
 
      rest[index] = args[start + index];
 
    }
 
    switch (start) {
 
      case 0: return func.call(this, rest);
 
      case 1: return func.call(this, args[0], rest);
 
      case 2: return func.call(this, args[0], args[1], rest);
 
    }
 
    var otherArgs = Array(start + 1);
 
    index = -1;
 
    while (++index < start) {
 
      otherArgs[index] = args[index];
 
    }
 
    otherArgs[start] = rest;
 
    return func.apply(this, otherArgs);
 
  };
 
}
 

	
 
module.exports = restParam;
 

	
 
},{}],7:[function(_dereq_,module,exports){
 
var debounce = _dereq_('./debounce'),
 
    isObject = _dereq_('../lang/isObject');
 

	
 
/** Used as the `TypeError` message for "Functions" methods. */
 
var FUNC_ERROR_TEXT = 'Expected a function';
 

	
 
/**
 
 * Creates a throttled function that only invokes `func` at most once per
 
 * every `wait` milliseconds. The throttled function comes with a `cancel`
 
 * method to cancel delayed invocations. Provide an options object to indicate
 
 * that `func` should be invoked on the leading and/or trailing edge of the
 
 * `wait` timeout. Subsequent calls to the throttled function return the
 
 * result of the last `func` call.
 
 *
 
 * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
 
 * on the trailing edge of the timeout only if the the throttled function is
 
 * invoked more than once during the `wait` timeout.
 
 *
 
 * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
 
 * for details over the differences between `_.throttle` and `_.debounce`.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Function
 
 * @param {Function} func The function to throttle.
 
 * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
 
 * @param {Object} [options] The options object.
 
 * @param {boolean} [options.leading=true] Specify invoking on the leading
 
 *  edge of the timeout.
 
 * @param {boolean} [options.trailing=true] Specify invoking on the trailing
 
 *  edge of the timeout.
 
 * @returns {Function} Returns the new throttled function.
 
 * @example
 
 *
 
 * // avoid excessively updating the position while scrolling
 
 * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
 
 *
 
 * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes
 
 * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {
 
 *   'trailing': false
 
 * }));
 
 *
 
 * // cancel a trailing throttled call
 
 * jQuery(window).on('popstate', throttled.cancel);
 
 */
 
function throttle(func, wait, options) {
 
  var leading = true,
 
      trailing = true;
 

	
 
  if (typeof func != 'function') {
 
    throw new TypeError(FUNC_ERROR_TEXT);
 
  }
 
  if (options === false) {
 
    leading = false;
 
  } else if (isObject(options)) {
 
    leading = 'leading' in options ? !!options.leading : leading;
 
    trailing = 'trailing' in options ? !!options.trailing : trailing;
 
  }
 
  return debounce(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing });
 
}
 

	
 
module.exports = throttle;
 

	
 
},{"../lang/isObject":33,"./debounce":5}],8:[function(_dereq_,module,exports){
 
/**
 
 * Copies the values of `source` to `array`.
 
 *
 
 * @private
 
 * @param {Array} source The array to copy values from.
 
 * @param {Array} [array=[]] The array to copy values to.
 
 * @returns {Array} Returns `array`.
 
 */
 
function arrayCopy(source, array) {
 
  var index = -1,
 
      length = source.length;
 

	
 
  array || (array = Array(length));
 
  while (++index < length) {
 
    array[index] = source[index];
 
  }
 
  return array;
 
}
 

	
 
module.exports = arrayCopy;
 

	
 
},{}],9:[function(_dereq_,module,exports){
 
/**
 
 * A specialized version of `_.forEach` for arrays without support for callback
 
 * shorthands and `this` binding.
 
 *
 
 * @private
 
 * @param {Array} array The array to iterate over.
 
 * @param {Function} iteratee The function invoked per iteration.
 
 * @returns {Array} Returns `array`.
 
 */
 
function arrayEach(array, iteratee) {
 
  var index = -1,
 
      length = array.length;
 

	
 
  while (++index < length) {
 
    if (iteratee(array[index], index, array) === false) {
 
      break;
 
    }
 
  }
 
  return array;
 
}
 

	
 
module.exports = arrayEach;
 

	
 
},{}],10:[function(_dereq_,module,exports){
 
/**
 
 * Copies properties of `source` to `object`.
 
 *
 
 * @private
 
 * @param {Object} source The object to copy properties from.
 
 * @param {Array} props The property names to copy.
 
 * @param {Object} [object={}] The object to copy properties to.
 
 * @returns {Object} Returns `object`.
 
 */
 
function baseCopy(source, props, object) {
 
  object || (object = {});
 

	
 
  var index = -1,
 
      length = props.length;
 

	
 
  while (++index < length) {
 
    var key = props[index];
 
    object[key] = source[key];
 
  }
 
  return object;
 
}
 

	
 
module.exports = baseCopy;
 

	
 
},{}],11:[function(_dereq_,module,exports){
 
var createBaseFor = _dereq_('./createBaseFor');
 

	
 
/**
 
 * The base implementation of `baseForIn` and `baseForOwn` which iterates
 
 * over `object` properties returned by `keysFunc` invoking `iteratee` for
 
 * each property. Iteratee functions may exit iteration early by explicitly
 
 * returning `false`.
 
 *
 
 * @private
 
 * @param {Object} object The object to iterate over.
 
 * @param {Function} iteratee The function invoked per iteration.
 
 * @param {Function} keysFunc The function to get the keys of `object`.
 
 * @returns {Object} Returns `object`.
 
 */
 
var baseFor = createBaseFor();
 

	
 
module.exports = baseFor;
 

	
 
},{"./createBaseFor":18}],12:[function(_dereq_,module,exports){
 
var baseFor = _dereq_('./baseFor'),
 
    keysIn = _dereq_('../object/keysIn');
 

	
 
/**
 
 * The base implementation of `_.forIn` without support for callback
 
 * shorthands and `this` binding.
 
 *
 
 * @private
 
 * @param {Object} object The object to iterate over.
 
 * @param {Function} iteratee The function invoked per iteration.
 
 * @returns {Object} Returns `object`.
 
 */
 
function baseForIn(object, iteratee) {
 
  return baseFor(object, iteratee, keysIn);
 
}
 

	
 
module.exports = baseForIn;
 

	
 
},{"../object/keysIn":39,"./baseFor":11}],13:[function(_dereq_,module,exports){
 
var arrayEach = _dereq_('./arrayEach'),
 
    baseMergeDeep = _dereq_('./baseMergeDeep'),
 
    isArray = _dereq_('../lang/isArray'),
 
    isArrayLike = _dereq_('./isArrayLike'),
 
    isObject = _dereq_('../lang/isObject'),
 
    isObjectLike = _dereq_('./isObjectLike'),
 
    isTypedArray = _dereq_('../lang/isTypedArray'),
 
    keys = _dereq_('../object/keys');
 

	
 
/**
 
 * The base implementation of `_.merge` without support for argument juggling,
 
 * multiple sources, and `this` binding `customizer` functions.
 
 *
 
 * @private
 
 * @param {Object} object The destination object.
 
 * @param {Object} source The source object.
 
 * @param {Function} [customizer] The function to customize merged values.
 
 * @param {Array} [stackA=[]] Tracks traversed source objects.
 
 * @param {Array} [stackB=[]] Associates values with source counterparts.
 
 * @returns {Object} Returns `object`.
 
 */
 
function baseMerge(object, source, customizer, stackA, stackB) {
 
  if (!isObject(object)) {
 
    return object;
 
  }
 
  var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),
 
      props = isSrcArr ? undefined : keys(source);
 

	
 
  arrayEach(props || source, function(srcValue, key) {
 
    if (props) {
 
      key = srcValue;
 
      srcValue = source[key];
 
    }
 
    if (isObjectLike(srcValue)) {
 
      stackA || (stackA = []);
 
      stackB || (stackB = []);
 
      baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);
 
    }
 
    else {
 
      var value = object[key],
 
          result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
 
          isCommon = result === undefined;
 

	
 
      if (isCommon) {
 
        result = srcValue;
 
      }
 
      if ((result !== undefined || (isSrcArr && !(key in object))) &&
 
          (isCommon || (result === result ? (result !== value) : (value === value)))) {
 
        object[key] = result;
 
      }
 
    }
 
  });
 
  return object;
 
}
 

	
 
module.exports = baseMerge;
 

	
 
},{"../lang/isArray":30,"../lang/isObject":33,"../lang/isTypedArray":36,"../object/keys":38,"./arrayEach":9,"./baseMergeDeep":14,"./isArrayLike":21,"./isObjectLike":26}],14:[function(_dereq_,module,exports){
 
var arrayCopy = _dereq_('./arrayCopy'),
 
    isArguments = _dereq_('../lang/isArguments'),
 
    isArray = _dereq_('../lang/isArray'),
 
    isArrayLike = _dereq_('./isArrayLike'),
 
    isPlainObject = _dereq_('../lang/isPlainObject'),
 
    isTypedArray = _dereq_('../lang/isTypedArray'),
 
    toPlainObject = _dereq_('../lang/toPlainObject');
 

	
 
/**
 
 * A specialized version of `baseMerge` for arrays and objects which performs
 
 * deep merges and tracks traversed objects enabling objects with circular
 
 * references to be merged.
 
 *
 
 * @private
 
 * @param {Object} object The destination object.
 
 * @param {Object} source The source object.
 
 * @param {string} key The key of the value to merge.
 
 * @param {Function} mergeFunc The function to merge values.
 
 * @param {Function} [customizer] The function to customize merged values.
 
 * @param {Array} [stackA=[]] Tracks traversed source objects.
 
 * @param {Array} [stackB=[]] Associates values with source counterparts.
 
 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
 
 */
 
function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {
 
  var length = stackA.length,
 
      srcValue = source[key];
 

	
 
  while (length--) {
 
    if (stackA[length] == srcValue) {
 
      object[key] = stackB[length];
 
      return;
 
    }
 
  }
 
  var value = object[key],
 
      result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
 
      isCommon = result === undefined;
 

	
 
  if (isCommon) {
 
    result = srcValue;
 
    if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) {
 
      result = isArray(value)
 
        ? value
 
        : (isArrayLike(value) ? arrayCopy(value) : []);
 
    }
 
    else if (isPlainObject(srcValue) || isArguments(srcValue)) {
 
      result = isArguments(value)
 
        ? toPlainObject(value)
 
        : (isPlainObject(value) ? value : {});
 
    }
 
    else {
 
      isCommon = false;
 
    }
 
  }
 
  // Add the source value to the stack of traversed objects and associate
 
  // it with its merged value.
 
  stackA.push(srcValue);
 
  stackB.push(result);
 

	
 
  if (isCommon) {
 
    // Recursively merge objects and arrays (susceptible to call stack limits).
 
    object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);
 
  } else if (result === result ? (result !== value) : (value === value)) {
 
    object[key] = result;
 
  }
 
}
 

	
 
module.exports = baseMergeDeep;
 

	
 
},{"../lang/isArguments":29,"../lang/isArray":30,"../lang/isPlainObject":34,"../lang/isTypedArray":36,"../lang/toPlainObject":37,"./arrayCopy":8,"./isArrayLike":21}],15:[function(_dereq_,module,exports){
 
var toObject = _dereq_('./toObject');
 

	
 
/**
 
 * The base implementation of `_.property` without support for deep paths.
 
 *
 
 * @private
 
 * @param {string} key The key of the property to get.
 
 * @returns {Function} Returns the new function.
 
 */
 
function baseProperty(key) {
 
  return function(object) {
 
    return object == null ? undefined : toObject(object)[key];
 
  };
 
}
 

	
 
module.exports = baseProperty;
 

	
 
},{"./toObject":28}],16:[function(_dereq_,module,exports){
 
var identity = _dereq_('../utility/identity');
 

	
 
/**
 
 * A specialized version of `baseCallback` which only supports `this` binding
 
 * and specifying the number of arguments to provide to `func`.
 
 *
 
 * @private
 
 * @param {Function} func The function to bind.
 
 * @param {*} thisArg The `this` binding of `func`.
 
 * @param {number} [argCount] The number of arguments to provide to `func`.
 
 * @returns {Function} Returns the callback.
 
 */
 
function bindCallback(func, thisArg, argCount) {
 
  if (typeof func != 'function') {
 
    return identity;
 
  }
 
  if (thisArg === undefined) {
 
    return func;
 
  }
 
  switch (argCount) {
 
    case 1: return function(value) {
 
      return func.call(thisArg, value);
 
    };
 
    case 3: return function(value, index, collection) {
 
      return func.call(thisArg, value, index, collection);
 
    };
 
    case 4: return function(accumulator, value, index, collection) {
 
      return func.call(thisArg, accumulator, value, index, collection);
 
    };
 
    case 5: return function(value, other, key, object, source) {
 
      return func.call(thisArg, value, other, key, object, source);
 
    };
 
  }
 
  return function() {
 
    return func.apply(thisArg, arguments);
 
  };
 
}
 

	
 
module.exports = bindCallback;
 

	
 
},{"../utility/identity":42}],17:[function(_dereq_,module,exports){
 
var bindCallback = _dereq_('./bindCallback'),
 
    isIterateeCall = _dereq_('./isIterateeCall'),
 
    restParam = _dereq_('../function/restParam');
 

	
 
/**
 
 * Creates a `_.assign`, `_.defaults`, or `_.merge` function.
 
 *
 
 * @private
 
 * @param {Function} assigner The function to assign values.
 
 * @returns {Function} Returns the new assigner function.
 
 */
 
function createAssigner(assigner) {
 
  return restParam(function(object, sources) {
 
    var index = -1,
 
        length = object == null ? 0 : sources.length,
 
        customizer = length > 2 ? sources[length - 2] : undefined,
 
        guard = length > 2 ? sources[2] : undefined,
 
        thisArg = length > 1 ? sources[length - 1] : undefined;
 

	
 
    if (typeof customizer == 'function') {
 
      customizer = bindCallback(customizer, thisArg, 5);
 
      length -= 2;
 
    } else {
 
      customizer = typeof thisArg == 'function' ? thisArg : undefined;
 
      length -= (customizer ? 1 : 0);
 
    }
 
    if (guard && isIterateeCall(sources[0], sources[1], guard)) {
 
      customizer = length < 3 ? undefined : customizer;
 
      length = 1;
 
    }
 
    while (++index < length) {
 
      var source = sources[index];
 
      if (source) {
 
        assigner(object, source, customizer);
 
      }
 
    }
 
    return object;
 
  });
 
}
 

	
 
module.exports = createAssigner;
 

	
 
},{"../function/restParam":6,"./bindCallback":16,"./isIterateeCall":24}],18:[function(_dereq_,module,exports){
 
var toObject = _dereq_('./toObject');
 

	
 
/**
 
 * Creates a base function for `_.forIn` or `_.forInRight`.
 
 *
 
 * @private
 
 * @param {boolean} [fromRight] Specify iterating from right to left.
 
 * @returns {Function} Returns the new base function.
 
 */
 
function createBaseFor(fromRight) {
 
  return function(object, iteratee, keysFunc) {
 
    var iterable = toObject(object),
 
        props = keysFunc(object),
 
        length = props.length,
 
        index = fromRight ? length : -1;
 

	
 
    while ((fromRight ? index-- : ++index < length)) {
 
      var key = props[index];
 
      if (iteratee(iterable[key], key, iterable) === false) {
 
        break;
 
      }
 
    }
 
    return object;
 
  };
 
}
 

	
 
module.exports = createBaseFor;
 

	
 
},{"./toObject":28}],19:[function(_dereq_,module,exports){
 
var baseProperty = _dereq_('./baseProperty');
 

	
 
/**
 
 * Gets the "length" property value of `object`.
 
 *
 
 * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
 
 * that affects Safari on at least iOS 8.1-8.3 ARM64.
 
 *
 
 * @private
 
 * @param {Object} object The object to query.
 
 * @returns {*} Returns the "length" value.
 
 */
 
var getLength = baseProperty('length');
 

	
 
module.exports = getLength;
 

	
 
},{"./baseProperty":15}],20:[function(_dereq_,module,exports){
 
var isNative = _dereq_('../lang/isNative');
 

	
 
/**
 
 * Gets the native function at `key` of `object`.
 
 *
 
 * @private
 
 * @param {Object} object The object to query.
 
 * @param {string} key The key of the method to get.
 
 * @returns {*} Returns the function if it's native, else `undefined`.
 
 */
 
function getNative(object, key) {
 
  var value = object == null ? undefined : object[key];
 
  return isNative(value) ? value : undefined;
 
}
 

	
 
module.exports = getNative;
 

	
 
},{"../lang/isNative":32}],21:[function(_dereq_,module,exports){
 
var getLength = _dereq_('./getLength'),
 
    isLength = _dereq_('./isLength');
 

	
 
/**
 
 * Checks if `value` is array-like.
 
 *
 
 * @private
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
 
 */
 
function isArrayLike(value) {
 
  return value != null && isLength(getLength(value));
 
}
 

	
 
module.exports = isArrayLike;
 

	
 
},{"./getLength":19,"./isLength":25}],22:[function(_dereq_,module,exports){
 
/**
 
 * Checks if `value` is a host object in IE < 9.
 
 *
 
 * @private
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is a host object, else `false`.
 
 */
 
var isHostObject = (function() {
 
  try {
 
    Object({ 'toString': 0 } + '');
 
  } catch(e) {
 
    return function() { return false; };
 
  }
 
  return function(value) {
 
    // IE < 9 presents many host objects as `Object` objects that can coerce
 
    // to strings despite having improperly defined `toString` methods.
 
    return typeof value.toString != 'function' && typeof (value + '') == 'string';
 
  };
 
}());
 

	
 
module.exports = isHostObject;
 

	
 
},{}],23:[function(_dereq_,module,exports){
 
/** Used to detect unsigned integer values. */
 
var reIsUint = /^\d+$/;
 

	
 
/**
 
 * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
 
 * of an array-like value.
 
 */
 
var MAX_SAFE_INTEGER = 9007199254740991;
 

	
 
/**
 
 * Checks if `value` is a valid array-like index.
 
 *
 
 * @private
 
 * @param {*} value The value to check.
 
 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
 
 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
 
 */
 
function isIndex(value, length) {
 
  value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
 
  length = length == null ? MAX_SAFE_INTEGER : length;
 
  return value > -1 && value % 1 == 0 && value < length;
 
}
 

	
 
module.exports = isIndex;
 

	
 
},{}],24:[function(_dereq_,module,exports){
 
var isArrayLike = _dereq_('./isArrayLike'),
 
    isIndex = _dereq_('./isIndex'),
 
    isObject = _dereq_('../lang/isObject');
 

	
 
/**
 
 * Checks if the provided arguments are from an iteratee call.
 
 *
 
 * @private
 
 * @param {*} value The potential iteratee value argument.
 
 * @param {*} index The potential iteratee index or key argument.
 
 * @param {*} object The potential iteratee object argument.
 
 * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.
 
 */
 
function isIterateeCall(value, index, object) {
 
  if (!isObject(object)) {
 
    return false;
 
  }
 
  var type = typeof index;
 
  if (type == 'number'
 
      ? (isArrayLike(object) && isIndex(index, object.length))
 
      : (type == 'string' && index in object)) {
 
    var other = object[index];
 
    return value === value ? (value === other) : (other !== other);
 
  }
 
  return false;
 
}
 

	
 
module.exports = isIterateeCall;
 

	
 
},{"../lang/isObject":33,"./isArrayLike":21,"./isIndex":23}],25:[function(_dereq_,module,exports){
 
/**
 
 * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
 
 * of an array-like value.
 
 */
 
var MAX_SAFE_INTEGER = 9007199254740991;
 

	
 
/**
 
 * Checks if `value` is a valid array-like length.
 
 *
 
 * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
 
 *
 
 * @private
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
 
 */
 
function isLength(value) {
 
  return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
 
}
 

	
 
module.exports = isLength;
 

	
 
},{}],26:[function(_dereq_,module,exports){
 
/**
 
 * Checks if `value` is object-like.
 
 *
 
 * @private
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
 
 */
 
function isObjectLike(value) {
 
  return !!value && typeof value == 'object';
 
}
 

	
 
module.exports = isObjectLike;
 

	
 
},{}],27:[function(_dereq_,module,exports){
 
var isArguments = _dereq_('../lang/isArguments'),
 
    isArray = _dereq_('../lang/isArray'),
 
    isIndex = _dereq_('./isIndex'),
 
    isLength = _dereq_('./isLength'),
 
    isString = _dereq_('../lang/isString'),
 
    keysIn = _dereq_('../object/keysIn');
 

	
 
/** Used for native method references. */
 
var objectProto = Object.prototype;
 

	
 
/** Used to check objects for own properties. */
 
var hasOwnProperty = objectProto.hasOwnProperty;
 

	
 
/**
 
 * A fallback implementation of `Object.keys` which creates an array of the
 
 * own enumerable property names of `object`.
 
 *
 
 * @private
 
 * @param {Object} object The object to query.
 
 * @returns {Array} Returns the array of property names.
 
 */
 
function shimKeys(object) {
 
  var props = keysIn(object),
 
      propsLength = props.length,
 
      length = propsLength && object.length;
 

	
 
  var allowIndexes = !!length && isLength(length) &&
 
    (isArray(object) || isArguments(object) || isString(object));
 

	
 
  var index = -1,
 
      result = [];
 

	
 
  while (++index < propsLength) {
 
    var key = props[index];
 
    if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {
 
      result.push(key);
 
    }
 
  }
 
  return result;
 
}
 

	
 
module.exports = shimKeys;
 

	
 
},{"../lang/isArguments":29,"../lang/isArray":30,"../lang/isString":35,"../object/keysIn":39,"./isIndex":23,"./isLength":25}],28:[function(_dereq_,module,exports){
 
var isObject = _dereq_('../lang/isObject'),
 
    isString = _dereq_('../lang/isString'),
 
    support = _dereq_('../support');
 

	
 
/**
 
 * Converts `value` to an object if it's not one.
 
 *
 
 * @private
 
 * @param {*} value The value to process.
 
 * @returns {Object} Returns the object.
 
 */
 
function toObject(value) {
 
  if (support.unindexedChars && isString(value)) {
 
    var index = -1,
 
        length = value.length,
 
        result = Object(value);
 

	
 
    while (++index < length) {
 
      result[index] = value.charAt(index);
 
    }
 
    return result;
 
  }
 
  return isObject(value) ? value : Object(value);
 
}
 

	
 
module.exports = toObject;
 

	
 
},{"../lang/isObject":33,"../lang/isString":35,"../support":41}],29:[function(_dereq_,module,exports){
 
var isArrayLike = _dereq_('../internal/isArrayLike'),
 
    isObjectLike = _dereq_('../internal/isObjectLike');
 

	
 
/** Used for native method references. */
 
var objectProto = Object.prototype;
 

	
 
/** Used to check objects for own properties. */
 
var hasOwnProperty = objectProto.hasOwnProperty;
 

	
 
/** Native method references. */
 
var propertyIsEnumerable = objectProto.propertyIsEnumerable;
 

	
 
/**
 
 * Checks if `value` is classified as an `arguments` object.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
 
 * @example
 
 *
 
 * _.isArguments(function() { return arguments; }());
 
 * // => true
 
 *
 
 * _.isArguments([1, 2, 3]);
 
 * // => false
 
 */
 
function isArguments(value) {
 
  return isObjectLike(value) && isArrayLike(value) &&
 
    hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');
 
}
 

	
 
module.exports = isArguments;
 

	
 
},{"../internal/isArrayLike":21,"../internal/isObjectLike":26}],30:[function(_dereq_,module,exports){
 
var getNative = _dereq_('../internal/getNative'),
 
    isLength = _dereq_('../internal/isLength'),
 
    isObjectLike = _dereq_('../internal/isObjectLike');
 

	
 
/** `Object#toString` result references. */
 
var arrayTag = '[object Array]';
 

	
 
/** Used for native method references. */
 
var objectProto = Object.prototype;
 

	
 
/**
 
 * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
 
 * of values.
 
 */
 
var objToString = objectProto.toString;
 

	
 
/* Native method references for those with the same name as other `lodash` methods. */
 
var nativeIsArray = getNative(Array, 'isArray');
 

	
 
/**
 
 * Checks if `value` is classified as an `Array` object.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
 
 * @example
 
 *
 
 * _.isArray([1, 2, 3]);
 
 * // => true
 
 *
 
 * _.isArray(function() { return arguments; }());
 
 * // => false
 
 */
 
var isArray = nativeIsArray || function(value) {
 
  return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
 
};
 

	
 
module.exports = isArray;
 

	
 
},{"../internal/getNative":20,"../internal/isLength":25,"../internal/isObjectLike":26}],31:[function(_dereq_,module,exports){
 
var isObject = _dereq_('./isObject');
 

	
 
/** `Object#toString` result references. */
 
var funcTag = '[object Function]';
 

	
 
/** Used for native method references. */
 
var objectProto = Object.prototype;
 

	
 
/**
 
 * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
 
 * of values.
 
 */
 
var objToString = objectProto.toString;
 

	
 
/**
 
 * Checks if `value` is classified as a `Function` object.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
 
 * @example
 
 *
 
 * _.isFunction(_);
 
 * // => true
 
 *
 
 * _.isFunction(/abc/);
 
 * // => false
 
 */
 
function isFunction(value) {
 
  // The use of `Object#toString` avoids issues with the `typeof` operator
 
  // in older versions of Chrome and Safari which return 'function' for regexes
 
  // and Safari 8 which returns 'object' for typed array constructors.
 
  return isObject(value) && objToString.call(value) == funcTag;
 
}
 

	
 
module.exports = isFunction;
 

	
 
},{"./isObject":33}],32:[function(_dereq_,module,exports){
 
var isFunction = _dereq_('./isFunction'),
 
    isHostObject = _dereq_('../internal/isHostObject'),
 
    isObjectLike = _dereq_('../internal/isObjectLike');
 

	
 
/** Used to detect host constructors (Safari > 5). */
 
var reIsHostCtor = /^\[object .+?Constructor\]$/;
 

	
 
/** Used for native method references. */
 
var objectProto = Object.prototype;
 

	
 
/** Used to resolve the decompiled source of functions. */
 
var fnToString = Function.prototype.toString;
 

	
 
/** Used to check objects for own properties. */
 
var hasOwnProperty = objectProto.hasOwnProperty;
 

	
 
/** Used to detect if a method is native. */
 
var reIsNative = RegExp('^' +
 
  fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
 
  .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
 
);
 

	
 
/**
 
 * Checks if `value` is a native function.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
 
 * @example
 
 *
 
 * _.isNative(Array.prototype.push);
 
 * // => true
 
 *
 
 * _.isNative(_);
 
 * // => false
 
 */
 
function isNative(value) {
 
  if (value == null) {
 
    return false;
 
  }
 
  if (isFunction(value)) {
 
    return reIsNative.test(fnToString.call(value));
 
  }
 
  return isObjectLike(value) && (isHostObject(value) ? reIsNative : reIsHostCtor).test(value);
 
}
 

	
 
module.exports = isNative;
 

	
 
},{"../internal/isHostObject":22,"../internal/isObjectLike":26,"./isFunction":31}],33:[function(_dereq_,module,exports){
 
/**
 
 * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
 
 * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
 
 * @example
 
 *
 
 * _.isObject({});
 
 * // => true
 
 *
 
 * _.isObject([1, 2, 3]);
 
 * // => true
 
 *
 
 * _.isObject(1);
 
 * // => false
 
 */
 
function isObject(value) {
 
  // Avoid a V8 JIT bug in Chrome 19-20.
 
  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
 
  var type = typeof value;
 
  return !!value && (type == 'object' || type == 'function');
 
}
 

	
 
module.exports = isObject;
 

	
 
},{}],34:[function(_dereq_,module,exports){
 
var baseForIn = _dereq_('../internal/baseForIn'),
 
    isArguments = _dereq_('./isArguments'),
 
    isHostObject = _dereq_('../internal/isHostObject'),
 
    isObjectLike = _dereq_('../internal/isObjectLike'),
 
    support = _dereq_('../support');
 

	
 
/** `Object#toString` result references. */
 
var objectTag = '[object Object]';
 

	
 
/** Used for native method references. */
 
var objectProto = Object.prototype;
 

	
 
/** Used to check objects for own properties. */
 
var hasOwnProperty = objectProto.hasOwnProperty;
 

	
 
/**
 
 * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
 
 * of values.
 
 */
 
var objToString = objectProto.toString;
 

	
 
/**
 
 * Checks if `value` is a plain object, that is, an object created by the
 
 * `Object` constructor or one with a `[[Prototype]]` of `null`.
 
 *
 
 * **Note:** This method assumes objects created by the `Object` constructor
 
 * have no inherited enumerable properties.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
 
 * @example
 
 *
 
 * function Foo() {
 
 *   this.a = 1;
 
 * }
 
 *
 
 * _.isPlainObject(new Foo);
 
 * // => false
 
 *
 
 * _.isPlainObject([1, 2, 3]);
 
 * // => false
 
 *
 
 * _.isPlainObject({ 'x': 0, 'y': 0 });
 
 * // => true
 
 *
 
 * _.isPlainObject(Object.create(null));
 
 * // => true
 
 */
 
function isPlainObject(value) {
 
  var Ctor;
 

	
 
  // Exit early for non `Object` objects.
 
  if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isHostObject(value) && !isArguments(value)) ||
 
      (!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {
 
    return false;
 
  }
 
  // IE < 9 iterates inherited properties before own properties. If the first
 
  // iterated property is an object's own property then there are no inherited
 
  // enumerable properties.
 
  var result;
 
  if (support.ownLast) {
 
    baseForIn(value, function(subValue, key, object) {
 
      result = hasOwnProperty.call(object, key);
 
      return false;
 
    });
 
    return result !== false;
 
  }
 
  // In most environments an object's own properties are iterated before
 
  // its inherited properties. If the last iterated property is an object's
 
  // own property then there are no inherited enumerable properties.
 
  baseForIn(value, function(subValue, key) {
 
    result = key;
 
  });
 
  return result === undefined || hasOwnProperty.call(value, result);
 
}
 

	
 
module.exports = isPlainObject;
 

	
 
},{"../internal/baseForIn":12,"../internal/isHostObject":22,"../internal/isObjectLike":26,"../support":41,"./isArguments":29}],35:[function(_dereq_,module,exports){
 
var isObjectLike = _dereq_('../internal/isObjectLike');
 

	
 
/** `Object#toString` result references. */
 
var stringTag = '[object String]';
 

	
 
/** Used for native method references. */
 
var objectProto = Object.prototype;
 

	
 
/**
 
 * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
 
 * of values.
 
 */
 
var objToString = objectProto.toString;
 

	
 
/**
 
 * Checks if `value` is classified as a `String` primitive or object.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
 
 * @example
 
 *
 
 * _.isString('abc');
 
 * // => true
 
 *
 
 * _.isString(1);
 
 * // => false
 
 */
 
function isString(value) {
 
  return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);
 
}
 

	
 
module.exports = isString;
 

	
 
},{"../internal/isObjectLike":26}],36:[function(_dereq_,module,exports){
 
var isLength = _dereq_('../internal/isLength'),
 
    isObjectLike = _dereq_('../internal/isObjectLike');
 

	
 
/** `Object#toString` result references. */
 
var argsTag = '[object Arguments]',
 
    arrayTag = '[object Array]',
 
    boolTag = '[object Boolean]',
 
    dateTag = '[object Date]',
 
    errorTag = '[object Error]',
 
    funcTag = '[object Function]',
 
    mapTag = '[object Map]',
 
    numberTag = '[object Number]',
 
    objectTag = '[object Object]',
 
    regexpTag = '[object RegExp]',
 
    setTag = '[object Set]',
 
    stringTag = '[object String]',
 
    weakMapTag = '[object WeakMap]';
 

	
 
var arrayBufferTag = '[object ArrayBuffer]',
 
    float32Tag = '[object Float32Array]',
 
    float64Tag = '[object Float64Array]',
 
    int8Tag = '[object Int8Array]',
 
    int16Tag = '[object Int16Array]',
 
    int32Tag = '[object Int32Array]',
 
    uint8Tag = '[object Uint8Array]',
 
    uint8ClampedTag = '[object Uint8ClampedArray]',
 
    uint16Tag = '[object Uint16Array]',
 
    uint32Tag = '[object Uint32Array]';
 

	
 
/** Used to identify `toStringTag` values of typed arrays. */
 
var typedArrayTags = {};
 
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
 
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
 
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
 
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
 
typedArrayTags[uint32Tag] = true;
 
typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
 
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
 
typedArrayTags[dateTag] = typedArrayTags[errorTag] =
 
typedArrayTags[funcTag] = typedArrayTags[mapTag] =
 
typedArrayTags[numberTag] = typedArrayTags[objectTag] =
 
typedArrayTags[regexpTag] = typedArrayTags[setTag] =
 
typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
 

	
 
/** Used for native method references. */
 
var objectProto = Object.prototype;
 

	
 
/**
 
 * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
 
 * of values.
 
 */
 
var objToString = objectProto.toString;
 

	
 
/**
 
 * Checks if `value` is classified as a typed array.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
 
 * @example
 
 *
 
 * _.isTypedArray(new Uint8Array);
 
 * // => true
 
 *
 
 * _.isTypedArray([]);
 
 * // => false
 
 */
 
function isTypedArray(value) {
 
  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];
 
}
 

	
 
module.exports = isTypedArray;
 

	
 
},{"../internal/isLength":25,"../internal/isObjectLike":26}],37:[function(_dereq_,module,exports){
 
var baseCopy = _dereq_('../internal/baseCopy'),
 
    keysIn = _dereq_('../object/keysIn');
 

	
 
/**
 
 * Converts `value` to a plain object flattening inherited enumerable
 
 * properties of `value` to own properties of the plain object.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to convert.
 
 * @returns {Object} Returns the converted plain object.
 
 * @example
 
 *
 
 * function Foo() {
 
 *   this.b = 2;
 
 * }
 
 *
 
 * Foo.prototype.c = 3;
 
 *
 
 * _.assign({ 'a': 1 }, new Foo);
 
 * // => { 'a': 1, 'b': 2 }
 
 *
 
 * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
 
 * // => { 'a': 1, 'b': 2, 'c': 3 }
 
 */
 
function toPlainObject(value) {
 
  return baseCopy(value, keysIn(value));
 
}
 

	
 
module.exports = toPlainObject;
 

	
 
},{"../internal/baseCopy":10,"../object/keysIn":39}],38:[function(_dereq_,module,exports){
 
var getNative = _dereq_('../internal/getNative'),
 
    isArrayLike = _dereq_('../internal/isArrayLike'),
 
    isObject = _dereq_('../lang/isObject'),
 
    shimKeys = _dereq_('../internal/shimKeys'),
 
    support = _dereq_('../support');
 

	
 
/* Native method references for those with the same name as other `lodash` methods. */
 
var nativeKeys = getNative(Object, 'keys');
 

	
 
/**
 
 * Creates an array of the own enumerable property names of `object`.
 
 *
 
 * **Note:** Non-object values are coerced to objects. See the
 
 * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
 
 * for more details.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Object
 
 * @param {Object} object The object to query.
 
 * @returns {Array} Returns the array of property names.
 
 * @example
 
 *
 
 * function Foo() {
 
 *   this.a = 1;
 
 *   this.b = 2;
 
 * }
 
 *
 
 * Foo.prototype.c = 3;
 
 *
 
 * _.keys(new Foo);
 
 * // => ['a', 'b'] (iteration order is not guaranteed)
 
 *
 
 * _.keys('hi');
 
 * // => ['0', '1']
 
 */
 
var keys = !nativeKeys ? shimKeys : function(object) {
 
  var Ctor = object == null ? undefined : object.constructor;
 
  if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
 
      (typeof object == 'function' ? support.enumPrototypes : isArrayLike(object))) {
 
    return shimKeys(object);
 
  }
 
  return isObject(object) ? nativeKeys(object) : [];
 
};
 

	
 
module.exports = keys;
 

	
 
},{"../internal/getNative":20,"../internal/isArrayLike":21,"../internal/shimKeys":27,"../lang/isObject":33,"../support":41}],39:[function(_dereq_,module,exports){
 
var arrayEach = _dereq_('../internal/arrayEach'),
 
    isArguments = _dereq_('../lang/isArguments'),
 
    isArray = _dereq_('../lang/isArray'),
 
    isFunction = _dereq_('../lang/isFunction'),
 
    isIndex = _dereq_('../internal/isIndex'),
 
    isLength = _dereq_('../internal/isLength'),
 
    isObject = _dereq_('../lang/isObject'),
 
    isString = _dereq_('../lang/isString'),
 
    support = _dereq_('../support');
 

	
 
/** `Object#toString` result references. */
 
var arrayTag = '[object Array]',
 
    boolTag = '[object Boolean]',
 
    dateTag = '[object Date]',
 
    errorTag = '[object Error]',
 
    funcTag = '[object Function]',
 
    numberTag = '[object Number]',
 
    objectTag = '[object Object]',
 
    regexpTag = '[object RegExp]',
 
    stringTag = '[object String]';
 

	
 
/** Used to fix the JScript `[[DontEnum]]` bug. */
 
var shadowProps = [
 
  'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',
 
  'toLocaleString', 'toString', 'valueOf'
 
];
 

	
 
/** Used for native method references. */
 
var errorProto = Error.prototype,
 
    objectProto = Object.prototype,
 
    stringProto = String.prototype;
 

	
 
/** Used to check objects for own properties. */
 
var hasOwnProperty = objectProto.hasOwnProperty;
 

	
 
/**
 
 * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
 
 * of values.
 
 */
 
var objToString = objectProto.toString;
 

	
 
/** Used to avoid iterating over non-enumerable properties in IE < 9. */
 
var nonEnumProps = {};
 
nonEnumProps[arrayTag] = nonEnumProps[dateTag] = nonEnumProps[numberTag] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };
 
nonEnumProps[boolTag] = nonEnumProps[stringTag] = { 'constructor': true, 'toString': true, 'valueOf': true };
 
nonEnumProps[errorTag] = nonEnumProps[funcTag] = nonEnumProps[regexpTag] = { 'constructor': true, 'toString': true };
 
nonEnumProps[objectTag] = { 'constructor': true };
 

	
 
arrayEach(shadowProps, function(key) {
 
  for (var tag in nonEnumProps) {
 
    if (hasOwnProperty.call(nonEnumProps, tag)) {
 
      var props = nonEnumProps[tag];
 
      props[key] = hasOwnProperty.call(props, key);
 
    }
 
  }
 
});
 

	
 
/**
 
 * Creates an array of the own and inherited enumerable property names of `object`.
 
 *
 
 * **Note:** Non-object values are coerced to objects.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Object
 
 * @param {Object} object The object to query.
 
 * @returns {Array} Returns the array of property names.
 
 * @example
 
 *
 
 * function Foo() {
 
 *   this.a = 1;
 
 *   this.b = 2;
 
 * }
 
 *
 
 * Foo.prototype.c = 3;
 
 *
 
 * _.keysIn(new Foo);
 
 * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
 
 */
 
function keysIn(object) {
 
  if (object == null) {
 
    return [];
 
  }
 
  if (!isObject(object)) {
 
    object = Object(object);
 
  }
 
  var length = object.length;
 

	
 
  length = (length && isLength(length) &&
 
    (isArray(object) || isArguments(object) || isString(object)) && length) || 0;
 

	
 
  var Ctor = object.constructor,
 
      index = -1,
 
      proto = (isFunction(Ctor) && Ctor.prototype) || objectProto,
 
      isProto = proto === object,
 
      result = Array(length),
 
      skipIndexes = length > 0,
 
      skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error),
 
      skipProto = support.enumPrototypes && isFunction(object);
 

	
 
  while (++index < length) {
 
    result[index] = (index + '');
 
  }
 
  // lodash skips the `constructor` property when it infers it's iterating
 
  // over a `prototype` object because IE < 9 can't set the `[[Enumerable]]`
 
  // attribute of an existing property and the `constructor` property of a
 
  // prototype defaults to non-enumerable.
 
  for (var key in object) {
 
    if (!(skipProto && key == 'prototype') &&
 
        !(skipErrorProps && (key == 'message' || key == 'name')) &&
 
        !(skipIndexes && isIndex(key, length)) &&
 
        !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
 
      result.push(key);
 
    }
 
  }
 
  if (support.nonEnumShadows && object !== objectProto) {
 
    var tag = object === stringProto ? stringTag : (object === errorProto ? errorTag : objToString.call(object)),
 
        nonEnums = nonEnumProps[tag] || nonEnumProps[objectTag];
 

	
 
    if (tag == objectTag) {
 
      proto = objectProto;
 
    }
 
    length = shadowProps.length;
 
    while (length--) {
 
      key = shadowProps[length];
 
      var nonEnum = nonEnums[key];
 
      if (!(isProto && nonEnum) &&
 
          (nonEnum ? hasOwnProperty.call(object, key) : object[key] !== proto[key])) {
 
        result.push(key);
 
      }
 
    }
 
  }
 
  return result;
 
}
 

	
 
module.exports = keysIn;
 

	
 
},{"../internal/arrayEach":9,"../internal/isIndex":23,"../internal/isLength":25,"../lang/isArguments":29,"../lang/isArray":30,"../lang/isFunction":31,"../lang/isObject":33,"../lang/isString":35,"../support":41}],40:[function(_dereq_,module,exports){
 
var baseMerge = _dereq_('../internal/baseMerge'),
 
    createAssigner = _dereq_('../internal/createAssigner');
 

	
 
/**
 
 * Recursively merges own enumerable properties of the source object(s), that
 
 * don't resolve to `undefined` into the destination object. Subsequent sources
 
 * overwrite property assignments of previous sources. If `customizer` is
 
 * provided it's invoked to produce the merged values of the destination and
 
 * source properties. If `customizer` returns `undefined` merging is handled
 
 * by the method instead. The `customizer` is bound to `thisArg` and invoked
 
 * with five arguments: (objectValue, sourceValue, key, object, source).
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Object
 
 * @param {Object} object The destination object.
 
 * @param {...Object} [sources] The source objects.
 
 * @param {Function} [customizer] The function to customize assigned values.
 
 * @param {*} [thisArg] The `this` binding of `customizer`.
 
 * @returns {Object} Returns `object`.
 
 * @example
 
 *
 
 * var users = {
 
 *   'data': [{ 'user': 'barney' }, { 'user': 'fred' }]
 
 * };
 
 *
 
 * var ages = {
 
 *   'data': [{ 'age': 36 }, { 'age': 40 }]
 
 * };
 
 *
 
 * _.merge(users, ages);
 
 * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }
 
 *
 
 * // using a customizer callback
 
 * var object = {
 
 *   'fruits': ['apple'],
 
 *   'vegetables': ['beet']
 
 * };
 
 *
 
 * var other = {
 
 *   'fruits': ['banana'],
 
 *   'vegetables': ['carrot']
 
 * };
 
 *
 
 * _.merge(object, other, function(a, b) {
 
 *   if (_.isArray(a)) {
 
 *     return a.concat(b);
 
 *   }
 
 * });
 
 * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
 
 */
 
var merge = createAssigner(baseMerge);
 

	
 
module.exports = merge;
 

	
 
},{"../internal/baseMerge":13,"../internal/createAssigner":17}],41:[function(_dereq_,module,exports){
 
/** Used for native method references. */
 
var arrayProto = Array.prototype,
 
    errorProto = Error.prototype,
 
    objectProto = Object.prototype;
 

	
 
/** Native method references. */
 
var propertyIsEnumerable = objectProto.propertyIsEnumerable,
 
    splice = arrayProto.splice;
 

	
 
/**
 
 * An object environment feature flags.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @type Object
 
 */
 
var support = {};
 

	
 
(function(x) {
 
  var Ctor = function() { this.x = x; },
 
      object = { '0': x, 'length': x },
 
      props = [];
 

	
 
  Ctor.prototype = { 'valueOf': x, 'y': x };
 
  for (var key in new Ctor) { props.push(key); }
 

	
 
  /**
 
   * Detect if `name` or `message` properties of `Error.prototype` are
 
   * enumerable by default (IE < 9, Safari < 5.1).
 
   *
 
   * @memberOf _.support
 
   * @type boolean
 
   */
 
  support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') ||
 
    propertyIsEnumerable.call(errorProto, 'name');
 

	
 
  /**
 
   * Detect if `prototype` properties are enumerable by default.
 
   *
 
   * Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1
 
   * (if the prototype or a property on the prototype has been set)
 
   * incorrectly set the `[[Enumerable]]` value of a function's `prototype`
 
   * property to `true`.
 
   *
 
   * @memberOf _.support
 
   * @type boolean
 
   */
 
  support.enumPrototypes = propertyIsEnumerable.call(Ctor, 'prototype');
 

	
 
  /**
 
   * Detect if properties shadowing those on `Object.prototype` are non-enumerable.
 
   *
 
   * In IE < 9 an object's own properties, shadowing non-enumerable ones,
 
   * are made non-enumerable as well (a.k.a the JScript `[[DontEnum]]` bug).
 
   *
 
   * @memberOf _.support
 
   * @type boolean
 
   */
 
  support.nonEnumShadows = !/valueOf/.test(props);
 

	
 
  /**
 
   * Detect if own properties are iterated after inherited properties (IE < 9).
 
   *
 
   * @memberOf _.support
 
   * @type boolean
 
   */
 
  support.ownLast = props[0] != 'x';
 

	
 
  /**
 
   * Detect if `Array#shift` and `Array#splice` augment array-like objects
 
   * correctly.
 
   *
 
   * Firefox < 10, compatibility modes of IE 8, and IE < 9 have buggy Array
 
   * `shift()` and `splice()` functions that fail to remove the last element,
 
   * `value[0]`, of array-like objects even though the "length" property is
 
   * set to `0`. The `shift()` method is buggy in compatibility modes of IE 8,
 
   * while `splice()` is buggy regardless of mode in IE < 9.
 
   *
 
   * @memberOf _.support
 
   * @type boolean
 
   */
 
  support.spliceObjects = (splice.call(object, 0, 1), !object[0]);
 

	
 
  /**
 
   * Detect lack of support for accessing string characters by index.
 
   *
 
   * IE < 8 can't access characters by index. IE 8 can only access characters
 
   * by index on string literals, not string objects.
 
   *
 
   * @memberOf _.support
 
   * @type boolean
 
   */
 
  support.unindexedChars = ('x'[0] + Object('x')[0]) != 'xx';
 
}(1, 0));
 

	
 
module.exports = support;
 

	
 
},{}],42:[function(_dereq_,module,exports){
 
/**
 
 * This method returns the first argument provided to it.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Utility
 
 * @param {*} value Any value.
 
 * @returns {*} Returns `value`.
 
 * @example
 
 *
 
 * var object = { 'user': 'fred' };
 
 *
 
 * _.identity(object) === object;
 
 * // => true
 
 */
 
function identity(value) {
 
  return value;
 
}
 

	
 
module.exports = identity;
 

	
 
},{}],43:[function(_dereq_,module,exports){
 
'use strict';
 

	
 
// modified from https://github.com/es-shims/es6-shim
 
var keys = _dereq_('object-keys');
 
var canBeObject = function (obj) {
 
	return typeof obj !== 'undefined' && obj !== null;
 
};
 
var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';
 
var defineProperties = _dereq_('define-properties');
 
var toObject = Object;
 
var push = Array.prototype.push;
 
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
 

	
 
var assignShim = function assign(target, source1) {
 
	if (!canBeObject(target)) { throw new TypeError('target must be an object'); }
 
	var objTarget = toObject(target);
 
	var s, source, i, props, syms;
 
	for (s = 1; s < arguments.length; ++s) {
 
		source = toObject(arguments[s]);
 
		props = keys(source);
 
		if (hasSymbols && Object.getOwnPropertySymbols) {
 
			syms = Object.getOwnPropertySymbols(source);
 
			for (i = 0; i < syms.length; ++i) {
 
				if (propIsEnumerable.call(source, syms[i])) {
 
					push.call(props, syms[i]);
 
				}
 
			}
 
		}
 
		for (i = 0; i < props.length; ++i) {
 
			objTarget[props[i]] = source[props[i]];
 
		}
 
	}
 
	return objTarget;
 
};
 

	
 
defineProperties(assignShim, {
 
	shim: function shimObjectAssign() {
 
		var assignHasPendingExceptions = function () {
 
			if (!Object.assign || !Object.preventExtensions) {
 
				return false;
 
			}
 
			// Firefox 37 still has "pending exception" logic in its Object.assign implementation,
 
			// which is 72% slower than our shim, and Firefox 40's native implementation.
 
			var thrower = Object.preventExtensions({ 1: 2 });
 
			try {
 
				Object.assign(thrower, 'xy');
 
			} catch (e) {
 
				return thrower[1] === 'y';
 
			}
 
		};
 
		defineProperties(
 
			Object,
 
			{ assign: assignShim },
 
			{ assign: assignHasPendingExceptions }
 
		);
 
		return Object.assign || assignShim;
 
	}
 
});
 

	
 
module.exports = assignShim;
 

	
 
},{"define-properties":44,"object-keys":46}],44:[function(_dereq_,module,exports){
 
'use strict';
 

	
 
var keys = _dereq_('object-keys');
 
var foreach = _dereq_('foreach');
 
var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';
 

	
 
var toStr = Object.prototype.toString;
 

	
 
var isFunction = function (fn) {
 
	return typeof fn === 'function' && toStr.call(fn) === '[object Function]';
 
};
 

	
 
var arePropertyDescriptorsSupported = function () {
 
	var obj = {};
 
	try {
 
		Object.defineProperty(obj, 'x', { value: obj, enumerable: false });
 
        /* eslint-disable no-unused-vars */
 
        for (var _ in obj) { return false; }
 
        /* eslint-enable no-unused-vars */
 
		return obj.x === obj;
 
	} catch (e) { /* this is IE 8. */
 
		return false;
 
	}
 
};
 
var supportsDescriptors = Object.defineProperty && arePropertyDescriptorsSupported();
 

	
 
var defineProperty = function (object, name, value, predicate) {
 
	if (name in object && (!isFunction(predicate) || !predicate())) {
 
		return;
 
	}
 
	if (supportsDescriptors) {
 
		Object.defineProperty(object, name, {
 
			configurable: true,
 
			enumerable: false,
 
			writable: true,
 
			value: value
 
		});
 
	} else {
 
		object[name] = value;
 
	}
 
};
 

	
 
var defineProperties = function (object, map) {
 
	var predicates = arguments.length > 2 ? arguments[2] : {};
 
	var props = keys(map);
 
	if (hasSymbols) {
 
		props = props.concat(Object.getOwnPropertySymbols(map));
 
	}
 
	foreach(props, function (name) {
 
		defineProperty(object, name, map[name], predicates[name]);
 
	});
 
};
 

	
 
defineProperties.supportsDescriptors = !!supportsDescriptors;
 

	
 
module.exports = defineProperties;
 

	
 
},{"foreach":45,"object-keys":46}],45:[function(_dereq_,module,exports){
 

	
 
var hasOwn = Object.prototype.hasOwnProperty;
 
var toString = Object.prototype.toString;
 

	
 
module.exports = function forEach (obj, fn, ctx) {
 
    if (toString.call(fn) !== '[object Function]') {
 
        throw new TypeError('iterator must be a function');
 
    }
 
    var l = obj.length;
 
    if (l === +l) {
 
        for (var i = 0; i < l; i++) {
 
            fn.call(ctx, obj[i], i, obj);
 
        }
 
    } else {
 
        for (var k in obj) {
 
            if (hasOwn.call(obj, k)) {
 
                fn.call(ctx, obj[k], k, obj);
 
            }
 
        }
 
    }
 
};
 

	
 

	
 
},{}],46:[function(_dereq_,module,exports){
 
'use strict';
 

	
 
// modified from https://github.com/es-shims/es5-shim
 
var has = Object.prototype.hasOwnProperty;
 
var toStr = Object.prototype.toString;
 
var slice = Array.prototype.slice;
 
var isArgs = _dereq_('./isArguments');
 
var hasDontEnumBug = !({ 'toString': null }).propertyIsEnumerable('toString');
 
var hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype');
 
var dontEnums = [
 
	'toString',
 
	'toLocaleString',
 
	'valueOf',
 
	'hasOwnProperty',
 
	'isPrototypeOf',
 
	'propertyIsEnumerable',
 
	'constructor'
 
];
 
var equalsConstructorPrototype = function (o) {
 
	var ctor = o.constructor;
 
	return ctor && ctor.prototype === o;
 
};
 
var blacklistedKeys = {
 
	$window: true,
 
	$console: true,
 
	$parent: true,
 
	$self: true,
 
	$frames: true,
 
	$webkitIndexedDB: true,
 
	$webkitStorageInfo: true
 
};
 
var hasAutomationEqualityBug = (function () {
 
	/* global window */
 
	if (typeof window === 'undefined') { return false; }
 
	for (var k in window) {
 
		if (!blacklistedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
 
			try {
 
				equalsConstructorPrototype(window[k]);
 
			} catch (e) {
 
				return true;
 
			}
 
		}
 
	}
 
	return false;
 
}());
 
var equalsConstructorPrototypeIfNotBuggy = function (o) {
 
	/* global window */
 
	if (typeof window === 'undefined' && !hasAutomationEqualityBug) {
 
		return equalsConstructorPrototype(o);
 
	}
 
	try {
 
		return equalsConstructorPrototype(o);
 
	} catch (e) {
 
		return false;
 
	}
 
};
 

	
 
var keysShim = function keys(object) {
 
	var isObject = object !== null && typeof object === 'object';
 
	var isFunction = toStr.call(object) === '[object Function]';
 
	var isArguments = isArgs(object);
 
	var isString = isObject && toStr.call(object) === '[object String]';
 
	var theKeys = [];
 

	
 
	if (!isObject && !isFunction && !isArguments) {
 
		throw new TypeError('Object.keys called on a non-object');
 
	}
 

	
 
	var skipProto = hasProtoEnumBug && isFunction;
 
	if (isString && object.length > 0 && !has.call(object, 0)) {
 
		for (var i = 0; i < object.length; ++i) {
 
			theKeys.push(String(i));
 
		}
 
	}
 

	
 
	if (isArguments && object.length > 0) {
 
		for (var j = 0; j < object.length; ++j) {
 
			theKeys.push(String(j));
 
		}
 
	} else {
 
		for (var name in object) {
 
			if (!(skipProto && name === 'prototype') && has.call(object, name)) {
 
				theKeys.push(String(name));
 
			}
 
		}
 
	}
 

	
 
	if (hasDontEnumBug) {
 
		var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
 

	
 
		for (var k = 0; k < dontEnums.length; ++k) {
 
			if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
 
				theKeys.push(dontEnums[k]);
 
			}
 
		}
 
	}
 
	return theKeys;
 
};
 

	
 
keysShim.shim = function shimObjectKeys() {
 
	if (!Object.keys) {
 
		Object.keys = keysShim;
 
	} else {
 
		var keysWorksWithArguments = (function () {
 
			// Safari 5.0 bug
 
			return (Object.keys(arguments) || '').length === 2;
 
		}(1, 2));
 
		if (!keysWorksWithArguments) {
 
			var originalKeys = Object.keys;
 
			Object.keys = function keys(object) {
 
				if (isArgs(object)) {
 
					return originalKeys(slice.call(object));
 
				} else {
 
					return originalKeys(object);
 
				}
 
			};
 
		}
 
	}
 
	return Object.keys || keysShim;
 
};
 

	
 
module.exports = keysShim;
 

	
 
},{"./isArguments":47}],47:[function(_dereq_,module,exports){
 
'use strict';
 

	
 
var toStr = Object.prototype.toString;
 

	
 
module.exports = function isArguments(value) {
 
	var str = toStr.call(value);
 
	var isArgs = str === '[object Arguments]';
 
	if (!isArgs) {
 
		isArgs = str !== '[object Array]' &&
 
			value !== null &&
 
			typeof value === 'object' &&
 
			typeof value.length === 'number' &&
 
			value.length >= 0 &&
 
			toStr.call(value.callee) === '[object Function]';
 
	}
 
	return isArgs;
 
};
 

	
 
},{}],48:[function(_dereq_,module,exports){
 
module.exports = SafeParseTuple
 

	
 
function SafeParseTuple(obj, reviver) {
 
    var json
 
    var error = null
 

	
 
    try {
 
        json = JSON.parse(obj, reviver)
 
    } catch (err) {
 
        error = err
 
    }
 

	
 
    return [error, json]
 
}
 

	
 
},{}],49:[function(_dereq_,module,exports){
 
function clean (s) {
 
  return s.replace(/\n\r?\s*/g, '')
 
}
 

	
 

	
 
module.exports = function tsml (sa) {
 
  var s = ''
 
    , i = 0
 

	
 
  for (; i < arguments.length; i++)
 
    s += clean(sa[i]) + (arguments[i + 1] || '')
 

	
 
  return s
 
}
 
},{}],50:[function(_dereq_,module,exports){
 
"use strict";
 
var window = _dereq_("global/window")
 
var once = _dereq_("once")
 
var parseHeaders = _dereq_("parse-headers")
 

	
 

	
 

	
 
module.exports = createXHR
 
createXHR.XMLHttpRequest = window.XMLHttpRequest || noop
 
createXHR.XDomainRequest = "withCredentials" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window.XDomainRequest
 

	
 

	
 
function isEmpty(obj){
 
    for(var i in obj){
 
        if(obj.hasOwnProperty(i)) return false
 
    }
 
    return true
 
}
 

	
 
function createXHR(options, callback) {
 
    function readystatechange() {
 
        if (xhr.readyState === 4) {
 
            loadFunc()
 
        }
 
    }
 

	
 
    function getBody() {
 
        // Chrome with requestType=blob throws errors arround when even testing access to responseText
 
        var body = undefined
 

	
 
        if (xhr.response) {
 
            body = xhr.response
 
        } else if (xhr.responseType === "text" || !xhr.responseType) {
 
            body = xhr.responseText || xhr.responseXML
 
        }
 

	
 
        if (isJson) {
 
            try {
 
                body = JSON.parse(body)
 
            } catch (e) {}
 
        }
 

	
 
        return body
 
    }
 

	
 
    var failureResponse = {
 
                body: undefined,
 
                headers: {},
 
                statusCode: 0,
 
                method: method,
 
                url: uri,
 
                rawRequest: xhr
 
            }
 

	
 
    function errorFunc(evt) {
 
        clearTimeout(timeoutTimer)
 
        if(!(evt instanceof Error)){
 
            evt = new Error("" + (evt || "Unknown XMLHttpRequest Error") )
 
        }
 
        evt.statusCode = 0
 
        callback(evt, failureResponse)
 
    }
 

	
 
    // will load the data & process the response in a special response object
 
    function loadFunc() {
 
        if (aborted) return
 
        var status
 
        clearTimeout(timeoutTimer)
 
        if(options.useXDR && xhr.status===undefined) {
 
            //IE8 CORS GET successful response doesn't have a status field, but body is fine
 
            status = 200
 
        } else {
 
            status = (xhr.status === 1223 ? 204 : xhr.status)
 
        }
 
        var response = failureResponse
 
        var err = null
 

	
 
        if (status !== 0){
 
            response = {
 
                body: getBody(),
 
                statusCode: status,
 
                method: method,
 
                headers: {},
 
                url: uri,
 
                rawRequest: xhr
 
            }
 
            if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE
 
                response.headers = parseHeaders(xhr.getAllResponseHeaders())
 
            }
 
        } else {
 
            err = new Error("Internal XMLHttpRequest Error")
 
        }
 
        callback(err, response, response.body)
 

	
 
    }
 

	
 
    if (typeof options === "string") {
 
        options = { uri: options }
 
    }
 

	
 
    options = options || {}
 
    if(typeof callback === "undefined"){
 
        throw new Error("callback argument missing")
 
    }
 
    callback = once(callback)
 

	
 
    var xhr = options.xhr || null
 

	
 
    if (!xhr) {
 
        if (options.cors || options.useXDR) {
 
            xhr = new createXHR.XDomainRequest()
 
        }else{
 
            xhr = new createXHR.XMLHttpRequest()
 
        }
 
    }
 

	
 
    var key
 
    var aborted
 
    var uri = xhr.url = options.uri || options.url
 
    var method = xhr.method = options.method || "GET"
 
    var body = options.body || options.data
 
    var headers = xhr.headers = options.headers || {}
 
    var sync = !!options.sync
 
    var isJson = false
 
    var timeoutTimer
 

	
 
    if ("json" in options) {
 
        isJson = true
 
        headers["accept"] || headers["Accept"] || (headers["Accept"] = "application/json") //Don't override existing accept header declared by user
 
        if (method !== "GET" && method !== "HEAD") {
 
            headers["content-type"] || headers["Content-Type"] || (headers["Content-Type"] = "application/json") //Don't override existing accept header declared by user
 
            body = JSON.stringify(options.json)
 
        }
 
    }
 

	
 
    xhr.onreadystatechange = readystatechange
 
    xhr.onload = loadFunc
 
    xhr.onerror = errorFunc
 
    // IE9 must have onprogress be set to a unique function.
 
    xhr.onprogress = function () {
 
        // IE must die
 
    }
 
    xhr.ontimeout = errorFunc
 
    xhr.open(method, uri, !sync, options.username, options.password)
 
    //has to be after open
 
    if(!sync) {
 
        xhr.withCredentials = !!options.withCredentials
 
    }
 
    // Cannot set timeout with sync request
 
    // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly
 
    // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent
 
    if (!sync && options.timeout > 0 ) {
 
        timeoutTimer = setTimeout(function(){
 
            aborted=true//IE9 may still call readystatechange
 
            xhr.abort("timeout")
 
            var e = new Error("XMLHttpRequest timeout")
 
            e.code = "ETIMEDOUT"
 
            errorFunc(e)
 
        }, options.timeout )
 
    }
 

	
 
    if (xhr.setRequestHeader) {
 
        for(key in headers){
 
            if(headers.hasOwnProperty(key)){
 
                xhr.setRequestHeader(key, headers[key])
 
            }
 
        }
 
    } else if (options.headers && !isEmpty(options.headers)) {
 
        throw new Error("Headers cannot be set on an XDomainRequest object")
 
    }
 

	
 
    if ("responseType" in options) {
 
        xhr.responseType = options.responseType
 
    }
 

	
 
    if ("beforeSend" in options &&
 
        typeof options.beforeSend === "function"
 
    ) {
 
        options.beforeSend(xhr)
 
    }
 

	
 
    xhr.send(body)
 

	
 
    return xhr
 

	
 

	
 
}
 

	
 
function noop() {}
 

	
 
},{"global/window":2,"once":51,"parse-headers":55}],51:[function(_dereq_,module,exports){
 
module.exports = once
 

	
 
once.proto = once(function () {
 
  Object.defineProperty(Function.prototype, 'once', {
 
    value: function () {
 
      return once(this)
 
    },
 
    configurable: true
 
  })
 
})
 

	
 
function once (fn) {
 
  var called = false
 
  return function () {
 
    if (called) return
 
    called = true
 
    return fn.apply(this, arguments)
 
  }
 
}
 

	
 
},{}],52:[function(_dereq_,module,exports){
 
var isFunction = _dereq_('is-function')
 

	
 
module.exports = forEach
 

	
 
var toString = Object.prototype.toString
 
var hasOwnProperty = Object.prototype.hasOwnProperty
 

	
 
function forEach(list, iterator, context) {
 
    if (!isFunction(iterator)) {
 
        throw new TypeError('iterator must be a function')
 
    }
 

	
 
    if (arguments.length < 3) {
 
        context = this
 
    }
 
    
 
    if (toString.call(list) === '[object Array]')
 
        forEachArray(list, iterator, context)
 
    else if (typeof list === 'string')
 
        forEachString(list, iterator, context)
 
    else
 
        forEachObject(list, iterator, context)
 
}
 

	
 
function forEachArray(array, iterator, context) {
 
    for (var i = 0, len = array.length; i < len; i++) {
 
        if (hasOwnProperty.call(array, i)) {
 
            iterator.call(context, array[i], i, array)
 
        }
 
    }
 
}
 

	
 
function forEachString(string, iterator, context) {
 
    for (var i = 0, len = string.length; i < len; i++) {
 
        // no such thing as a sparse string.
 
        iterator.call(context, string.charAt(i), i, string)
 
    }
 
}
 

	
 
function forEachObject(object, iterator, context) {
 
    for (var k in object) {
 
        if (hasOwnProperty.call(object, k)) {
 
            iterator.call(context, object[k], k, object)
 
        }
 
    }
 
}
 

	
 
},{"is-function":53}],53:[function(_dereq_,module,exports){
 
module.exports = isFunction
 

	
 
var toString = Object.prototype.toString
 

	
 
function isFunction (fn) {
 
  var string = toString.call(fn)
 
  return string === '[object Function]' ||
 
    (typeof fn === 'function' && string !== '[object RegExp]') ||
 
    (typeof window !== 'undefined' &&
 
     // IE8 and below
 
     (fn === window.setTimeout ||
 
      fn === window.alert ||
 
      fn === window.confirm ||
 
      fn === window.prompt))
 
};
 

	
 
},{}],54:[function(_dereq_,module,exports){
 

	
 
exports = module.exports = trim;
 

	
 
function trim(str){
 
  return str.replace(/^\s*|\s*$/g, '');
 
}
 

	
 
exports.left = function(str){
 
  return str.replace(/^\s*/, '');
 
};
 

	
 
exports.right = function(str){
 
  return str.replace(/\s*$/, '');
 
};
 

	
 
},{}],55:[function(_dereq_,module,exports){
 
var trim = _dereq_('trim')
 
  , forEach = _dereq_('for-each')
 
  , isArray = function(arg) {
 
      return Object.prototype.toString.call(arg) === '[object Array]';
 
    }
 

	
 
module.exports = function (headers) {
 
  if (!headers)
 
    return {}
 

	
 
  var result = {}
 

	
 
  forEach(
 
      trim(headers).split('\n')
 
    , function (row) {
 
        var index = row.indexOf(':')
 
          , key = trim(row.slice(0, index)).toLowerCase()
 
          , value = trim(row.slice(index + 1))
 

	
 
        if (typeof(result[key]) === 'undefined') {
 
          result[key] = value
 
        } else if (isArray(result[key])) {
 
          result[key].push(value)
 
        } else {
 
          result[key] = [ result[key], value ]
 
        }
 
      }
 
  )
 

	
 
  return result
 
}
 
},{"for-each":52,"trim":54}],56:[function(_dereq_,module,exports){
 
/**
 
 * @file big-play-button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _buttonJs = _dereq_('./button.js');
 

	
 
var _buttonJs2 = _interopRequireDefault(_buttonJs);
 

	
 
var _componentJs = _dereq_('./component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * Initial play button. Shows before the video has played. The hiding of the
 
 * big play button is done via CSS and player states.
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @extends Button
 
 * @class BigPlayButton
 
 */
 

	
 
var BigPlayButton = (function (_Button) {
 
  _inherits(BigPlayButton, _Button);
 

	
 
  function BigPlayButton(player, options) {
 
    _classCallCheck(this, BigPlayButton);
 

	
 
    _Button.call(this, player, options);
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  BigPlayButton.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-big-play-button';
 
  };
 

	
 
  /**
 
   * Handles click for play
 
   *
 
   * @method handleClick
 
   */
 

	
 
  BigPlayButton.prototype.handleClick = function handleClick() {
 
    this.player_.play();
 
  };
 

	
 
  return BigPlayButton;
 
})(_buttonJs2['default']);
 

	
 
BigPlayButton.prototype.controlText_ = 'Play Video';
 

	
 
_componentJs2['default'].registerComponent('BigPlayButton', BigPlayButton);
 
exports['default'] = BigPlayButton;
 
module.exports = exports['default'];
 

	
 
},{"./button.js":57,"./component.js":58}],57:[function(_dereq_,module,exports){
 
/**
 
 * @file button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _component = _dereq_('./component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _utilsDomJs = _dereq_('./utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsEventsJs = _dereq_('./utils/events.js');
 

	
 
var Events = _interopRequireWildcard(_utilsEventsJs);
 

	
 
var _utilsFnJs = _dereq_('./utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
/**
 
 * Base class for all buttons
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @extends Component
 
 * @class Button
 
 */
 

	
 
var Button = (function (_Component) {
 
  _inherits(Button, _Component);
 

	
 
  function Button(player, options) {
 
    _classCallCheck(this, Button);
 

	
 
    _Component.call(this, player, options);
 

	
 
    this.emitTapEvents();
 

	
 
    this.on('tap', this.handleClick);
 
    this.on('click', this.handleClick);
 
    this.on('focus', this.handleFocus);
 
    this.on('blur', this.handleBlur);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @param {String=} type Element's node type. e.g. 'div'
 
   * @param {Object=} props An object of element attributes that should be set on the element Tag name
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  Button.prototype.createEl = function createEl() {
 
    var tag = arguments.length <= 0 || arguments[0] === undefined ? 'button' : arguments[0];
 
    var props = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
 
    var attributes = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
 

	
 
    props = _objectAssign2['default']({
 
      className: this.buildCSSClass(),
 
      tabIndex: 0
 
    }, props);
 

	
 
    // Add standard Aria info
 
    attributes = _objectAssign2['default']({
 
      role: 'button',
 
      type: 'button', // Necessary since the default button type is "submit"
 
      'aria-live': 'polite' // let the screen reader user know that the text of the button may change
 
    }, attributes);
 

	
 
    var el = _Component.prototype.createEl.call(this, tag, props, attributes);
 

	
 
    this.controlTextEl_ = Dom.createEl('span', {
 
      className: 'vjs-control-text'
 
    });
 

	
 
    el.appendChild(this.controlTextEl_);
 

	
 
    this.controlText(this.controlText_);
 

	
 
    return el;
 
  };
 

	
 
  /**
 
   * Controls text - both request and localize
 
   *
 
   * @param {String} text Text for button
 
   * @return {String}
 
   * @method controlText
 
   */
 

	
 
  Button.prototype.controlText = function controlText(text) {
 
    if (!text) return this.controlText_ || 'Need Text';
 

	
 
    this.controlText_ = text;
 
    this.controlTextEl_.innerHTML = this.localize(this.controlText_);
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Allows sub components to stack CSS class names
 
   *
 
   * @return {String}
 
   * @method buildCSSClass
 
   */
 

	
 
  Button.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-control vjs-button ' + _Component.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Handle Click - Override with specific functionality for button
 
   *
 
   * @method handleClick
 
   */
 

	
 
  Button.prototype.handleClick = function handleClick() {};
 

	
 
  /**
 
   * Handle Focus - Add keyboard functionality to element
 
   *
 
   * @method handleFocus
 
   */
 

	
 
  Button.prototype.handleFocus = function handleFocus() {
 
    Events.on(_globalDocument2['default'], 'keydown', Fn.bind(this, this.handleKeyPress));
 
  };
 

	
 
  /**
 
   * Handle KeyPress (document level) - Trigger click when keys are pressed
 
   *
 
   * @method handleKeyPress
 
   */
 

	
 
  Button.prototype.handleKeyPress = function handleKeyPress(event) {
 
    // Check for space bar (32) or enter (13) keys
 
    if (event.which === 32 || event.which === 13) {
 
      event.preventDefault();
 
      this.handleClick(event);
 
    }
 
  };
 

	
 
  /**
 
   * Handle Blur - Remove keyboard triggers
 
   *
 
   * @method handleBlur
 
   */
 

	
 
  Button.prototype.handleBlur = function handleBlur() {
 
    Events.off(_globalDocument2['default'], 'keydown', Fn.bind(this, this.handleKeyPress));
 
  };
 

	
 
  return Button;
 
})(_component2['default']);
 

	
 
_component2['default'].registerComponent('Button', Button);
 
exports['default'] = Button;
 
module.exports = exports['default'];
 

	
 
},{"./component":58,"./utils/dom.js":118,"./utils/events.js":119,"./utils/fn.js":120,"global/document":1,"object.assign":43}],58:[function(_dereq_,module,exports){
 
/**
 
 * @file component.js
 
 *
 
 * Player Component - Base class for all UI objects
 
 */
 

	
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _utilsDomJs = _dereq_('./utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFnJs = _dereq_('./utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsGuidJs = _dereq_('./utils/guid.js');
 

	
 
var Guid = _interopRequireWildcard(_utilsGuidJs);
 

	
 
var _utilsEventsJs = _dereq_('./utils/events.js');
 

	
 
var Events = _interopRequireWildcard(_utilsEventsJs);
 

	
 
var _utilsLogJs = _dereq_('./utils/log.js');
 

	
 
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
 

	
 
var _utilsToTitleCaseJs = _dereq_('./utils/to-title-case.js');
 

	
 
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
var _utilsMergeOptionsJs = _dereq_('./utils/merge-options.js');
 

	
 
var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs);
 

	
 
/**
 
 * Base UI Component class
 
 * Components are embeddable UI objects that are represented by both a
 
 * javascript object and an element in the DOM. They can be children of other
 
 * components, and can have many children themselves.
 
 * ```js
 
 *     // adding a button to the player
 
 *     var button = player.addChild('button');
 
 *     button.el(); // -> button element
 
 * ```
 
 * ```html
 
 *     <div class="video-js">
 
 *       <div class="vjs-button">Button</div>
 
 *     </div>
 
 * ```
 
 * Components are also event targets.
 
 * ```js
 
 *     button.on('click', function(){
 
 *       console.log('Button Clicked!');
 
 *     });
 
 *     button.trigger('customevent');
 
 * ```
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @class Component
 
 */
 

	
 
var Component = (function () {
 
  function Component(player, options, ready) {
 
    _classCallCheck(this, Component);
 

	
 
    // The component might be the player itself and we can't pass `this` to super
 
    if (!player && this.play) {
 
      this.player_ = player = this; // eslint-disable-line
 
    } else {
 
        this.player_ = player;
 
      }
 

	
 
    // Make a copy of prototype.options_ to protect against overriding defaults
 
    this.options_ = _utilsMergeOptionsJs2['default']({}, this.options_);
 

	
 
    // Updated options with supplied options
 
    options = this.options_ = _utilsMergeOptionsJs2['default'](this.options_, options);
 

	
 
    // Get ID from options or options element if one is supplied
 
    this.id_ = options.id || options.el && options.el.id;
 

	
 
    // If there was no ID from the options, generate one
 
    if (!this.id_) {
 
      // Don't require the player ID function in the case of mock players
 
      var id = player && player.id && player.id() || 'no_player';
 

	
 
      this.id_ = id + '_component_' + Guid.newGUID();
 
    }
 

	
 
    this.name_ = options.name || null;
 

	
 
    // Create element if one wasn't provided in options
 
    if (options.el) {
 
      this.el_ = options.el;
 
    } else if (options.createEl !== false) {
 
      this.el_ = this.createEl();
 
    }
 

	
 
    this.children_ = [];
 
    this.childIndex_ = {};
 
    this.childNameIndex_ = {};
 

	
 
    // Add any child components in options
 
    if (options.initChildren !== false) {
 
      this.initChildren();
 
    }
 

	
 
    this.ready(ready);
 
    // Don't want to trigger ready here or it will before init is actually
 
    // finished for all children that run this constructor
 

	
 
    if (options.reportTouchActivity !== false) {
 
      this.enableTouchActivity();
 
    }
 
  }
 

	
 
  /**
 
   * Dispose of the component and all child components
 
   *
 
   * @method dispose
 
   */
 

	
 
  Component.prototype.dispose = function dispose() {
 
    this.trigger({ type: 'dispose', bubbles: false });
 

	
 
    // Dispose all children.
 
    if (this.children_) {
 
      for (var i = this.children_.length - 1; i >= 0; i--) {
 
        if (this.children_[i].dispose) {
 
          this.children_[i].dispose();
 
        }
 
      }
 
    }
 

	
 
    // Delete child references
 
    this.children_ = null;
 
    this.childIndex_ = null;
 
    this.childNameIndex_ = null;
 

	
 
    // Remove all event listeners.
 
    this.off();
 

	
 
    // Remove element from DOM
 
    if (this.el_.parentNode) {
 
      this.el_.parentNode.removeChild(this.el_);
 
    }
 

	
 
    Dom.removeElData(this.el_);
 
    this.el_ = null;
 
  };
 

	
 
  /**
 
   * Return the component's player
 
   *
 
   * @return {Player}
 
   * @method player
 
   */
 

	
 
  Component.prototype.player = function player() {
 
    return this.player_;
 
  };
 

	
 
  /**
 
   * Deep merge of options objects
 
   * Whenever a property is an object on both options objects
 
   * the two properties will be merged using mergeOptions.
 
   *
 
   * ```js
 
   *     Parent.prototype.options_ = {
 
   *       optionSet: {
 
   *         'childOne': { 'foo': 'bar', 'asdf': 'fdsa' },
 
   *         'childTwo': {},
 
   *         'childThree': {}
 
   *       }
 
   *     }
 
   *     newOptions = {
 
   *       optionSet: {
 
   *         'childOne': { 'foo': 'baz', 'abc': '123' }
 
   *         'childTwo': null,
 
   *         'childFour': {}
 
   *       }
 
   *     }
 
   *
 
   *     this.options(newOptions);
 
   * ```
 
   * RESULT
 
   * ```js
 
   *     {
 
   *       optionSet: {
 
   *         'childOne': { 'foo': 'baz', 'asdf': 'fdsa', 'abc': '123' },
 
   *         'childTwo': null, // Disabled. Won't be initialized.
 
   *         'childThree': {},
 
   *         'childFour': {}
 
   *       }
 
   *     }
 
   * ```
 
   *
 
   * @param  {Object} obj Object of new option values
 
   * @return {Object}     A NEW object of this.options_ and obj merged
 
   * @method options
 
   */
 

	
 
  Component.prototype.options = function options(obj) {
 
    _utilsLogJs2['default'].warn('this.options() has been deprecated and will be moved to the constructor in 6.0');
 

	
 
    if (!obj) {
 
      return this.options_;
 
    }
 

	
 
    this.options_ = _utilsMergeOptionsJs2['default'](this.options_, obj);
 
    return this.options_;
 
  };
 

	
 
  /**
 
   * Get the component's DOM element
 
   * ```js
 
   *     var domEl = myComponent.el();
 
   * ```
 
   *
 
   * @return {Element}
 
   * @method el
 
   */
 

	
 
  Component.prototype.el = function el() {
 
    return this.el_;
 
  };
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @param  {String=} tagName  Element's node type. e.g. 'div'
 
   * @param  {Object=} properties An object of properties that should be set
 
   * @param  {Object=} attributes An object of attributes that should be set
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  Component.prototype.createEl = function createEl(tagName, properties, attributes) {
 
    return Dom.createEl(tagName, properties, attributes);
 
  };
 

	
 
  Component.prototype.localize = function localize(string) {
 
    var code = this.player_.language && this.player_.language();
 
    var languages = this.player_.languages && this.player_.languages();
 

	
 
    if (!code || !languages) {
 
      return string;
 
    }
 

	
 
    var language = languages[code];
 

	
 
    if (language && language[string]) {
 
      return language[string];
 
    }
 

	
 
    var primaryCode = code.split('-')[0];
 
    var primaryLang = languages[primaryCode];
 

	
 
    if (primaryLang && primaryLang[string]) {
 
      return primaryLang[string];
 
    }
 

	
 
    return string;
 
  };
 

	
 
  /**
 
   * Return the component's DOM element where children are inserted.
 
   * Will either be the same as el() or a new element defined in createEl().
 
   *
 
   * @return {Element}
 
   * @method contentEl
 
   */
 

	
 
  Component.prototype.contentEl = function contentEl() {
 
    return this.contentEl_ || this.el_;
 
  };
 

	
 
  /**
 
   * Get the component's ID
 
   * ```js
 
   *     var id = myComponent.id();
 
   * ```
 
   *
 
   * @return {String}
 
   * @method id
 
   */
 

	
 
  Component.prototype.id = function id() {
 
    return this.id_;
 
  };
 

	
 
  /**
 
   * Get the component's name. The name is often used to reference the component.
 
   * ```js
 
   *     var name = myComponent.name();
 
   * ```
 
   *
 
   * @return {String}
 
   * @method name
 
   */
 

	
 
  Component.prototype.name = function name() {
 
    return this.name_;
 
  };
 

	
 
  /**
 
   * Get an array of all child components
 
   * ```js
 
   *     var kids = myComponent.children();
 
   * ```
 
   *
 
   * @return {Array} The children
 
   * @method children
 
   */
 

	
 
  Component.prototype.children = function children() {
 
    return this.children_;
 
  };
 

	
 
  /**
 
   * Returns a child component with the provided ID
 
   *
 
   * @return {Component}
 
   * @method getChildById
 
   */
 

	
 
  Component.prototype.getChildById = function getChildById(id) {
 
    return this.childIndex_[id];
 
  };
 

	
 
  /**
 
   * Returns a child component with the provided name
 
   *
 
   * @return {Component}
 
   * @method getChild
 
   */
 

	
 
  Component.prototype.getChild = function getChild(name) {
 
    return this.childNameIndex_[name];
 
  };
 

	
 
  /**
 
   * Adds a child component inside this component
 
   * ```js
 
   *     myComponent.el();
 
   *     // -> <div class='my-component'></div>
 
   *     myComponent.children();
 
   *     // [empty array]
 
   *
 
   *     var myButton = myComponent.addChild('MyButton');
 
   *     // -> <div class='my-component'><div class="my-button">myButton<div></div>
 
   *     // -> myButton === myComponent.children()[0];
 
   * ```
 
   * Pass in options for child constructors and options for children of the child
 
   * ```js
 
   *     var myButton = myComponent.addChild('MyButton', {
 
   *       text: 'Press Me',
 
   *       buttonChildExample: {
 
   *         buttonChildOption: true
 
   *       }
 
   *     });
 
   * ```
 
   *
 
   * @param {String|Component} child The class name or instance of a child to add
 
   * @param {Object=} options Options, including options to be passed to children of the child.
 
   * @return {Component} The child component (created by this process if a string was used)
 
   * @method addChild
 
   */
 

	
 
  Component.prototype.addChild = function addChild(child) {
 
    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
 

	
 
    var component = undefined;
 
    var componentName = undefined;
 

	
 
    // If child is a string, create nt with options
 
    if (typeof child === 'string') {
 
      componentName = child;
 

	
 
      // Options can also be specified as a boolean, so convert to an empty object if false.
 
      if (!options) {
 
        options = {};
 
      }
 

	
 
      // Same as above, but true is deprecated so show a warning.
 
      if (options === true) {
 
        _utilsLogJs2['default'].warn('Initializing a child component with `true` is deprecated. Children should be defined in an array when possible, but if necessary use an object instead of `true`.');
 
        options = {};
 
      }
 

	
 
      // If no componentClass in options, assume componentClass is the name lowercased
 
      // (e.g. playButton)
 
      var componentClassName = options.componentClass || _utilsToTitleCaseJs2['default'](componentName);
 

	
 
      // Set name through options
 
      options.name = componentName;
 

	
 
      // Create a new object & element for this controls set
 
      // If there's no .player_, this is a player
 
      var ComponentClass = Component.getComponent(componentClassName);
 

	
 
      component = new ComponentClass(this.player_ || this, options);
 

	
 
      // child is a component instance
 
    } else {
 
        component = child;
 
      }
 

	
 
    this.children_.push(component);
 

	
 
    if (typeof component.id === 'function') {
 
      this.childIndex_[component.id()] = component;
 
    }
 

	
 
    // If a name wasn't used to create the component, check if we can use the
 
    // name function of the component
 
    componentName = componentName || component.name && component.name();
 

	
 
    if (componentName) {
 
      this.childNameIndex_[componentName] = component;
 
    }
 

	
 
    // Add the UI object's element to the container div (box)
 
    // Having an element is not required
 
    if (typeof component.el === 'function' && component.el()) {
 
      this.contentEl().appendChild(component.el());
 
    }
 

	
 
    // Return so it can stored on parent object if desired.
 
    return component;
 
  };
 

	
 
  /**
 
   * Remove a child component from this component's list of children, and the
 
   * child component's element from this component's element
 
   *
 
   * @param  {Component} component Component to remove
 
   * @method removeChild
 
   */
 

	
 
  Component.prototype.removeChild = function removeChild(component) {
 
    if (typeof component === 'string') {
 
      component = this.getChild(component);
 
    }
 

	
 
    if (!component || !this.children_) {
 
      return;
 
    }
 

	
 
    var childFound = false;
 

	
 
    for (var i = this.children_.length - 1; i >= 0; i--) {
 
      if (this.children_[i] === component) {
 
        childFound = true;
 
        this.children_.splice(i, 1);
 
        break;
 
      }
 
    }
 

	
 
    if (!childFound) {
 
      return;
 
    }
 

	
 
    this.childIndex_[component.id()] = null;
 
    this.childNameIndex_[component.name()] = null;
 

	
 
    var compEl = component.el();
 

	
 
    if (compEl && compEl.parentNode === this.contentEl()) {
 
      this.contentEl().removeChild(component.el());
 
    }
 
  };
 

	
 
  /**
 
   * Add and initialize default child components from options
 
   * ```js
 
   *     // when an instance of MyComponent is created, all children in options
 
   *     // will be added to the instance by their name strings and options
 
   *     MyComponent.prototype.options_ = {
 
   *       children: [
 
   *         'myChildComponent'
 
   *       ],
 
   *       myChildComponent: {
 
   *         myChildOption: true
 
   *       }
 
   *     };
 
   *
 
   *     // Or when creating the component
 
   *     var myComp = new MyComponent(player, {
 
   *       children: [
 
   *         'myChildComponent'
 
   *       ],
 
   *       myChildComponent: {
 
   *         myChildOption: true
 
   *       }
 
   *     });
 
   * ```
 
   * The children option can also be an array of
 
   * child options objects (that also include a 'name' key).
 
   * This can be used if you have two child components of the
 
   * same type that need different options.
 
   * ```js
 
   *     var myComp = new MyComponent(player, {
 
   *       children: [
 
   *         'button',
 
   *         {
 
   *           name: 'button',
 
   *           someOtherOption: true
 
   *         },
 
   *         {
 
   *           name: 'button',
 
   *           someOtherOption: false
 
   *         }
 
   *       ]
 
   *     });
 
   * ```
 
   *
 
   * @method initChildren
 
   */
 

	
 
  Component.prototype.initChildren = function initChildren() {
 
    var _this = this;
 

	
 
    var children = this.options_.children;
 

	
 
    if (children) {
 
      (function () {
 
        // `this` is `parent`
 
        var parentOptions = _this.options_;
 

	
 
        var handleAdd = function handleAdd(name, opts) {
 
          // Allow options for children to be set at the parent options
 
          // e.g. videojs(id, { controlBar: false });
 
          // instead of videojs(id, { children: { controlBar: false });
 
          if (parentOptions[name] !== undefined) {
 
            opts = parentOptions[name];
 
          }
 

	
 
          // Allow for disabling default components
 
          // e.g. options['children']['posterImage'] = false
 
          if (opts === false) {
 
            return;
 
          }
 

	
 
          // Allow options to be passed as a simple boolean if no configuration
 
          // is necessary.
 
          if (opts === true) {
 
            opts = {};
 
          }
 

	
 
          // We also want to pass the original player options to each component as well so they don't need to
 
          // reach back into the player for options later.
 
          opts.playerOptions = _this.options_.playerOptions;
 

	
 
          // Create and add the child component.
 
          // Add a direct reference to the child by name on the parent instance.
 
          // If two of the same component are used, different names should be supplied
 
          // for each
 
          _this[name] = _this.addChild(name, opts);
 
        };
 

	
 
        // Allow for an array of children details to passed in the options
 
        if (Array.isArray(children)) {
 
          for (var i = 0; i < children.length; i++) {
 
            var child = children[i];
 
            var _name = undefined;
 
            var opts = undefined;
 

	
 
            if (typeof child === 'string') {
 
              // ['myComponent']
 
              _name = child;
 
              opts = {};
 
            } else {
 
              // [{ name: 'myComponent', otherOption: true }]
 
              _name = child.name;
 
              opts = child;
 
            }
 

	
 
            handleAdd(_name, opts);
 
          }
 
        } else {
 
          Object.getOwnPropertyNames(children).forEach(function (name) {
 
            handleAdd(name, children[name]);
 
          });
 
        }
 
      })();
 
    }
 
  };
 

	
 
  /**
 
   * Allows sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  Component.prototype.buildCSSClass = function buildCSSClass() {
 
    // Child classes can include a function that does:
 
    // return 'CLASS NAME' + this._super();
 
    return '';
 
  };
 

	
 
  /**
 
   * Add an event listener to this component's element
 
   * ```js
 
   *     var myFunc = function(){
 
   *       var myComponent = this;
 
   *       // Do something when the event is fired
 
   *     };
 
   *
 
   *     myComponent.on('eventType', myFunc);
 
   * ```
 
   * The context of myFunc will be myComponent unless previously bound.
 
   * Alternatively, you can add a listener to another element or component.
 
   * ```js
 
   *     myComponent.on(otherElement, 'eventName', myFunc);
 
   *     myComponent.on(otherComponent, 'eventName', myFunc);
 
   * ```
 
   * The benefit of using this over `VjsEvents.on(otherElement, 'eventName', myFunc)`
 
   * and `otherComponent.on('eventName', myFunc)` is that this way the listeners
 
   * will be automatically cleaned up when either component is disposed.
 
   * It will also bind myComponent as the context of myFunc.
 
   * **NOTE**: When using this on elements in the page other than window
 
   * and document (both permanent), if you remove the element from the DOM
 
   * you need to call `myComponent.trigger(el, 'dispose')` on it to clean up
 
   * references to it and allow the browser to garbage collect it.
 
   *
 
   * @param  {String|Component} first   The event type or other component
 
   * @param  {Function|String}      second  The event handler or event type
 
   * @param  {Function}             third   The event handler
 
   * @return {Component}
 
   * @method on
 
   */
 

	
 
  Component.prototype.on = function on(first, second, third) {
 
    var _this2 = this;
 

	
 
    if (typeof first === 'string' || Array.isArray(first)) {
 
      Events.on(this.el_, first, Fn.bind(this, second));
 

	
 
      // Targeting another component or element
 
    } else {
 
        (function () {
 
          var target = first;
 
          var type = second;
 
          var fn = Fn.bind(_this2, third);
 

	
 
          // When this component is disposed, remove the listener from the other component
 
          var removeOnDispose = function removeOnDispose() {
 
            return _this2.off(target, type, fn);
 
          };
 

	
 
          // Use the same function ID so we can remove it later it using the ID
 
          // of the original listener
 
          removeOnDispose.guid = fn.guid;
 
          _this2.on('dispose', removeOnDispose);
 

	
 
          // If the other component is disposed first we need to clean the reference
 
          // to the other component in this component's removeOnDispose listener
 
          // Otherwise we create a memory leak.
 
          var cleanRemover = function cleanRemover() {
 
            return _this2.off('dispose', removeOnDispose);
 
          };
 

	
 
          // Add the same function ID so we can easily remove it later
 
          cleanRemover.guid = fn.guid;
 

	
 
          // Check if this is a DOM node
 
          if (first.nodeName) {
 
            // Add the listener to the other element
 
            Events.on(target, type, fn);
 
            Events.on(target, 'dispose', cleanRemover);
 

	
 
            // Should be a component
 
            // Not using `instanceof Component` because it makes mock players difficult
 
          } else if (typeof first.on === 'function') {
 
              // Add the listener to the other component
 
              target.on(type, fn);
 
              target.on('dispose', cleanRemover);
 
            }
 
        })();
 
      }
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Remove an event listener from this component's element
 
   * ```js
 
   *     myComponent.off('eventType', myFunc);
 
   * ```
 
   * If myFunc is excluded, ALL listeners for the event type will be removed.
 
   * If eventType is excluded, ALL listeners will be removed from the component.
 
   * Alternatively you can use `off` to remove listeners that were added to other
 
   * elements or components using `myComponent.on(otherComponent...`.
 
   * In this case both the event type and listener function are REQUIRED.
 
   * ```js
 
   *     myComponent.off(otherElement, 'eventType', myFunc);
 
   *     myComponent.off(otherComponent, 'eventType', myFunc);
 
   * ```
 
   *
 
   * @param  {String=|Component}  first  The event type or other component
 
   * @param  {Function=|String}       second The listener function or event type
 
   * @param  {Function=}              third  The listener for other component
 
   * @return {Component}
 
   * @method off
 
   */
 

	
 
  Component.prototype.off = function off(first, second, third) {
 
    if (!first || typeof first === 'string' || Array.isArray(first)) {
 
      Events.off(this.el_, first, second);
 
    } else {
 
      var target = first;
 
      var type = second;
 
      // Ensure there's at least a guid, even if the function hasn't been used
 
      var fn = Fn.bind(this, third);
 

	
 
      // Remove the dispose listener on this component,
 
      // which was given the same guid as the event listener
 
      this.off('dispose', fn);
 

	
 
      if (first.nodeName) {
 
        // Remove the listener
 
        Events.off(target, type, fn);
 
        // Remove the listener for cleaning the dispose listener
 
        Events.off(target, 'dispose', fn);
 
      } else {
 
        target.off(type, fn);
 
        target.off('dispose', fn);
 
      }
 
    }
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Add an event listener to be triggered only once and then removed
 
   * ```js
 
   *     myComponent.one('eventName', myFunc);
 
   * ```
 
   * Alternatively you can add a listener to another element or component
 
   * that will be triggered only once.
 
   * ```js
 
   *     myComponent.one(otherElement, 'eventName', myFunc);
 
   *     myComponent.one(otherComponent, 'eventName', myFunc);
 
   * ```
 
   *
 
   * @param  {String|Component}  first   The event type or other component
 
   * @param  {Function|String}       second  The listener function or event type
 
   * @param  {Function=}             third   The listener function for other component
 
   * @return {Component}
 
   * @method one
 
   */
 

	
 
  Component.prototype.one = function one(first, second, third) {
 
    var _this3 = this,
 
        _arguments = arguments;
 

	
 
    if (typeof first === 'string' || Array.isArray(first)) {
 
      Events.one(this.el_, first, Fn.bind(this, second));
 
    } else {
 
      (function () {
 
        var target = first;
 
        var type = second;
 
        var fn = Fn.bind(_this3, third);
 

	
 
        var newFunc = function newFunc() {
 
          _this3.off(target, type, newFunc);
 
          fn.apply(null, _arguments);
 
        };
 

	
 
        // Keep the same function ID so we can remove it later
 
        newFunc.guid = fn.guid;
 

	
 
        _this3.on(target, type, newFunc);
 
      })();
 
    }
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Trigger an event on an element
 
   * ```js
 
   *     myComponent.trigger('eventName');
 
   *     myComponent.trigger({'type':'eventName'});
 
   *     myComponent.trigger('eventName', {data: 'some data'});
 
   *     myComponent.trigger({'type':'eventName'}, {data: 'some data'});
 
   * ```
 
   *
 
   * @param  {Event|Object|String} event  A string (the type) or an event object with a type attribute
 
   * @param  {Object} [hash] data hash to pass along with the event
 
   * @return {Component}       self
 
   * @method trigger
 
   */
 

	
 
  Component.prototype.trigger = function trigger(event, hash) {
 
    Events.trigger(this.el_, event, hash);
 
    return this;
 
  };
 

	
 
  /**
 
   * Bind a listener to the component's ready state.
 
   * Different from event listeners in that if the ready event has already happened
 
   * it will trigger the function immediately.
 
   *
 
   * @param  {Function} fn Ready listener
 
   * @param  {Boolean} sync Exec the listener synchronously if component is ready
 
   * @return {Component}
 
   * @method ready
 
   */
 

	
 
  Component.prototype.ready = function ready(fn) {
 
    var sync = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];
 

	
 
    if (fn) {
 
      if (this.isReady_) {
 
        if (sync) {
 
          fn.call(this);
 
        } else {
 
          // Call the function asynchronously by default for consistency
 
          this.setTimeout(fn, 1);
 
        }
 
      } else {
 
        this.readyQueue_ = this.readyQueue_ || [];
 
        this.readyQueue_.push(fn);
 
      }
 
    }
 
    return this;
 
  };
 

	
 
  /**
 
   * Trigger the ready listeners
 
   *
 
   * @return {Component}
 
   * @method triggerReady
 
   */
 

	
 
  Component.prototype.triggerReady = function triggerReady() {
 
    this.isReady_ = true;
 

	
 
    // Ensure ready is triggerd asynchronously
 
    this.setTimeout(function () {
 
      var readyQueue = this.readyQueue_;
 

	
 
      // Reset Ready Queue
 
      this.readyQueue_ = [];
 

	
 
      if (readyQueue && readyQueue.length > 0) {
 
        readyQueue.forEach(function (fn) {
 
          fn.call(this);
 
        }, this);
 
      }
 

	
 
      // Allow for using event listeners also
 
      this.trigger('ready');
 
    }, 1);
 
  };
 

	
 
  /**
 
   * Check if a component's element has a CSS class name
 
   *
 
   * @param {String} classToCheck Classname to check
 
   * @return {Component}
 
   * @method hasClass
 
   */
 

	
 
  Component.prototype.hasClass = function hasClass(classToCheck) {
 
    return Dom.hasElClass(this.el_, classToCheck);
 
  };
 

	
 
  /**
 
   * Add a CSS class name to the component's element
 
   *
 
   * @param {String} classToAdd Classname to add
 
   * @return {Component}
 
   * @method addClass
 
   */
 

	
 
  Component.prototype.addClass = function addClass(classToAdd) {
 
    Dom.addElClass(this.el_, classToAdd);
 
    return this;
 
  };
 

	
 
  /**
 
   * Remove and return a CSS class name from the component's element
 
   *
 
   * @param {String} classToRemove Classname to remove
 
   * @return {Component}
 
   * @method removeClass
 
   */
 

	
 
  Component.prototype.removeClass = function removeClass(classToRemove) {
 
    Dom.removeElClass(this.el_, classToRemove);
 
    return this;
 
  };
 

	
 
  /**
 
   * Show the component element if hidden
 
   *
 
   * @return {Component}
 
   * @method show
 
   */
 

	
 
  Component.prototype.show = function show() {
 
    this.removeClass('vjs-hidden');
 
    return this;
 
  };
 

	
 
  /**
 
   * Hide the component element if currently showing
 
   *
 
   * @return {Component}
 
   * @method hide
 
   */
 

	
 
  Component.prototype.hide = function hide() {
 
    this.addClass('vjs-hidden');
 
    return this;
 
  };
 

	
 
  /**
 
   * Lock an item in its visible state
 
   * To be used with fadeIn/fadeOut.
 
   *
 
   * @return {Component}
 
   * @private
 
   * @method lockShowing
 
   */
 

	
 
  Component.prototype.lockShowing = function lockShowing() {
 
    this.addClass('vjs-lock-showing');
 
    return this;
 
  };
 

	
 
  /**
 
   * Unlock an item to be hidden
 
   * To be used with fadeIn/fadeOut.
 
   *
 
   * @return {Component}
 
   * @private
 
   * @method unlockShowing
 
   */
 

	
 
  Component.prototype.unlockShowing = function unlockShowing() {
 
    this.removeClass('vjs-lock-showing');
 
    return this;
 
  };
 

	
 
  /**
 
   * Set or get the width of the component (CSS values)
 
   * Setting the video tag dimension values only works with values in pixels.
 
   * Percent values will not work.
 
   * Some percents can be used, but width()/height() will return the number + %,
 
   * not the actual computed width/height.
 
   *
 
   * @param  {Number|String=} num   Optional width number
 
   * @param  {Boolean} skipListeners Skip the 'resize' event trigger
 
   * @return {Component} This component, when setting the width
 
   * @return {Number|String} The width, when getting
 
   * @method width
 
   */
 

	
 
  Component.prototype.width = function width(num, skipListeners) {
 
    return this.dimension('width', num, skipListeners);
 
  };
 

	
 
  /**
 
   * Get or set the height of the component (CSS values)
 
   * Setting the video tag dimension values only works with values in pixels.
 
   * Percent values will not work.
 
   * Some percents can be used, but width()/height() will return the number + %,
 
   * not the actual computed width/height.
 
   *
 
   * @param  {Number|String=} num     New component height
 
   * @param  {Boolean=} skipListeners Skip the resize event trigger
 
   * @return {Component} This component, when setting the height
 
   * @return {Number|String} The height, when getting
 
   * @method height
 
   */
 

	
 
  Component.prototype.height = function height(num, skipListeners) {
 
    return this.dimension('height', num, skipListeners);
 
  };
 

	
 
  /**
 
   * Set both width and height at the same time
 
   *
 
   * @param  {Number|String} width Width of player
 
   * @param  {Number|String} height Height of player
 
   * @return {Component} The component
 
   * @method dimensions
 
   */
 

	
 
  Component.prototype.dimensions = function dimensions(width, height) {
 
    // Skip resize listeners on width for optimization
 
    return this.width(width, true).height(height);
 
  };
 

	
 
  /**
 
   * Get or set width or height
 
   * This is the shared code for the width() and height() methods.
 
   * All for an integer, integer + 'px' or integer + '%';
 
   * Known issue: Hidden elements officially have a width of 0. We're defaulting
 
   * to the style.width value and falling back to computedStyle which has the
 
   * hidden element issue. Info, but probably not an efficient fix:
 
   * http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/
 
   *
 
   * @param  {String} widthOrHeight  'width' or 'height'
 
   * @param  {Number|String=} num     New dimension
 
   * @param  {Boolean=} skipListeners Skip resize event trigger
 
   * @return {Component} The component if a dimension was set
 
   * @return {Number|String} The dimension if nothing was set
 
   * @private
 
   * @method dimension
 
   */
 

	
 
  Component.prototype.dimension = function dimension(widthOrHeight, num, skipListeners) {
 
    if (num !== undefined) {
 
      // Set to zero if null or literally NaN (NaN !== NaN)
 
      if (num === null || num !== num) {
 
        num = 0;
 
      }
 

	
 
      // Check if using css width/height (% or px) and adjust
 
      if (('' + num).indexOf('%') !== -1 || ('' + num).indexOf('px') !== -1) {
 
        this.el_.style[widthOrHeight] = num;
 
      } else if (num === 'auto') {
 
        this.el_.style[widthOrHeight] = '';
 
      } else {
 
        this.el_.style[widthOrHeight] = num + 'px';
 
      }
 

	
 
      // skipListeners allows us to avoid triggering the resize event when setting both width and height
 
      if (!skipListeners) {
 
        this.trigger('resize');
 
      }
 

	
 
      // Return component
 
      return this;
 
    }
 

	
 
    // Not setting a value, so getting it
 
    // Make sure element exists
 
    if (!this.el_) {
 
      return 0;
 
    }
 

	
 
    // Get dimension value from style
 
    var val = this.el_.style[widthOrHeight];
 
    var pxIndex = val.indexOf('px');
 

	
 
    if (pxIndex !== -1) {
 
      // Return the pixel value with no 'px'
 
      return parseInt(val.slice(0, pxIndex), 10);
 
    }
 

	
 
    // No px so using % or no style was set, so falling back to offsetWidth/height
 
    // If component has display:none, offset will return 0
 
    // TODO: handle display:none and no dimension style using px
 
    return parseInt(this.el_['offset' + _utilsToTitleCaseJs2['default'](widthOrHeight)], 10);
 
  };
 

	
 
  /**
 
   * Emit 'tap' events when touch events are supported
 
   * This is used to support toggling the controls through a tap on the video.
 
   * We're requiring them to be enabled because otherwise every component would
 
   * have this extra overhead unnecessarily, on mobile devices where extra
 
   * overhead is especially bad.
 
   *
 
   * @private
 
   * @method emitTapEvents
 
   */
 

	
 
  Component.prototype.emitTapEvents = function emitTapEvents() {
 
    // Track the start time so we can determine how long the touch lasted
 
    var touchStart = 0;
 
    var firstTouch = null;
 

	
 
    // Maximum movement allowed during a touch event to still be considered a tap
 
    // Other popular libs use anywhere from 2 (hammer.js) to 15, so 10 seems like a nice, round number.
 
    var tapMovementThreshold = 10;
 

	
 
    // The maximum length a touch can be while still being considered a tap
 
    var touchTimeThreshold = 200;
 

	
 
    var couldBeTap = undefined;
 

	
 
    this.on('touchstart', function (event) {
 
      // If more than one finger, don't consider treating this as a click
 
      if (event.touches.length === 1) {
 
        // Copy the touches object to prevent modifying the original
 
        firstTouch = _objectAssign2['default']({}, event.touches[0]);
 
        // Record start time so we can detect a tap vs. "touch and hold"
 
        touchStart = new Date().getTime();
 
        // Reset couldBeTap tracking
 
        couldBeTap = true;
 
      }
 
    });
 

	
 
    this.on('touchmove', function (event) {
 
      // If more than one finger, don't consider treating this as a click
 
      if (event.touches.length > 1) {
 
        couldBeTap = false;
 
      } else if (firstTouch) {
 
        // Some devices will throw touchmoves for all but the slightest of taps.
 
        // So, if we moved only a small distance, this could still be a tap
 
        var xdiff = event.touches[0].pageX - firstTouch.pageX;
 
        var ydiff = event.touches[0].pageY - firstTouch.pageY;
 
        var touchDistance = Math.sqrt(xdiff * xdiff + ydiff * ydiff);
 

	
 
        if (touchDistance > tapMovementThreshold) {
 
          couldBeTap = false;
 
        }
 
      }
 
    });
 

	
 
    var noTap = function noTap() {
 
      couldBeTap = false;
 
    };
 

	
 
    // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s
 
    this.on('touchleave', noTap);
 
    this.on('touchcancel', noTap);
 

	
 
    // When the touch ends, measure how long it took and trigger the appropriate
 
    // event
 
    this.on('touchend', function (event) {
 
      firstTouch = null;
 
      // Proceed only if the touchmove/leave/cancel event didn't happen
 
      if (couldBeTap === true) {
 
        // Measure how long the touch lasted
 
        var touchTime = new Date().getTime() - touchStart;
 

	
 
        // Make sure the touch was less than the threshold to be considered a tap
 
        if (touchTime < touchTimeThreshold) {
 
          // Don't let browser turn this into a click
 
          event.preventDefault();
 
          this.trigger('tap');
 
          // It may be good to copy the touchend event object and change the
 
          // type to tap, if the other event properties aren't exact after
 
          // Events.fixEvent runs (e.g. event.target)
 
        }
 
      }
 
    });
 
  };
 

	
 
  /**
 
   * Report user touch activity when touch events occur
 
   * User activity is used to determine when controls should show/hide. It's
 
   * relatively simple when it comes to mouse events, because any mouse event
 
   * should show the controls. So we capture mouse events that bubble up to the
 
   * player and report activity when that happens.
 
   * With touch events it isn't as easy. We can't rely on touch events at the
 
   * player level, because a tap (touchstart + touchend) on the video itself on
 
   * mobile devices is meant to turn controls off (and on). User activity is
 
   * checked asynchronously, so what could happen is a tap event on the video
 
   * turns the controls off, then the touchend event bubbles up to the player,
 
   * which if it reported user activity, would turn the controls right back on.
 
   * (We also don't want to completely block touch events from bubbling up)
 
   * Also a touchmove, touch+hold, and anything other than a tap is not supposed
 
   * to turn the controls back on on a mobile device.
 
   * Here we're setting the default component behavior to report user activity
 
   * whenever touch events happen, and this can be turned off by components that
 
   * want touch events to act differently.
 
   *
 
   * @method enableTouchActivity
 
   */
 

	
 
  Component.prototype.enableTouchActivity = function enableTouchActivity() {
 
    // Don't continue if the root player doesn't support reporting user activity
 
    if (!this.player() || !this.player().reportUserActivity) {
 
      return;
 
    }
 

	
 
    // listener for reporting that the user is active
 
    var report = Fn.bind(this.player(), this.player().reportUserActivity);
 

	
 
    var touchHolding = undefined;
 

	
 
    this.on('touchstart', function () {
 
      report();
 
      // For as long as the they are touching the device or have their mouse down,
 
      // we consider them active even if they're not moving their finger or mouse.
 
      // So we want to continue to update that they are active
 
      this.clearInterval(touchHolding);
 
      // report at the same interval as activityCheck
 
      touchHolding = this.setInterval(report, 250);
 
    });
 

	
 
    var touchEnd = function touchEnd(event) {
 
      report();
 
      // stop the interval that maintains activity if the touch is holding
 
      this.clearInterval(touchHolding);
 
    };
 

	
 
    this.on('touchmove', report);
 
    this.on('touchend', touchEnd);
 
    this.on('touchcancel', touchEnd);
 
  };
 

	
 
  /**
 
   * Creates timeout and sets up disposal automatically.
 
   *
 
   * @param {Function} fn The function to run after the timeout.
 
   * @param {Number} timeout Number of ms to delay before executing specified function.
 
   * @return {Number} Returns the timeout ID
 
   * @method setTimeout
 
   */
 

	
 
  Component.prototype.setTimeout = function setTimeout(fn, timeout) {
 
    fn = Fn.bind(this, fn);
 

	
 
    // window.setTimeout would be preferable here, but due to some bizarre issue with Sinon and/or Phantomjs, we can't.
 
    var timeoutId = _globalWindow2['default'].setTimeout(fn, timeout);
 

	
 
    var disposeFn = function disposeFn() {
 
      this.clearTimeout(timeoutId);
 
    };
 

	
 
    disposeFn.guid = 'vjs-timeout-' + timeoutId;
 

	
 
    this.on('dispose', disposeFn);
 

	
 
    return timeoutId;
 
  };
 

	
 
  /**
 
   * Clears a timeout and removes the associated dispose listener
 
   *
 
   * @param {Number} timeoutId The id of the timeout to clear
 
   * @return {Number} Returns the timeout ID
 
   * @method clearTimeout
 
   */
 

	
 
  Component.prototype.clearTimeout = function clearTimeout(timeoutId) {
 
    _globalWindow2['default'].clearTimeout(timeoutId);
 

	
 
    var disposeFn = function disposeFn() {};
 

	
 
    disposeFn.guid = 'vjs-timeout-' + timeoutId;
 

	
 
    this.off('dispose', disposeFn);
 

	
 
    return timeoutId;
 
  };
 

	
 
  /**
 
   * Creates an interval and sets up disposal automatically.
 
   *
 
   * @param {Function} fn The function to run every N seconds.
 
   * @param {Number} interval Number of ms to delay before executing specified function.
 
   * @return {Number} Returns the interval ID
 
   * @method setInterval
 
   */
 

	
 
  Component.prototype.setInterval = function setInterval(fn, interval) {
 
    fn = Fn.bind(this, fn);
 

	
 
    var intervalId = _globalWindow2['default'].setInterval(fn, interval);
 

	
 
    var disposeFn = function disposeFn() {
 
      this.clearInterval(intervalId);
 
    };
 

	
 
    disposeFn.guid = 'vjs-interval-' + intervalId;
 

	
 
    this.on('dispose', disposeFn);
 

	
 
    return intervalId;
 
  };
 

	
 
  /**
 
   * Clears an interval and removes the associated dispose listener
 
   *
 
   * @param {Number} intervalId The id of the interval to clear
 
   * @return {Number} Returns the interval ID
 
   * @method clearInterval
 
   */
 

	
 
  Component.prototype.clearInterval = function clearInterval(intervalId) {
 
    _globalWindow2['default'].clearInterval(intervalId);
 

	
 
    var disposeFn = function disposeFn() {};
 

	
 
    disposeFn.guid = 'vjs-interval-' + intervalId;
 

	
 
    this.off('dispose', disposeFn);
 

	
 
    return intervalId;
 
  };
 

	
 
  /**
 
   * Registers a component
 
   *
 
   * @param {String} name Name of the component to register
 
   * @param {Object} comp The component to register
 
   * @static
 
   * @method registerComponent
 
   */
 

	
 
  Component.registerComponent = function registerComponent(name, comp) {
 
    if (!Component.components_) {
 
      Component.components_ = {};
 
    }
 

	
 
    Component.components_[name] = comp;
 
    return comp;
 
  };
 

	
 
  /**
 
   * Gets a component by name
 
   *
 
   * @param {String} name Name of the component to get
 
   * @return {Component}
 
   * @static
 
   * @method getComponent
 
   */
 

	
 
  Component.getComponent = function getComponent(name) {
 
    if (Component.components_ && Component.components_[name]) {
 
      return Component.components_[name];
 
    }
 

	
 
    if (_globalWindow2['default'] && _globalWindow2['default'].videojs && _globalWindow2['default'].videojs[name]) {
 
      _utilsLogJs2['default'].warn('The ' + name + ' component was added to the videojs object when it should be registered using videojs.registerComponent(name, component)');
 
      return _globalWindow2['default'].videojs[name];
 
    }
 
  };
 

	
 
  /**
 
   * Sets up the constructor using the supplied init method
 
   * or uses the init of the parent object
 
   *
 
   * @param {Object} props An object of properties
 
   * @static
 
   * @deprecated
 
   * @method extend
 
   */
 

	
 
  Component.extend = function extend(props) {
 
    props = props || {};
 

	
 
    _utilsLogJs2['default'].warn('Component.extend({}) has been deprecated, use videojs.extend(Component, {}) instead');
 

	
 
    // Set up the constructor using the supplied init method
 
    // or using the init of the parent object
 
    // Make sure to check the unobfuscated version for external libs
 
    var init = props.init || props.init || this.prototype.init || this.prototype.init || function () {};
 
    // In Resig's simple class inheritance (previously used) the constructor
 
    //  is a function that calls `this.init.apply(arguments)`
 
    // However that would prevent us from using `ParentObject.call(this);`
 
    //  in a Child constructor because the `this` in `this.init`
 
    //  would still refer to the Child and cause an infinite loop.
 
    // We would instead have to do
 
    //    `ParentObject.prototype.init.apply(this, arguments);`
 
    //  Bleh. We're not creating a _super() function, so it's good to keep
 
    //  the parent constructor reference simple.
 
    var subObj = function subObj() {
 
      init.apply(this, arguments);
 
    };
 

	
 
    // Inherit from this object's prototype
 
    subObj.prototype = Object.create(this.prototype);
 
    // Reset the constructor property for subObj otherwise
 
    // instances of subObj would have the constructor of the parent Object
 
    subObj.prototype.constructor = subObj;
 

	
 
    // Make the class extendable
 
    subObj.extend = Component.extend;
 

	
 
    // Extend subObj's prototype with functions and other properties from props
 
    for (var _name2 in props) {
 
      if (props.hasOwnProperty(_name2)) {
 
        subObj.prototype[_name2] = props[_name2];
 
      }
 
    }
 

	
 
    return subObj;
 
  };
 

	
 
  return Component;
 
})();
 

	
 
Component.registerComponent('Component', Component);
 
exports['default'] = Component;
 
module.exports = exports['default'];
 

	
 
},{"./utils/dom.js":118,"./utils/events.js":119,"./utils/fn.js":120,"./utils/guid.js":122,"./utils/log.js":123,"./utils/merge-options.js":124,"./utils/to-title-case.js":127,"global/window":2,"object.assign":43}],59:[function(_dereq_,module,exports){
 
/**
 
 * @file control-bar.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
// Required children
 

	
 
var _playToggleJs = _dereq_('./play-toggle.js');
 

	
 
var _playToggleJs2 = _interopRequireDefault(_playToggleJs);
 

	
 
var _timeControlsCurrentTimeDisplayJs = _dereq_('./time-controls/current-time-display.js');
 

	
 
var _timeControlsCurrentTimeDisplayJs2 = _interopRequireDefault(_timeControlsCurrentTimeDisplayJs);
 

	
 
var _timeControlsDurationDisplayJs = _dereq_('./time-controls/duration-display.js');
 

	
 
var _timeControlsDurationDisplayJs2 = _interopRequireDefault(_timeControlsDurationDisplayJs);
 

	
 
var _timeControlsTimeDividerJs = _dereq_('./time-controls/time-divider.js');
 

	
 
var _timeControlsTimeDividerJs2 = _interopRequireDefault(_timeControlsTimeDividerJs);
 

	
 
var _timeControlsRemainingTimeDisplayJs = _dereq_('./time-controls/remaining-time-display.js');
 

	
 
var _timeControlsRemainingTimeDisplayJs2 = _interopRequireDefault(_timeControlsRemainingTimeDisplayJs);
 

	
 
var _liveDisplayJs = _dereq_('./live-display.js');
 

	
 
var _liveDisplayJs2 = _interopRequireDefault(_liveDisplayJs);
 

	
 
var _progressControlProgressControlJs = _dereq_('./progress-control/progress-control.js');
 

	
 
var _progressControlProgressControlJs2 = _interopRequireDefault(_progressControlProgressControlJs);
 

	
 
var _fullscreenToggleJs = _dereq_('./fullscreen-toggle.js');
 

	
 
var _fullscreenToggleJs2 = _interopRequireDefault(_fullscreenToggleJs);
 

	
 
var _volumeControlVolumeControlJs = _dereq_('./volume-control/volume-control.js');
 

	
 
var _volumeControlVolumeControlJs2 = _interopRequireDefault(_volumeControlVolumeControlJs);
 

	
 
var _volumeMenuButtonJs = _dereq_('./volume-menu-button.js');
 

	
 
var _volumeMenuButtonJs2 = _interopRequireDefault(_volumeMenuButtonJs);
 

	
 
var _muteToggleJs = _dereq_('./mute-toggle.js');
 

	
 
var _muteToggleJs2 = _interopRequireDefault(_muteToggleJs);
 

	
 
var _textTrackControlsChaptersButtonJs = _dereq_('./text-track-controls/chapters-button.js');
 

	
 
var _textTrackControlsChaptersButtonJs2 = _interopRequireDefault(_textTrackControlsChaptersButtonJs);
 

	
 
var _textTrackControlsSubtitlesButtonJs = _dereq_('./text-track-controls/subtitles-button.js');
 

	
 
var _textTrackControlsSubtitlesButtonJs2 = _interopRequireDefault(_textTrackControlsSubtitlesButtonJs);
 

	
 
var _textTrackControlsCaptionsButtonJs = _dereq_('./text-track-controls/captions-button.js');
 

	
 
var _textTrackControlsCaptionsButtonJs2 = _interopRequireDefault(_textTrackControlsCaptionsButtonJs);
 

	
 
var _playbackRateMenuPlaybackRateMenuButtonJs = _dereq_('./playback-rate-menu/playback-rate-menu-button.js');
 

	
 
var _playbackRateMenuPlaybackRateMenuButtonJs2 = _interopRequireDefault(_playbackRateMenuPlaybackRateMenuButtonJs);
 

	
 
var _spacerControlsCustomControlSpacerJs = _dereq_('./spacer-controls/custom-control-spacer.js');
 

	
 
var _spacerControlsCustomControlSpacerJs2 = _interopRequireDefault(_spacerControlsCustomControlSpacerJs);
 

	
 
/**
 
 * Container of main controls
 
 *
 
 * @extends Component
 
 * @class ControlBar
 
 */
 

	
 
var ControlBar = (function (_Component) {
 
  _inherits(ControlBar, _Component);
 

	
 
  function ControlBar() {
 
    _classCallCheck(this, ControlBar);
 

	
 
    _Component.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  ControlBar.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-control-bar'
 
    });
 
  };
 

	
 
  return ControlBar;
 
})(_componentJs2['default']);
 

	
 
ControlBar.prototype.options_ = {
 
  loadEvent: 'play',
 
  children: ['playToggle', 'volumeMenuButton', 'currentTimeDisplay', 'timeDivider', 'durationDisplay', 'progressControl', 'liveDisplay', 'remainingTimeDisplay', 'customControlSpacer', 'playbackRateMenuButton', 'chaptersButton', 'subtitlesButton', 'captionsButton', 'fullscreenToggle']
 
};
 

	
 
_componentJs2['default'].registerComponent('ControlBar', ControlBar);
 
exports['default'] = ControlBar;
 
module.exports = exports['default'];
 

	
 
},{"../component.js":58,"./fullscreen-toggle.js":60,"./live-display.js":61,"./mute-toggle.js":62,"./play-toggle.js":63,"./playback-rate-menu/playback-rate-menu-button.js":64,"./progress-control/progress-control.js":69,"./spacer-controls/custom-control-spacer.js":71,"./text-track-controls/captions-button.js":74,"./text-track-controls/chapters-button.js":75,"./text-track-controls/subtitles-button.js":78,"./time-controls/current-time-display.js":81,"./time-controls/duration-display.js":82,"./time-controls/remaining-time-display.js":83,"./time-controls/time-divider.js":84,"./volume-control/volume-control.js":86,"./volume-menu-button.js":88}],60:[function(_dereq_,module,exports){
 
/**
 
 * @file fullscreen-toggle.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _buttonJs = _dereq_('../button.js');
 

	
 
var _buttonJs2 = _interopRequireDefault(_buttonJs);
 

	
 
var _componentJs = _dereq_('../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * Toggle fullscreen video
 
 *
 
 * @extends Button
 
 * @class FullscreenToggle
 
 */
 

	
 
var FullscreenToggle = (function (_Button) {
 
  _inherits(FullscreenToggle, _Button);
 

	
 
  function FullscreenToggle() {
 
    _classCallCheck(this, FullscreenToggle);
 

	
 
    _Button.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  FullscreenToggle.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-fullscreen-control ' + _Button.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Handles click for full screen
 
   *
 
   * @method handleClick
 
   */
 

	
 
  FullscreenToggle.prototype.handleClick = function handleClick() {
 
    if (!this.player_.isFullscreen()) {
 
      this.player_.requestFullscreen();
 
      this.controlText('Non-Fullscreen');
 
    } else {
 
      this.player_.exitFullscreen();
 
      this.controlText('Fullscreen');
 
    }
 
  };
 

	
 
  return FullscreenToggle;
 
})(_buttonJs2['default']);
 

	
 
FullscreenToggle.prototype.controlText_ = 'Fullscreen';
 

	
 
_componentJs2['default'].registerComponent('FullscreenToggle', FullscreenToggle);
 
exports['default'] = FullscreenToggle;
 
module.exports = exports['default'];
 

	
 
},{"../button.js":57,"../component.js":58}],61:[function(_dereq_,module,exports){
 
/**
 
 * @file live-display.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _component = _dereq_('../component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _utilsDomJs = _dereq_('../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
/**
 
 * Displays the live indicator
 
 * TODO - Future make it click to snap to live
 
 *
 
 * @extends Component
 
 * @class LiveDisplay
 
 */
 

	
 
var LiveDisplay = (function (_Component) {
 
  _inherits(LiveDisplay, _Component);
 

	
 
  function LiveDisplay(player, options) {
 
    _classCallCheck(this, LiveDisplay);
 

	
 
    _Component.call(this, player, options);
 

	
 
    this.updateShowing();
 
    this.on(this.player(), 'durationchange', this.updateShowing);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  LiveDisplay.prototype.createEl = function createEl() {
 
    var el = _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-live-control vjs-control'
 
    });
 

	
 
    this.contentEl_ = Dom.createEl('div', {
 
      className: 'vjs-live-display',
 
      innerHTML: '<span class="vjs-control-text">' + this.localize('Stream Type') + '</span>' + this.localize('LIVE')
 
    }, {
 
      'aria-live': 'off'
 
    });
 

	
 
    el.appendChild(this.contentEl_);
 
    return el;
 
  };
 

	
 
  LiveDisplay.prototype.updateShowing = function updateShowing() {
 
    if (this.player().duration() === Infinity) {
 
      this.show();
 
    } else {
 
      this.hide();
 
    }
 
  };
 

	
 
  return LiveDisplay;
 
})(_component2['default']);
 

	
 
_component2['default'].registerComponent('LiveDisplay', LiveDisplay);
 
exports['default'] = LiveDisplay;
 
module.exports = exports['default'];
 

	
 
},{"../component":58,"../utils/dom.js":118}],62:[function(_dereq_,module,exports){
 
/**
 
 * @file mute-toggle.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _button = _dereq_('../button');
 

	
 
var _button2 = _interopRequireDefault(_button);
 

	
 
var _component = _dereq_('../component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _utilsDomJs = _dereq_('../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
/**
 
 * A button component for muting the audio
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Button
 
 * @class MuteToggle
 
 */
 

	
 
var MuteToggle = (function (_Button) {
 
  _inherits(MuteToggle, _Button);
 

	
 
  function MuteToggle(player, options) {
 
    _classCallCheck(this, MuteToggle);
 

	
 
    _Button.call(this, player, options);
 

	
 
    this.on(player, 'volumechange', this.update);
 

	
 
    // hide mute toggle if the current tech doesn't support volume control
 
    if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {
 
      this.addClass('vjs-hidden');
 
    }
 

	
 
    this.on(player, 'loadstart', function () {
 
      this.update(); // We need to update the button to account for a default muted state.
 

	
 
      if (player.tech_['featuresVolumeControl'] === false) {
 
        this.addClass('vjs-hidden');
 
      } else {
 
        this.removeClass('vjs-hidden');
 
      }
 
    });
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  MuteToggle.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-mute-control ' + _Button.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Handle click on mute
 
   *
 
   * @method handleClick
 
   */
 

	
 
  MuteToggle.prototype.handleClick = function handleClick() {
 
    this.player_.muted(this.player_.muted() ? false : true);
 
  };
 

	
 
  /**
 
   * Update volume
 
   *
 
   * @method update
 
   */
 

	
 
  MuteToggle.prototype.update = function update() {
 
    var vol = this.player_.volume(),
 
        level = 3;
 

	
 
    if (vol === 0 || this.player_.muted()) {
 
      level = 0;
 
    } else if (vol < 0.33) {
 
      level = 1;
 
    } else if (vol < 0.67) {
 
      level = 2;
 
    }
 

	
 
    // Don't rewrite the button text if the actual text doesn't change.
 
    // This causes unnecessary and confusing information for screen reader users.
 
    // This check is needed because this function gets called every time the volume level is changed.
 
    var toMute = this.player_.muted() ? 'Unmute' : 'Mute';
 
    var localizedMute = this.localize(toMute);
 
    if (this.controlText() !== localizedMute) {
 
      this.controlText(localizedMute);
 
    }
 

	
 
    /* TODO improve muted icon classes */
 
    for (var i = 0; i < 4; i++) {
 
      Dom.removeElClass(this.el_, 'vjs-vol-' + i);
 
    }
 
    Dom.addElClass(this.el_, 'vjs-vol-' + level);
 
  };
 

	
 
  return MuteToggle;
 
})(_button2['default']);
 

	
 
MuteToggle.prototype.controlText_ = 'Mute';
 

	
 
_component2['default'].registerComponent('MuteToggle', MuteToggle);
 
exports['default'] = MuteToggle;
 
module.exports = exports['default'];
 

	
 
},{"../button":57,"../component":58,"../utils/dom.js":118}],63:[function(_dereq_,module,exports){
 
/**
 
 * @file play-toggle.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _buttonJs = _dereq_('../button.js');
 

	
 
var _buttonJs2 = _interopRequireDefault(_buttonJs);
 

	
 
var _componentJs = _dereq_('../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * Button to toggle between play and pause
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Button
 
 * @class PlayToggle
 
 */
 

	
 
var PlayToggle = (function (_Button) {
 
  _inherits(PlayToggle, _Button);
 

	
 
  function PlayToggle(player, options) {
 
    _classCallCheck(this, PlayToggle);
 

	
 
    _Button.call(this, player, options);
 

	
 
    this.on(player, 'play', this.handlePlay);
 
    this.on(player, 'pause', this.handlePause);
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  PlayToggle.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-play-control ' + _Button.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Handle click to toggle between play and pause
 
   *
 
   * @method handleClick
 
   */
 

	
 
  PlayToggle.prototype.handleClick = function handleClick() {
 
    if (this.player_.paused()) {
 
      this.player_.play();
 
    } else {
 
      this.player_.pause();
 
    }
 
  };
 

	
 
  /**
 
   * Add the vjs-playing class to the element so it can change appearance
 
   *
 
   * @method handlePlay
 
   */
 

	
 
  PlayToggle.prototype.handlePlay = function handlePlay() {
 
    this.removeClass('vjs-paused');
 
    this.addClass('vjs-playing');
 
    this.controlText('Pause'); // change the button text to "Pause"
 
  };
 

	
 
  /**
 
   * Add the vjs-paused class to the element so it can change appearance
 
   *
 
   * @method handlePause
 
   */
 

	
 
  PlayToggle.prototype.handlePause = function handlePause() {
 
    this.removeClass('vjs-playing');
 
    this.addClass('vjs-paused');
 
    this.controlText('Play'); // change the button text to "Play"
 
  };
 

	
 
  return PlayToggle;
 
})(_buttonJs2['default']);
 

	
 
PlayToggle.prototype.controlText_ = 'Play';
 

	
 
_componentJs2['default'].registerComponent('PlayToggle', PlayToggle);
 
exports['default'] = PlayToggle;
 
module.exports = exports['default'];
 

	
 
},{"../button.js":57,"../component.js":58}],64:[function(_dereq_,module,exports){
 
/**
 
 * @file playback-rate-menu-button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _menuMenuButtonJs = _dereq_('../../menu/menu-button.js');
 

	
 
var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs);
 

	
 
var _menuMenuJs = _dereq_('../../menu/menu.js');
 

	
 
var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs);
 

	
 
var _playbackRateMenuItemJs = _dereq_('./playback-rate-menu-item.js');
 

	
 
var _playbackRateMenuItemJs2 = _interopRequireDefault(_playbackRateMenuItemJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsDomJs = _dereq_('../../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
/**
 
 * The component for controlling the playback rate
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuButton
 
 * @class PlaybackRateMenuButton
 
 */
 

	
 
var PlaybackRateMenuButton = (function (_MenuButton) {
 
  _inherits(PlaybackRateMenuButton, _MenuButton);
 

	
 
  function PlaybackRateMenuButton(player, options) {
 
    _classCallCheck(this, PlaybackRateMenuButton);
 

	
 
    _MenuButton.call(this, player, options);
 

	
 
    this.updateVisibility();
 
    this.updateLabel();
 

	
 
    this.on(player, 'loadstart', this.updateVisibility);
 
    this.on(player, 'ratechange', this.updateLabel);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.createEl = function createEl() {
 
    var el = _MenuButton.prototype.createEl.call(this);
 

	
 
    this.labelEl_ = Dom.createEl('div', {
 
      className: 'vjs-playback-rate-value',
 
      innerHTML: 1.0
 
    });
 

	
 
    el.appendChild(this.labelEl_);
 

	
 
    return el;
 
  };
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-playback-rate ' + _MenuButton.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Create the playback rate menu
 
   *
 
   * @return {Menu} Menu object populated with items
 
   * @method createMenu
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.createMenu = function createMenu() {
 
    var menu = new _menuMenuJs2['default'](this.player());
 
    var rates = this.playbackRates();
 

	
 
    if (rates) {
 
      for (var i = rates.length - 1; i >= 0; i--) {
 
        menu.addChild(new _playbackRateMenuItemJs2['default'](this.player(), { 'rate': rates[i] + 'x' }));
 
      }
 
    }
 

	
 
    return menu;
 
  };
 

	
 
  /**
 
   * Updates ARIA accessibility attributes
 
   *
 
   * @method updateARIAAttributes
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.updateARIAAttributes = function updateARIAAttributes() {
 
    // Current playback rate
 
    this.el().setAttribute('aria-valuenow', this.player().playbackRate());
 
  };
 

	
 
  /**
 
   * Handle menu item click
 
   *
 
   * @method handleClick
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.handleClick = function handleClick() {
 
    // select next rate option
 
    var currentRate = this.player().playbackRate();
 
    var rates = this.playbackRates();
 

	
 
    // this will select first one if the last one currently selected
 
    var newRate = rates[0];
 
    for (var i = 0; i < rates.length; i++) {
 
      if (rates[i] > currentRate) {
 
        newRate = rates[i];
 
        break;
 
      }
 
    }
 
    this.player().playbackRate(newRate);
 
  };
 

	
 
  /**
 
   * Get possible playback rates
 
   *
 
   * @return {Array} Possible playback rates
 
   * @method playbackRates
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.playbackRates = function playbackRates() {
 
    return this.options_['playbackRates'] || this.options_.playerOptions && this.options_.playerOptions['playbackRates'];
 
  };
 

	
 
  /**
 
   * Get supported playback rates
 
   *
 
   * @return {Array} Supported playback rates
 
   * @method playbackRateSupported
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.playbackRateSupported = function playbackRateSupported() {
 
    return this.player().tech_ && this.player().tech_['featuresPlaybackRate'] && this.playbackRates() && this.playbackRates().length > 0;
 
  };
 

	
 
  /**
 
   * Hide playback rate controls when they're no playback rate options to select
 
   *
 
   * @method updateVisibility
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.updateVisibility = function updateVisibility() {
 
    if (this.playbackRateSupported()) {
 
      this.removeClass('vjs-hidden');
 
    } else {
 
      this.addClass('vjs-hidden');
 
    }
 
  };
 

	
 
  /**
 
   * Update button label when rate changed
 
   *
 
   * @method updateLabel
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.updateLabel = function updateLabel() {
 
    if (this.playbackRateSupported()) {
 
      this.labelEl_.innerHTML = this.player().playbackRate() + 'x';
 
    }
 
  };
 

	
 
  return PlaybackRateMenuButton;
 
})(_menuMenuButtonJs2['default']);
 

	
 
PlaybackRateMenuButton.prototype.controlText_ = 'Playback Rate';
 

	
 
_componentJs2['default'].registerComponent('PlaybackRateMenuButton', PlaybackRateMenuButton);
 
exports['default'] = PlaybackRateMenuButton;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../menu/menu-button.js":95,"../../menu/menu.js":97,"../../utils/dom.js":118,"./playback-rate-menu-item.js":65}],65:[function(_dereq_,module,exports){
 
/**
 
 * @file playback-rate-menu-item.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _menuMenuItemJs = _dereq_('../../menu/menu-item.js');
 

	
 
var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * The specific menu item type for selecting a playback rate
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuItem
 
 * @class PlaybackRateMenuItem
 
 */
 

	
 
var PlaybackRateMenuItem = (function (_MenuItem) {
 
  _inherits(PlaybackRateMenuItem, _MenuItem);
 

	
 
  function PlaybackRateMenuItem(player, options) {
 
    _classCallCheck(this, PlaybackRateMenuItem);
 

	
 
    var label = options['rate'];
 
    var rate = parseFloat(label, 10);
 

	
 
    // Modify options for parent MenuItem class's init.
 
    options['label'] = label;
 
    options['selected'] = rate === 1;
 
    _MenuItem.call(this, player, options);
 

	
 
    this.label = label;
 
    this.rate = rate;
 

	
 
    this.on(player, 'ratechange', this.update);
 
  }
 

	
 
  /**
 
   * Handle click on menu item
 
   *
 
   * @method handleClick
 
   */
 

	
 
  PlaybackRateMenuItem.prototype.handleClick = function handleClick() {
 
    _MenuItem.prototype.handleClick.call(this);
 
    this.player().playbackRate(this.rate);
 
  };
 

	
 
  /**
 
   * Update playback rate with selected rate
 
   *
 
   * @method update
 
   */
 

	
 
  PlaybackRateMenuItem.prototype.update = function update() {
 
    this.selected(this.player().playbackRate() === this.rate);
 
  };
 

	
 
  return PlaybackRateMenuItem;
 
})(_menuMenuItemJs2['default']);
 

	
 
PlaybackRateMenuItem.prototype.contentElType = 'button';
 

	
 
_componentJs2['default'].registerComponent('PlaybackRateMenuItem', PlaybackRateMenuItem);
 
exports['default'] = PlaybackRateMenuItem;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../menu/menu-item.js":96}],66:[function(_dereq_,module,exports){
 
/**
 
 * @file load-progress-bar.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsDomJs = _dereq_('../../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
/**
 
 * Shows load progress
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class LoadProgressBar
 
 */
 

	
 
var LoadProgressBar = (function (_Component) {
 
  _inherits(LoadProgressBar, _Component);
 

	
 
  function LoadProgressBar(player, options) {
 
    _classCallCheck(this, LoadProgressBar);
 

	
 
    _Component.call(this, player, options);
 
    this.on(player, 'progress', this.update);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  LoadProgressBar.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-load-progress',
 
      innerHTML: '<span class="vjs-control-text"><span>' + this.localize('Loaded') + '</span>: 0%</span>'
 
    });
 
  };
 

	
 
  /**
 
   * Update progress bar
 
   *
 
   * @method update
 
   */
 

	
 
  LoadProgressBar.prototype.update = function update() {
 
    var buffered = this.player_.buffered();
 
    var duration = this.player_.duration();
 
    var bufferedEnd = this.player_.bufferedEnd();
 
    var children = this.el_.children;
 

	
 
    // get the percent width of a time compared to the total end
 
    var percentify = function percentify(time, end) {
 
      var percent = time / end || 0; // no NaN
 
      return (percent >= 1 ? 1 : percent) * 100 + '%';
 
    };
 

	
 
    // update the width of the progress bar
 
    this.el_.style.width = percentify(bufferedEnd, duration);
 

	
 
    // add child elements to represent the individual buffered time ranges
 
    for (var i = 0; i < buffered.length; i++) {
 
      var start = buffered.start(i);
 
      var end = buffered.end(i);
 
      var part = children[i];
 

	
 
      if (!part) {
 
        part = this.el_.appendChild(Dom.createEl());
 
      }
 

	
 
      // set the percent based on the width of the progress bar (bufferedEnd)
 
      part.style.left = percentify(start, bufferedEnd);
 
      part.style.width = percentify(end - start, bufferedEnd);
 
    }
 

	
 
    // remove unused buffered range elements
 
    for (var i = children.length; i > buffered.length; i--) {
 
      this.el_.removeChild(children[i - 1]);
 
    }
 
  };
 

	
 
  return LoadProgressBar;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('LoadProgressBar', LoadProgressBar);
 
exports['default'] = LoadProgressBar;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../utils/dom.js":118}],67:[function(_dereq_,module,exports){
 
/**
 
 * @file mouse-time-display.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsDomJs = _dereq_('../../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFnJs = _dereq_('../../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
 

	
 
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
 

	
 
var _lodashCompatFunctionThrottle = _dereq_('lodash-compat/function/throttle');
 

	
 
var _lodashCompatFunctionThrottle2 = _interopRequireDefault(_lodashCompatFunctionThrottle);
 

	
 
/**
 
 * The Mouse Time Display component shows the time you will seek to
 
 * when hovering over the progress bar
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class MouseTimeDisplay
 
 */
 

	
 
var MouseTimeDisplay = (function (_Component) {
 
  _inherits(MouseTimeDisplay, _Component);
 

	
 
  function MouseTimeDisplay(player, options) {
 
    var _this = this;
 

	
 
    _classCallCheck(this, MouseTimeDisplay);
 

	
 
    _Component.call(this, player, options);
 

	
 
    this.update(0, 0);
 

	
 
    player.on('ready', function () {
 
      _this.on(player.controlBar.progressControl.el(), 'mousemove', _lodashCompatFunctionThrottle2['default'](Fn.bind(_this, _this.handleMouseMove), 25));
 
    });
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  MouseTimeDisplay.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-mouse-display'
 
    });
 
  };
 

	
 
  MouseTimeDisplay.prototype.handleMouseMove = function handleMouseMove(event) {
 
    var duration = this.player_.duration();
 
    var newTime = this.calculateDistance(event) * duration;
 
    var position = event.pageX - Dom.findElPosition(this.el().parentNode).left;
 

	
 
    this.update(newTime, position);
 
  };
 

	
 
  MouseTimeDisplay.prototype.update = function update(newTime, position) {
 
    var time = _utilsFormatTimeJs2['default'](newTime, this.player_.duration());
 

	
 
    this.el().style.left = position + 'px';
 
    this.el().setAttribute('data-current-time', time);
 
  };
 

	
 
  MouseTimeDisplay.prototype.calculateDistance = function calculateDistance(event) {
 
    return Dom.getPointerPosition(this.el().parentNode, event).x;
 
  };
 

	
 
  return MouseTimeDisplay;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('MouseTimeDisplay', MouseTimeDisplay);
 
exports['default'] = MouseTimeDisplay;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../utils/dom.js":118,"../../utils/fn.js":120,"../../utils/format-time.js":121,"lodash-compat/function/throttle":7}],68:[function(_dereq_,module,exports){
 
/**
 
 * @file play-progress-bar.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsFnJs = _dereq_('../../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
 

	
 
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
 

	
 
/**
 
 * Shows play progress
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class PlayProgressBar
 
 */
 

	
 
var PlayProgressBar = (function (_Component) {
 
  _inherits(PlayProgressBar, _Component);
 

	
 
  function PlayProgressBar(player, options) {
 
    _classCallCheck(this, PlayProgressBar);
 

	
 
    _Component.call(this, player, options);
 
    this.updateDataAttr();
 
    this.on(player, 'timeupdate', this.updateDataAttr);
 
    player.ready(Fn.bind(this, this.updateDataAttr));
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  PlayProgressBar.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-play-progress vjs-slider-bar',
 
      innerHTML: '<span class="vjs-control-text"><span>' + this.localize('Progress') + '</span>: 0%</span>'
 
    });
 
  };
 

	
 
  PlayProgressBar.prototype.updateDataAttr = function updateDataAttr() {
 
    var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();
 
    this.el_.setAttribute('data-current-time', _utilsFormatTimeJs2['default'](time, this.player_.duration()));
 
  };
 

	
 
  return PlayProgressBar;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('PlayProgressBar', PlayProgressBar);
 
exports['default'] = PlayProgressBar;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../utils/fn.js":120,"../../utils/format-time.js":121}],69:[function(_dereq_,module,exports){
 
/**
 
 * @file progress-control.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _seekBarJs = _dereq_('./seek-bar.js');
 

	
 
var _seekBarJs2 = _interopRequireDefault(_seekBarJs);
 

	
 
var _mouseTimeDisplayJs = _dereq_('./mouse-time-display.js');
 

	
 
var _mouseTimeDisplayJs2 = _interopRequireDefault(_mouseTimeDisplayJs);
 

	
 
/**
 
 * The Progress Control component contains the seek bar, load progress,
 
 * and play progress
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class ProgressControl
 
 */
 

	
 
var ProgressControl = (function (_Component) {
 
  _inherits(ProgressControl, _Component);
 

	
 
  function ProgressControl() {
 
    _classCallCheck(this, ProgressControl);
 

	
 
    _Component.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  ProgressControl.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-progress-control vjs-control'
 
    });
 
  };
 

	
 
  return ProgressControl;
 
})(_componentJs2['default']);
 

	
 
ProgressControl.prototype.options_ = {
 
  children: ['seekBar']
 
};
 

	
 
_componentJs2['default'].registerComponent('ProgressControl', ProgressControl);
 
exports['default'] = ProgressControl;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"./mouse-time-display.js":67,"./seek-bar.js":70}],70:[function(_dereq_,module,exports){
 
/**
 
 * @file seek-bar.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _sliderSliderJs = _dereq_('../../slider/slider.js');
 

	
 
var _sliderSliderJs2 = _interopRequireDefault(_sliderSliderJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _loadProgressBarJs = _dereq_('./load-progress-bar.js');
 

	
 
var _loadProgressBarJs2 = _interopRequireDefault(_loadProgressBarJs);
 

	
 
var _playProgressBarJs = _dereq_('./play-progress-bar.js');
 

	
 
var _playProgressBarJs2 = _interopRequireDefault(_playProgressBarJs);
 

	
 
var _utilsFnJs = _dereq_('../../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
 

	
 
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
/**
 
 * Seek Bar and holder for the progress bars
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Slider
 
 * @class SeekBar
 
 */
 

	
 
var SeekBar = (function (_Slider) {
 
  _inherits(SeekBar, _Slider);
 

	
 
  function SeekBar(player, options) {
 
    _classCallCheck(this, SeekBar);
 

	
 
    _Slider.call(this, player, options);
 
    this.on(player, 'timeupdate', this.updateARIAAttributes);
 
    player.ready(Fn.bind(this, this.updateARIAAttributes));
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  SeekBar.prototype.createEl = function createEl() {
 
    return _Slider.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-progress-holder'
 
    }, {
 
      'aria-label': 'video progress bar'
 
    });
 
  };
 

	
 
  /**
 
   * Update ARIA accessibility attributes
 
   *
 
   * @method updateARIAAttributes
 
   */
 

	
 
  SeekBar.prototype.updateARIAAttributes = function updateARIAAttributes() {
 
    // Allows for smooth scrubbing, when player can't keep up.
 
    var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();
 
    this.el_.setAttribute('aria-valuenow', (this.getPercent() * 100).toFixed(2)); // machine readable value of progress bar (percentage complete)
 
    this.el_.setAttribute('aria-valuetext', _utilsFormatTimeJs2['default'](time, this.player_.duration())); // human readable value of progress bar (time complete)
 
  };
 

	
 
  /**
 
   * Get percentage of video played
 
   *
 
   * @return {Number} Percentage played
 
   * @method getPercent
 
   */
 

	
 
  SeekBar.prototype.getPercent = function getPercent() {
 
    var percent = this.player_.currentTime() / this.player_.duration();
 
    return percent >= 1 ? 1 : percent;
 
  };
 

	
 
  /**
 
   * Handle mouse down on seek bar
 
   *
 
   * @method handleMouseDown
 
   */
 

	
 
  SeekBar.prototype.handleMouseDown = function handleMouseDown(event) {
 
    _Slider.prototype.handleMouseDown.call(this, event);
 

	
 
    this.player_.scrubbing(true);
 

	
 
    this.videoWasPlaying = !this.player_.paused();
 
    this.player_.pause();
 
  };
 

	
 
  /**
 
   * Handle mouse move on seek bar
 
   *
 
   * @method handleMouseMove
 
   */
 

	
 
  SeekBar.prototype.handleMouseMove = function handleMouseMove(event) {
 
    var newTime = this.calculateDistance(event) * this.player_.duration();
 

	
 
    // Don't let video end while scrubbing.
 
    if (newTime === this.player_.duration()) {
 
      newTime = newTime - 0.1;
 
    }
 

	
 
    // Set new time (tell player to seek to new time)
 
    this.player_.currentTime(newTime);
 
  };
 

	
 
  /**
 
   * Handle mouse up on seek bar
 
   *
 
   * @method handleMouseUp
 
   */
 

	
 
  SeekBar.prototype.handleMouseUp = function handleMouseUp(event) {
 
    _Slider.prototype.handleMouseUp.call(this, event);
 

	
 
    this.player_.scrubbing(false);
 
    if (this.videoWasPlaying) {
 
      this.player_.play();
 
    }
 
  };
 

	
 
  /**
 
   * Move more quickly fast forward for keyboard-only users
 
   *
 
   * @method stepForward
 
   */
 

	
 
  SeekBar.prototype.stepForward = function stepForward() {
 
    this.player_.currentTime(this.player_.currentTime() + 5); // more quickly fast forward for keyboard-only users
 
  };
 

	
 
  /**
 
   * Move more quickly rewind for keyboard-only users
 
   *
 
   * @method stepBack
 
   */
 

	
 
  SeekBar.prototype.stepBack = function stepBack() {
 
    this.player_.currentTime(this.player_.currentTime() - 5); // more quickly rewind for keyboard-only users
 
  };
 

	
 
  return SeekBar;
 
})(_sliderSliderJs2['default']);
 

	
 
SeekBar.prototype.options_ = {
 
  children: ['loadProgressBar', 'mouseTimeDisplay', 'playProgressBar'],
 
  'barName': 'playProgressBar'
 
};
 

	
 
SeekBar.prototype.playerEvent = 'timeupdate';
 

	
 
_componentJs2['default'].registerComponent('SeekBar', SeekBar);
 
exports['default'] = SeekBar;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../slider/slider.js":102,"../../utils/fn.js":120,"../../utils/format-time.js":121,"./load-progress-bar.js":66,"./play-progress-bar.js":68,"object.assign":43}],71:[function(_dereq_,module,exports){
 
/**
 
 * @file custom-control-spacer.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _spacerJs = _dereq_('./spacer.js');
 

	
 
var _spacerJs2 = _interopRequireDefault(_spacerJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * Spacer specifically meant to be used as an insertion point for new plugins, etc.
 
 *
 
 * @extends Spacer
 
 * @class CustomControlSpacer
 
 */
 

	
 
var CustomControlSpacer = (function (_Spacer) {
 
  _inherits(CustomControlSpacer, _Spacer);
 

	
 
  function CustomControlSpacer() {
 
    _classCallCheck(this, CustomControlSpacer);
 

	
 
    _Spacer.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  CustomControlSpacer.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-custom-control-spacer ' + _Spacer.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  CustomControlSpacer.prototype.createEl = function createEl() {
 
    var el = _Spacer.prototype.createEl.call(this, {
 
      className: this.buildCSSClass()
 
    });
 

	
 
    // No-flex/table-cell mode requires there be some content
 
    // in the cell to fill the remaining space of the table.
 
    el.innerHTML = '&nbsp;';
 
    return el;
 
  };
 

	
 
  return CustomControlSpacer;
 
})(_spacerJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('CustomControlSpacer', CustomControlSpacer);
 
exports['default'] = CustomControlSpacer;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"./spacer.js":72}],72:[function(_dereq_,module,exports){
 
/**
 
 * @file spacer.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * Just an empty spacer element that can be used as an append point for plugins, etc.
 
 * Also can be used to create space between elements when necessary.
 
 *
 
 * @extends Component
 
 * @class Spacer
 
 */
 

	
 
var Spacer = (function (_Component) {
 
  _inherits(Spacer, _Component);
 

	
 
  function Spacer() {
 
    _classCallCheck(this, Spacer);
 

	
 
    _Component.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  Spacer.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-spacer ' + _Component.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  Spacer.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: this.buildCSSClass()
 
    });
 
  };
 

	
 
  return Spacer;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('Spacer', Spacer);
 

	
 
exports['default'] = Spacer;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58}],73:[function(_dereq_,module,exports){
 
/**
 
 * @file caption-settings-menu-item.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js');
 

	
 
var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * The menu item for caption track settings menu
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends TextTrackMenuItem
 
 * @class CaptionSettingsMenuItem
 
 */
 

	
 
var CaptionSettingsMenuItem = (function (_TextTrackMenuItem) {
 
  _inherits(CaptionSettingsMenuItem, _TextTrackMenuItem);
 

	
 
  function CaptionSettingsMenuItem(player, options) {
 
    _classCallCheck(this, CaptionSettingsMenuItem);
 

	
 
    options['track'] = {
 
      'kind': options['kind'],
 
      'player': player,
 
      'label': options['kind'] + ' settings',
 
      'default': false,
 
      mode: 'disabled'
 
    };
 

	
 
    _TextTrackMenuItem.call(this, player, options);
 
    this.addClass('vjs-texttrack-settings');
 
  }
 

	
 
  /**
 
   * Handle click on menu item
 
   *
 
   * @method handleClick
 
   */
 

	
 
  CaptionSettingsMenuItem.prototype.handleClick = function handleClick() {
 
    this.player().getChild('textTrackSettings').show();
 
  };
 

	
 
  return CaptionSettingsMenuItem;
 
})(_textTrackMenuItemJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('CaptionSettingsMenuItem', CaptionSettingsMenuItem);
 
exports['default'] = CaptionSettingsMenuItem;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"./text-track-menu-item.js":80}],74:[function(_dereq_,module,exports){
 
/**
 
 * @file captions-button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _textTrackButtonJs = _dereq_('./text-track-button.js');
 

	
 
var _textTrackButtonJs2 = _interopRequireDefault(_textTrackButtonJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _captionSettingsMenuItemJs = _dereq_('./caption-settings-menu-item.js');
 

	
 
var _captionSettingsMenuItemJs2 = _interopRequireDefault(_captionSettingsMenuItemJs);
 

	
 
/**
 
 * The button component for toggling and selecting captions
 
 *
 
 * @param {Object} player  Player object
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends TextTrackButton
 
 * @class CaptionsButton
 
 */
 

	
 
var CaptionsButton = (function (_TextTrackButton) {
 
  _inherits(CaptionsButton, _TextTrackButton);
 

	
 
  function CaptionsButton(player, options, ready) {
 
    _classCallCheck(this, CaptionsButton);
 

	
 
    _TextTrackButton.call(this, player, options, ready);
 
    this.el_.setAttribute('aria-label', 'Captions Menu');
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  CaptionsButton.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-captions-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Update caption menu items
 
   *
 
   * @method update
 
   */
 

	
 
  CaptionsButton.prototype.update = function update() {
 
    var threshold = 2;
 
    _TextTrackButton.prototype.update.call(this);
 

	
 
    // if native, then threshold is 1 because no settings button
 
    if (this.player().tech_ && this.player().tech_['featuresNativeTextTracks']) {
 
      threshold = 1;
 
    }
 

	
 
    if (this.items && this.items.length > threshold) {
 
      this.show();
 
    } else {
 
      this.hide();
 
    }
 
  };
 

	
 
  /**
 
   * Create caption menu items
 
   *
 
   * @return {Array} Array of menu items
 
   * @method createItems
 
   */
 

	
 
  CaptionsButton.prototype.createItems = function createItems() {
 
    var items = [];
 

	
 
    if (!(this.player().tech_ && this.player().tech_['featuresNativeTextTracks'])) {
 
      items.push(new _captionSettingsMenuItemJs2['default'](this.player_, { 'kind': this.kind_ }));
 
    }
 

	
 
    return _TextTrackButton.prototype.createItems.call(this, items);
 
  };
 

	
 
  return CaptionsButton;
 
})(_textTrackButtonJs2['default']);
 

	
 
CaptionsButton.prototype.kind_ = 'captions';
 
CaptionsButton.prototype.controlText_ = 'Captions';
 

	
 
_componentJs2['default'].registerComponent('CaptionsButton', CaptionsButton);
 
exports['default'] = CaptionsButton;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"./caption-settings-menu-item.js":73,"./text-track-button.js":79}],75:[function(_dereq_,module,exports){
 
/**
 
 * @file chapters-button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _textTrackButtonJs = _dereq_('./text-track-button.js');
 

	
 
var _textTrackButtonJs2 = _interopRequireDefault(_textTrackButtonJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js');
 

	
 
var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs);
 

	
 
var _chaptersTrackMenuItemJs = _dereq_('./chapters-track-menu-item.js');
 

	
 
var _chaptersTrackMenuItemJs2 = _interopRequireDefault(_chaptersTrackMenuItemJs);
 

	
 
var _menuMenuJs = _dereq_('../../menu/menu.js');
 

	
 
var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs);
 

	
 
var _utilsDomJs = _dereq_('../../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFnJs = _dereq_('../../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsToTitleCaseJs = _dereq_('../../utils/to-title-case.js');
 

	
 
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
/**
 
 * The button component for toggling and selecting chapters
 
 * Chapters act much differently than other text tracks
 
 * Cues are navigation vs. other tracks of alternative languages
 
 *
 
 * @param {Object} player  Player object
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends TextTrackButton
 
 * @class ChaptersButton
 
 */
 

	
 
var ChaptersButton = (function (_TextTrackButton) {
 
  _inherits(ChaptersButton, _TextTrackButton);
 

	
 
  function ChaptersButton(player, options, ready) {
 
    _classCallCheck(this, ChaptersButton);
 

	
 
    _TextTrackButton.call(this, player, options, ready);
 
    this.el_.setAttribute('aria-label', 'Chapters Menu');
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  ChaptersButton.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-chapters-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Create a menu item for each text track
 
   *
 
   * @return {Array} Array of menu items
 
   * @method createItems
 
   */
 

	
 
  ChaptersButton.prototype.createItems = function createItems() {
 
    var items = [];
 

	
 
    var tracks = this.player_.textTracks();
 

	
 
    if (!tracks) {
 
      return items;
 
    }
 

	
 
    for (var i = 0; i < tracks.length; i++) {
 
      var track = tracks[i];
 
      if (track['kind'] === this.kind_) {
 
        items.push(new _textTrackMenuItemJs2['default'](this.player_, {
 
          'track': track
 
        }));
 
      }
 
    }
 

	
 
    return items;
 
  };
 

	
 
  /**
 
   * Create menu from chapter buttons
 
   *
 
   * @return {Menu} Menu of chapter buttons
 
   * @method createMenu
 
   */
 

	
 
  ChaptersButton.prototype.createMenu = function createMenu() {
 
    var tracks = this.player_.textTracks() || [];
 
    var chaptersTrack = undefined;
 
    var items = this.items = [];
 

	
 
    for (var i = 0, l = tracks.length; i < l; i++) {
 
      var track = tracks[i];
 
      if (track['kind'] === this.kind_) {
 
        if (!track.cues) {
 
          track['mode'] = 'hidden';
 
          /* jshint loopfunc:true */
 
          // TODO see if we can figure out a better way of doing this https://github.com/videojs/video.js/issues/1864
 
          _globalWindow2['default'].setTimeout(Fn.bind(this, function () {
 
            this.createMenu();
 
          }), 100);
 
          /* jshint loopfunc:false */
 
        } else {
 
            chaptersTrack = track;
 
            break;
 
          }
 
      }
 
    }
 

	
 
    var menu = this.menu;
 
    if (menu === undefined) {
 
      menu = new _menuMenuJs2['default'](this.player_);
 
      menu.contentEl().appendChild(Dom.createEl('li', {
 
        className: 'vjs-menu-title',
 
        innerHTML: _utilsToTitleCaseJs2['default'](this.kind_),
 
        tabIndex: -1
 
      }));
 
    }
 

	
 
    if (chaptersTrack) {
 
      var cues = chaptersTrack['cues'],
 
          cue = undefined;
 

	
 
      for (var i = 0, l = cues.length; i < l; i++) {
 
        cue = cues[i];
 

	
 
        var mi = new _chaptersTrackMenuItemJs2['default'](this.player_, {
 
          'track': chaptersTrack,
 
          'cue': cue
 
        });
 

	
 
        items.push(mi);
 

	
 
        menu.addChild(mi);
 
      }
 
      this.addChild(menu);
 
    }
 

	
 
    if (this.items.length > 0) {
 
      this.show();
 
    }
 

	
 
    return menu;
 
  };
 

	
 
  return ChaptersButton;
 
})(_textTrackButtonJs2['default']);
 

	
 
ChaptersButton.prototype.kind_ = 'chapters';
 
ChaptersButton.prototype.controlText_ = 'Chapters';
 

	
 
_componentJs2['default'].registerComponent('ChaptersButton', ChaptersButton);
 
exports['default'] = ChaptersButton;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../menu/menu.js":97,"../../utils/dom.js":118,"../../utils/fn.js":120,"../../utils/to-title-case.js":127,"./chapters-track-menu-item.js":76,"./text-track-button.js":79,"./text-track-menu-item.js":80,"global/window":2}],76:[function(_dereq_,module,exports){
 
/**
 
 * @file chapters-track-menu-item.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _menuMenuItemJs = _dereq_('../../menu/menu-item.js');
 

	
 
var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsFnJs = _dereq_('../../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
/**
 
 * The chapter track menu item
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuItem
 
 * @class ChaptersTrackMenuItem
 
 */
 

	
 
var ChaptersTrackMenuItem = (function (_MenuItem) {
 
  _inherits(ChaptersTrackMenuItem, _MenuItem);
 

	
 
  function ChaptersTrackMenuItem(player, options) {
 
    _classCallCheck(this, ChaptersTrackMenuItem);
 

	
 
    var track = options['track'];
 
    var cue = options['cue'];
 
    var currentTime = player.currentTime();
 

	
 
    // Modify options for parent MenuItem class's init.
 
    options['label'] = cue.text;
 
    options['selected'] = cue['startTime'] <= currentTime && currentTime < cue['endTime'];
 
    _MenuItem.call(this, player, options);
 

	
 
    this.track = track;
 
    this.cue = cue;
 
    track.addEventListener('cuechange', Fn.bind(this, this.update));
 
  }
 

	
 
  /**
 
   * Handle click on menu item
 
   *
 
   * @method handleClick
 
   */
 

	
 
  ChaptersTrackMenuItem.prototype.handleClick = function handleClick() {
 
    _MenuItem.prototype.handleClick.call(this);
 
    this.player_.currentTime(this.cue.startTime);
 
    this.update(this.cue.startTime);
 
  };
 

	
 
  /**
 
   * Update chapter menu item
 
   *
 
   * @method update
 
   */
 

	
 
  ChaptersTrackMenuItem.prototype.update = function update() {
 
    var cue = this.cue;
 
    var currentTime = this.player_.currentTime();
 

	
 
    // vjs.log(currentTime, cue.startTime);
 
    this.selected(cue['startTime'] <= currentTime && currentTime < cue['endTime']);
 
  };
 

	
 
  return ChaptersTrackMenuItem;
 
})(_menuMenuItemJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('ChaptersTrackMenuItem', ChaptersTrackMenuItem);
 
exports['default'] = ChaptersTrackMenuItem;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../menu/menu-item.js":96,"../../utils/fn.js":120}],77:[function(_dereq_,module,exports){
 
/**
 
 * @file off-text-track-menu-item.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js');
 

	
 
var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * A special menu item for turning of a specific type of text track
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends TextTrackMenuItem
 
 * @class OffTextTrackMenuItem
 
 */
 

	
 
var OffTextTrackMenuItem = (function (_TextTrackMenuItem) {
 
  _inherits(OffTextTrackMenuItem, _TextTrackMenuItem);
 

	
 
  function OffTextTrackMenuItem(player, options) {
 
    _classCallCheck(this, OffTextTrackMenuItem);
 

	
 
    // Create pseudo track info
 
    // Requires options['kind']
 
    options['track'] = {
 
      'kind': options['kind'],
 
      'player': player,
 
      'label': options['kind'] + ' off',
 
      'default': false,
 
      'mode': 'disabled'
 
    };
 

	
 
    _TextTrackMenuItem.call(this, player, options);
 
    this.selected(true);
 
  }
 

	
 
  /**
 
   * Handle text track change
 
   *
 
   * @param {Object} event Event object
 
   * @method handleTracksChange
 
   */
 

	
 
  OffTextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {
 
    var tracks = this.player().textTracks();
 
    var selected = true;
 

	
 
    for (var i = 0, l = tracks.length; i < l; i++) {
 
      var track = tracks[i];
 
      if (track['kind'] === this.track['kind'] && track['mode'] === 'showing') {
 
        selected = false;
 
        break;
 
      }
 
    }
 

	
 
    this.selected(selected);
 
  };
 

	
 
  return OffTextTrackMenuItem;
 
})(_textTrackMenuItemJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('OffTextTrackMenuItem', OffTextTrackMenuItem);
 
exports['default'] = OffTextTrackMenuItem;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"./text-track-menu-item.js":80}],78:[function(_dereq_,module,exports){
 
/**
 
 * @file subtitles-button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _textTrackButtonJs = _dereq_('./text-track-button.js');
 

	
 
var _textTrackButtonJs2 = _interopRequireDefault(_textTrackButtonJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * The button component for toggling and selecting subtitles
 
 *
 
 * @param {Object} player  Player object
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends TextTrackButton
 
 * @class SubtitlesButton
 
 */
 

	
 
var SubtitlesButton = (function (_TextTrackButton) {
 
  _inherits(SubtitlesButton, _TextTrackButton);
 

	
 
  function SubtitlesButton(player, options, ready) {
 
    _classCallCheck(this, SubtitlesButton);
 

	
 
    _TextTrackButton.call(this, player, options, ready);
 
    this.el_.setAttribute('aria-label', 'Subtitles Menu');
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  SubtitlesButton.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-subtitles-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  return SubtitlesButton;
 
})(_textTrackButtonJs2['default']);
 

	
 
SubtitlesButton.prototype.kind_ = 'subtitles';
 
SubtitlesButton.prototype.controlText_ = 'Subtitles';
 

	
 
_componentJs2['default'].registerComponent('SubtitlesButton', SubtitlesButton);
 
exports['default'] = SubtitlesButton;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"./text-track-button.js":79}],79:[function(_dereq_,module,exports){
 
/**
 
 * @file text-track-button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _menuMenuButtonJs = _dereq_('../../menu/menu-button.js');
 

	
 
var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsFnJs = _dereq_('../../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js');
 

	
 
var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs);
 

	
 
var _offTextTrackMenuItemJs = _dereq_('./off-text-track-menu-item.js');
 

	
 
var _offTextTrackMenuItemJs2 = _interopRequireDefault(_offTextTrackMenuItemJs);
 

	
 
/**
 
 * The base class for buttons that toggle specific text track types (e.g. subtitles)
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuButton
 
 * @class TextTrackButton
 
 */
 

	
 
var TextTrackButton = (function (_MenuButton) {
 
  _inherits(TextTrackButton, _MenuButton);
 

	
 
  function TextTrackButton(player, options) {
 
    _classCallCheck(this, TextTrackButton);
 

	
 
    _MenuButton.call(this, player, options);
 

	
 
    var tracks = this.player_.textTracks();
 

	
 
    if (this.items.length <= 1) {
 
      this.hide();
 
    }
 

	
 
    if (!tracks) {
 
      return;
 
    }
 

	
 
    var updateHandler = Fn.bind(this, this.update);
 
    tracks.addEventListener('removetrack', updateHandler);
 
    tracks.addEventListener('addtrack', updateHandler);
 

	
 
    this.player_.on('dispose', function () {
 
      tracks.removeEventListener('removetrack', updateHandler);
 
      tracks.removeEventListener('addtrack', updateHandler);
 
    });
 
  }
 

	
 
  // Create a menu item for each text track
 

	
 
  TextTrackButton.prototype.createItems = function createItems() {
 
    var items = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
 

	
 
    // Add an OFF menu item to turn all tracks off
 
    items.push(new _offTextTrackMenuItemJs2['default'](this.player_, { 'kind': this.kind_ }));
 

	
 
    var tracks = this.player_.textTracks();
 

	
 
    if (!tracks) {
 
      return items;
 
    }
 

	
 
    for (var i = 0; i < tracks.length; i++) {
 
      var track = tracks[i];
 

	
 
      // only add tracks that are of the appropriate kind and have a label
 
      if (track['kind'] === this.kind_) {
 
        items.push(new _textTrackMenuItemJs2['default'](this.player_, {
 
          'track': track
 
        }));
 
      }
 
    }
 

	
 
    return items;
 
  };
 

	
 
  return TextTrackButton;
 
})(_menuMenuButtonJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('TextTrackButton', TextTrackButton);
 
exports['default'] = TextTrackButton;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../menu/menu-button.js":95,"../../utils/fn.js":120,"./off-text-track-menu-item.js":77,"./text-track-menu-item.js":80}],80:[function(_dereq_,module,exports){
 
/**
 
 * @file text-track-menu-item.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _menuMenuItemJs = _dereq_('../../menu/menu-item.js');
 

	
 
var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsFnJs = _dereq_('../../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
/**
 
 * The specific menu item type for selecting a language within a text track kind
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuItem
 
 * @class TextTrackMenuItem
 
 */
 

	
 
var TextTrackMenuItem = (function (_MenuItem) {
 
  _inherits(TextTrackMenuItem, _MenuItem);
 

	
 
  function TextTrackMenuItem(player, options) {
 
    var _this = this;
 

	
 
    _classCallCheck(this, TextTrackMenuItem);
 

	
 
    var track = options['track'];
 
    var tracks = player.textTracks();
 

	
 
    // Modify options for parent MenuItem class's init.
 
    options['label'] = track['label'] || track['language'] || 'Unknown';
 
    options['selected'] = track['default'] || track['mode'] === 'showing';
 
    _MenuItem.call(this, player, options);
 

	
 
    this.track = track;
 

	
 
    if (tracks) {
 
      (function () {
 
        var changeHandler = Fn.bind(_this, _this.handleTracksChange);
 

	
 
        tracks.addEventListener('change', changeHandler);
 
        _this.on('dispose', function () {
 
          tracks.removeEventListener('change', changeHandler);
 
        });
 
      })();
 
    }
 

	
 
    // iOS7 doesn't dispatch change events to TextTrackLists when an
 
    // associated track's mode changes. Without something like
 
    // Object.observe() (also not present on iOS7), it's not
 
    // possible to detect changes to the mode attribute and polyfill
 
    // the change event. As a poor substitute, we manually dispatch
 
    // change events whenever the controls modify the mode.
 
    if (tracks && tracks.onchange === undefined) {
 
      (function () {
 
        var event = undefined;
 

	
 
        _this.on(['tap', 'click'], function () {
 
          if (typeof _globalWindow2['default'].Event !== 'object') {
 
            // Android 2.3 throws an Illegal Constructor error for window.Event
 
            try {
 
              event = new _globalWindow2['default'].Event('change');
 
            } catch (err) {}
 
          }
 

	
 
          if (!event) {
 
            event = _globalDocument2['default'].createEvent('Event');
 
            event.initEvent('change', true, true);
 
          }
 

	
 
          tracks.dispatchEvent(event);
 
        });
 
      })();
 
    }
 
  }
 

	
 
  /**
 
   * Handle click on text track
 
   *
 
   * @method handleClick
 
   */
 

	
 
  TextTrackMenuItem.prototype.handleClick = function handleClick(event) {
 
    var kind = this.track['kind'];
 
    var tracks = this.player_.textTracks();
 

	
 
    _MenuItem.prototype.handleClick.call(this, event);
 

	
 
    if (!tracks) return;
 

	
 
    for (var i = 0; i < tracks.length; i++) {
 
      var track = tracks[i];
 

	
 
      if (track['kind'] !== kind) {
 
        continue;
 
      }
 

	
 
      if (track === this.track) {
 
        track['mode'] = 'showing';
 
      } else {
 
        track['mode'] = 'disabled';
 
      }
 
    }
 
  };
 

	
 
  /**
 
   * Handle text track change
 
   *
 
   * @method handleTracksChange
 
   */
 

	
 
  TextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {
 
    this.selected(this.track['mode'] === 'showing');
 
  };
 

	
 
  return TextTrackMenuItem;
 
})(_menuMenuItemJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('TextTrackMenuItem', TextTrackMenuItem);
 
exports['default'] = TextTrackMenuItem;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../menu/menu-item.js":96,"../../utils/fn.js":120,"global/document":1,"global/window":2}],81:[function(_dereq_,module,exports){
 
/**
 
 * @file current-time-display.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsDomJs = _dereq_('../../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
 

	
 
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
 

	
 
/**
 
 * Displays the current time
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class CurrentTimeDisplay
 
 */
 

	
 
var CurrentTimeDisplay = (function (_Component) {
 
  _inherits(CurrentTimeDisplay, _Component);
 

	
 
  function CurrentTimeDisplay(player, options) {
 
    _classCallCheck(this, CurrentTimeDisplay);
 

	
 
    _Component.call(this, player, options);
 

	
 
    this.on(player, 'timeupdate', this.updateContent);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  CurrentTimeDisplay.prototype.createEl = function createEl() {
 
    var el = _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-current-time vjs-time-control vjs-control'
 
    });
 

	
 
    this.contentEl_ = Dom.createEl('div', {
 
      className: 'vjs-current-time-display',
 
      // label the current time for screen reader users
 
      innerHTML: '<span class="vjs-control-text">Current Time </span>' + '0:00'
 
    }, {
 
      // tell screen readers not to automatically read the time as it changes
 
      'aria-live': 'off'
 
    });
 

	
 
    el.appendChild(this.contentEl_);
 
    return el;
 
  };
 

	
 
  /**
 
   * Update current time display
 
   *
 
   * @method updateContent
 
   */
 

	
 
  CurrentTimeDisplay.prototype.updateContent = function updateContent() {
 
    // Allows for smooth scrubbing, when player can't keep up.
 
    var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();
 
    var localizedText = this.localize('Current Time');
 
    var formattedTime = _utilsFormatTimeJs2['default'](time, this.player_.duration());
 
    this.contentEl_.innerHTML = '<span class="vjs-control-text">' + localizedText + '</span> ' + formattedTime;
 
  };
 

	
 
  return CurrentTimeDisplay;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('CurrentTimeDisplay', CurrentTimeDisplay);
 
exports['default'] = CurrentTimeDisplay;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../utils/dom.js":118,"../../utils/format-time.js":121}],82:[function(_dereq_,module,exports){
 
/**
 
 * @file duration-display.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsDomJs = _dereq_('../../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
 

	
 
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
 

	
 
/**
 
 * Displays the duration
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class DurationDisplay
 
 */
 

	
 
var DurationDisplay = (function (_Component) {
 
  _inherits(DurationDisplay, _Component);
 

	
 
  function DurationDisplay(player, options) {
 
    _classCallCheck(this, DurationDisplay);
 

	
 
    _Component.call(this, player, options);
 

	
 
    // this might need to be changed to 'durationchange' instead of 'timeupdate' eventually,
 
    // however the durationchange event fires before this.player_.duration() is set,
 
    // so the value cannot be written out using this method.
 
    // Once the order of durationchange and this.player_.duration() being set is figured out,
 
    // this can be updated.
 
    this.on(player, 'timeupdate', this.updateContent);
 
    this.on(player, 'loadedmetadata', this.updateContent);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  DurationDisplay.prototype.createEl = function createEl() {
 
    var el = _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-duration vjs-time-control vjs-control'
 
    });
 

	
 
    this.contentEl_ = Dom.createEl('div', {
 
      className: 'vjs-duration-display',
 
      // label the duration time for screen reader users
 
      innerHTML: '<span class="vjs-control-text">' + this.localize('Duration Time') + '</span> 0:00'
 
    }, {
 
      // tell screen readers not to automatically read the time as it changes
 
      'aria-live': 'off'
 
    });
 

	
 
    el.appendChild(this.contentEl_);
 
    return el;
 
  };
 

	
 
  /**
 
   * Update duration time display
 
   *
 
   * @method updateContent
 
   */
 

	
 
  DurationDisplay.prototype.updateContent = function updateContent() {
 
    var duration = this.player_.duration();
 
    if (duration) {
 
      var localizedText = this.localize('Duration Time');
 
      var formattedTime = _utilsFormatTimeJs2['default'](duration);
 
      this.contentEl_.innerHTML = '<span class="vjs-control-text">' + localizedText + '</span> ' + formattedTime; // label the duration time for screen reader users
 
    }
 
  };
 

	
 
  return DurationDisplay;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('DurationDisplay', DurationDisplay);
 
exports['default'] = DurationDisplay;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../utils/dom.js":118,"../../utils/format-time.js":121}],83:[function(_dereq_,module,exports){
 
/**
 
 * @file remaining-time-display.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsDomJs = _dereq_('../../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
 

	
 
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
 

	
 
/**
 
 * Displays the time left in the video
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class RemainingTimeDisplay
 
 */
 

	
 
var RemainingTimeDisplay = (function (_Component) {
 
  _inherits(RemainingTimeDisplay, _Component);
 

	
 
  function RemainingTimeDisplay(player, options) {
 
    _classCallCheck(this, RemainingTimeDisplay);
 

	
 
    _Component.call(this, player, options);
 

	
 
    this.on(player, 'timeupdate', this.updateContent);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  RemainingTimeDisplay.prototype.createEl = function createEl() {
 
    var el = _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-remaining-time vjs-time-control vjs-control'
 
    });
 

	
 
    this.contentEl_ = Dom.createEl('div', {
 
      className: 'vjs-remaining-time-display',
 
      // label the remaining time for screen reader users
 
      innerHTML: '<span class="vjs-control-text">' + this.localize('Remaining Time') + '</span> -0:00'
 
    }, {
 
      // tell screen readers not to automatically read the time as it changes
 
      'aria-live': 'off'
 
    });
 

	
 
    el.appendChild(this.contentEl_);
 
    return el;
 
  };
 

	
 
  /**
 
   * Update remaining time display
 
   *
 
   * @method updateContent
 
   */
 

	
 
  RemainingTimeDisplay.prototype.updateContent = function updateContent() {
 
    if (this.player_.duration()) {
 
      var localizedText = this.localize('Remaining Time');
 
      var formattedTime = _utilsFormatTimeJs2['default'](this.player_.remainingTime());
 
      this.contentEl_.innerHTML = '<span class="vjs-control-text">' + localizedText + '</span> -' + formattedTime;
 
    }
 

	
 
    // Allows for smooth scrubbing, when player can't keep up.
 
    // var time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();
 
    // this.contentEl_.innerHTML = vjs.formatTime(time, this.player_.duration());
 
  };
 

	
 
  return RemainingTimeDisplay;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('RemainingTimeDisplay', RemainingTimeDisplay);
 
exports['default'] = RemainingTimeDisplay;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../utils/dom.js":118,"../../utils/format-time.js":121}],84:[function(_dereq_,module,exports){
 
/**
 
 * @file time-divider.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * The separator between the current time and duration.
 
 * Can be hidden if it's not needed in the design.
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class TimeDivider
 
 */
 

	
 
var TimeDivider = (function (_Component) {
 
  _inherits(TimeDivider, _Component);
 

	
 
  function TimeDivider() {
 
    _classCallCheck(this, TimeDivider);
 

	
 
    _Component.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  TimeDivider.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-time-control vjs-time-divider',
 
      innerHTML: '<div><span>/</span></div>'
 
    });
 
  };
 

	
 
  return TimeDivider;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('TimeDivider', TimeDivider);
 
exports['default'] = TimeDivider;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58}],85:[function(_dereq_,module,exports){
 
/**
 
 * @file volume-bar.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _sliderSliderJs = _dereq_('../../slider/slider.js');
 

	
 
var _sliderSliderJs2 = _interopRequireDefault(_sliderSliderJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsFnJs = _dereq_('../../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
// Required children
 

	
 
var _volumeLevelJs = _dereq_('./volume-level.js');
 

	
 
var _volumeLevelJs2 = _interopRequireDefault(_volumeLevelJs);
 

	
 
/**
 
 * The bar that contains the volume level and can be clicked on to adjust the level
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Slider
 
 * @class VolumeBar
 
 */
 

	
 
var VolumeBar = (function (_Slider) {
 
  _inherits(VolumeBar, _Slider);
 

	
 
  function VolumeBar(player, options) {
 
    _classCallCheck(this, VolumeBar);
 

	
 
    _Slider.call(this, player, options);
 
    this.on(player, 'volumechange', this.updateARIAAttributes);
 
    player.ready(Fn.bind(this, this.updateARIAAttributes));
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  VolumeBar.prototype.createEl = function createEl() {
 
    return _Slider.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-volume-bar vjs-slider-bar'
 
    }, {
 
      'aria-label': 'volume level'
 
    });
 
  };
 

	
 
  /**
 
   * Handle mouse move on volume bar
 
   *
 
   * @method handleMouseMove
 
   */
 

	
 
  VolumeBar.prototype.handleMouseMove = function handleMouseMove(event) {
 
    if (this.player_.muted()) {
 
      this.player_.muted(false);
 
    }
 

	
 
    this.player_.volume(this.calculateDistance(event));
 
  };
 

	
 
  /**
 
   * Get percent of volume level
 
   *
 
   * @retun {Number} Volume level percent
 
   * @method getPercent
 
   */
 

	
 
  VolumeBar.prototype.getPercent = function getPercent() {
 
    if (this.player_.muted()) {
 
      return 0;
 
    } else {
 
      return this.player_.volume();
 
    }
 
  };
 

	
 
  /**
 
   * Increase volume level for keyboard users
 
   *
 
   * @method stepForward
 
   */
 

	
 
  VolumeBar.prototype.stepForward = function stepForward() {
 
    this.player_.volume(this.player_.volume() + 0.1);
 
  };
 

	
 
  /**
 
   * Decrease volume level for keyboard users
 
   *
 
   * @method stepBack
 
   */
 

	
 
  VolumeBar.prototype.stepBack = function stepBack() {
 
    this.player_.volume(this.player_.volume() - 0.1);
 
  };
 

	
 
  /**
 
   * Update ARIA accessibility attributes
 
   *
 
   * @method updateARIAAttributes
 
   */
 

	
 
  VolumeBar.prototype.updateARIAAttributes = function updateARIAAttributes() {
 
    // Current value of volume bar as a percentage
 
    var volume = (this.player_.volume() * 100).toFixed(2);
 
    this.el_.setAttribute('aria-valuenow', volume);
 
    this.el_.setAttribute('aria-valuetext', volume + '%');
 
  };
 

	
 
  return VolumeBar;
 
})(_sliderSliderJs2['default']);
 

	
 
VolumeBar.prototype.options_ = {
 
  children: ['volumeLevel'],
 
  'barName': 'volumeLevel'
 
};
 

	
 
VolumeBar.prototype.playerEvent = 'volumechange';
 

	
 
_componentJs2['default'].registerComponent('VolumeBar', VolumeBar);
 
exports['default'] = VolumeBar;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../slider/slider.js":102,"../../utils/fn.js":120,"./volume-level.js":87}],86:[function(_dereq_,module,exports){
 
/**
 
 * @file volume-control.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
// Required children
 

	
 
var _volumeBarJs = _dereq_('./volume-bar.js');
 

	
 
var _volumeBarJs2 = _interopRequireDefault(_volumeBarJs);
 

	
 
/**
 
 * The component for controlling the volume level
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class VolumeControl
 
 */
 

	
 
var VolumeControl = (function (_Component) {
 
  _inherits(VolumeControl, _Component);
 

	
 
  function VolumeControl(player, options) {
 
    _classCallCheck(this, VolumeControl);
 

	
 
    _Component.call(this, player, options);
 

	
 
    // hide volume controls when they're not supported by the current tech
 
    if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {
 
      this.addClass('vjs-hidden');
 
    }
 
    this.on(player, 'loadstart', function () {
 
      if (player.tech_['featuresVolumeControl'] === false) {
 
        this.addClass('vjs-hidden');
 
      } else {
 
        this.removeClass('vjs-hidden');
 
      }
 
    });
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  VolumeControl.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-volume-control vjs-control'
 
    });
 
  };
 

	
 
  return VolumeControl;
 
})(_componentJs2['default']);
 

	
 
VolumeControl.prototype.options_ = {
 
  children: ['volumeBar']
 
};
 

	
 
_componentJs2['default'].registerComponent('VolumeControl', VolumeControl);
 
exports['default'] = VolumeControl;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"./volume-bar.js":85}],87:[function(_dereq_,module,exports){
 
/**
 
 * @file volume-level.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * Shows volume level
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class VolumeLevel
 
 */
 

	
 
var VolumeLevel = (function (_Component) {
 
  _inherits(VolumeLevel, _Component);
 

	
 
  function VolumeLevel() {
 
    _classCallCheck(this, VolumeLevel);
 

	
 
    _Component.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  VolumeLevel.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-volume-level',
 
      innerHTML: '<span class="vjs-control-text"></span>'
 
    });
 
  };
 

	
 
  return VolumeLevel;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('VolumeLevel', VolumeLevel);
 
exports['default'] = VolumeLevel;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58}],88:[function(_dereq_,module,exports){
 
/**
 
 * @file volume-menu-button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _buttonJs = _dereq_('../button.js');
 

	
 
var _buttonJs2 = _interopRequireDefault(_buttonJs);
 

	
 
var _componentJs = _dereq_('../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _menuMenuJs = _dereq_('../menu/menu.js');
 

	
 
var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs);
 

	
 
var _menuMenuButtonJs = _dereq_('../menu/menu-button.js');
 

	
 
var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs);
 

	
 
var _muteToggleJs = _dereq_('./mute-toggle.js');
 

	
 
var _muteToggleJs2 = _interopRequireDefault(_muteToggleJs);
 

	
 
var _volumeControlVolumeBarJs = _dereq_('./volume-control/volume-bar.js');
 

	
 
var _volumeControlVolumeBarJs2 = _interopRequireDefault(_volumeControlVolumeBarJs);
 

	
 
/**
 
 * Button for volume menu
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuButton
 
 * @class VolumeMenuButton
 
 */
 

	
 
var VolumeMenuButton = (function (_MenuButton) {
 
  _inherits(VolumeMenuButton, _MenuButton);
 

	
 
  function VolumeMenuButton(player) {
 
    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
 

	
 
    _classCallCheck(this, VolumeMenuButton);
 

	
 
    // Default to inline
 
    if (options.inline === undefined) {
 
      options.inline = true;
 
    }
 

	
 
    // If the vertical option isn't passed at all, default to true.
 
    if (options.vertical === undefined) {
 
      // If an inline volumeMenuButton is used, we should default to using
 
      // a horizontal slider for obvious reasons.
 
      if (options.inline) {
 
        options.vertical = false;
 
      } else {
 
        options.vertical = true;
 
      }
 
    }
 

	
 
    // The vertical option needs to be set on the volumeBar as well,
 
    // since that will need to be passed along to the VolumeBar constructor
 
    options.volumeBar = options.volumeBar || {};
 
    options.volumeBar.vertical = !!options.vertical;
 

	
 
    _MenuButton.call(this, player, options);
 

	
 
    // Same listeners as MuteToggle
 
    this.on(player, 'volumechange', this.volumeUpdate);
 
    this.on(player, 'loadstart', this.volumeUpdate);
 

	
 
    // hide mute toggle if the current tech doesn't support volume control
 
    function updateVisibility() {
 
      if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {
 
        this.addClass('vjs-hidden');
 
      } else {
 
        this.removeClass('vjs-hidden');
 
      }
 
    }
 

	
 
    updateVisibility.call(this);
 
    this.on(player, 'loadstart', updateVisibility);
 

	
 
    this.on(this.volumeBar, ['slideractive', 'focus'], function () {
 
      this.addClass('vjs-slider-active');
 
    });
 

	
 
    this.on(this.volumeBar, ['sliderinactive', 'blur'], function () {
 
      this.removeClass('vjs-slider-active');
 
    });
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  VolumeMenuButton.prototype.buildCSSClass = function buildCSSClass() {
 
    var orientationClass = '';
 
    if (!!this.options_.vertical) {
 
      orientationClass = 'vjs-volume-menu-button-vertical';
 
    } else {
 
      orientationClass = 'vjs-volume-menu-button-horizontal';
 
    }
 

	
 
    return 'vjs-volume-menu-button ' + _MenuButton.prototype.buildCSSClass.call(this) + ' ' + orientationClass;
 
  };
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {Menu} The volume menu button
 
   * @method createMenu
 
   */
 

	
 
  VolumeMenuButton.prototype.createMenu = function createMenu() {
 
    var menu = new _menuMenuJs2['default'](this.player_, {
 
      contentElType: 'div'
 
    });
 

	
 
    var vb = new _volumeControlVolumeBarJs2['default'](this.player_, this.options_.volumeBar);
 

	
 
    menu.addChild(vb);
 

	
 
    this.volumeBar = vb;
 
    return menu;
 
  };
 

	
 
  /**
 
   * Handle click on volume menu and calls super
 
   *
 
   * @method handleClick
 
   */
 

	
 
  VolumeMenuButton.prototype.handleClick = function handleClick() {
 
    _muteToggleJs2['default'].prototype.handleClick.call(this);
 
    _MenuButton.prototype.handleClick.call(this);
 
  };
 

	
 
  return VolumeMenuButton;
 
})(_menuMenuButtonJs2['default']);
 

	
 
VolumeMenuButton.prototype.volumeUpdate = _muteToggleJs2['default'].prototype.update;
 
VolumeMenuButton.prototype.controlText_ = 'Mute';
 

	
 
_componentJs2['default'].registerComponent('VolumeMenuButton', VolumeMenuButton);
 
exports['default'] = VolumeMenuButton;
 
module.exports = exports['default'];
 

	
 
},{"../button.js":57,"../component.js":58,"../menu/menu-button.js":95,"../menu/menu.js":97,"./mute-toggle.js":62,"./volume-control/volume-bar.js":85}],89:[function(_dereq_,module,exports){
 
/**
 
 * @file error-display.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _component = _dereq_('./component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _utilsDomJs = _dereq_('./utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
/**
 
 * Display that an error has occurred making the video unplayable
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @extends Component
 
 * @class ErrorDisplay
 
 */
 

	
 
var ErrorDisplay = (function (_Component) {
 
  _inherits(ErrorDisplay, _Component);
 

	
 
  function ErrorDisplay(player, options) {
 
    _classCallCheck(this, ErrorDisplay);
 

	
 
    _Component.call(this, player, options);
 

	
 
    this.update();
 
    this.on(player, 'error', this.update);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  ErrorDisplay.prototype.createEl = function createEl() {
 
    var el = _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-error-display'
 
    });
 

	
 
    this.contentEl_ = Dom.createEl('div');
 
    el.appendChild(this.contentEl_);
 

	
 
    return el;
 
  };
 

	
 
  /**
 
   * Update the error message in localized language
 
   *
 
   * @method update
 
   */
 

	
 
  ErrorDisplay.prototype.update = function update() {
 
    if (this.player().error()) {
 
      this.contentEl_.innerHTML = this.localize(this.player().error().message);
 
    }
 
  };
 

	
 
  return ErrorDisplay;
 
})(_component2['default']);
 

	
 
_component2['default'].registerComponent('ErrorDisplay', ErrorDisplay);
 
exports['default'] = ErrorDisplay;
 
module.exports = exports['default'];
 

	
 
},{"./component":58,"./utils/dom.js":118}],90:[function(_dereq_,module,exports){
 
/**
 
 * @file event-target.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
var _utilsEventsJs = _dereq_('./utils/events.js');
 

	
 
var Events = _interopRequireWildcard(_utilsEventsJs);
 

	
 
var EventTarget = function EventTarget() {};
 

	
 
EventTarget.prototype.allowedEvents_ = {};
 

	
 
EventTarget.prototype.on = function (type, fn) {
 
  // Remove the addEventListener alias before calling Events.on
 
  // so we don't get into an infinite type loop
 
  var ael = this.addEventListener;
 
  this.addEventListener = Function.prototype;
 
  Events.on(this, type, fn);
 
  this.addEventListener = ael;
 
};
 
EventTarget.prototype.addEventListener = EventTarget.prototype.on;
 

	
 
EventTarget.prototype.off = function (type, fn) {
 
  Events.off(this, type, fn);
 
};
 
EventTarget.prototype.removeEventListener = EventTarget.prototype.off;
 

	
 
EventTarget.prototype.one = function (type, fn) {
 
  Events.one(this, type, fn);
 
};
 

	
 
EventTarget.prototype.trigger = function (event) {
 
  var type = event.type || event;
 

	
 
  if (typeof event === 'string') {
 
    event = {
 
      type: type
 
    };
 
  }
 
  event = Events.fixEvent(event);
 

	
 
  if (this.allowedEvents_[type] && this['on' + type]) {
 
    this['on' + type](event);
 
  }
 

	
 
  Events.trigger(this, event);
 
};
 
// The standard DOM EventTarget.dispatchEvent() is aliased to trigger()
 
EventTarget.prototype.dispatchEvent = EventTarget.prototype.trigger;
 

	
 
exports['default'] = EventTarget;
 
module.exports = exports['default'];
 

	
 
},{"./utils/events.js":119}],91:[function(_dereq_,module,exports){
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _utilsLog = _dereq_('./utils/log');
 

	
 
var _utilsLog2 = _interopRequireDefault(_utilsLog);
 

	
 
/*
 
 * @file extend.js
 
 *
 
 * A combination of node inherits and babel's inherits (after transpile).
 
 * Both work the same but node adds `super_` to the subClass
 
 * and Bable adds the superClass as __proto__. Both seem useful.
 
 */
 
var _inherits = function _inherits(subClass, superClass) {
 
  if (typeof superClass !== 'function' && superClass !== null) {
 
    throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);
 
  }
 

	
 
  subClass.prototype = Object.create(superClass && superClass.prototype, {
 
    constructor: {
 
      value: subClass,
 
      enumerable: false,
 
      writable: true,
 
      configurable: true
 
    }
 
  });
 

	
 
  if (superClass) {
 
    // node
 
    subClass.super_ = superClass;
 
  }
 
};
 

	
 
/*
 
 * Function for subclassing using the same inheritance that
 
 * videojs uses internally
 
 * ```js
 
 * var Button = videojs.getComponent('Button');
 
 * ```
 
 * ```js
 
 * var MyButton = videojs.extend(Button, {
 
 *   constructor: function(player, options) {
 
 *     Button.call(this, player, options);
 
 *   },
 
 *   onClick: function() {
 
 *     // doSomething
 
 *   }
 
 * });
 
 * ```
 
 */
 
var extendFn = function extendFn(superClass) {
 
  var subClassMethods = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
 

	
 
  var subClass = function subClass() {
 
    superClass.apply(this, arguments);
 
  };
 
  var methods = {};
 

	
 
  if (typeof subClassMethods === 'object') {
 
    if (typeof subClassMethods.init === 'function') {
 
      _utilsLog2['default'].warn('Constructor logic via init() is deprecated; please use constructor() instead.');
 
      subClassMethods.constructor = subClassMethods.init;
 
    }
 
    if (subClassMethods.constructor !== Object.prototype.constructor) {
 
      subClass = subClassMethods.constructor;
 
    }
 
    methods = subClassMethods;
 
  } else if (typeof subClassMethods === 'function') {
 
    subClass = subClassMethods;
 
  }
 

	
 
  _inherits(subClass, superClass);
 

	
 
  // Extend subObj's prototype with functions and other properties from props
 
  for (var name in methods) {
 
    if (methods.hasOwnProperty(name)) {
 
      subClass.prototype[name] = methods[name];
 
    }
 
  }
 

	
 
  return subClass;
 
};
 

	
 
exports['default'] = extendFn;
 
module.exports = exports['default'];
 

	
 
},{"./utils/log":123}],92:[function(_dereq_,module,exports){
 
/**
 
 * @file fullscreen-api.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
/*
 
 * Store the browser-specific methods for the fullscreen API
 
 * @type {Object|undefined}
 
 * @private
 
 */
 
var FullscreenApi = {};
 

	
 
// browser API methods
 
// map approach from Screenful.js - https://github.com/sindresorhus/screenfull.js
 
var apiMap = [
 
// Spec: https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
 
['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror'],
 
// WebKit
 
['webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror'],
 
// Old WebKit (Safari 5.1)
 
['webkitRequestFullScreen', 'webkitCancelFullScreen', 'webkitCurrentFullScreenElement', 'webkitCancelFullScreen', 'webkitfullscreenchange', 'webkitfullscreenerror'],
 
// Mozilla
 
['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror'],
 
// Microsoft
 
['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError']];
 

	
 
var specApi = apiMap[0];
 
var browserApi = undefined;
 

	
 
// determine the supported set of functions
 
for (var i = 0; i < apiMap.length; i++) {
 
  // check for exitFullscreen function
 
  if (apiMap[i][1] in _globalDocument2['default']) {
 
    browserApi = apiMap[i];
 
    break;
 
  }
 
}
 

	
 
// map the browser API names to the spec API names
 
if (browserApi) {
 
  for (var i = 0; i < browserApi.length; i++) {
 
    FullscreenApi[specApi[i]] = browserApi[i];
 
  }
 
}
 

	
 
exports['default'] = FullscreenApi;
 
module.exports = exports['default'];
 

	
 
},{"global/document":1}],93:[function(_dereq_,module,exports){
 
/**
 
 * @file loading-spinner.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _component = _dereq_('./component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
/* Loading Spinner
 
================================================================================ */
 
/**
 
 * Loading spinner for waiting events
 
 *
 
 * @extends Component
 
 * @class LoadingSpinner
 
 */
 

	
 
var LoadingSpinner = (function (_Component) {
 
  _inherits(LoadingSpinner, _Component);
 

	
 
  function LoadingSpinner() {
 
    _classCallCheck(this, LoadingSpinner);
 

	
 
    _Component.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @method createEl
 
   */
 

	
 
  LoadingSpinner.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-loading-spinner'
 
    });
 
  };
 

	
 
  return LoadingSpinner;
 
})(_component2['default']);
 

	
 
_component2['default'].registerComponent('LoadingSpinner', LoadingSpinner);
 
exports['default'] = LoadingSpinner;
 
module.exports = exports['default'];
 

	
 
},{"./component":58}],94:[function(_dereq_,module,exports){
 
/**
 
 * @file media-error.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
/*
 
 * Custom MediaError to mimic the HTML5 MediaError
 
 *
 
 * @param {Number} code The media error code
 
 */
 
var MediaError = function MediaError(code) {
 
  if (typeof code === 'number') {
 
    this.code = code;
 
  } else if (typeof code === 'string') {
 
    // default code is zero, so this is a custom error
 
    this.message = code;
 
  } else if (typeof code === 'object') {
 
    // object
 
    _objectAssign2['default'](this, code);
 
  }
 

	
 
  if (!this.message) {
 
    this.message = MediaError.defaultMessages[this.code] || '';
 
  }
 
};
 

	
 
/*
 
 * The error code that refers two one of the defined
 
 * MediaError types
 
 *
 
 * @type {Number}
 
 */
 
MediaError.prototype.code = 0;
 

	
 
/*
 
 * An optional message to be shown with the error.
 
 * Message is not part of the HTML5 video spec
 
 * but allows for more informative custom errors.
 
 *
 
 * @type {String}
 
 */
 
MediaError.prototype.message = '';
 

	
 
/*
 
 * An optional status code that can be set by plugins
 
 * to allow even more detail about the error.
 
 * For example the HLS plugin might provide the specific
 
 * HTTP status code that was returned when the error
 
 * occurred, then allowing a custom error overlay
 
 * to display more information.
 
 *
 
 * @type {Array}
 
 */
 
MediaError.prototype.status = null;
 

	
 
MediaError.errorTypes = ['MEDIA_ERR_CUSTOM', // = 0
 
'MEDIA_ERR_ABORTED', // = 1
 
'MEDIA_ERR_NETWORK', // = 2
 
'MEDIA_ERR_DECODE', // = 3
 
'MEDIA_ERR_SRC_NOT_SUPPORTED', // = 4
 
'MEDIA_ERR_ENCRYPTED' // = 5
 
];
 

	
 
MediaError.defaultMessages = {
 
  1: 'You aborted the media playback',
 
  2: 'A network error caused the media download to fail part-way.',
 
  3: 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.',
 
  4: 'The media could not be loaded, either because the server or network failed or because the format is not supported.',
 
  5: 'The media is encrypted and we do not have the keys to decrypt it.'
 
};
 

	
 
// Add types as properties on MediaError
 
// e.g. MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
 
for (var errNum = 0; errNum < MediaError.errorTypes.length; errNum++) {
 
  MediaError[MediaError.errorTypes[errNum]] = errNum;
 
  // values should be accessible on both the class and instance
 
  MediaError.prototype[MediaError.errorTypes[errNum]] = errNum;
 
}
 

	
 
exports['default'] = MediaError;
 
module.exports = exports['default'];
 

	
 
},{"object.assign":43}],95:[function(_dereq_,module,exports){
 
/**
 
 * @file menu-button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _buttonJs = _dereq_('../button.js');
 

	
 
var _buttonJs2 = _interopRequireDefault(_buttonJs);
 

	
 
var _componentJs = _dereq_('../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _menuJs = _dereq_('./menu.js');
 

	
 
var _menuJs2 = _interopRequireDefault(_menuJs);
 

	
 
var _utilsDomJs = _dereq_('../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFnJs = _dereq_('../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsToTitleCaseJs = _dereq_('../utils/to-title-case.js');
 

	
 
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
 

	
 
/**
 
 * A button class with a popup menu
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Button
 
 * @class MenuButton
 
 */
 

	
 
var MenuButton = (function (_Button) {
 
  _inherits(MenuButton, _Button);
 

	
 
  function MenuButton(player) {
 
    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
 

	
 
    _classCallCheck(this, MenuButton);
 

	
 
    _Button.call(this, player, options);
 

	
 
    this.update();
 

	
 
    this.on('keydown', this.handleKeyPress);
 
    this.el_.setAttribute('aria-haspopup', true);
 
    this.el_.setAttribute('role', 'button');
 
  }
 

	
 
  /**
 
   * Update menu
 
   *
 
   * @method update
 
   */
 

	
 
  MenuButton.prototype.update = function update() {
 
    var menu = this.createMenu();
 

	
 
    if (this.menu) {
 
      this.removeChild(this.menu);
 
    }
 

	
 
    this.menu = menu;
 
    this.addChild(menu);
 

	
 
    /**
 
     * Track the state of the menu button
 
     *
 
     * @type {Boolean}
 
     * @private
 
     */
 
    this.buttonPressed_ = false;
 

	
 
    if (this.items && this.items.length === 0) {
 
      this.hide();
 
    } else if (this.items && this.items.length > 1) {
 
      this.show();
 
    }
 
  };
 

	
 
  /**
 
   * Create menu
 
   *
 
   * @return {Menu} The constructed menu
 
   * @method createMenu
 
   */
 

	
 
  MenuButton.prototype.createMenu = function createMenu() {
 
    var menu = new _menuJs2['default'](this.player_);
 

	
 
    // Add a title list item to the top
 
    if (this.options_.title) {
 
      menu.contentEl().appendChild(Dom.createEl('li', {
 
        className: 'vjs-menu-title',
 
        innerHTML: _utilsToTitleCaseJs2['default'](this.options_.title),
 
        tabIndex: -1
 
      }));
 
    }
 

	
 
    this.items = this['createItems']();
 

	
 
    if (this.items) {
 
      // Add menu items to the menu
 
      for (var i = 0; i < this.items.length; i++) {
 
        menu.addItem(this.items[i]);
 
      }
 
    }
 

	
 
    return menu;
 
  };
 

	
 
  /**
 
   * Create the list of menu items. Specific to each subclass.
 
   *
 
   * @method createItems
 
   */
 

	
 
  MenuButton.prototype.createItems = function createItems() {};
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  MenuButton.prototype.createEl = function createEl() {
 
    return _Button.prototype.createEl.call(this, 'div', {
 
      className: this.buildCSSClass()
 
    });
 
  };
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  MenuButton.prototype.buildCSSClass = function buildCSSClass() {
 
    var menuButtonClass = 'vjs-menu-button';
 

	
 
    // If the inline option is passed, we want to use different styles altogether.
 
    if (this.options_.inline === true) {
 
      menuButtonClass += '-inline';
 
    } else {
 
      menuButtonClass += '-popup';
 
    }
 

	
 
    return 'vjs-menu-button ' + menuButtonClass + ' ' + _Button.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Focus - Add keyboard functionality to element
 
   * This function is not needed anymore. Instead, the
 
   * keyboard functionality is handled by
 
   * treating the button as triggering a submenu.
 
   * When the button is pressed, the submenu
 
   * appears. Pressing the button again makes
 
   * the submenu disappear.
 
   *
 
   * @method handleFocus
 
   */
 

	
 
  MenuButton.prototype.handleFocus = function handleFocus() {};
 

	
 
  /**
 
   * Can't turn off list display that we turned
 
   * on with focus, because list would go away.
 
   *
 
   * @method handleBlur
 
   */
 

	
 
  MenuButton.prototype.handleBlur = function handleBlur() {};
 

	
 
  /**
 
   * When you click the button it adds focus, which
 
   * will show the menu indefinitely.
 
   * So we'll remove focus when the mouse leaves the button.
 
   * Focus is needed for tab navigation.
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @method handleClick
 
   */
 

	
 
  MenuButton.prototype.handleClick = function handleClick() {
 
    this.one('mouseout', Fn.bind(this, function () {
 
      this.menu.unlockShowing();
 
      this.el_.blur();
 
    }));
 
    if (this.buttonPressed_) {
 
      this.unpressButton();
 
    } else {
 
      this.pressButton();
 
    }
 
  };
 

	
 
  /**
 
   * Handle key press on menu
 
   *
 
   * @param {Object} Key press event
 
   * @method handleKeyPress
 
   */
 

	
 
  MenuButton.prototype.handleKeyPress = function handleKeyPress(event) {
 

	
 
    // Check for space bar (32) or enter (13) keys
 
    if (event.which === 32 || event.which === 13) {
 
      if (this.buttonPressed_) {
 
        this.unpressButton();
 
      } else {
 
        this.pressButton();
 
      }
 
      event.preventDefault();
 
      // Check for escape (27) key
 
    } else if (event.which === 27) {
 
        if (this.buttonPressed_) {
 
          this.unpressButton();
 
        }
 
        event.preventDefault();
 
      }
 
  };
 

	
 
  /**
 
   * Makes changes based on button pressed
 
   *
 
   * @method pressButton
 
   */
 

	
 
  MenuButton.prototype.pressButton = function pressButton() {
 
    this.buttonPressed_ = true;
 
    this.menu.lockShowing();
 
    this.el_.setAttribute('aria-pressed', true);
 
    if (this.items && this.items.length > 0) {
 
      this.items[0].el().focus(); // set the focus to the title of the submenu
 
    }
 
  };
 

	
 
  /**
 
   * Makes changes based on button unpressed
 
   *
 
   * @method unpressButton
 
   */
 

	
 
  MenuButton.prototype.unpressButton = function unpressButton() {
 
    this.buttonPressed_ = false;
 
    this.menu.unlockShowing();
 
    this.el_.setAttribute('aria-pressed', false);
 
  };
 

	
 
  return MenuButton;
 
})(_buttonJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('MenuButton', MenuButton);
 
exports['default'] = MenuButton;
 
module.exports = exports['default'];
 

	
 
},{"../button.js":57,"../component.js":58,"../utils/dom.js":118,"../utils/fn.js":120,"../utils/to-title-case.js":127,"./menu.js":97}],96:[function(_dereq_,module,exports){
 
/**
 
 * @file menu-item.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _buttonJs = _dereq_('../button.js');
 

	
 
var _buttonJs2 = _interopRequireDefault(_buttonJs);
 

	
 
var _componentJs = _dereq_('../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
/**
 
 * The component for a menu item. `<li>`
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Button
 
 * @class MenuItem
 
 */
 

	
 
var MenuItem = (function (_Button) {
 
  _inherits(MenuItem, _Button);
 

	
 
  function MenuItem(player, options) {
 
    _classCallCheck(this, MenuItem);
 

	
 
    _Button.call(this, player, options);
 
    this.selected(options['selected']);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @param {String=} type Desc
 
   * @param {Object=} props Desc
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  MenuItem.prototype.createEl = function createEl(type, props, attrs) {
 
    return _Button.prototype.createEl.call(this, 'li', _objectAssign2['default']({
 
      className: 'vjs-menu-item',
 
      innerHTML: this.localize(this.options_['label'])
 
    }, props), attrs);
 
  };
 

	
 
  /**
 
   * Handle a click on the menu item, and set it to selected
 
   *
 
   * @method handleClick
 
   */
 

	
 
  MenuItem.prototype.handleClick = function handleClick() {
 
    this.selected(true);
 
  };
 

	
 
  /**
 
   * Set this menu item as selected or not
 
   *
 
   * @param  {Boolean} selected
 
   * @method selected
 
   */
 

	
 
  MenuItem.prototype.selected = function selected(_selected) {
 
    if (_selected) {
 
      this.addClass('vjs-selected');
 
      this.el_.setAttribute('aria-selected', true);
 
    } else {
 
      this.removeClass('vjs-selected');
 
      this.el_.setAttribute('aria-selected', false);
 
    }
 
  };
 

	
 
  return MenuItem;
 
})(_buttonJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('MenuItem', MenuItem);
 
exports['default'] = MenuItem;
 
module.exports = exports['default'];
 

	
 
},{"../button.js":57,"../component.js":58,"object.assign":43}],97:[function(_dereq_,module,exports){
 
/**
 
 * @file menu.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsDomJs = _dereq_('../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFnJs = _dereq_('../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsEventsJs = _dereq_('../utils/events.js');
 

	
 
var Events = _interopRequireWildcard(_utilsEventsJs);
 

	
 
/**
 
 * The Menu component is used to build pop up menus, including subtitle and
 
 * captions selection menus.
 
 *
 
 * @extends Component
 
 * @class Menu
 
 */
 

	
 
var Menu = (function (_Component) {
 
  _inherits(Menu, _Component);
 

	
 
  function Menu() {
 
    _classCallCheck(this, Menu);
 

	
 
    _Component.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Add a menu item to the menu
 
   *
 
   * @param {Object|String} component Component or component type to add
 
   * @method addItem
 
   */
 

	
 
  Menu.prototype.addItem = function addItem(component) {
 
    this.addChild(component);
 
    component.on('click', Fn.bind(this, function () {
 
      this.unlockShowing();
 
    }));
 
  };
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  Menu.prototype.createEl = function createEl() {
 
    var contentElType = this.options_.contentElType || 'ul';
 
    this.contentEl_ = Dom.createEl(contentElType, {
 
      className: 'vjs-menu-content'
 
    });
 
    var el = _Component.prototype.createEl.call(this, 'div', {
 
      append: this.contentEl_,
 
      className: 'vjs-menu'
 
    });
 
    el.appendChild(this.contentEl_);
 

	
 
    // Prevent clicks from bubbling up. Needed for Menu Buttons,
 
    // where a click on the parent is significant
 
    Events.on(el, 'click', function (event) {
 
      event.preventDefault();
 
      event.stopImmediatePropagation();
 
    });
 

	
 
    return el;
 
  };
 

	
 
  return Menu;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('Menu', Menu);
 
exports['default'] = Menu;
 
module.exports = exports['default'];
 

	
 
},{"../component.js":58,"../utils/dom.js":118,"../utils/events.js":119,"../utils/fn.js":120}],98:[function(_dereq_,module,exports){
 
/**
 
 * @file player.js
 
 */
 
// Subclasses Component
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('./component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _utilsEventsJs = _dereq_('./utils/events.js');
 

	
 
var Events = _interopRequireWildcard(_utilsEventsJs);
 

	
 
var _utilsDomJs = _dereq_('./utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFnJs = _dereq_('./utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsGuidJs = _dereq_('./utils/guid.js');
 

	
 
var Guid = _interopRequireWildcard(_utilsGuidJs);
 

	
 
var _utilsBrowserJs = _dereq_('./utils/browser.js');
 

	
 
var browser = _interopRequireWildcard(_utilsBrowserJs);
 

	
 
var _utilsLogJs = _dereq_('./utils/log.js');
 

	
 
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
 

	
 
var _utilsToTitleCaseJs = _dereq_('./utils/to-title-case.js');
 

	
 
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
 

	
 
var _utilsTimeRangesJs = _dereq_('./utils/time-ranges.js');
 

	
 
var _utilsBufferJs = _dereq_('./utils/buffer.js');
 

	
 
var _utilsStylesheetJs = _dereq_('./utils/stylesheet.js');
 

	
 
var stylesheet = _interopRequireWildcard(_utilsStylesheetJs);
 

	
 
var _fullscreenApiJs = _dereq_('./fullscreen-api.js');
 

	
 
var _fullscreenApiJs2 = _interopRequireDefault(_fullscreenApiJs);
 

	
 
var _mediaErrorJs = _dereq_('./media-error.js');
 

	
 
var _mediaErrorJs2 = _interopRequireDefault(_mediaErrorJs);
 

	
 
var _safeJsonParseTuple = _dereq_('safe-json-parse/tuple');
 

	
 
var _safeJsonParseTuple2 = _interopRequireDefault(_safeJsonParseTuple);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
var _utilsMergeOptionsJs = _dereq_('./utils/merge-options.js');
 

	
 
var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs);
 

	
 
var _tracksTextTrackListConverterJs = _dereq_('./tracks/text-track-list-converter.js');
 

	
 
var _tracksTextTrackListConverterJs2 = _interopRequireDefault(_tracksTextTrackListConverterJs);
 

	
 
// Include required child components (importing also registers them)
 

	
 
var _techLoaderJs = _dereq_('./tech/loader.js');
 

	
 
var _techLoaderJs2 = _interopRequireDefault(_techLoaderJs);
 

	
 
var _posterImageJs = _dereq_('./poster-image.js');
 

	
 
var _posterImageJs2 = _interopRequireDefault(_posterImageJs);
 

	
 
var _tracksTextTrackDisplayJs = _dereq_('./tracks/text-track-display.js');
 

	
 
var _tracksTextTrackDisplayJs2 = _interopRequireDefault(_tracksTextTrackDisplayJs);
 

	
 
var _loadingSpinnerJs = _dereq_('./loading-spinner.js');
 

	
 
var _loadingSpinnerJs2 = _interopRequireDefault(_loadingSpinnerJs);
 

	
 
var _bigPlayButtonJs = _dereq_('./big-play-button.js');
 

	
 
var _bigPlayButtonJs2 = _interopRequireDefault(_bigPlayButtonJs);
 

	
 
var _controlBarControlBarJs = _dereq_('./control-bar/control-bar.js');
 

	
 
var _controlBarControlBarJs2 = _interopRequireDefault(_controlBarControlBarJs);
 

	
 
var _errorDisplayJs = _dereq_('./error-display.js');
 

	
 
var _errorDisplayJs2 = _interopRequireDefault(_errorDisplayJs);
 

	
 
var _tracksTextTrackSettingsJs = _dereq_('./tracks/text-track-settings.js');
 

	
 
var _tracksTextTrackSettingsJs2 = _interopRequireDefault(_tracksTextTrackSettingsJs);
 

	
 
// Require html5 tech, at least for disposing the original video tag
 

	
 
var _techHtml5Js = _dereq_('./tech/html5.js');
 

	
 
var _techHtml5Js2 = _interopRequireDefault(_techHtml5Js);
 

	
 
/**
 
 * An instance of the `Player` class is created when any of the Video.js setup methods are used to initialize a video.
 
 * ```js
 
 * var myPlayer = videojs('example_video_1');
 
 * ```
 
 * In the following example, the `data-setup` attribute tells the Video.js library to create a player instance when the library is ready.
 
 * ```html
 
 * <video id="example_video_1" data-setup='{}' controls>
 
 *   <source src="my-source.mp4" type="video/mp4">
 
 * </video>
 
 * ```
 
 * After an instance has been created it can be accessed globally using `Video('example_video_1')`.
 
 *
 
 * @param {Element} tag        The original video tag used for configuring options
 
 * @param {Object=} options    Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends Component
 
 * @class Player
 
 */
 

	
 
var Player = (function (_Component) {
 
  _inherits(Player, _Component);
 

	
 
  /**
 
   * player's constructor function
 
   *
 
   * @constructs
 
   * @method init
 
   * @param {Element} tag        The original video tag used for configuring options
 
   * @param {Object=} options    Player options
 
   * @param {Function=} ready    Ready callback function
 
   */
 

	
 
  function Player(tag, options, ready) {
 
    var _this = this;
 

	
 
    _classCallCheck(this, Player);
 

	
 
    // Make sure tag ID exists
 
    tag.id = tag.id || 'vjs_video_' + Guid.newGUID();
 

	
 
    // Set Options
 
    // The options argument overrides options set in the video tag
 
    // which overrides globally set options.
 
    // This latter part coincides with the load order
 
    // (tag must exist before Player)
 
    options = _objectAssign2['default'](Player.getTagSettings(tag), options);
 

	
 
    // Delay the initialization of children because we need to set up
 
    // player properties first, and can't use `this` before `super()`
 
    options.initChildren = false;
 

	
 
    // Same with creating the element
 
    options.createEl = false;
 

	
 
    // we don't want the player to report touch activity on itself
 
    // see enableTouchActivity in Component
 
    options.reportTouchActivity = false;
 

	
 
    // Run base component initializing with new options
 
    _Component.call(this, null, options, ready);
 

	
 
    // if the global option object was accidentally blown away by
 
    // someone, bail early with an informative error
 
    if (!this.options_ || !this.options_.techOrder || !this.options_.techOrder.length) {
 
      throw new Error('No techOrder specified. Did you overwrite ' + 'videojs.options instead of just changing the ' + 'properties you want to override?');
 
    }
 

	
 
    this.tag = tag; // Store the original tag used to set options
 

	
 
    // Store the tag attributes used to restore html5 element
 
    this.tagAttributes = tag && Dom.getElAttributes(tag);
 

	
 
    // Update current language
 
    this.language(this.options_.language);
 

	
 
    // Update Supported Languages
 
    if (options.languages) {
 
      (function () {
 
        // Normalise player option languages to lowercase
 
        var languagesToLower = {};
 

	
 
        Object.getOwnPropertyNames(options.languages).forEach(function (name) {
 
          languagesToLower[name.toLowerCase()] = options.languages[name];
 
        });
 
        _this.languages_ = languagesToLower;
 
      })();
 
    } else {
 
      this.languages_ = Player.prototype.options_.languages;
 
    }
 

	
 
    // Cache for video property values.
 
    this.cache_ = {};
 

	
 
    // Set poster
 
    this.poster_ = options.poster || '';
 

	
 
    // Set controls
 
    this.controls_ = !!options.controls;
 

	
 
    // Original tag settings stored in options
 
    // now remove immediately so native controls don't flash.
 
    // May be turned back on by HTML5 tech if nativeControlsForTouch is true
 
    tag.controls = false;
 

	
 
    /*
 
     * Store the internal state of scrubbing
 
     *
 
     * @private
 
     * @return {Boolean} True if the user is scrubbing
 
     */
 
    this.scrubbing_ = false;
 

	
 
    this.el_ = this.createEl();
 

	
 
    // We also want to pass the original player options to each component and plugin
 
    // as well so they don't need to reach back into the player for options later.
 
    // We also need to do another copy of this.options_ so we don't end up with
 
    // an infinite loop.
 
    var playerOptionsCopy = _utilsMergeOptionsJs2['default'](this.options_);
 

	
 
    // Load plugins
 
    if (options.plugins) {
 
      (function () {
 
        var plugins = options.plugins;
 

	
 
        Object.getOwnPropertyNames(plugins).forEach(function (name) {
 
          if (typeof this[name] === 'function') {
 
            this[name](plugins[name]);
 
          } else {
 
            _utilsLogJs2['default'].error('Unable to find plugin:', name);
 
          }
 
        }, _this);
 
      })();
 
    }
 

	
 
    this.options_.playerOptions = playerOptionsCopy;
 

	
 
    this.initChildren();
 

	
 
    // Set isAudio based on whether or not an audio tag was used
 
    this.isAudio(tag.nodeName.toLowerCase() === 'audio');
 

	
 
    // Update controls className. Can't do this when the controls are initially
 
    // set because the element doesn't exist yet.
 
    if (this.controls()) {
 
      this.addClass('vjs-controls-enabled');
 
    } else {
 
      this.addClass('vjs-controls-disabled');
 
    }
 

	
 
    if (this.isAudio()) {
 
      this.addClass('vjs-audio');
 
    }
 

	
 
    if (this.flexNotSupported_()) {
 
      this.addClass('vjs-no-flex');
 
    }
 

	
 
    // TODO: Make this smarter. Toggle user state between touching/mousing
 
    // using events, since devices can have both touch and mouse events.
 
    // if (browser.TOUCH_ENABLED) {
 
    //   this.addClass('vjs-touch-enabled');
 
    // }
 

	
 
    // Make player easily findable by ID
 
    Player.players[this.id_] = this;
 

	
 
    // When the player is first initialized, trigger activity so components
 
    // like the control bar show themselves if needed
 
    this.userActive(true);
 
    this.reportUserActivity();
 
    this.listenForUserActivity_();
 

	
 
    this.on('fullscreenchange', this.handleFullscreenChange_);
 
    this.on('stageclick', this.handleStageClick_);
 
  }
 

	
 
  /*
 
   * Global player list
 
   *
 
   * @type {Object}
 
   */
 

	
 
  /**
 
   * Destroys the video player and does any necessary cleanup
 
   * ```js
 
   *     myPlayer.dispose();
 
   * ```
 
   * This is especially helpful if you are dynamically adding and removing videos
 
   * to/from the DOM.
 
   *
 
   * @method dispose
 
   */
 

	
 
  Player.prototype.dispose = function dispose() {
 
    this.trigger('dispose');
 
    // prevent dispose from being called twice
 
    this.off('dispose');
 

	
 
    if (this.styleEl_) {
 
      this.styleEl_.parentNode.removeChild(this.styleEl_);
 
    }
 

	
 
    // Kill reference to this player
 
    Player.players[this.id_] = null;
 
    if (this.tag && this.tag.player) {
 
      this.tag.player = null;
 
    }
 
    if (this.el_ && this.el_.player) {
 
      this.el_.player = null;
 
    }
 

	
 
    if (this.tech_) {
 
      this.tech_.dispose();
 
    }
 

	
 
    _Component.prototype.dispose.call(this);
 
  };
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  Player.prototype.createEl = function createEl() {
 
    var el = this.el_ = _Component.prototype.createEl.call(this, 'div');
 
    var tag = this.tag;
 

	
 
    // Remove width/height attrs from tag so CSS can make it 100% width/height
 
    tag.removeAttribute('width');
 
    tag.removeAttribute('height');
 

	
 
    // Copy over all the attributes from the tag, including ID and class
 
    // ID will now reference player box, not the video tag
 
    var attrs = Dom.getElAttributes(tag);
 

	
 
    Object.getOwnPropertyNames(attrs).forEach(function (attr) {
 
      // workaround so we don't totally break IE7
 
      // http://stackoverflow.com/questions/3653444/css-styles-not-applied-on-dynamic-elements-in-internet-explorer-7
 
      if (attr === 'class') {
 
        el.className = attrs[attr];
 
      } else {
 
        el.setAttribute(attr, attrs[attr]);
 
      }
 
    });
 

	
 
    // Update tag id/class for use as HTML5 playback tech
 
    // Might think we should do this after embedding in container so .vjs-tech class
 
    // doesn't flash 100% width/height, but class only applies with .video-js parent
 
    tag.id += '_html5_api';
 
    tag.className = 'vjs-tech';
 

	
 
    // Make player findable on elements
 
    tag.player = el.player = this;
 
    // Default state of video is paused
 
    this.addClass('vjs-paused');
 

	
 
    // Add a style element in the player that we'll use to set the width/height
 
    // of the player in a way that's still overrideable by CSS, just like the
 
    // video element
 
    this.styleEl_ = stylesheet.createStyleElement('vjs-styles-dimensions');
 
    var defaultsStyleEl = _globalDocument2['default'].querySelector('.vjs-styles-defaults');
 
    var head = _globalDocument2['default'].querySelector('head');
 
    head.insertBefore(this.styleEl_, defaultsStyleEl ? defaultsStyleEl.nextSibling : head.firstChild);
 

	
 
    // Pass in the width/height/aspectRatio options which will update the style el
 
    this.width(this.options_.width);
 
    this.height(this.options_.height);
 
    this.fluid(this.options_.fluid);
 
    this.aspectRatio(this.options_.aspectRatio);
 

	
 
    // insertElFirst seems to cause the networkState to flicker from 3 to 2, so
 
    // keep track of the original for later so we can know if the source originally failed
 
    tag.initNetworkState_ = tag.networkState;
 

	
 
    // Wrap video tag in div (el/box) container
 
    if (tag.parentNode) {
 
      tag.parentNode.insertBefore(el, tag);
 
    }
 
    Dom.insertElFirst(tag, el); // Breaks iPhone, fixed in HTML5 setup.
 

	
 
    this.el_ = el;
 

	
 
    return el;
 
  };
 

	
 
  /**
 
   * Get/set player width
 
   *
 
   * @param {Number=} value Value for width
 
   * @return {Number} Width when getting
 
   * @method width
 
   */
 

	
 
  Player.prototype.width = function width(value) {
 
    return this.dimension('width', value);
 
  };
 

	
 
  /**
 
   * Get/set player height
 
   *
 
   * @param {Number=} value Value for height
 
   * @return {Number} Height when getting
 
   * @method height
 
   */
 

	
 
  Player.prototype.height = function height(value) {
 
    return this.dimension('height', value);
 
  };
 

	
 
  /**
 
   * Get/set dimension for player
 
   *
 
   * @param {String} dimension Either width or height
 
   * @param {Number=} value Value for dimension
 
   * @return {Component}
 
   * @method dimension
 
   */
 

	
 
  Player.prototype.dimension = function dimension(_dimension, value) {
 
    var privDimension = _dimension + '_';
 

	
 
    if (value === undefined) {
 
      return this[privDimension] || 0;
 
    }
 

	
 
    if (value === '') {
 
      // If an empty string is given, reset the dimension to be automatic
 
      this[privDimension] = undefined;
 
    } else {
 
      var parsedVal = parseFloat(value);
 

	
 
      if (isNaN(parsedVal)) {
 
        _utilsLogJs2['default'].error('Improper value "' + value + '" supplied for for ' + _dimension);
 
        return this;
 
      }
 

	
 
      this[privDimension] = parsedVal;
 
    }
 

	
 
    this.updateStyleEl_();
 
    return this;
 
  };
 

	
 
  /**
 
   * Add/remove the vjs-fluid class
 
   *
 
   * @param {Boolean} bool Value of true adds the class, value of false removes the class
 
   * @method fluid
 
   */
 

	
 
  Player.prototype.fluid = function fluid(bool) {
 
    if (bool === undefined) {
 
      return !!this.fluid_;
 
    }
 

	
 
    this.fluid_ = !!bool;
 

	
 
    if (bool) {
 
      this.addClass('vjs-fluid');
 
    } else {
 
      this.removeClass('vjs-fluid');
 
    }
 
  };
 

	
 
  /**
 
   * Get/Set the aspect ratio
 
   *
 
   * @param {String=} ratio Aspect ratio for player
 
   * @return aspectRatio
 
   * @method aspectRatio
 
   */
 

	
 
  Player.prototype.aspectRatio = function aspectRatio(ratio) {
 
    if (ratio === undefined) {
 
      return this.aspectRatio_;
 
    }
 

	
 
    // Check for width:height format
 
    if (!/^\d+\:\d+$/.test(ratio)) {
 
      throw new Error('Improper value supplied for aspect ratio. The format should be width:height, for example 16:9.');
 
    }
 
    this.aspectRatio_ = ratio;
 

	
 
    // We're assuming if you set an aspect ratio you want fluid mode,
 
    // because in fixed mode you could calculate width and height yourself.
 
    this.fluid(true);
 

	
 
    this.updateStyleEl_();
 
  };
 

	
 
  /**
 
   * Update styles of the player element (height, width and aspect ratio)
 
   *
 
   * @method updateStyleEl_
 
   */
 

	
 
  Player.prototype.updateStyleEl_ = function updateStyleEl_() {
 
    var width = undefined;
 
    var height = undefined;
 
    var aspectRatio = undefined;
 

	
 
    // The aspect ratio is either used directly or to calculate width and height.
 
    if (this.aspectRatio_ !== undefined && this.aspectRatio_ !== 'auto') {
 
      // Use any aspectRatio that's been specifically set
 
      aspectRatio = this.aspectRatio_;
 
    } else if (this.videoWidth()) {
 
      // Otherwise try to get the aspect ratio from the video metadata
 
      aspectRatio = this.videoWidth() + ':' + this.videoHeight();
 
    } else {
 
      // Or use a default. The video element's is 2:1, but 16:9 is more common.
 
      aspectRatio = '16:9';
 
    }
 

	
 
    // Get the ratio as a decimal we can use to calculate dimensions
 
    var ratioParts = aspectRatio.split(':');
 
    var ratioMultiplier = ratioParts[1] / ratioParts[0];
 

	
 
    if (this.width_ !== undefined) {
 
      // Use any width that's been specifically set
 
      width = this.width_;
 
    } else if (this.height_ !== undefined) {
 
      // Or calulate the width from the aspect ratio if a height has been set
 
      width = this.height_ / ratioMultiplier;
 
    } else {
 
      // Or use the video's metadata, or use the video el's default of 300
 
      width = this.videoWidth() || 300;
 
    }
 

	
 
    if (this.height_ !== undefined) {
 
      // Use any height that's been specifically set
 
      height = this.height_;
 
    } else {
 
      // Otherwise calculate the height from the ratio and the width
 
      height = width * ratioMultiplier;
 
    }
 

	
 
    var idClass = this.id() + '-dimensions';
 

	
 
    // Ensure the right class is still on the player for the style element
 
    this.addClass(idClass);
 

	
 
    stylesheet.setTextContent(this.styleEl_, '\n      .' + idClass + ' {\n        width: ' + width + 'px;\n        height: ' + height + 'px;\n      }\n\n      .' + idClass + '.vjs-fluid {\n        padding-top: ' + ratioMultiplier * 100 + '%;\n      }\n    ');
 
  };
 

	
 
  /**
 
   * Load the Media Playback Technology (tech)
 
   * Load/Create an instance of playback technology including element and API methods
 
   * And append playback element in player div.
 
   *
 
   * @param {String} techName Name of the playback technology
 
   * @param {String} source Video source
 
   * @method loadTech_
 
   * @private
 
   */
 

	
 
  Player.prototype.loadTech_ = function loadTech_(techName, source) {
 

	
 
    // Pause and remove current playback technology
 
    if (this.tech_) {
 
      this.unloadTech_();
 
    }
 

	
 
    // get rid of the HTML5 video tag as soon as we are using another tech
 
    if (techName !== 'Html5' && this.tag) {
 
      _componentJs2['default'].getComponent('Html5').disposeMediaElement(this.tag);
 
      this.tag.player = null;
 
      this.tag = null;
 
    }
 

	
 
    this.techName_ = techName;
 

	
 
    // Turn off API access because we're loading a new tech that might load asynchronously
 
    this.isReady_ = false;
 

	
 
    // Grab tech-specific options from player options and add source and parent element to use.
 
    var techOptions = _objectAssign2['default']({
 
      'nativeControlsForTouch': this.options_.nativeControlsForTouch,
 
      'source': source,
 
      'playerId': this.id(),
 
      'techId': this.id() + '_' + techName + '_api',
 
      'textTracks': this.textTracks_,
 
      'autoplay': this.options_.autoplay,
 
      'preload': this.options_.preload,
 
      'loop': this.options_.loop,
 
      'muted': this.options_.muted,
 
      'poster': this.poster(),
 
      'language': this.language(),
 
      'vtt.js': this.options_['vtt.js']
 
    }, this.options_[techName.toLowerCase()]);
 

	
 
    if (this.tag) {
 
      techOptions.tag = this.tag;
 
    }
 

	
 
    if (source) {
 
      this.currentType_ = source.type;
 
      if (source.src === this.cache_.src && this.cache_.currentTime > 0) {
 
        techOptions.startTime = this.cache_.currentTime;
 
      }
 

	
 
      this.cache_.src = source.src;
 
    }
 

	
 
    // Initialize tech instance
 
    var techComponent = _componentJs2['default'].getComponent(techName);
 
    this.tech_ = new techComponent(techOptions);
 

	
 
    // player.triggerReady is always async, so don't need this to be async
 
    this.tech_.ready(Fn.bind(this, this.handleTechReady_), true);
 

	
 
    _tracksTextTrackListConverterJs2['default'].jsonToTextTracks(this.textTracksJson_ || [], this.tech_);
 

	
 
    // Listen to all HTML5-defined events and trigger them on the player
 
    this.on(this.tech_, 'loadstart', this.handleTechLoadStart_);
 
    this.on(this.tech_, 'waiting', this.handleTechWaiting_);
 
    this.on(this.tech_, 'canplay', this.handleTechCanPlay_);
 
    this.on(this.tech_, 'canplaythrough', this.handleTechCanPlayThrough_);
 
    this.on(this.tech_, 'playing', this.handleTechPlaying_);
 
    this.on(this.tech_, 'ended', this.handleTechEnded_);
 
    this.on(this.tech_, 'seeking', this.handleTechSeeking_);
 
    this.on(this.tech_, 'seeked', this.handleTechSeeked_);
 
    this.on(this.tech_, 'play', this.handleTechPlay_);
 
    this.on(this.tech_, 'firstplay', this.handleTechFirstPlay_);
 
    this.on(this.tech_, 'pause', this.handleTechPause_);
 
    this.on(this.tech_, 'progress', this.handleTechProgress_);
 
    this.on(this.tech_, 'durationchange', this.handleTechDurationChange_);
 
    this.on(this.tech_, 'fullscreenchange', this.handleTechFullscreenChange_);
 
    this.on(this.tech_, 'error', this.handleTechError_);
 
    this.on(this.tech_, 'suspend', this.handleTechSuspend_);
 
    this.on(this.tech_, 'abort', this.handleTechAbort_);
 
    this.on(this.tech_, 'emptied', this.handleTechEmptied_);
 
    this.on(this.tech_, 'stalled', this.handleTechStalled_);
 
    this.on(this.tech_, 'loadedmetadata', this.handleTechLoadedMetaData_);
 
    this.on(this.tech_, 'loadeddata', this.handleTechLoadedData_);
 
    this.on(this.tech_, 'timeupdate', this.handleTechTimeUpdate_);
 
    this.on(this.tech_, 'ratechange', this.handleTechRateChange_);
 
    this.on(this.tech_, 'volumechange', this.handleTechVolumeChange_);
 
    this.on(this.tech_, 'texttrackchange', this.handleTechTextTrackChange_);
 
    this.on(this.tech_, 'loadedmetadata', this.updateStyleEl_);
 
    this.on(this.tech_, 'posterchange', this.handleTechPosterChange_);
 

	
 
    this.usingNativeControls(this.techGet_('controls'));
 

	
 
    if (this.controls() && !this.usingNativeControls()) {
 
      this.addTechControlsListeners_();
 
    }
 

	
 
    // Add the tech element in the DOM if it was not already there
 
    // Make sure to not insert the original video element if using Html5
 
    if (this.tech_.el().parentNode !== this.el() && (techName !== 'Html5' || !this.tag)) {
 
      Dom.insertElFirst(this.tech_.el(), this.el());
 
    }
 

	
 
    // Get rid of the original video tag reference after the first tech is loaded
 
    if (this.tag) {
 
      this.tag.player = null;
 
      this.tag = null;
 
    }
 
  };
 

	
 
  /**
 
   * Unload playback technology
 
   *
 
   * @method unloadTech_
 
   * @private
 
   */
 

	
 
  Player.prototype.unloadTech_ = function unloadTech_() {
 
    // Save the current text tracks so that we can reuse the same text tracks with the next tech
 
    this.textTracks_ = this.textTracks();
 
    this.textTracksJson_ = _tracksTextTrackListConverterJs2['default'].textTracksToJson(this);
 

	
 
    this.isReady_ = false;
 

	
 
    this.tech_.dispose();
 

	
 
    this.tech_ = false;
 
  };
 

	
 
  /**
 
   * Set up click and touch listeners for the playback element
 
   *
 
   * On desktops, a click on the video itself will toggle playback,
 
   * on a mobile device a click on the video toggles controls.
 
   * (toggling controls is done by toggling the user state between active and
 
   * inactive)
 
   * A tap can signal that a user has become active, or has become inactive
 
   * e.g. a quick tap on an iPhone movie should reveal the controls. Another
 
   * quick tap should hide them again (signaling the user is in an inactive
 
   * viewing state)
 
   * In addition to this, we still want the user to be considered inactive after
 
   * a few seconds of inactivity.
 
   * Note: the only part of iOS interaction we can't mimic with this setup
 
   * is a touch and hold on the video element counting as activity in order to
 
   * keep the controls showing, but that shouldn't be an issue. A touch and hold
 
   * on any controls will still keep the user active
 
   *
 
   * @private
 
   * @method addTechControlsListeners_
 
   */
 

	
 
  Player.prototype.addTechControlsListeners_ = function addTechControlsListeners_() {
 
    // Make sure to remove all the previous listeners in case we are called multiple times.
 
    this.removeTechControlsListeners_();
 

	
 
    // Some browsers (Chrome & IE) don't trigger a click on a flash swf, but do
 
    // trigger mousedown/up.
 
    // http://stackoverflow.com/questions/1444562/javascript-onclick-event-over-flash-object
 
    // Any touch events are set to block the mousedown event from happening
 
    this.on(this.tech_, 'mousedown', this.handleTechClick_);
 

	
 
    // If the controls were hidden we don't want that to change without a tap event
 
    // so we'll check if the controls were already showing before reporting user
 
    // activity
 
    this.on(this.tech_, 'touchstart', this.handleTechTouchStart_);
 
    this.on(this.tech_, 'touchmove', this.handleTechTouchMove_);
 
    this.on(this.tech_, 'touchend', this.handleTechTouchEnd_);
 

	
 
    // The tap listener needs to come after the touchend listener because the tap
 
    // listener cancels out any reportedUserActivity when setting userActive(false)
 
    this.on(this.tech_, 'tap', this.handleTechTap_);
 
  };
 

	
 
  /**
 
   * Remove the listeners used for click and tap controls. This is needed for
 
   * toggling to controls disabled, where a tap/touch should do nothing.
 
   *
 
   * @method removeTechControlsListeners_
 
   * @private
 
   */
 

	
 
  Player.prototype.removeTechControlsListeners_ = function removeTechControlsListeners_() {
 
    // We don't want to just use `this.off()` because there might be other needed
 
    // listeners added by techs that extend this.
 
    this.off(this.tech_, 'tap', this.handleTechTap_);
 
    this.off(this.tech_, 'touchstart', this.handleTechTouchStart_);
 
    this.off(this.tech_, 'touchmove', this.handleTechTouchMove_);
 
    this.off(this.tech_, 'touchend', this.handleTechTouchEnd_);
 
    this.off(this.tech_, 'mousedown', this.handleTechClick_);
 
  };
 

	
 
  /**
 
   * Player waits for the tech to be ready
 
   *
 
   * @method handleTechReady_
 
   * @private
 
   */
 

	
 
  Player.prototype.handleTechReady_ = function handleTechReady_() {
 
    this.triggerReady();
 

	
 
    // Keep the same volume as before
 
    if (this.cache_.volume) {
 
      this.techCall_('setVolume', this.cache_.volume);
 
    }
 

	
 
    // Look if the tech found a higher resolution poster while loading
 
    this.handleTechPosterChange_();
 

	
 
    // Update the duration if available
 
    this.handleTechDurationChange_();
 

	
 
    // Chrome and Safari both have issues with autoplay.
 
    // In Safari (5.1.1), when we move the video element into the container div, autoplay doesn't work.
 
    // In Chrome (15), if you have autoplay + a poster + no controls, the video gets hidden (but audio plays)
 
    // This fixes both issues. Need to wait for API, so it updates displays correctly
 
    if (this.tag && this.options_.autoplay && this.paused()) {
 
      delete this.tag.poster; // Chrome Fix. Fixed in Chrome v16.
 
      this.play();
 
    }
 
  };
 

	
 
  /**
 
   * Fired when the user agent begins looking for media data
 
   *
 
   * @private
 
   * @method handleTechLoadStart_
 
   */
 

	
 
  Player.prototype.handleTechLoadStart_ = function handleTechLoadStart_() {
 
    // TODO: Update to use `emptied` event instead. See #1277.
 

	
 
    this.removeClass('vjs-ended');
 

	
 
    // reset the error state
 
    this.error(null);
 

	
 
    // If it's already playing we want to trigger a firstplay event now.
 
    // The firstplay event relies on both the play and loadstart events
 
    // which can happen in any order for a new source
 
    if (!this.paused()) {
 
      this.trigger('loadstart');
 
      this.trigger('firstplay');
 
    } else {
 
      // reset the hasStarted state
 
      this.hasStarted(false);
 
      this.trigger('loadstart');
 
    }
 
  };
 

	
 
  /**
 
   * Add/remove the vjs-has-started class
 
   *
 
   * @param {Boolean} hasStarted The value of true adds the class the value of false remove the class
 
   * @return {Boolean} Boolean value if has started
 
   * @private
 
   * @method hasStarted
 
   */
 

	
 
  Player.prototype.hasStarted = function hasStarted(_hasStarted) {
 
    if (_hasStarted !== undefined) {
 
      // only update if this is a new value
 
      if (this.hasStarted_ !== _hasStarted) {
 
        this.hasStarted_ = _hasStarted;
 
        if (_hasStarted) {
 
          this.addClass('vjs-has-started');
 
          // trigger the firstplay event if this newly has played
 
          this.trigger('firstplay');
 
        } else {
 
          this.removeClass('vjs-has-started');
 
        }
 
      }
 
      return this;
 
    }
 
    return !!this.hasStarted_;
 
  };
 

	
 
  /**
 
   * Fired whenever the media begins or resumes playback
 
   *
 
   * @private
 
   * @method handleTechPlay_
 
   */
 

	
 
  Player.prototype.handleTechPlay_ = function handleTechPlay_() {
 
    this.removeClass('vjs-ended');
 
    this.removeClass('vjs-paused');
 
    this.addClass('vjs-playing');
 

	
 
    // hide the poster when the user hits play
 
    // https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-play
 
    this.hasStarted(true);
 

	
 
    this.trigger('play');
 
  };
 

	
 
  /**
 
   * Fired whenever the media begins waiting
 
   *
 
   * @private
 
   * @method handleTechWaiting_
 
   */
 

	
 
  Player.prototype.handleTechWaiting_ = function handleTechWaiting_() {
 
    this.addClass('vjs-waiting');
 
    this.trigger('waiting');
 
  };
 

	
 
  /**
 
   * A handler for events that signal that waiting has ended
 
   * which is not consistent between browsers. See #1351
 
   *
 
   * @private
 
   * @method handleTechCanPlay_
 
   */
 

	
 
  Player.prototype.handleTechCanPlay_ = function handleTechCanPlay_() {
 
    this.removeClass('vjs-waiting');
 
    this.trigger('canplay');
 
  };
 

	
 
  /**
 
   * A handler for events that signal that waiting has ended
 
   * which is not consistent between browsers. See #1351
 
   *
 
   * @private
 
   * @method handleTechCanPlayThrough_
 
   */
 

	
 
  Player.prototype.handleTechCanPlayThrough_ = function handleTechCanPlayThrough_() {
 
    this.removeClass('vjs-waiting');
 
    this.trigger('canplaythrough');
 
  };
 

	
 
  /**
 
   * A handler for events that signal that waiting has ended
 
   * which is not consistent between browsers. See #1351
 
   *
 
   * @private
 
   * @method handleTechPlaying_
 
   */
 

	
 
  Player.prototype.handleTechPlaying_ = function handleTechPlaying_() {
 
    this.removeClass('vjs-waiting');
 
    this.trigger('playing');
 
  };
 

	
 
  /**
 
   * Fired whenever the player is jumping to a new time
 
   *
 
   * @private
 
   * @method handleTechSeeking_
 
   */
 

	
 
  Player.prototype.handleTechSeeking_ = function handleTechSeeking_() {
 
    this.addClass('vjs-seeking');
 
    this.trigger('seeking');
 
  };
 

	
 
  /**
 
   * Fired when the player has finished jumping to a new time
 
   *
 
   * @private
 
   * @method handleTechSeeked_
 
   */
 

	
 
  Player.prototype.handleTechSeeked_ = function handleTechSeeked_() {
 
    this.removeClass('vjs-seeking');
 
    this.trigger('seeked');
 
  };
 

	
 
  /**
 
   * Fired the first time a video is played
 
   * Not part of the HLS spec, and we're not sure if this is the best
 
   * implementation yet, so use sparingly. If you don't have a reason to
 
   * prevent playback, use `myPlayer.one('play');` instead.
 
   *
 
   * @private
 
   * @method handleTechFirstPlay_
 
   */
 

	
 
  Player.prototype.handleTechFirstPlay_ = function handleTechFirstPlay_() {
 
    //If the first starttime attribute is specified
 
    //then we will start at the given offset in seconds
 
    if (this.options_.starttime) {
 
      this.currentTime(this.options_.starttime);
 
    }
 

	
 
    this.addClass('vjs-has-started');
 
    this.trigger('firstplay');
 
  };
 

	
 
  /**
 
   * Fired whenever the media has been paused
 
   *
 
   * @private
 
   * @method handleTechPause_
 
   */
 

	
 
  Player.prototype.handleTechPause_ = function handleTechPause_() {
 
    this.removeClass('vjs-playing');
 
    this.addClass('vjs-paused');
 
    this.trigger('pause');
 
  };
 

	
 
  /**
 
   * Fired while the user agent is downloading media data
 
   *
 
   * @private
 
   * @method handleTechProgress_
 
   */
 

	
 
  Player.prototype.handleTechProgress_ = function handleTechProgress_() {
 
    this.trigger('progress');
 
  };
 

	
 
  /**
 
   * Fired when the end of the media resource is reached (currentTime == duration)
 
   *
 
   * @private
 
   * @method handleTechEnded_
 
   */
 

	
 
  Player.prototype.handleTechEnded_ = function handleTechEnded_() {
 
    this.addClass('vjs-ended');
 
    if (this.options_.loop) {
 
      this.currentTime(0);
 
      this.play();
 
    } else if (!this.paused()) {
 
      this.pause();
 
    }
 

	
 
    this.trigger('ended');
 
  };
 

	
 
  /**
 
   * Fired when the duration of the media resource is first known or changed
 
   *
 
   * @private
 
   * @method handleTechDurationChange_
 
   */
 

	
 
  Player.prototype.handleTechDurationChange_ = function handleTechDurationChange_() {
 
    this.duration(this.techGet_('duration'));
 
  };
 

	
 
  /**
 
   * Handle a click on the media element to play/pause
 
   *
 
   * @param {Object=} event Event object
 
   * @private
 
   * @method handleTechClick_
 
   */
 

	
 
  Player.prototype.handleTechClick_ = function handleTechClick_(event) {
 
    // We're using mousedown to detect clicks thanks to Flash, but mousedown
 
    // will also be triggered with right-clicks, so we need to prevent that
 
    if (event.button !== 0) return;
 

	
 
    // When controls are disabled a click should not toggle playback because
 
    // the click is considered a control
 
    if (this.controls()) {
 
      if (this.paused()) {
 
        this.play();
 
      } else {
 
        this.pause();
 
      }
 
    }
 
  };
 

	
 
  /**
 
   * Handle a tap on the media element. It will toggle the user
 
   * activity state, which hides and shows the controls.
 
   *
 
   * @private
 
   * @method handleTechTap_
 
   */
 

	
 
  Player.prototype.handleTechTap_ = function handleTechTap_() {
 
    this.userActive(!this.userActive());
 
  };
 

	
 
  /**
 
   * Handle touch to start
 
   *
 
   * @private
 
   * @method handleTechTouchStart_
 
   */
 

	
 
  Player.prototype.handleTechTouchStart_ = function handleTechTouchStart_() {
 
    this.userWasActive = this.userActive();
 
  };
 

	
 
  /**
 
   * Handle touch to move
 
   *
 
   * @private
 
   * @method handleTechTouchMove_
 
   */
 

	
 
  Player.prototype.handleTechTouchMove_ = function handleTechTouchMove_() {
 
    if (this.userWasActive) {
 
      this.reportUserActivity();
 
    }
 
  };
 

	
 
  /**
 
   * Handle touch to end
 
   *
 
   * @private
 
   * @method handleTechTouchEnd_
 
   */
 

	
 
  Player.prototype.handleTechTouchEnd_ = function handleTechTouchEnd_(event) {
 
    // Stop the mouse events from also happening
 
    event.preventDefault();
 
  };
 

	
 
  /**
 
   * Fired when the player switches in or out of fullscreen mode
 
   *
 
   * @private
 
   * @method handleFullscreenChange_
 
   */
 

	
 
  Player.prototype.handleFullscreenChange_ = function handleFullscreenChange_() {
 
    if (this.isFullscreen()) {
 
      this.addClass('vjs-fullscreen');
 
    } else {
 
      this.removeClass('vjs-fullscreen');
 
    }
 
  };
 

	
 
  /**
 
   * native click events on the SWF aren't triggered on IE11, Win8.1RT
 
   * use stageclick events triggered from inside the SWF instead
 
   *
 
   * @private
 
   * @method handleStageClick_
 
   */
 

	
 
  Player.prototype.handleStageClick_ = function handleStageClick_() {
 
    this.reportUserActivity();
 
  };
 

	
 
  /**
 
   * Handle Tech Fullscreen Change
 
   *
 
   * @private
 
   * @method handleTechFullscreenChange_
 
   */
 

	
 
  Player.prototype.handleTechFullscreenChange_ = function handleTechFullscreenChange_(event, data) {
 
    if (data) {
 
      this.isFullscreen(data.isFullscreen);
 
    }
 
    this.trigger('fullscreenchange');
 
  };
 

	
 
  /**
 
   * Fires when an error occurred during the loading of an audio/video
 
   *
 
   * @private
 
   * @method handleTechError_
 
   */
 

	
 
  Player.prototype.handleTechError_ = function handleTechError_() {
 
    var error = this.tech_.error();
 
    this.error(error && error.code);
 
  };
 

	
 
  /**
 
   * Fires when the browser is intentionally not getting media data
 
   *
 
   * @private
 
   * @method handleTechSuspend_
 
   */
 

	
 
  Player.prototype.handleTechSuspend_ = function handleTechSuspend_() {
 
    this.trigger('suspend');
 
  };
 

	
 
  /**
 
   * Fires when the loading of an audio/video is aborted
 
   *
 
   * @private
 
   * @method handleTechAbort_
 
   */
 

	
 
  Player.prototype.handleTechAbort_ = function handleTechAbort_() {
 
    this.trigger('abort');
 
  };
 

	
 
  /**
 
   * Fires when the current playlist is empty
 
   *
 
   * @private
 
   * @method handleTechEmptied_
 
   */
 

	
 
  Player.prototype.handleTechEmptied_ = function handleTechEmptied_() {
 
    this.trigger('emptied');
 
  };
 

	
 
  /**
 
   * Fires when the browser is trying to get media data, but data is not available
 
   *
 
   * @private
 
   * @method handleTechStalled_
 
   */
 

	
 
  Player.prototype.handleTechStalled_ = function handleTechStalled_() {
 
    this.trigger('stalled');
 
  };
 

	
 
  /**
 
   * Fires when the browser has loaded meta data for the audio/video
 
   *
 
   * @private
 
   * @method handleTechLoadedMetaData_
 
   */
 

	
 
  Player.prototype.handleTechLoadedMetaData_ = function handleTechLoadedMetaData_() {
 
    this.trigger('loadedmetadata');
 
  };
 

	
 
  /**
 
   * Fires when the browser has loaded the current frame of the audio/video
 
   *
 
   * @private
 
   * @method handleTechLoadedData_
 
   */
 

	
 
  Player.prototype.handleTechLoadedData_ = function handleTechLoadedData_() {
 
    this.trigger('loadeddata');
 
  };
 

	
 
  /**
 
   * Fires when the current playback position has changed
 
   *
 
   * @private
 
   * @method handleTechTimeUpdate_
 
   */
 

	
 
  Player.prototype.handleTechTimeUpdate_ = function handleTechTimeUpdate_() {
 
    this.trigger('timeupdate');
 
  };
 

	
 
  /**
 
   * Fires when the playing speed of the audio/video is changed
 
   *
 
   * @private
 
   * @method handleTechRateChange_
 
   */
 

	
 
  Player.prototype.handleTechRateChange_ = function handleTechRateChange_() {
 
    this.trigger('ratechange');
 
  };
 

	
 
  /**
 
   * Fires when the volume has been changed
 
   *
 
   * @private
 
   * @method handleTechVolumeChange_
 
   */
 

	
 
  Player.prototype.handleTechVolumeChange_ = function handleTechVolumeChange_() {
 
    this.trigger('volumechange');
 
  };
 

	
 
  /**
 
   * Fires when the text track has been changed
 
   *
 
   * @private
 
   * @method handleTechTextTrackChange_
 
   */
 

	
 
  Player.prototype.handleTechTextTrackChange_ = function handleTechTextTrackChange_() {
 
    this.trigger('texttrackchange');
 
  };
 

	
 
  /**
 
   * Get object for cached values.
 
   *
 
   * @return {Object}
 
   * @method getCache
 
   */
 

	
 
  Player.prototype.getCache = function getCache() {
 
    return this.cache_;
 
  };
 

	
 
  /**
 
   * Pass values to the playback tech
 
   *
 
   * @param {String=} method Method
 
   * @param {Object=} arg Argument
 
   * @private
 
   * @method techCall_
 
   */
 

	
 
  Player.prototype.techCall_ = function techCall_(method, arg) {
 
    // If it's not ready yet, call method when it is
 
    if (this.tech_ && !this.tech_.isReady_) {
 
      this.tech_.ready(function () {
 
        this[method](arg);
 
      }, true);
 

	
 
      // Otherwise call method now
 
    } else {
 
        try {
 
          this.tech_[method](arg);
 
        } catch (e) {
 
          _utilsLogJs2['default'](e);
 
          throw e;
 
        }
 
      }
 
  };
 

	
 
  /**
 
   * Get calls can't wait for the tech, and sometimes don't need to.
 
   *
 
   * @param {String} method Tech method
 
   * @return {Method}
 
   * @private
 
   * @method techGet_
 
   */
 

	
 
  Player.prototype.techGet_ = function techGet_(method) {
 
    if (this.tech_ && this.tech_.isReady_) {
 

	
 
      // Flash likes to die and reload when you hide or reposition it.
 
      // In these cases the object methods go away and we get errors.
 
      // When that happens we'll catch the errors and inform tech that it's not ready any more.
 
      try {
 
        return this.tech_[method]();
 
      } catch (e) {
 
        // When building additional tech libs, an expected method may not be defined yet
 
        if (this.tech_[method] === undefined) {
 
          _utilsLogJs2['default']('Video.js: ' + method + ' method not defined for ' + this.techName_ + ' playback technology.', e);
 
        } else {
 
          // When a method isn't available on the object it throws a TypeError
 
          if (e.name === 'TypeError') {
 
            _utilsLogJs2['default']('Video.js: ' + method + ' unavailable on ' + this.techName_ + ' playback technology element.', e);
 
            this.tech_.isReady_ = false;
 
          } else {
 
            _utilsLogJs2['default'](e);
 
          }
 
        }
 
        throw e;
 
      }
 
    }
 

	
 
    return;
 
  };
 

	
 
  /**
 
   * start media playback
 
   * ```js
 
   *     myPlayer.play();
 
   * ```
 
   *
 
   * @return {Player} self
 
   * @method play
 
   */
 

	
 
  Player.prototype.play = function play() {
 
    this.techCall_('play');
 
    return this;
 
  };
 

	
 
  /**
 
   * Pause the video playback
 
   * ```js
 
   *     myPlayer.pause();
 
   * ```
 
   *
 
   * @return {Player} self
 
   * @method pause
 
   */
 

	
 
  Player.prototype.pause = function pause() {
 
    this.techCall_('pause');
 
    return this;
 
  };
 

	
 
  /**
 
   * Check if the player is paused
 
   * ```js
 
   *     var isPaused = myPlayer.paused();
 
   *     var isPlaying = !myPlayer.paused();
 
   * ```
 
   *
 
   * @return {Boolean} false if the media is currently playing, or true otherwise
 
   * @method paused
 
   */
 

	
 
  Player.prototype.paused = function paused() {
 
    // The initial state of paused should be true (in Safari it's actually false)
 
    return this.techGet_('paused') === false ? false : true;
 
  };
 

	
 
  /**
 
   * Returns whether or not the user is "scrubbing". Scrubbing is when the user
 
   * has clicked the progress bar handle and is dragging it along the progress bar.
 
   *
 
   * @param  {Boolean} isScrubbing   True/false the user is scrubbing
 
   * @return {Boolean}               The scrubbing status when getting
 
   * @return {Object}                The player when setting
 
   * @method scrubbing
 
   */
 

	
 
  Player.prototype.scrubbing = function scrubbing(isScrubbing) {
 
    if (isScrubbing !== undefined) {
 
      this.scrubbing_ = !!isScrubbing;
 

	
 
      if (isScrubbing) {
 
        this.addClass('vjs-scrubbing');
 
      } else {
 
        this.removeClass('vjs-scrubbing');
 
      }
 

	
 
      return this;
 
    }
 

	
 
    return this.scrubbing_;
 
  };
 

	
 
  /**
 
   * Get or set the current time (in seconds)
 
   * ```js
 
   *     // get
 
   *     var whereYouAt = myPlayer.currentTime();
 
   *     // set
 
   *     myPlayer.currentTime(120); // 2 minutes into the video
 
   * ```
 
   *
 
   * @param  {Number|String=} seconds The time to seek to
 
   * @return {Number}        The time in seconds, when not setting
 
   * @return {Player}    self, when the current time is set
 
   * @method currentTime
 
   */
 

	
 
  Player.prototype.currentTime = function currentTime(seconds) {
 
    if (seconds !== undefined) {
 

	
 
      this.techCall_('setCurrentTime', seconds);
 

	
 
      return this;
 
    }
 

	
 
    // cache last currentTime and return. default to 0 seconds
 
    //
 
    // Caching the currentTime is meant to prevent a massive amount of reads on the tech's
 
    // currentTime when scrubbing, but may not provide much performance benefit afterall.
 
    // Should be tested. Also something has to read the actual current time or the cache will
 
    // never get updated.
 
    return this.cache_.currentTime = this.techGet_('currentTime') || 0;
 
  };
 

	
 
  /**
 
   * Get the length in time of the video in seconds
 
   * ```js
 
   *     var lengthOfVideo = myPlayer.duration();
 
   * ```
 
   * **NOTE**: The video must have started loading before the duration can be
 
   * known, and in the case of Flash, may not be known until the video starts
 
   * playing.
 
   *
 
   * @param {Number} seconds Duration when setting
 
   * @return {Number} The duration of the video in seconds when getting
 
   * @method duration
 
   */
 

	
 
  Player.prototype.duration = function duration(seconds) {
 
    if (seconds === undefined) {
 
      return this.cache_.duration || 0;
 
    }
 

	
 
    seconds = parseFloat(seconds) || 0;
 

	
 
    // Standardize on Inifity for signaling video is live
 
    if (seconds < 0) {
 
      seconds = Infinity;
 
    }
 

	
 
    if (seconds !== this.cache_.duration) {
 
      // Cache the last set value for optimized scrubbing (esp. Flash)
 
      this.cache_.duration = seconds;
 

	
 
      if (seconds === Infinity) {
 
        this.addClass('vjs-live');
 
      } else {
 
        this.removeClass('vjs-live');
 
      }
 

	
 
      this.trigger('durationchange');
 
    }
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Calculates how much time is left.
 
   * ```js
 
   *     var timeLeft = myPlayer.remainingTime();
 
   * ```
 
   * Not a native video element function, but useful
 
   *
 
   * @return {Number} The time remaining in seconds
 
   * @method remainingTime
 
   */
 

	
 
  Player.prototype.remainingTime = function remainingTime() {
 
    return this.duration() - this.currentTime();
 
  };
 

	
 
  // http://dev.w3.org/html5/spec/video.html#dom-media-buffered
 
  // Buffered returns a timerange object.
 
  // Kind of like an array of portions of the video that have been downloaded.
 

	
 
  /**
 
   * Get a TimeRange object with the times of the video that have been downloaded
 
   * If you just want the percent of the video that's been downloaded,
 
   * use bufferedPercent.
 
   * ```js
 
   *     // Number of different ranges of time have been buffered. Usually 1.
 
   *     numberOfRanges = bufferedTimeRange.length,
 
   *     // Time in seconds when the first range starts. Usually 0.
 
   *     firstRangeStart = bufferedTimeRange.start(0),
 
   *     // Time in seconds when the first range ends
 
   *     firstRangeEnd = bufferedTimeRange.end(0),
 
   *     // Length in seconds of the first time range
 
   *     firstRangeLength = firstRangeEnd - firstRangeStart;
 
   * ```
 
   *
 
   * @return {Object} A mock TimeRange object (following HTML spec)
 
   * @method buffered
 
   */
 

	
 
  Player.prototype.buffered = function buffered() {
 
    var buffered = this.techGet_('buffered');
 

	
 
    if (!buffered || !buffered.length) {
 
      buffered = _utilsTimeRangesJs.createTimeRange(0, 0);
 
    }
 

	
 
    return buffered;
 
  };
 

	
 
  /**
 
   * Get the percent (as a decimal) of the video that's been downloaded
 
   * ```js
 
   *     var howMuchIsDownloaded = myPlayer.bufferedPercent();
 
   * ```
 
   * 0 means none, 1 means all.
 
   * (This method isn't in the HTML5 spec, but it's very convenient)
 
   *
 
   * @return {Number} A decimal between 0 and 1 representing the percent
 
   * @method bufferedPercent
 
   */
 

	
 
  Player.prototype.bufferedPercent = function bufferedPercent() {
 
    return _utilsBufferJs.bufferedPercent(this.buffered(), this.duration());
 
  };
 

	
 
  /**
 
   * Get the ending time of the last buffered time range
 
   * This is used in the progress bar to encapsulate all time ranges.
 
   *
 
   * @return {Number} The end of the last buffered time range
 
   * @method bufferedEnd
 
   */
 

	
 
  Player.prototype.bufferedEnd = function bufferedEnd() {
 
    var buffered = this.buffered(),
 
        duration = this.duration(),
 
        end = buffered.end(buffered.length - 1);
 

	
 
    if (end > duration) {
 
      end = duration;
 
    }
 

	
 
    return end;
 
  };
 

	
 
  /**
 
   * Get or set the current volume of the media
 
   * ```js
 
   *     // get
 
   *     var howLoudIsIt = myPlayer.volume();
 
   *     // set
 
   *     myPlayer.volume(0.5); // Set volume to half
 
   * ```
 
   * 0 is off (muted), 1.0 is all the way up, 0.5 is half way.
 
   *
 
   * @param  {Number} percentAsDecimal The new volume as a decimal percent
 
   * @return {Number}              The current volume when getting
 
   * @return {Player}              self when setting
 
   * @method volume
 
   */
 

	
 
  Player.prototype.volume = function volume(percentAsDecimal) {
 
    var vol = undefined;
 

	
 
    if (percentAsDecimal !== undefined) {
 
      vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal))); // Force value to between 0 and 1
 
      this.cache_.volume = vol;
 
      this.techCall_('setVolume', vol);
 

	
 
      return this;
 
    }
 

	
 
    // Default to 1 when returning current volume.
 
    vol = parseFloat(this.techGet_('volume'));
 
    return isNaN(vol) ? 1 : vol;
 
  };
 

	
 
  /**
 
   * Get the current muted state, or turn mute on or off
 
   * ```js
 
   *     // get
 
   *     var isVolumeMuted = myPlayer.muted();
 
   *     // set
 
   *     myPlayer.muted(true); // mute the volume
 
   * ```
 
   *
 
   * @param  {Boolean=} muted True to mute, false to unmute
 
   * @return {Boolean} True if mute is on, false if not when getting
 
   * @return {Player} self when setting mute
 
   * @method muted
 
   */
 

	
 
  Player.prototype.muted = function muted(_muted) {
 
    if (_muted !== undefined) {
 
      this.techCall_('setMuted', _muted);
 
      return this;
 
    }
 
    return this.techGet_('muted') || false; // Default to false
 
  };
 

	
 
  // Check if current tech can support native fullscreen
 
  // (e.g. with built in controls like iOS, so not our flash swf)
 
  /**
 
   * Check to see if fullscreen is supported
 
   *
 
   * @return {Boolean}
 
   * @method supportsFullScreen
 
   */
 

	
 
  Player.prototype.supportsFullScreen = function supportsFullScreen() {
 
    return this.techGet_('supportsFullScreen') || false;
 
  };
 

	
 
  /**
 
   * Check if the player is in fullscreen mode
 
   * ```js
 
   *     // get
 
   *     var fullscreenOrNot = myPlayer.isFullscreen();
 
   *     // set
 
   *     myPlayer.isFullscreen(true); // tell the player it's in fullscreen
 
   * ```
 
   * NOTE: As of the latest HTML5 spec, isFullscreen is no longer an official
 
   * property and instead document.fullscreenElement is used. But isFullscreen is
 
   * still a valuable property for internal player workings.
 
   *
 
   * @param  {Boolean=} isFS Update the player's fullscreen state
 
   * @return {Boolean} true if fullscreen false if not when getting
 
   * @return {Player} self when setting
 
   * @method isFullscreen
 
   */
 

	
 
  Player.prototype.isFullscreen = function isFullscreen(isFS) {
 
    if (isFS !== undefined) {
 
      this.isFullscreen_ = !!isFS;
 
      return this;
 
    }
 
    return !!this.isFullscreen_;
 
  };
 

	
 
  /**
 
   * Increase the size of the video to full screen
 
   * ```js
 
   *     myPlayer.requestFullscreen();
 
   * ```
 
   * In some browsers, full screen is not supported natively, so it enters
 
   * "full window mode", where the video fills the browser window.
 
   * In browsers and devices that support native full screen, sometimes the
 
   * browser's default controls will be shown, and not the Video.js custom skin.
 
   * This includes most mobile devices (iOS, Android) and older versions of
 
   * Safari.
 
   *
 
   * @return {Player} self
 
   * @method requestFullscreen
 
   */
 

	
 
  Player.prototype.requestFullscreen = function requestFullscreen() {
 
    var fsApi = _fullscreenApiJs2['default'];
 

	
 
    this.isFullscreen(true);
 

	
 
    if (fsApi.requestFullscreen) {
 
      // the browser supports going fullscreen at the element level so we can
 
      // take the controls fullscreen as well as the video
 

	
 
      // Trigger fullscreenchange event after change
 
      // We have to specifically add this each time, and remove
 
      // when canceling fullscreen. Otherwise if there's multiple
 
      // players on a page, they would all be reacting to the same fullscreen
 
      // events
 
      Events.on(_globalDocument2['default'], fsApi.fullscreenchange, Fn.bind(this, function documentFullscreenChange(e) {
 
        this.isFullscreen(_globalDocument2['default'][fsApi.fullscreenElement]);
 

	
 
        // If cancelling fullscreen, remove event listener.
 
        if (this.isFullscreen() === false) {
 
          Events.off(_globalDocument2['default'], fsApi.fullscreenchange, documentFullscreenChange);
 
        }
 

	
 
        this.trigger('fullscreenchange');
 
      }));
 

	
 
      this.el_[fsApi.requestFullscreen]();
 
    } else if (this.tech_.supportsFullScreen()) {
 
      // we can't take the video.js controls fullscreen but we can go fullscreen
 
      // with native controls
 
      this.techCall_('enterFullScreen');
 
    } else {
 
      // fullscreen isn't supported so we'll just stretch the video element to
 
      // fill the viewport
 
      this.enterFullWindow();
 
      this.trigger('fullscreenchange');
 
    }
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Return the video to its normal size after having been in full screen mode
 
   * ```js
 
   *     myPlayer.exitFullscreen();
 
   * ```
 
   *
 
   * @return {Player} self
 
   * @method exitFullscreen
 
   */
 

	
 
  Player.prototype.exitFullscreen = function exitFullscreen() {
 
    var fsApi = _fullscreenApiJs2['default'];
 
    this.isFullscreen(false);
 

	
 
    // Check for browser element fullscreen support
 
    if (fsApi.requestFullscreen) {
 
      _globalDocument2['default'][fsApi.exitFullscreen]();
 
    } else if (this.tech_.supportsFullScreen()) {
 
      this.techCall_('exitFullScreen');
 
    } else {
 
      this.exitFullWindow();
 
      this.trigger('fullscreenchange');
 
    }
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * When fullscreen isn't supported we can stretch the video container to as wide as the browser will let us.
 
   *
 
   * @method enterFullWindow
 
   */
 

	
 
  Player.prototype.enterFullWindow = function enterFullWindow() {
 
    this.isFullWindow = true;
 

	
 
    // Storing original doc overflow value to return to when fullscreen is off
 
    this.docOrigOverflow = _globalDocument2['default'].documentElement.style.overflow;
 

	
 
    // Add listener for esc key to exit fullscreen
 
    Events.on(_globalDocument2['default'], 'keydown', Fn.bind(this, this.fullWindowOnEscKey));
 

	
 
    // Hide any scroll bars
 
    _globalDocument2['default'].documentElement.style.overflow = 'hidden';
 

	
 
    // Apply fullscreen styles
 
    Dom.addElClass(_globalDocument2['default'].body, 'vjs-full-window');
 

	
 
    this.trigger('enterFullWindow');
 
  };
 

	
 
  /**
 
   * Check for call to either exit full window or full screen on ESC key
 
   *
 
   * @param {String} event Event to check for key press
 
   * @method fullWindowOnEscKey
 
   */
 

	
 
  Player.prototype.fullWindowOnEscKey = function fullWindowOnEscKey(event) {
 
    if (event.keyCode === 27) {
 
      if (this.isFullscreen() === true) {
 
        this.exitFullscreen();
 
      } else {
 
        this.exitFullWindow();
 
      }
 
    }
 
  };
 

	
 
  /**
 
   * Exit full window
 
   *
 
   * @method exitFullWindow
 
   */
 

	
 
  Player.prototype.exitFullWindow = function exitFullWindow() {
 
    this.isFullWindow = false;
 
    Events.off(_globalDocument2['default'], 'keydown', this.fullWindowOnEscKey);
 

	
 
    // Unhide scroll bars.
 
    _globalDocument2['default'].documentElement.style.overflow = this.docOrigOverflow;
 

	
 
    // Remove fullscreen styles
 
    Dom.removeElClass(_globalDocument2['default'].body, 'vjs-full-window');
 

	
 
    // Resize the box, controller, and poster to original sizes
 
    // this.positionAll();
 
    this.trigger('exitFullWindow');
 
  };
 

	
 
  /**
 
   * Select source based on tech order
 
   *
 
   * @param {Array} sources The sources for a media asset
 
   * @return {Object|Boolean} Object of source and tech order, otherwise false
 
   * @method selectSource
 
   */
 

	
 
  Player.prototype.selectSource = function selectSource(sources) {
 
    // Loop through each playback technology in the options order
 
    for (var i = 0, j = this.options_.techOrder; i < j.length; i++) {
 
      var techName = _utilsToTitleCaseJs2['default'](j[i]);
 
      var tech = _componentJs2['default'].getComponent(techName);
 

	
 
      // Check if the current tech is defined before continuing
 
      if (!tech) {
 
        _utilsLogJs2['default'].error('The "' + techName + '" tech is undefined. Skipped browser support check for that tech.');
 
        continue;
 
      }
 

	
 
      // Check if the browser supports this technology
 
      if (tech.isSupported()) {
 
        // Loop through each source object
 
        for (var a = 0, b = sources; a < b.length; a++) {
 
          var source = b[a];
 

	
 
          // Check if source can be played with this technology
 
          if (tech.canPlaySource(source)) {
 
            return { source: source, tech: techName };
 
          }
 
        }
 
      }
 
    }
 

	
 
    return false;
 
  };
 

	
 
  /**
 
   * The source function updates the video source
 
   * There are three types of variables you can pass as the argument.
 
   * **URL String**: A URL to the the video file. Use this method if you are sure
 
   * the current playback technology (HTML5/Flash) can support the source you
 
   * provide. Currently only MP4 files can be used in both HTML5 and Flash.
 
   * ```js
 
   *     myPlayer.src("http://www.example.com/path/to/video.mp4");
 
   * ```
 
   * **Source Object (or element):* * A javascript object containing information
 
   * about the source file. Use this method if you want the player to determine if
 
   * it can support the file using the type information.
 
   * ```js
 
   *     myPlayer.src({ type: "video/mp4", src: "http://www.example.com/path/to/video.mp4" });
 
   * ```
 
   * **Array of Source Objects:* * To provide multiple versions of the source so
 
   * that it can be played using HTML5 across browsers you can use an array of
 
   * source objects. Video.js will detect which version is supported and load that
 
   * file.
 
   * ```js
 
   *     myPlayer.src([
 
   *       { type: "video/mp4", src: "http://www.example.com/path/to/video.mp4" },
 
   *       { type: "video/webm", src: "http://www.example.com/path/to/video.webm" },
 
   *       { type: "video/ogg", src: "http://www.example.com/path/to/video.ogv" }
 
   *     ]);
 
   * ```
 
   *
 
   * @param  {String|Object|Array=} source The source URL, object, or array of sources
 
   * @return {String} The current video source when getting
 
   * @return {String} The player when setting
 
   * @method src
 
   */
 

	
 
  Player.prototype.src = function src(source) {
 
    if (source === undefined) {
 
      return this.techGet_('src');
 
    }
 

	
 
    var currentTech = _componentJs2['default'].getComponent(this.techName_);
 

	
 
    // case: Array of source objects to choose from and pick the best to play
 
    if (Array.isArray(source)) {
 
      this.sourceList_(source);
 

	
 
      // case: URL String (http://myvideo...)
 
    } else if (typeof source === 'string') {
 
        // create a source object from the string
 
        this.src({ src: source });
 

	
 
        // case: Source object { src: '', type: '' ... }
 
      } else if (source instanceof Object) {
 
          // check if the source has a type and the loaded tech cannot play the source
 
          // if there's no type we'll just try the current tech
 
          if (source.type && !currentTech.canPlaySource(source)) {
 
            // create a source list with the current source and send through
 
            // the tech loop to check for a compatible technology
 
            this.sourceList_([source]);
 
          } else {
 
            this.cache_.src = source.src;
 
            this.currentType_ = source.type || '';
 

	
 
            // wait until the tech is ready to set the source
 
            this.ready(function () {
 

	
 
              // The setSource tech method was added with source handlers
 
              // so older techs won't support it
 
              // We need to check the direct prototype for the case where subclasses
 
              // of the tech do not support source handlers
 
              if (currentTech.prototype.hasOwnProperty('setSource')) {
 
                this.techCall_('setSource', source);
 
              } else {
 
                this.techCall_('src', source.src);
 
              }
 

	
 
              if (this.options_.preload === 'auto') {
 
                this.load();
 
              }
 

	
 
              if (this.options_.autoplay) {
 
                this.play();
 
              }
 

	
 
              // Set the source synchronously if possible (#2326)
 
            }, true);
 
          }
 
        }
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Handle an array of source objects
 
   *
 
   * @param  {Array} sources Array of source objects
 
   * @private
 
   * @method sourceList_
 
   */
 

	
 
  Player.prototype.sourceList_ = function sourceList_(sources) {
 
    var sourceTech = this.selectSource(sources);
 

	
 
    if (sourceTech) {
 
      if (sourceTech.tech === this.techName_) {
 
        // if this technology is already loaded, set the source
 
        this.src(sourceTech.source);
 
      } else {
 
        // load this technology with the chosen source
 
        this.loadTech_(sourceTech.tech, sourceTech.source);
 
      }
 
    } else {
 
      // We need to wrap this in a timeout to give folks a chance to add error event handlers
 
      this.setTimeout(function () {
 
        this.error({ code: 4, message: this.localize(this.options_.notSupportedMessage) });
 
      }, 0);
 

	
 
      // we could not find an appropriate tech, but let's still notify the delegate that this is it
 
      // this needs a better comment about why this is needed
 
      this.triggerReady();
 
    }
 
  };
 

	
 
  /**
 
   * Begin loading the src data.
 
   *
 
   * @return {Player} Returns the player
 
   * @method load
 
   */
 

	
 
  Player.prototype.load = function load() {
 
    this.techCall_('load');
 
    return this;
 
  };
 

	
 
  /**
 
   * Returns the fully qualified URL of the current source value e.g. http://mysite.com/video.mp4
 
   * Can be used in conjuction with `currentType` to assist in rebuilding the current source object.
 
   *
 
   * @return {String} The current source
 
   * @method currentSrc
 
   */
 

	
 
  Player.prototype.currentSrc = function currentSrc() {
 
    return this.techGet_('currentSrc') || this.cache_.src || '';
 
  };
 

	
 
  /**
 
   * Get the current source type e.g. video/mp4
 
   * This can allow you rebuild the current source object so that you could load the same
 
   * source and tech later
 
   *
 
   * @return {String} The source MIME type
 
   * @method currentType
 
   */
 

	
 
  Player.prototype.currentType = function currentType() {
 
    return this.currentType_ || '';
 
  };
 

	
 
  /**
 
   * Get or set the preload attribute
 
   *
 
   * @param {Boolean} value Boolean to determine if preload should be used
 
   * @return {String} The preload attribute value when getting
 
   * @return {Player} Returns the player when setting
 
   * @method preload
 
   */
 

	
 
  Player.prototype.preload = function preload(value) {
 
    if (value !== undefined) {
 
      this.techCall_('setPreload', value);
 
      this.options_.preload = value;
 
      return this;
 
    }
 
    return this.techGet_('preload');
 
  };
 

	
 
  /**
 
   * Get or set the autoplay attribute.
 
   *
 
   * @param {Boolean} value Boolean to determine if preload should be used
 
   * @return {String} The autoplay attribute value when getting
 
   * @return {Player} Returns the player when setting
 
   * @method autoplay
 
   */
 

	
 
  Player.prototype.autoplay = function autoplay(value) {
 
    if (value !== undefined) {
 
      this.techCall_('setAutoplay', value);
 
      this.options_.autoplay = value;
 
      return this;
 
    }
 
    return this.techGet_('autoplay', value);
 
  };
 

	
 
  /**
 
   * Get or set the loop attribute on the video element.
 
   *
 
   * @param {Boolean} value Boolean to determine if preload should be used
 
   * @return {String} The loop attribute value when getting
 
   * @return {Player} Returns the player when setting
 
   * @method loop
 
   */
 

	
 
  Player.prototype.loop = function loop(value) {
 
    if (value !== undefined) {
 
      this.techCall_('setLoop', value);
 
      this.options_['loop'] = value;
 
      return this;
 
    }
 
    return this.techGet_('loop');
 
  };
 

	
 
  /**
 
   * Get or set the poster image source url
 
   *
 
   * ##### EXAMPLE:
 
   * ```js
 
   *     // get
 
   *     var currentPoster = myPlayer.poster();
 
   *     // set
 
   *     myPlayer.poster('http://example.com/myImage.jpg');
 
   * ```
 
   *
 
   * @param  {String=} src Poster image source URL
 
   * @return {String} poster URL when getting
 
   * @return {Player} self when setting
 
   * @method poster
 
   */
 

	
 
  Player.prototype.poster = function poster(src) {
 
    if (src === undefined) {
 
      return this.poster_;
 
    }
 

	
 
    // The correct way to remove a poster is to set as an empty string
 
    // other falsey values will throw errors
 
    if (!src) {
 
      src = '';
 
    }
 

	
 
    // update the internal poster variable
 
    this.poster_ = src;
 

	
 
    // update the tech's poster
 
    this.techCall_('setPoster', src);
 

	
 
    // alert components that the poster has been set
 
    this.trigger('posterchange');
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Some techs (e.g. YouTube) can provide a poster source in an
 
   * asynchronous way. We want the poster component to use this
 
   * poster source so that it covers up the tech's controls.
 
   * (YouTube's play button). However we only want to use this
 
   * soruce if the player user hasn't set a poster through
 
   * the normal APIs.
 
   *
 
   * @private
 
   * @method handleTechPosterChange_
 
   */
 

	
 
  Player.prototype.handleTechPosterChange_ = function handleTechPosterChange_() {
 
    if (!this.poster_ && this.tech_ && this.tech_.poster) {
 
      this.poster_ = this.tech_.poster() || '';
 

	
 
      // Let components know the poster has changed
 
      this.trigger('posterchange');
 
    }
 
  };
 

	
 
  /**
 
   * Get or set whether or not the controls are showing.
 
   *
 
   * @param  {Boolean} bool Set controls to showing or not
 
   * @return {Boolean}    Controls are showing
 
   * @method controls
 
   */
 

	
 
  Player.prototype.controls = function controls(bool) {
 
    if (bool !== undefined) {
 
      bool = !!bool; // force boolean
 
      // Don't trigger a change event unless it actually changed
 
      if (this.controls_ !== bool) {
 
        this.controls_ = bool;
 

	
 
        if (this.usingNativeControls()) {
 
          this.techCall_('setControls', bool);
 
        }
 

	
 
        if (bool) {
 
          this.removeClass('vjs-controls-disabled');
 
          this.addClass('vjs-controls-enabled');
 
          this.trigger('controlsenabled');
 

	
 
          if (!this.usingNativeControls()) {
 
            this.addTechControlsListeners_();
 
          }
 
        } else {
 
          this.removeClass('vjs-controls-enabled');
 
          this.addClass('vjs-controls-disabled');
 
          this.trigger('controlsdisabled');
 

	
 
          if (!this.usingNativeControls()) {
 
            this.removeTechControlsListeners_();
 
          }
 
        }
 
      }
 
      return this;
 
    }
 
    return !!this.controls_;
 
  };
 

	
 
  /**
 
   * Toggle native controls on/off. Native controls are the controls built into
 
   * devices (e.g. default iPhone controls), Flash, or other techs
 
   * (e.g. Vimeo Controls)
 
   * **This should only be set by the current tech, because only the tech knows
 
   * if it can support native controls**
 
   *
 
   * @param  {Boolean} bool    True signals that native controls are on
 
   * @return {Player}      Returns the player
 
   * @private
 
   * @method usingNativeControls
 
   */
 

	
 
  Player.prototype.usingNativeControls = function usingNativeControls(bool) {
 
    if (bool !== undefined) {
 
      bool = !!bool; // force boolean
 
      // Don't trigger a change event unless it actually changed
 
      if (this.usingNativeControls_ !== bool) {
 
        this.usingNativeControls_ = bool;
 
        if (bool) {
 
          this.addClass('vjs-using-native-controls');
 

	
 
          /**
 
            * player is using the native device controls
 
           *
 
            * @event usingnativecontrols
 
            * @memberof Player
 
            * @instance
 
            * @private
 
            */
 
          this.trigger('usingnativecontrols');
 
        } else {
 
          this.removeClass('vjs-using-native-controls');
 

	
 
          /**
 
            * player is using the custom HTML controls
 
           *
 
            * @event usingcustomcontrols
 
            * @memberof Player
 
            * @instance
 
            * @private
 
            */
 
          this.trigger('usingcustomcontrols');
 
        }
 
      }
 
      return this;
 
    }
 
    return !!this.usingNativeControls_;
 
  };
 

	
 
  /**
 
   * Set or get the current MediaError
 
   *
 
   * @param  {*} err A MediaError or a String/Number to be turned into a MediaError
 
   * @return {MediaError|null}     when getting
 
   * @return {Player}              when setting
 
   * @method error
 
   */
 

	
 
  Player.prototype.error = function error(err) {
 
    if (err === undefined) {
 
      return this.error_ || null;
 
    }
 

	
 
    // restoring to default
 
    if (err === null) {
 
      this.error_ = err;
 
      this.removeClass('vjs-error');
 
      return this;
 
    }
 

	
 
    // error instance
 
    if (err instanceof _mediaErrorJs2['default']) {
 
      this.error_ = err;
 
    } else {
 
      this.error_ = new _mediaErrorJs2['default'](err);
 
    }
 

	
 
    // fire an error event on the player
 
    this.trigger('error');
 

	
 
    // add the vjs-error classname to the player
 
    this.addClass('vjs-error');
 

	
 
    // log the name of the error type and any message
 
    // ie8 just logs "[object object]" if you just log the error object
 
    _utilsLogJs2['default'].error('(CODE:' + this.error_.code + ' ' + _mediaErrorJs2['default'].errorTypes[this.error_.code] + ')', this.error_.message, this.error_);
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Returns whether or not the player is in the "ended" state.
 
   *
 
   * @return {Boolean} True if the player is in the ended state, false if not.
 
   * @method ended
 
   */
 

	
 
  Player.prototype.ended = function ended() {
 
    return this.techGet_('ended');
 
  };
 

	
 
  /**
 
   * Returns whether or not the player is in the "seeking" state.
 
   *
 
   * @return {Boolean} True if the player is in the seeking state, false if not.
 
   * @method seeking
 
   */
 

	
 
  Player.prototype.seeking = function seeking() {
 
    return this.techGet_('seeking');
 
  };
 

	
 
  /**
 
   * Returns the TimeRanges of the media that are currently available
 
   * for seeking to.
 
   *
 
   * @return {TimeRanges} the seekable intervals of the media timeline
 
   * @method seekable
 
   */
 

	
 
  Player.prototype.seekable = function seekable() {
 
    return this.techGet_('seekable');
 
  };
 

	
 
  /**
 
   * Report user activity
 
   *
 
   * @param {Object} event Event object
 
   * @method reportUserActivity
 
   */
 

	
 
  Player.prototype.reportUserActivity = function reportUserActivity(event) {
 
    this.userActivity_ = true;
 
  };
 

	
 
  /**
 
   * Get/set if user is active
 
   *
 
   * @param {Boolean} bool Value when setting
 
   * @return {Boolean} Value if user is active user when getting
 
   * @method userActive
 
   */
 

	
 
  Player.prototype.userActive = function userActive(bool) {
 
    if (bool !== undefined) {
 
      bool = !!bool;
 
      if (bool !== this.userActive_) {
 
        this.userActive_ = bool;
 
        if (bool) {
 
          // If the user was inactive and is now active we want to reset the
 
          // inactivity timer
 
          this.userActivity_ = true;
 
          this.removeClass('vjs-user-inactive');
 
          this.addClass('vjs-user-active');
 
          this.trigger('useractive');
 
        } else {
 
          // We're switching the state to inactive manually, so erase any other
 
          // activity
 
          this.userActivity_ = false;
 

	
 
          // Chrome/Safari/IE have bugs where when you change the cursor it can
 
          // trigger a mousemove event. This causes an issue when you're hiding
 
          // the cursor when the user is inactive, and a mousemove signals user
 
          // activity. Making it impossible to go into inactive mode. Specifically
 
          // this happens in fullscreen when we really need to hide the cursor.
 
          //
 
          // When this gets resolved in ALL browsers it can be removed
 
          // https://code.google.com/p/chromium/issues/detail?id=103041
 
          if (this.tech_) {
 
            this.tech_.one('mousemove', function (e) {
 
              e.stopPropagation();
 
              e.preventDefault();
 
            });
 
          }
 

	
 
          this.removeClass('vjs-user-active');
 
          this.addClass('vjs-user-inactive');
 
          this.trigger('userinactive');
 
        }
 
      }
 
      return this;
 
    }
 
    return this.userActive_;
 
  };
 

	
 
  /**
 
   * Listen for user activity based on timeout value
 
   *
 
   * @private
 
   * @method listenForUserActivity_
 
   */
 

	
 
  Player.prototype.listenForUserActivity_ = function listenForUserActivity_() {
 
    var mouseInProgress = undefined,
 
        lastMoveX = undefined,
 
        lastMoveY = undefined;
 

	
 
    var handleActivity = Fn.bind(this, this.reportUserActivity);
 

	
 
    var handleMouseMove = function handleMouseMove(e) {
 
      // #1068 - Prevent mousemove spamming
 
      // Chrome Bug: https://code.google.com/p/chromium/issues/detail?id=366970
 
      if (e.screenX !== lastMoveX || e.screenY !== lastMoveY) {
 
        lastMoveX = e.screenX;
 
        lastMoveY = e.screenY;
 
        handleActivity();
 
      }
 
    };
 

	
 
    var handleMouseDown = function handleMouseDown() {
 
      handleActivity();
 
      // For as long as the they are touching the device or have their mouse down,
 
      // we consider them active even if they're not moving their finger or mouse.
 
      // So we want to continue to update that they are active
 
      this.clearInterval(mouseInProgress);
 
      // Setting userActivity=true now and setting the interval to the same time
 
      // as the activityCheck interval (250) should ensure we never miss the
 
      // next activityCheck
 
      mouseInProgress = this.setInterval(handleActivity, 250);
 
    };
 

	
 
    var handleMouseUp = function handleMouseUp(event) {
 
      handleActivity();
 
      // Stop the interval that maintains activity if the mouse/touch is down
 
      this.clearInterval(mouseInProgress);
 
    };
 

	
 
    // Any mouse movement will be considered user activity
 
    this.on('mousedown', handleMouseDown);
 
    this.on('mousemove', handleMouseMove);
 
    this.on('mouseup', handleMouseUp);
 

	
 
    // Listen for keyboard navigation
 
    // Shouldn't need to use inProgress interval because of key repeat
 
    this.on('keydown', handleActivity);
 
    this.on('keyup', handleActivity);
 

	
 
    // Run an interval every 250 milliseconds instead of stuffing everything into
 
    // the mousemove/touchmove function itself, to prevent performance degradation.
 
    // `this.reportUserActivity` simply sets this.userActivity_ to true, which
 
    // then gets picked up by this loop
 
    // http://ejohn.org/blog/learning-from-twitter/
 
    var inactivityTimeout = undefined;
 
    var activityCheck = this.setInterval(function () {
 
      // Check to see if mouse/touch activity has happened
 
      if (this.userActivity_) {
 
        // Reset the activity tracker
 
        this.userActivity_ = false;
 

	
 
        // If the user state was inactive, set the state to active
 
        this.userActive(true);
 

	
 
        // Clear any existing inactivity timeout to start the timer over
 
        this.clearTimeout(inactivityTimeout);
 

	
 
        var timeout = this.options_['inactivityTimeout'];
 
        if (timeout > 0) {
 
          // In <timeout> milliseconds, if no more activity has occurred the
 
          // user will be considered inactive
 
          inactivityTimeout = this.setTimeout(function () {
 
            // Protect against the case where the inactivityTimeout can trigger just
 
            // before the next user activity is picked up by the activityCheck loop
 
            // causing a flicker
 
            if (!this.userActivity_) {
 
              this.userActive(false);
 
            }
 
          }, timeout);
 
        }
 
      }
 
    }, 250);
 
  };
 

	
 
  /**
 
   * Gets or sets the current playback rate.  A playback rate of
 
   * 1.0 represents normal speed and 0.5 would indicate half-speed
 
   * playback, for instance.
 
   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-playbackrate
 
   *
 
   * @param  {Number} rate    New playback rate to set.
 
   * @return {Number}         Returns the new playback rate when setting
 
   * @return {Number}         Returns the current playback rate when getting
 
   * @method playbackRate
 
   */
 

	
 
  Player.prototype.playbackRate = function playbackRate(rate) {
 
    if (rate !== undefined) {
 
      this.techCall_('setPlaybackRate', rate);
 
      return this;
 
    }
 

	
 
    if (this.tech_ && this.tech_['featuresPlaybackRate']) {
 
      return this.techGet_('playbackRate');
 
    } else {
 
      return 1.0;
 
    }
 
  };
 

	
 
  /**
 
   * Gets or sets the audio flag
 
   *
 
   * @param  {Boolean} bool    True signals that this is an audio player.
 
   * @return {Boolean}         Returns true if player is audio, false if not when getting
 
   * @return {Player}      Returns the player if setting
 
   * @private
 
   * @method isAudio
 
   */
 

	
 
  Player.prototype.isAudio = function isAudio(bool) {
 
    if (bool !== undefined) {
 
      this.isAudio_ = !!bool;
 
      return this;
 
    }
 

	
 
    return !!this.isAudio_;
 
  };
 

	
 
  /**
 
   * Returns the current state of network activity for the element, from
 
   * the codes in the list below.
 
   * - NETWORK_EMPTY (numeric value 0)
 
   *   The element has not yet been initialised. All attributes are in
 
   *   their initial states.
 
   * - NETWORK_IDLE (numeric value 1)
 
   *   The element's resource selection algorithm is active and has
 
   *   selected a resource, but it is not actually using the network at
 
   *   this time.
 
   * - NETWORK_LOADING (numeric value 2)
 
   *   The user agent is actively trying to download data.
 
   * - NETWORK_NO_SOURCE (numeric value 3)
 
   *   The element's resource selection algorithm is active, but it has
 
   *   not yet found a resource to use.
 
   *
 
   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#network-states
 
   * @return {Number} the current network activity state
 
   * @method networkState
 
   */
 

	
 
  Player.prototype.networkState = function networkState() {
 
    return this.techGet_('networkState');
 
  };
 

	
 
  /**
 
   * Returns a value that expresses the current state of the element
 
   * with respect to rendering the current playback position, from the
 
   * codes in the list below.
 
   * - HAVE_NOTHING (numeric value 0)
 
   *   No information regarding the media resource is available.
 
   * - HAVE_METADATA (numeric value 1)
 
   *   Enough of the resource has been obtained that the duration of the
 
   *   resource is available.
 
   * - HAVE_CURRENT_DATA (numeric value 2)
 
   *   Data for the immediate current playback position is available.
 
   * - HAVE_FUTURE_DATA (numeric value 3)
 
   *   Data for the immediate current playback position is available, as
 
   *   well as enough data for the user agent to advance the current
 
   *   playback position in the direction of playback.
 
   * - HAVE_ENOUGH_DATA (numeric value 4)
 
   *   The user agent estimates that enough data is available for
 
   *   playback to proceed uninterrupted.
 
   *
 
   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-readystate
 
   * @return {Number} the current playback rendering state
 
   * @method readyState
 
   */
 

	
 
  Player.prototype.readyState = function readyState() {
 
    return this.techGet_('readyState');
 
  };
 

	
 
  /*
 
    * Text tracks are tracks of timed text events.
 
    * Captions - text displayed over the video for the hearing impaired
 
    * Subtitles - text displayed over the video for those who don't understand language in the video
 
    * Chapters - text displayed in a menu allowing the user to jump to particular points (chapters) in the video
 
    * Descriptions (not supported yet) - audio descriptions that are read back to the user by a screen reading device
 
    */
 

	
 
  /**
 
   * Get an array of associated text tracks. captions, subtitles, chapters, descriptions
 
   * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-texttracks
 
   *
 
   * @return {Array}           Array of track objects
 
   * @method textTracks
 
   */
 

	
 
  Player.prototype.textTracks = function textTracks() {
 
    // cannot use techGet_ directly because it checks to see whether the tech is ready.
 
    // Flash is unlikely to be ready in time but textTracks should still work.
 
    return this.tech_ && this.tech_['textTracks']();
 
  };
 

	
 
  /**
 
   * Get an array of remote text tracks
 
   *
 
   * @return {Array}
 
   * @method remoteTextTracks
 
   */
 

	
 
  Player.prototype.remoteTextTracks = function remoteTextTracks() {
 
    return this.tech_ && this.tech_['remoteTextTracks']();
 
  };
 

	
 
  /**
 
   * Add a text track
 
   * In addition to the W3C settings we allow adding additional info through options.
 
   * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-addtexttrack
 
   *
 
   * @param {String}  kind        Captions, subtitles, chapters, descriptions, or metadata
 
   * @param {String=} label       Optional label
 
   * @param {String=} language    Optional language
 
   * @method addTextTrack
 
   */
 

	
 
  Player.prototype.addTextTrack = function addTextTrack(kind, label, language) {
 
    return this.tech_ && this.tech_['addTextTrack'](kind, label, language);
 
  };
 

	
 
  /**
 
   * Add a remote text track
 
   *
 
   * @param {Object} options    Options for remote text track
 
   * @method addRemoteTextTrack
 
   */
 

	
 
  Player.prototype.addRemoteTextTrack = function addRemoteTextTrack(options) {
 
    return this.tech_ && this.tech_['addRemoteTextTrack'](options);
 
  };
 

	
 
  /**
 
   * Remove a remote text track
 
   *
 
   * @param {Object} track    Remote text track to remove
 
   * @method removeRemoteTextTrack
 
   */
 

	
 
  Player.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) {
 
    this.tech_ && this.tech_['removeRemoteTextTrack'](track);
 
  };
 

	
 
  /**
 
   * Get video width
 
   *
 
   * @return {Number} Video width
 
   * @method videoWidth
 
   */
 

	
 
  Player.prototype.videoWidth = function videoWidth() {
 
    return this.tech_ && this.tech_.videoWidth && this.tech_.videoWidth() || 0;
 
  };
 

	
 
  /**
 
   * Get video height
 
   *
 
   * @return {Number} Video height
 
   * @method videoHeight
 
   */
 

	
 
  Player.prototype.videoHeight = function videoHeight() {
 
    return this.tech_ && this.tech_.videoHeight && this.tech_.videoHeight() || 0;
 
  };
 

	
 
  // Methods to add support for
 
  // initialTime: function(){ return this.techCall_('initialTime'); },
 
  // startOffsetTime: function(){ return this.techCall_('startOffsetTime'); },
 
  // played: function(){ return this.techCall_('played'); },
 
  // videoTracks: function(){ return this.techCall_('videoTracks'); },
 
  // audioTracks: function(){ return this.techCall_('audioTracks'); },
 
  // defaultPlaybackRate: function(){ return this.techCall_('defaultPlaybackRate'); },
 
  // defaultMuted: function(){ return this.techCall_('defaultMuted'); }
 

	
 
  /**
 
   * The player's language code
 
   * NOTE: The language should be set in the player options if you want the
 
   * the controls to be built with a specific language. Changing the lanugage
 
   * later will not update controls text.
 
   *
 
   * @param {String} code  The locale string
 
   * @return {String}      The locale string when getting
 
   * @return {Player}      self when setting
 
   * @method language
 
   */
 

	
 
  Player.prototype.language = function language(code) {
 
    if (code === undefined) {
 
      return this.language_;
 
    }
 

	
 
    this.language_ = ('' + code).toLowerCase();
 
    return this;
 
  };
 

	
 
  /**
 
   * Get the player's language dictionary
 
   * Merge every time, because a newly added plugin might call videojs.addLanguage() at any time
 
   * Languages specified directly in the player options have precedence
 
   *
 
   * @return {Array} Array of languages
 
   * @method languages
 
   */
 

	
 
  Player.prototype.languages = function languages() {
 
    return _utilsMergeOptionsJs2['default'](Player.prototype.options_.languages, this.languages_);
 
  };
 

	
 
  /**
 
   * Converts track info to JSON
 
   *
 
   * @return {Object} JSON object of options
 
   * @method toJSON
 
   */
 

	
 
  Player.prototype.toJSON = function toJSON() {
 
    var options = _utilsMergeOptionsJs2['default'](this.options_);
 
    var tracks = options.tracks;
 

	
 
    options.tracks = [];
 

	
 
    for (var i = 0; i < tracks.length; i++) {
 
      var track = tracks[i];
 

	
 
      // deep merge tracks and null out player so no circular references
 
      track = _utilsMergeOptionsJs2['default'](track);
 
      track.player = undefined;
 
      options.tracks[i] = track;
 
    }
 

	
 
    return options;
 
  };
 

	
 
  /**
 
   * Gets tag settings
 
   *
 
   * @param {Element} tag The player tag
 
   * @return {Array} An array of sources and track objects
 
   * @static
 
   * @method getTagSettings
 
   */
 

	
 
  Player.getTagSettings = function getTagSettings(tag) {
 
    var baseOptions = {
 
      'sources': [],
 
      'tracks': []
 
    };
 

	
 
    var tagOptions = Dom.getElAttributes(tag);
 
    var dataSetup = tagOptions['data-setup'];
 

	
 
    // Check if data-setup attr exists.
 
    if (dataSetup !== null) {
 
      // Parse options JSON
 

	
 
      var _safeParseTuple = _safeJsonParseTuple2['default'](dataSetup || '{}');
 

	
 
      var err = _safeParseTuple[0];
 
      var data = _safeParseTuple[1];
 

	
 
      if (err) {
 
        _utilsLogJs2['default'].error(err);
 
      }
 
      _objectAssign2['default'](tagOptions, data);
 
    }
 

	
 
    _objectAssign2['default'](baseOptions, tagOptions);
 

	
 
    // Get tag children settings
 
    if (tag.hasChildNodes()) {
 
      var children = tag.childNodes;
 

	
 
      for (var i = 0, j = children.length; i < j; i++) {
 
        var child = children[i];
 
        // Change case needed: http://ejohn.org/blog/nodename-case-sensitivity/
 
        var childName = child.nodeName.toLowerCase();
 
        if (childName === 'source') {
 
          baseOptions.sources.push(Dom.getElAttributes(child));
 
        } else if (childName === 'track') {
 
          baseOptions.tracks.push(Dom.getElAttributes(child));
 
        }
 
      }
 
    }
 

	
 
    return baseOptions;
 
  };
 

	
 
  return Player;
 
})(_componentJs2['default']);
 

	
 
Player.players = {};
 

	
 
var navigator = _globalWindow2['default'].navigator;
 
/*
 
 * Player instance options, surfaced using options
 
 * options = Player.prototype.options_
 
 * Make changes in options, not here.
 
 *
 
 * @type {Object}
 
 * @private
 
 */
 
Player.prototype.options_ = {
 
  // Default order of fallback technology
 
  techOrder: ['html5', 'flash'],
 
  // techOrder: ['flash','html5'],
 

	
 
  html5: {},
 
  flash: {},
 

	
 
  // defaultVolume: 0.85,
 
  defaultVolume: 0.00, // The freakin seaguls are driving me crazy!
 

	
 
  // default inactivity timeout
 
  inactivityTimeout: 2000,
 

	
 
  // default playback rates
 
  playbackRates: [],
 
  // Add playback rate selection by adding rates
 
  // 'playbackRates': [0.5, 1, 1.5, 2],
 

	
 
  // Included control sets
 
  children: ['mediaLoader', 'posterImage', 'textTrackDisplay', 'loadingSpinner', 'bigPlayButton', 'controlBar', 'errorDisplay', 'textTrackSettings'],
 

	
 
  language: _globalDocument2['default'].getElementsByTagName('html')[0].getAttribute('lang') || navigator.languages && navigator.languages[0] || navigator.userLanguage || navigator.language || 'en',
 

	
 
  // locales and their language translations
 
  languages: {},
 

	
 
  // Default message to show when a video cannot be played.
 
  notSupportedMessage: 'No compatible source was found for this video.'
 
};
 

	
 
/**
 
 * Fired when the player has initial duration and dimension information
 
 *
 
 * @event loadedmetadata
 
 */
 
Player.prototype.handleLoadedMetaData_;
 

	
 
/**
 
 * Fired when the player has downloaded data at the current playback position
 
 *
 
 * @event loadeddata
 
 */
 
Player.prototype.handleLoadedData_;
 

	
 
/**
 
 * Fired when the user is active, e.g. moves the mouse over the player
 
 *
 
 * @event useractive
 
 */
 
Player.prototype.handleUserActive_;
 

	
 
/**
 
 * Fired when the user is inactive, e.g. a short delay after the last mouse move or control interaction
 
 *
 
 * @event userinactive
 
 */
 
Player.prototype.handleUserInactive_;
 

	
 
/**
 
 * Fired when the current playback position has changed *
 
 * During playback this is fired every 15-250 milliseconds, depending on the
 
 * playback technology in use.
 
 *
 
 * @event timeupdate
 
 */
 
Player.prototype.handleTimeUpdate_;
 

	
 
/**
 
 * Fired when the volume changes
 
 *
 
 * @event volumechange
 
 */
 
Player.prototype.handleVolumeChange_;
 

	
 
/**
 
 * Fired when an error occurs
 
 *
 
 * @event error
 
 */
 
Player.prototype.handleError_;
 

	
 
Player.prototype.flexNotSupported_ = function () {
 
  var elem = _globalDocument2['default'].createElement('i');
 

	
 
  // Note: We don't actually use flexBasis (or flexOrder), but it's one of the more
 
  // common flex features that we can rely on when checking for flex support.
 
  return !('flexBasis' in elem.style || 'webkitFlexBasis' in elem.style || 'mozFlexBasis' in elem.style || 'msFlexBasis' in elem.style || 'msFlexOrder' in elem.style) /* IE10-specific (2012 flex spec)  */;
 
};
 

	
 
_componentJs2['default'].registerComponent('Player', Player);
 
exports['default'] = Player;
 
module.exports = exports['default'];
 
// If empty string, make it a parsable json object.
 

	
 
},{"./big-play-button.js":56,"./component.js":58,"./control-bar/control-bar.js":59,"./error-display.js":89,"./fullscreen-api.js":92,"./loading-spinner.js":93,"./media-error.js":94,"./poster-image.js":100,"./tech/html5.js":105,"./tech/loader.js":106,"./tracks/text-track-display.js":109,"./tracks/text-track-list-converter.js":111,"./tracks/text-track-settings.js":113,"./utils/browser.js":115,"./utils/buffer.js":116,"./utils/dom.js":118,"./utils/events.js":119,"./utils/fn.js":120,"./utils/guid.js":122,"./utils/log.js":123,"./utils/merge-options.js":124,"./utils/stylesheet.js":125,"./utils/time-ranges.js":126,"./utils/to-title-case.js":127,"global/document":1,"global/window":2,"object.assign":43,"safe-json-parse/tuple":48}],99:[function(_dereq_,module,exports){
 
/**
 
 * @file plugins.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _playerJs = _dereq_('./player.js');
 

	
 
var _playerJs2 = _interopRequireDefault(_playerJs);
 

	
 
/**
 
 * The method for registering a video.js plugin
 
 *
 
 * @param  {String} name The name of the plugin
 
 * @param  {Function} init The function that is run when the player inits
 
 * @method plugin
 
 */
 
var plugin = function plugin(name, init) {
 
  _playerJs2['default'].prototype[name] = init;
 
};
 

	
 
exports['default'] = plugin;
 
module.exports = exports['default'];
 

	
 
},{"./player.js":98}],100:[function(_dereq_,module,exports){
 
/**
 
 * @file poster-image.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _buttonJs = _dereq_('./button.js');
 

	
 
var _buttonJs2 = _interopRequireDefault(_buttonJs);
 

	
 
var _componentJs = _dereq_('./component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsFnJs = _dereq_('./utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsDomJs = _dereq_('./utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsBrowserJs = _dereq_('./utils/browser.js');
 

	
 
var browser = _interopRequireWildcard(_utilsBrowserJs);
 

	
 
/**
 
 * The component that handles showing the poster image.
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Button
 
 * @class PosterImage
 
 */
 

	
 
var PosterImage = (function (_Button) {
 
  _inherits(PosterImage, _Button);
 

	
 
  function PosterImage(player, options) {
 
    _classCallCheck(this, PosterImage);
 

	
 
    _Button.call(this, player, options);
 

	
 
    this.update();
 
    player.on('posterchange', Fn.bind(this, this.update));
 
  }
 

	
 
  /**
 
   * Clean up the poster image
 
   *
 
   * @method dispose
 
   */
 

	
 
  PosterImage.prototype.dispose = function dispose() {
 
    this.player().off('posterchange', this.update);
 
    _Button.prototype.dispose.call(this);
 
  };
 

	
 
  /**
 
   * Create the poster's image element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  PosterImage.prototype.createEl = function createEl() {
 
    var el = Dom.createEl('div', {
 
      className: 'vjs-poster',
 

	
 
      // Don't want poster to be tabbable.
 
      tabIndex: -1
 
    });
 

	
 
    // To ensure the poster image resizes while maintaining its original aspect
 
    // ratio, use a div with `background-size` when available. For browsers that
 
    // do not support `background-size` (e.g. IE8), fall back on using a regular
 
    // img element.
 
    if (!browser.BACKGROUND_SIZE_SUPPORTED) {
 
      this.fallbackImg_ = Dom.createEl('img');
 
      el.appendChild(this.fallbackImg_);
 
    }
 

	
 
    return el;
 
  };
 

	
 
  /**
 
   * Event handler for updates to the player's poster source
 
   *
 
   * @method update
 
   */
 

	
 
  PosterImage.prototype.update = function update() {
 
    var url = this.player().poster();
 

	
 
    this.setSrc(url);
 

	
 
    // If there's no poster source we should display:none on this component
 
    // so it's not still clickable or right-clickable
 
    if (url) {
 
      this.show();
 
    } else {
 
      this.hide();
 
    }
 
  };
 

	
 
  /**
 
   * Set the poster source depending on the display method
 
   *
 
   * @param {String} url The URL to the poster source
 
   * @method setSrc
 
   */
 

	
 
  PosterImage.prototype.setSrc = function setSrc(url) {
 
    if (this.fallbackImg_) {
 
      this.fallbackImg_.src = url;
 
    } else {
 
      var backgroundImage = '';
 
      // Any falsey values should stay as an empty string, otherwise
 
      // this will throw an extra error
 
      if (url) {
 
        backgroundImage = 'url("' + url + '")';
 
      }
 

	
 
      this.el_.style.backgroundImage = backgroundImage;
 
    }
 
  };
 

	
 
  /**
 
   * Event handler for clicks on the poster image
 
   *
 
   * @method handleClick
 
   */
 

	
 
  PosterImage.prototype.handleClick = function handleClick() {
 
    // We don't want a click to trigger playback when controls are disabled
 
    // but CSS should be hiding the poster to prevent that from happening
 
    if (this.player_.paused()) {
 
      this.player_.play();
 
    } else {
 
      this.player_.pause();
 
    }
 
  };
 

	
 
  return PosterImage;
 
})(_buttonJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('PosterImage', PosterImage);
 
exports['default'] = PosterImage;
 
module.exports = exports['default'];
 

	
 
},{"./button.js":57,"./component.js":58,"./utils/browser.js":115,"./utils/dom.js":118,"./utils/fn.js":120}],101:[function(_dereq_,module,exports){
 
/**
 
 * @file setup.js
 
 *
 
 * Functions for automatically setting up a player
 
 * based on the data-setup attribute of the video tag
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
var _utilsEventsJs = _dereq_('./utils/events.js');
 

	
 
var Events = _interopRequireWildcard(_utilsEventsJs);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _windowLoaded = false;
 
var videojs = undefined;
 

	
 
// Automatically set up any tags that have a data-setup attribute
 
var autoSetup = function autoSetup() {
 
  // One day, when we stop supporting IE8, go back to this, but in the meantime...*hack hack hack*
 
  // var vids = Array.prototype.slice.call(document.getElementsByTagName('video'));
 
  // var audios = Array.prototype.slice.call(document.getElementsByTagName('audio'));
 
  // var mediaEls = vids.concat(audios);
 

	
 
  // Because IE8 doesn't support calling slice on a node list, we need to loop through each list of elements
 
  // to build up a new, combined list of elements.
 
  var vids = _globalDocument2['default'].getElementsByTagName('video');
 
  var audios = _globalDocument2['default'].getElementsByTagName('audio');
 
  var mediaEls = [];
 
  if (vids && vids.length > 0) {
 
    for (var i = 0, e = vids.length; i < e; i++) {
 
      mediaEls.push(vids[i]);
 
    }
 
  }
 
  if (audios && audios.length > 0) {
 
    for (var i = 0, e = audios.length; i < e; i++) {
 
      mediaEls.push(audios[i]);
 
    }
 
  }
 

	
 
  // Check if any media elements exist
 
  if (mediaEls && mediaEls.length > 0) {
 

	
 
    for (var i = 0, e = mediaEls.length; i < e; i++) {
 
      var mediaEl = mediaEls[i];
 

	
 
      // Check if element exists, has getAttribute func.
 
      // IE seems to consider typeof el.getAttribute == 'object' instead of 'function' like expected, at least when loading the player immediately.
 
      if (mediaEl && mediaEl.getAttribute) {
 

	
 
        // Make sure this player hasn't already been set up.
 
        if (mediaEl['player'] === undefined) {
 
          var options = mediaEl.getAttribute('data-setup');
 

	
 
          // Check if data-setup attr exists.
 
          // We only auto-setup if they've added the data-setup attr.
 
          if (options !== null) {
 
            // Create new video.js instance.
 
            var player = videojs(mediaEl);
 
          }
 
        }
 

	
 
        // If getAttribute isn't defined, we need to wait for the DOM.
 
      } else {
 
          autoSetupTimeout(1);
 
          break;
 
        }
 
    }
 

	
 
    // No videos were found, so keep looping unless page is finished loading.
 
  } else if (!_windowLoaded) {
 
      autoSetupTimeout(1);
 
    }
 
};
 

	
 
// Pause to let the DOM keep processing
 
var autoSetupTimeout = function autoSetupTimeout(wait, vjs) {
 
  videojs = vjs;
 
  setTimeout(autoSetup, wait);
 
};
 

	
 
if (_globalDocument2['default'].readyState === 'complete') {
 
  _windowLoaded = true;
 
} else {
 
  Events.one(_globalWindow2['default'], 'load', function () {
 
    _windowLoaded = true;
 
  });
 
}
 

	
 
var hasLoaded = function hasLoaded() {
 
  return _windowLoaded;
 
};
 

	
 
exports.autoSetup = autoSetup;
 
exports.autoSetupTimeout = autoSetupTimeout;
 
exports.hasLoaded = hasLoaded;
 

	
 
},{"./utils/events.js":119,"global/document":1,"global/window":2}],102:[function(_dereq_,module,exports){
 
/**
 
 * @file slider.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsDomJs = _dereq_('../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
/**
 
 * The base functionality for sliders like the volume bar and seek bar
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class Slider
 
 */
 

	
 
var Slider = (function (_Component) {
 
  _inherits(Slider, _Component);
 

	
 
  function Slider(player, options) {
 
    _classCallCheck(this, Slider);
 

	
 
    _Component.call(this, player, options);
 

	
 
    // Set property names to bar to match with the child Slider class is looking for
 
    this.bar = this.getChild(this.options_.barName);
 

	
 
    // Set a horizontal or vertical class on the slider depending on the slider type
 
    this.vertical(!!this.options_.vertical);
 

	
 
    this.on('mousedown', this.handleMouseDown);
 
    this.on('touchstart', this.handleMouseDown);
 
    this.on('focus', this.handleFocus);
 
    this.on('blur', this.handleBlur);
 
    this.on('click', this.handleClick);
 

	
 
    this.on(player, 'controlsvisible', this.update);
 
    this.on(player, this.playerEvent, this.update);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @param {String} type Type of element to create
 
   * @param {Object=} props List of properties in Object form
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  Slider.prototype.createEl = function createEl(type) {
 
    var props = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
 
    var attributes = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
 

	
 
    // Add the slider element class to all sub classes
 
    props.className = props.className + ' vjs-slider';
 
    props = _objectAssign2['default']({
 
      tabIndex: 0
 
    }, props);
 

	
 
    attributes = _objectAssign2['default']({
 
      'role': 'slider',
 
      'aria-valuenow': 0,
 
      'aria-valuemin': 0,
 
      'aria-valuemax': 100,
 
      tabIndex: 0
 
    }, attributes);
 

	
 
    return _Component.prototype.createEl.call(this, type, props, attributes);
 
  };
 

	
 
  /**
 
   * Handle mouse down on slider
 
   *
 
   * @param {Object} event Mouse down event object
 
   * @method handleMouseDown
 
   */
 

	
 
  Slider.prototype.handleMouseDown = function handleMouseDown(event) {
 
    event.preventDefault();
 
    Dom.blockTextSelection();
 

	
 
    this.addClass('vjs-sliding');
 
    this.trigger('slideractive');
 

	
 
    this.on(_globalDocument2['default'], 'mousemove', this.handleMouseMove);
 
    this.on(_globalDocument2['default'], 'mouseup', this.handleMouseUp);
 
    this.on(_globalDocument2['default'], 'touchmove', this.handleMouseMove);
 
    this.on(_globalDocument2['default'], 'touchend', this.handleMouseUp);
 

	
 
    this.handleMouseMove(event);
 
  };
 

	
 
  /**
 
   * To be overridden by a subclass
 
   *
 
   * @method handleMouseMove
 
   */
 

	
 
  Slider.prototype.handleMouseMove = function handleMouseMove() {};
 

	
 
  /**
 
   * Handle mouse up on Slider
 
   *
 
   * @method handleMouseUp
 
   */
 

	
 
  Slider.prototype.handleMouseUp = function handleMouseUp() {
 
    Dom.unblockTextSelection();
 

	
 
    this.removeClass('vjs-sliding');
 
    this.trigger('sliderinactive');
 

	
 
    this.off(_globalDocument2['default'], 'mousemove', this.handleMouseMove);
 
    this.off(_globalDocument2['default'], 'mouseup', this.handleMouseUp);
 
    this.off(_globalDocument2['default'], 'touchmove', this.handleMouseMove);
 
    this.off(_globalDocument2['default'], 'touchend', this.handleMouseUp);
 

	
 
    this.update();
 
  };
 

	
 
  /**
 
   * Update slider
 
   *
 
   * @method update
 
   */
 

	
 
  Slider.prototype.update = function update() {
 
    // In VolumeBar init we have a setTimeout for update that pops and update to the end of the
 
    // execution stack. The player is destroyed before then update will cause an error
 
    if (!this.el_) return;
 

	
 
    // If scrubbing, we could use a cached value to make the handle keep up with the user's mouse.
 
    // On HTML5 browsers scrubbing is really smooth, but some flash players are slow, so we might want to utilize this later.
 
    // var progress =  (this.player_.scrubbing()) ? this.player_.getCache().currentTime / this.player_.duration() : this.player_.currentTime() / this.player_.duration();
 
    var progress = this.getPercent();
 
    var bar = this.bar;
 

	
 
    // If there's no bar...
 
    if (!bar) return;
 

	
 
    // Protect against no duration and other division issues
 
    if (typeof progress !== 'number' || progress !== progress || progress < 0 || progress === Infinity) {
 
      progress = 0;
 
    }
 

	
 
    // Convert to a percentage for setting
 
    var percentage = (progress * 100).toFixed(2) + '%';
 

	
 
    // Set the new bar width or height
 
    if (this.vertical()) {
 
      bar.el().style.height = percentage;
 
    } else {
 
      bar.el().style.width = percentage;
 
    }
 
  };
 

	
 
  /**
 
   * Calculate distance for slider
 
   *
 
   * @param {Object} event Event object
 
   * @method calculateDistance
 
   */
 

	
 
  Slider.prototype.calculateDistance = function calculateDistance(event) {
 
    var position = Dom.getPointerPosition(this.el_, event);
 
    if (this.vertical()) {
 
      return position.y;
 
    }
 
    return position.x;
 
  };
 

	
 
  /**
 
   * Handle on focus for slider
 
   *
 
   * @method handleFocus
 
   */
 

	
 
  Slider.prototype.handleFocus = function handleFocus() {
 
    this.on(_globalDocument2['default'], 'keydown', this.handleKeyPress);
 
  };
 

	
 
  /**
 
   * Handle key press for slider
 
   *
 
   * @param {Object} event Event object
 
   * @method handleKeyPress
 
   */
 

	
 
  Slider.prototype.handleKeyPress = function handleKeyPress(event) {
 
    if (event.which === 37 || event.which === 40) {
 
      // Left and Down Arrows
 
      event.preventDefault();
 
      this.stepBack();
 
    } else if (event.which === 38 || event.which === 39) {
 
      // Up and Right Arrows
 
      event.preventDefault();
 
      this.stepForward();
 
    }
 
  };
 

	
 
  /**
 
   * Handle on blur for slider
 
   *
 
   * @method handleBlur
 
   */
 

	
 
  Slider.prototype.handleBlur = function handleBlur() {
 
    this.off(_globalDocument2['default'], 'keydown', this.handleKeyPress);
 
  };
 

	
 
  /**
 
   * Listener for click events on slider, used to prevent clicks
 
   *   from bubbling up to parent elements like button menus.
 
   *
 
   * @param {Object} event Event object
 
   * @method handleClick
 
   */
 

	
 
  Slider.prototype.handleClick = function handleClick(event) {
 
    event.stopImmediatePropagation();
 
    event.preventDefault();
 
  };
 

	
 
  /**
 
   * Get/set if slider is horizontal for vertical
 
   *
 
   * @param {Boolean} bool True if slider is vertical, false is horizontal
 
   * @return {Boolean} True if slider is vertical, false is horizontal
 
   * @method vertical
 
   */
 

	
 
  Slider.prototype.vertical = function vertical(bool) {
 
    if (bool === undefined) {
 
      return this.vertical_ || false;
 
    }
 

	
 
    this.vertical_ = !!bool;
 

	
 
    if (this.vertical_) {
 
      this.addClass('vjs-slider-vertical');
 
    } else {
 
      this.addClass('vjs-slider-horizontal');
 
    }
 

	
 
    return this;
 
  };
 

	
 
  return Slider;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('Slider', Slider);
 
exports['default'] = Slider;
 
module.exports = exports['default'];
 

	
 
},{"../component.js":58,"../utils/dom.js":118,"global/document":1,"object.assign":43}],103:[function(_dereq_,module,exports){
 
/**
 
 * @file flash-rtmp.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 
function FlashRtmpDecorator(Flash) {
 
  Flash.streamingFormats = {
 
    'rtmp/mp4': 'MP4',
 
    'rtmp/flv': 'FLV'
 
  };
 

	
 
  Flash.streamFromParts = function (connection, stream) {
 
    return connection + '&' + stream;
 
  };
 

	
 
  Flash.streamToParts = function (src) {
 
    var parts = {
 
      connection: '',
 
      stream: ''
 
    };
 

	
 
    if (!src) return parts;
 

	
 
    // Look for the normal URL separator we expect, '&'.
 
    // If found, we split the URL into two pieces around the
 
    // first '&'.
 
    var connEnd = src.indexOf('&');
 
    var streamBegin = undefined;
 
    if (connEnd !== -1) {
 
      streamBegin = connEnd + 1;
 
    } else {
 
      // If there's not a '&', we use the last '/' as the delimiter.
 
      connEnd = streamBegin = src.lastIndexOf('/') + 1;
 
      if (connEnd === 0) {
 
        // really, there's not a '/'?
 
        connEnd = streamBegin = src.length;
 
      }
 
    }
 
    parts.connection = src.substring(0, connEnd);
 
    parts.stream = src.substring(streamBegin, src.length);
 

	
 
    return parts;
 
  };
 

	
 
  Flash.isStreamingType = function (srcType) {
 
    return srcType in Flash.streamingFormats;
 
  };
 

	
 
  // RTMP has four variations, any string starting
 
  // with one of these protocols should be valid
 
  Flash.RTMP_RE = /^rtmp[set]?:\/\//i;
 

	
 
  Flash.isStreamingSrc = function (src) {
 
    return Flash.RTMP_RE.test(src);
 
  };
 

	
 
  /**
 
   * A source handler for RTMP urls
 
   * @type {Object}
 
   */
 
  Flash.rtmpSourceHandler = {};
 

	
 
  /**
 
   * Check Flash can handle the source natively
 
   * @param  {Object} source  The source object
 
   * @return {String}         'probably', 'maybe', or '' (empty string)
 
   */
 
  Flash.rtmpSourceHandler.canHandleSource = function (source) {
 
    if (Flash.isStreamingType(source.type) || Flash.isStreamingSrc(source.src)) {
 
      return 'maybe';
 
    }
 

	
 
    return '';
 
  };
 

	
 
  /**
 
   * Pass the source to the flash object
 
   * Adaptive source handlers will have more complicated workflows before passing
 
   * video data to the video element
 
   * @param  {Object} source    The source object
 
   * @param  {Flash} tech   The instance of the Flash tech
 
   */
 
  Flash.rtmpSourceHandler.handleSource = function (source, tech) {
 
    var srcParts = Flash.streamToParts(source.src);
 

	
 
    tech['setRtmpConnection'](srcParts.connection);
 
    tech['setRtmpStream'](srcParts.stream);
 
  };
 

	
 
  // Register the native source handler
 
  Flash.registerSourceHandler(Flash.rtmpSourceHandler);
 

	
 
  return Flash;
 
}
 

	
 
exports['default'] = FlashRtmpDecorator;
 
module.exports = exports['default'];
 

	
 
},{}],104:[function(_dereq_,module,exports){
 
/**
 
 * @file flash.js
 
 * VideoJS-SWF - Custom Flash Player with HTML5-ish API
 
 * https://github.com/zencoder/video-js-swf
 
 * Not using setupTriggers. Using global onEvent func to distribute events
 
 */
 

	
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _tech = _dereq_('./tech');
 

	
 
var _tech2 = _interopRequireDefault(_tech);
 

	
 
var _utilsDomJs = _dereq_('../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsUrlJs = _dereq_('../utils/url.js');
 

	
 
var Url = _interopRequireWildcard(_utilsUrlJs);
 

	
 
var _utilsTimeRangesJs = _dereq_('../utils/time-ranges.js');
 

	
 
var _flashRtmp = _dereq_('./flash-rtmp');
 

	
 
var _flashRtmp2 = _interopRequireDefault(_flashRtmp);
 

	
 
var _component = _dereq_('../component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
var navigator = _globalWindow2['default'].navigator;
 
/**
 
 * Flash Media Controller - Wrapper for fallback SWF API
 
 *
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready Ready callback function
 
 * @extends Tech
 
 * @class Flash
 
 */
 

	
 
var Flash = (function (_Tech) {
 
  _inherits(Flash, _Tech);
 

	
 
  function Flash(options, ready) {
 
    _classCallCheck(this, Flash);
 

	
 
    _Tech.call(this, options, ready);
 

	
 
    // Set the source when ready
 
    if (options.source) {
 
      this.ready(function () {
 
        this.setSource(options.source);
 
      }, true);
 
    }
 

	
 
    // Having issues with Flash reloading on certain page actions (hide/resize/fullscreen) in certain browsers
 
    // This allows resetting the playhead when we catch the reload
 
    if (options.startTime) {
 
      this.ready(function () {
 
        this.load();
 
        this.play();
 
        this.currentTime(options.startTime);
 
      }, true);
 
    }
 

	
 
    // Add global window functions that the swf expects
 
    // A 4.x workflow we weren't able to solve for in 5.0
 
    // because of the need to hard code these functions
 
    // into the swf for security reasons
 
    _globalWindow2['default'].videojs = _globalWindow2['default'].videojs || {};
 
    _globalWindow2['default'].videojs.Flash = _globalWindow2['default'].videojs.Flash || {};
 
    _globalWindow2['default'].videojs.Flash.onReady = Flash.onReady;
 
    _globalWindow2['default'].videojs.Flash.onEvent = Flash.onEvent;
 
    _globalWindow2['default'].videojs.Flash.onError = Flash.onError;
 

	
 
    this.on('seeked', function () {
 
      this.lastSeekTarget_ = undefined;
 
    });
 
  }
 

	
 
  // Create setters and getters for attributes
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  Flash.prototype.createEl = function createEl() {
 
    var options = this.options_;
 

	
 
    // If video.js is hosted locally you should also set the location
 
    // for the hosted swf, which should be relative to the page (not video.js)
 
    // Otherwise this adds a CDN url.
 
    // The CDN also auto-adds a swf URL for that specific version.
 
    if (!options.swf) {
 
      options.swf = '//vjs.zencdn.net/swf/5.0.0-rc1/video-js.swf';
 
    }
 

	
 
    // Generate ID for swf object
 
    var objId = options.techId;
 

	
 
    // Merge default flashvars with ones passed in to init
 
    var flashVars = _objectAssign2['default']({
 

	
 
      // SWF Callback Functions
 
      'readyFunction': 'videojs.Flash.onReady',
 
      'eventProxyFunction': 'videojs.Flash.onEvent',
 
      'errorEventProxyFunction': 'videojs.Flash.onError',
 

	
 
      // Player Settings
 
      'autoplay': options.autoplay,
 
      'preload': options.preload,
 
      'loop': options.loop,
 
      'muted': options.muted
 

	
 
    }, options.flashVars);
 

	
 
    // Merge default parames with ones passed in
 
    var params = _objectAssign2['default']({
 
      'wmode': 'opaque', // Opaque is needed to overlay controls, but can affect playback performance
 
      'bgcolor': '#000000' // Using bgcolor prevents a white flash when the object is loading
 
    }, options.params);
 

	
 
    // Merge default attributes with ones passed in
 
    var attributes = _objectAssign2['default']({
 
      'id': objId,
 
      'name': objId, // Both ID and Name needed or swf to identify itself
 
      'class': 'vjs-tech'
 
    }, options.attributes);
 

	
 
    this.el_ = Flash.embed(options.swf, flashVars, params, attributes);
 
    this.el_.tech = this;
 

	
 
    return this.el_;
 
  };
 

	
 
  /**
 
   * Play for flash tech
 
   *
 
   * @method play
 
   */
 

	
 
  Flash.prototype.play = function play() {
 
    if (this.ended()) {
 
      this.setCurrentTime(0);
 
    }
 
    this.el_.vjs_play();
 
  };
 

	
 
  /**
 
   * Pause for flash tech
 
   *
 
   * @method pause
 
   */
 

	
 
  Flash.prototype.pause = function pause() {
 
    this.el_.vjs_pause();
 
  };
 

	
 
  /**
 
   * Get/set video
 
   *
 
   * @param {Object=} src Source object
 
   * @return {Object}
 
   * @method src
 
   */
 

	
 
  Flash.prototype.src = function src(_src) {
 
    if (_src === undefined) {
 
      return this.currentSrc();
 
    }
 

	
 
    // Setting src through `src` not `setSrc` will be deprecated
 
    return this.setSrc(_src);
 
  };
 

	
 
  /**
 
   * Set video
 
   *
 
   * @param {Object=} src Source object
 
   * @deprecated
 
   * @method setSrc
 
   */
 

	
 
  Flash.prototype.setSrc = function setSrc(src) {
 
    // Make sure source URL is absolute.
 
    src = Url.getAbsoluteURL(src);
 
    this.el_.vjs_src(src);
 

	
 
    // Currently the SWF doesn't autoplay if you load a source later.
 
    // e.g. Load player w/ no source, wait 2s, set src.
 
    if (this.autoplay()) {
 
      var tech = this;
 
      this.setTimeout(function () {
 
        tech.play();
 
      }, 0);
 
    }
 
  };
 

	
 
  /**
 
   * Returns true if the tech is currently seeking.
 
   * @return {boolean} true if seeking
 
   */
 

	
 
  Flash.prototype.seeking = function seeking() {
 
    return this.lastSeekTarget_ !== undefined;
 
  };
 

	
 
  /**
 
   * Set current time
 
   *
 
   * @param {Number} time Current time of video
 
   * @method setCurrentTime
 
   */
 

	
 
  Flash.prototype.setCurrentTime = function setCurrentTime(time) {
 
    var seekable = this.seekable();
 
    if (seekable.length) {
 
      // clamp to the current seekable range
 
      time = time > seekable.start(0) ? time : seekable.start(0);
 
      time = time < seekable.end(seekable.length - 1) ? time : seekable.end(seekable.length - 1);
 

	
 
      this.lastSeekTarget_ = time;
 
      this.trigger('seeking');
 
      this.el_.vjs_setProperty('currentTime', time);
 
      _Tech.prototype.setCurrentTime.call(this);
 
    }
 
  };
 

	
 
  /**
 
   * Get current time
 
   *
 
   * @param {Number=} time Current time of video
 
   * @return {Number} Current time
 
   * @method currentTime
 
   */
 

	
 
  Flash.prototype.currentTime = function currentTime(time) {
 
    // when seeking make the reported time keep up with the requested time
 
    // by reading the time we're seeking to
 
    if (this.seeking()) {
 
      return this.lastSeekTarget_ || 0;
 
    }
 
    return this.el_.vjs_getProperty('currentTime');
 
  };
 

	
 
  /**
 
   * Get current source
 
   *
 
   * @method currentSrc
 
   */
 

	
 
  Flash.prototype.currentSrc = function currentSrc() {
 
    if (this.currentSource_) {
 
      return this.currentSource_.src;
 
    } else {
 
      return this.el_.vjs_getProperty('currentSrc');
 
    }
 
  };
 

	
 
  /**
 
   * Load media into player
 
   *
 
   * @method load
 
   */
 

	
 
  Flash.prototype.load = function load() {
 
    this.el_.vjs_load();
 
  };
 

	
 
  /**
 
   * Get poster
 
   *
 
   * @method poster
 
   */
 

	
 
  Flash.prototype.poster = function poster() {
 
    this.el_.vjs_getProperty('poster');
 
  };
 

	
 
  /**
 
   * Poster images are not handled by the Flash tech so make this a no-op
 
   *
 
   * @method setPoster
 
   */
 

	
 
  Flash.prototype.setPoster = function setPoster() {};
 

	
 
  /**
 
   * Determine if can seek in media
 
   *
 
   * @return {TimeRangeObject}
 
   * @method seekable
 
   */
 

	
 
  Flash.prototype.seekable = function seekable() {
 
    var duration = this.duration();
 
    if (duration === 0) {
 
      return _utilsTimeRangesJs.createTimeRange();
 
    }
 
    return _utilsTimeRangesJs.createTimeRange(0, duration);
 
  };
 

	
 
  /**
 
   * Get buffered time range
 
   *
 
   * @return {TimeRangeObject}
 
   * @method buffered
 
   */
 

	
 
  Flash.prototype.buffered = function buffered() {
 
    var ranges = this.el_.vjs_getProperty('buffered');
 
    if (ranges.length === 0) {
 
      return _utilsTimeRangesJs.createTimeRange();
 
    }
 
    return _utilsTimeRangesJs.createTimeRange(ranges[0][0], ranges[0][1]);
 
  };
 

	
 
  /**
 
   * Get fullscreen support -
 
   * Flash does not allow fullscreen through javascript
 
   * so always returns false
 
   *
 
   * @return {Boolean} false
 
   * @method supportsFullScreen
 
   */
 

	
 
  Flash.prototype.supportsFullScreen = function supportsFullScreen() {
 
    return false; // Flash does not allow fullscreen through javascript
 
  };
 

	
 
  /**
 
   * Request to enter fullscreen
 
   * Flash does not allow fullscreen through javascript
 
   * so always returns false
 
   *
 
   * @return {Boolean} false
 
   * @method enterFullScreen
 
   */
 

	
 
  Flash.prototype.enterFullScreen = function enterFullScreen() {
 
    return false;
 
  };
 

	
 
  return Flash;
 
})(_tech2['default']);
 

	
 
var _api = Flash.prototype;
 
var _readWrite = 'rtmpConnection,rtmpStream,preload,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted'.split(',');
 
var _readOnly = 'networkState,readyState,initialTime,duration,startOffsetTime,paused,ended,videoTracks,audioTracks,videoWidth,videoHeight'.split(',');
 

	
 
function _createSetter(attr) {
 
  var attrUpper = attr.charAt(0).toUpperCase() + attr.slice(1);
 
  _api['set' + attrUpper] = function (val) {
 
    return this.el_.vjs_setProperty(attr, val);
 
  };
 
}
 
function _createGetter(attr) {
 
  _api[attr] = function () {
 
    return this.el_.vjs_getProperty(attr);
 
  };
 
}
 

	
 
// Create getter and setters for all read/write attributes
 
for (var i = 0; i < _readWrite.length; i++) {
 
  _createGetter(_readWrite[i]);
 
  _createSetter(_readWrite[i]);
 
}
 

	
 
// Create getters for read-only attributes
 
for (var i = 0; i < _readOnly.length; i++) {
 
  _createGetter(_readOnly[i]);
 
}
 

	
 
/* Flash Support Testing -------------------------------------------------------- */
 

	
 
Flash.isSupported = function () {
 
  return Flash.version()[0] >= 10;
 
  // return swfobject.hasFlashPlayerVersion('10');
 
};
 

	
 
// Add Source Handler pattern functions to this tech
 
_tech2['default'].withSourceHandlers(Flash);
 

	
 
/*
 
 * The default native source handler.
 
 * This simply passes the source to the video element. Nothing fancy.
 
 *
 
 * @param  {Object} source   The source object
 
 * @param  {Flash} tech  The instance of the Flash tech
 
 */
 
Flash.nativeSourceHandler = {};
 

	
 
/*
 
 * Check Flash can handle the source natively
 
 *
 
 * @param  {Object} source  The source object
 
 * @return {String}         'probably', 'maybe', or '' (empty string)
 
 */
 
Flash.nativeSourceHandler.canHandleSource = function (source) {
 
  var type;
 

	
 
  function guessMimeType(src) {
 
    var ext = Url.getFileExtension(src);
 
    if (ext) {
 
      return 'video/' + ext;
 
    }
 
    return '';
 
  }
 

	
 
  if (!source.type) {
 
    type = guessMimeType(source.src);
 
  } else {
 
    // Strip code information from the type because we don't get that specific
 
    type = source.type.replace(/;.*/, '').toLowerCase();
 
  }
 

	
 
  if (type in Flash.formats) {
 
    return 'maybe';
 
  }
 

	
 
  return '';
 
};
 

	
 
/*
 
 * Pass the source to the flash object
 
 * Adaptive source handlers will have more complicated workflows before passing
 
 * video data to the video element
 
 *
 
 * @param  {Object} source    The source object
 
 * @param  {Flash} tech   The instance of the Flash tech
 
 */
 
Flash.nativeSourceHandler.handleSource = function (source, tech) {
 
  tech.setSrc(source.src);
 
};
 

	
 
/*
 
 * Clean up the source handler when disposing the player or switching sources..
 
 * (no cleanup is needed when supporting the format natively)
 
 */
 
Flash.nativeSourceHandler.dispose = function () {};
 

	
 
// Register the native source handler
 
Flash.registerSourceHandler(Flash.nativeSourceHandler);
 

	
 
Flash.formats = {
 
  'video/flv': 'FLV',
 
  'video/x-flv': 'FLV',
 
  'video/mp4': 'MP4',
 
  'video/m4v': 'MP4'
 
};
 

	
 
Flash.onReady = function (currSwf) {
 
  var el = Dom.getEl(currSwf);
 
  var tech = el && el.tech;
 

	
 
  // if there is no el then the tech has been disposed
 
  // and the tech element was removed from the player div
 
  if (tech && tech.el()) {
 
    // check that the flash object is really ready
 
    Flash.checkReady(tech);
 
  }
 
};
 

	
 
// The SWF isn't always ready when it says it is. Sometimes the API functions still need to be added to the object.
 
// If it's not ready, we set a timeout to check again shortly.
 
Flash.checkReady = function (tech) {
 
  // stop worrying if the tech has been disposed
 
  if (!tech.el()) {
 
    return;
 
  }
 

	
 
  // check if API property exists
 
  if (tech.el().vjs_getProperty) {
 
    // tell tech it's ready
 
    tech.triggerReady();
 
  } else {
 
    // wait longer
 
    this.setTimeout(function () {
 
      Flash['checkReady'](tech);
 
    }, 50);
 
  }
 
};
 

	
 
// Trigger events from the swf on the player
 
Flash.onEvent = function (swfID, eventName) {
 
  var tech = Dom.getEl(swfID).tech;
 
  tech.trigger(eventName);
 
};
 

	
 
// Log errors from the swf
 
Flash.onError = function (swfID, err) {
 
  var tech = Dom.getEl(swfID).tech;
 

	
 
  // trigger MEDIA_ERR_SRC_NOT_SUPPORTED
 
  if (err === 'srcnotfound') {
 
    return tech.error(4);
 
  }
 

	
 
  // trigger a custom error
 
  tech.error('FLASH: ' + err);
 
};
 

	
 
// Flash Version Check
 
Flash.version = function () {
 
  var version = '0,0,0';
 

	
 
  // IE
 
  try {
 
    version = new _globalWindow2['default'].ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
 

	
 
    // other browsers
 
  } catch (e) {
 
    try {
 
      if (navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin) {
 
        version = (navigator.plugins['Shockwave Flash 2.0'] || navigator.plugins['Shockwave Flash']).description.replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
 
      }
 
    } catch (err) {}
 
  }
 
  return version.split(',');
 
};
 

	
 
// Flash embedding method. Only used in non-iframe mode
 
Flash.embed = function (swf, flashVars, params, attributes) {
 
  var code = Flash.getEmbedCode(swf, flashVars, params, attributes);
 

	
 
  // Get element by embedding code and retrieving created element
 
  var obj = Dom.createEl('div', { innerHTML: code }).childNodes[0];
 

	
 
  return obj;
 
};
 

	
 
Flash.getEmbedCode = function (swf, flashVars, params, attributes) {
 
  var objTag = '<object type="application/x-shockwave-flash" ';
 
  var flashVarsString = '';
 
  var paramsString = '';
 
  var attrsString = '';
 

	
 
  // Convert flash vars to string
 
  if (flashVars) {
 
    Object.getOwnPropertyNames(flashVars).forEach(function (key) {
 
      flashVarsString += key + '=' + flashVars[key] + '&amp;';
 
    });
 
  }
 

	
 
  // Add swf, flashVars, and other default params
 
  params = _objectAssign2['default']({
 
    'movie': swf,
 
    'flashvars': flashVarsString,
 
    'allowScriptAccess': 'always', // Required to talk to swf
 
    'allowNetworking': 'all' // All should be default, but having security issues.
 
  }, params);
 

	
 
  // Create param tags string
 
  Object.getOwnPropertyNames(params).forEach(function (key) {
 
    paramsString += '<param name="' + key + '" value="' + params[key] + '" />';
 
  });
 

	
 
  attributes = _objectAssign2['default']({
 
    // Add swf to attributes (need both for IE and Others to work)
 
    'data': swf,
 

	
 
    // Default to 100% width/height
 
    'width': '100%',
 
    'height': '100%'
 

	
 
  }, attributes);
 

	
 
  // Create Attributes string
 
  Object.getOwnPropertyNames(attributes).forEach(function (key) {
 
    attrsString += key + '="' + attributes[key] + '" ';
 
  });
 

	
 
  return '' + objTag + attrsString + '>' + paramsString + '</object>';
 
};
 

	
 
// Run Flash through the RTMP decorator
 
_flashRtmp2['default'](Flash);
 

	
 
_component2['default'].registerComponent('Flash', Flash);
 
exports['default'] = Flash;
 
module.exports = exports['default'];
 

	
 
},{"../component":58,"../utils/dom.js":118,"../utils/time-ranges.js":126,"../utils/url.js":128,"./flash-rtmp":103,"./tech":107,"global/window":2,"object.assign":43}],105:[function(_dereq_,module,exports){
 
/**
 
 * @file html5.js
 
 * HTML5 Media Controller - Wrapper for HTML5 Media API
 
 */
 

	
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _techJs = _dereq_('./tech.js');
 

	
 
var _techJs2 = _interopRequireDefault(_techJs);
 

	
 
var _component = _dereq_('../component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _utilsDomJs = _dereq_('../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsUrlJs = _dereq_('../utils/url.js');
 

	
 
var Url = _interopRequireWildcard(_utilsUrlJs);
 

	
 
var _utilsFnJs = _dereq_('../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsLogJs = _dereq_('../utils/log.js');
 

	
 
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
 

	
 
var _utilsBrowserJs = _dereq_('../utils/browser.js');
 

	
 
var browser = _interopRequireWildcard(_utilsBrowserJs);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
var _utilsMergeOptionsJs = _dereq_('../utils/merge-options.js');
 

	
 
var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs);
 

	
 
/**
 
 * HTML5 Media Controller - Wrapper for HTML5 Media API
 
 *
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready Ready callback function
 
 * @extends Tech
 
 * @class Html5
 
 */
 

	
 
var Html5 = (function (_Tech) {
 
  _inherits(Html5, _Tech);
 

	
 
  function Html5(options, ready) {
 
    _classCallCheck(this, Html5);
 

	
 
    _Tech.call(this, options, ready);
 

	
 
    var source = options.source;
 

	
 
    // Set the source if one is provided
 
    // 1) Check if the source is new (if not, we want to keep the original so playback isn't interrupted)
 
    // 2) Check to see if the network state of the tag was failed at init, and if so, reset the source
 
    // anyway so the error gets fired.
 
    if (source && (this.el_.currentSrc !== source.src || options.tag && options.tag.initNetworkState_ === 3)) {
 
      this.setSource(source);
 
    } else {
 
      this.handleLateInit_(this.el_);
 
    }
 

	
 
    if (this.el_.hasChildNodes()) {
 

	
 
      var nodes = this.el_.childNodes;
 
      var nodesLength = nodes.length;
 
      var removeNodes = [];
 

	
 
      while (nodesLength--) {
 
        var node = nodes[nodesLength];
 
        var nodeName = node.nodeName.toLowerCase();
 
        if (nodeName === 'track') {
 
          if (!this.featuresNativeTextTracks) {
 
            // Empty video tag tracks so the built-in player doesn't use them also.
 
            // This may not be fast enough to stop HTML5 browsers from reading the tags
 
            // so we'll need to turn off any default tracks if we're manually doing
 
            // captions and subtitles. videoElement.textTracks
 
            removeNodes.push(node);
 
          } else {
 
            this.remoteTextTracks().addTrack_(node.track);
 
          }
 
        }
 
      }
 

	
 
      for (var i = 0; i < removeNodes.length; i++) {
 
        this.el_.removeChild(removeNodes[i]);
 
      }
 
    }
 

	
 
    if (this.featuresNativeTextTracks) {
 
      this.handleTextTrackChange_ = Fn.bind(this, this.handleTextTrackChange);
 
      this.handleTextTrackAdd_ = Fn.bind(this, this.handleTextTrackAdd);
 
      this.handleTextTrackRemove_ = Fn.bind(this, this.handleTextTrackRemove);
 
      this.proxyNativeTextTracks_();
 
    }
 

	
 
    // Determine if native controls should be used
 
    // Our goal should be to get the custom controls on mobile solid everywhere
 
    // so we can remove this all together. Right now this will block custom
 
    // controls on touch enabled laptops like the Chrome Pixel
 
    if (browser.TOUCH_ENABLED && options.nativeControlsForTouch === true || browser.IS_IPHONE || browser.IS_NATIVE_ANDROID) {
 
      this.setControls(true);
 
    }
 

	
 
    this.triggerReady();
 
  }
 

	
 
  /* HTML5 Support Testing ---------------------------------------------------- */
 

	
 
  /*
 
  * Element for testing browser HTML5 video capabilities
 
  *
 
  * @type {Element}
 
  * @constant
 
  * @private
 
  */
 

	
 
  /**
 
   * Dispose of html5 media element
 
   *
 
   * @method dispose
 
   */
 

	
 
  Html5.prototype.dispose = function dispose() {
 
    var tt = this.el().textTracks;
 
    var emulatedTt = this.textTracks();
 

	
 
    // remove native event listeners
 
    if (tt && tt.removeEventListener) {
 
      tt.removeEventListener('change', this.handleTextTrackChange_);
 
      tt.removeEventListener('addtrack', this.handleTextTrackAdd_);
 
      tt.removeEventListener('removetrack', this.handleTextTrackRemove_);
 
    }
 

	
 
    // clearout the emulated text track list.
 
    var i = emulatedTt.length;
 

	
 
    while (i--) {
 
      emulatedTt.removeTrack_(emulatedTt[i]);
 
    }
 

	
 
    Html5.disposeMediaElement(this.el_);
 
    _Tech.prototype.dispose.call(this);
 
  };
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  Html5.prototype.createEl = function createEl() {
 
    var el = this.options_.tag;
 

	
 
    // Check if this browser supports moving the element into the box.
 
    // On the iPhone video will break if you move the element,
 
    // So we have to create a brand new element.
 
    if (!el || this['movingMediaElementInDOM'] === false) {
 

	
 
      // If the original tag is still there, clone and remove it.
 
      if (el) {
 
        var clone = el.cloneNode(true);
 
        el.parentNode.insertBefore(clone, el);
 
        Html5.disposeMediaElement(el);
 
        el = clone;
 
      } else {
 
        el = _globalDocument2['default'].createElement('video');
 

	
 
        // determine if native controls should be used
 
        var tagAttributes = this.options_.tag && Dom.getElAttributes(this.options_.tag);
 
        var attributes = _utilsMergeOptionsJs2['default']({}, tagAttributes);
 
        if (!browser.TOUCH_ENABLED || this.options_.nativeControlsForTouch !== true) {
 
          delete attributes.controls;
 
        }
 

	
 
        Dom.setElAttributes(el, _objectAssign2['default'](attributes, {
 
          id: this.options_.techId,
 
          'class': 'vjs-tech'
 
        }));
 
      }
 
    }
 

	
 
    // Update specific tag settings, in case they were overridden
 
    var settingsAttrs = ['autoplay', 'preload', 'loop', 'muted'];
 
    for (var i = settingsAttrs.length - 1; i >= 0; i--) {
 
      var attr = settingsAttrs[i];
 
      var overwriteAttrs = {};
 
      if (typeof this.options_[attr] !== 'undefined') {
 
        overwriteAttrs[attr] = this.options_[attr];
 
      }
 
      Dom.setElAttributes(el, overwriteAttrs);
 
    }
 

	
 
    return el;
 
    // jenniisawesome = true;
 
  };
 

	
 
  // If we're loading the playback object after it has started loading
 
  // or playing the video (often with autoplay on) then the loadstart event
 
  // has already fired and we need to fire it manually because many things
 
  // rely on it.
 

	
 
  Html5.prototype.handleLateInit_ = function handleLateInit_(el) {
 
    var _this = this;
 

	
 
    if (el.networkState === 0 || el.networkState === 3) {
 
      // The video element hasn't started loading the source yet
 
      // or didn't find a source
 
      return;
 
    }
 

	
 
    if (el.readyState === 0) {
 
      var _ret = (function () {
 
        // NetworkState is set synchronously BUT loadstart is fired at the
 
        // end of the current stack, usually before setInterval(fn, 0).
 
        // So at this point we know loadstart may have already fired or is
 
        // about to fire, and either way the player hasn't seen it yet.
 
        // We don't want to fire loadstart prematurely here and cause a
 
        // double loadstart so we'll wait and see if it happens between now
 
        // and the next loop, and fire it if not.
 
        // HOWEVER, we also want to make sure it fires before loadedmetadata
 
        // which could also happen between now and the next loop, so we'll
 
        // watch for that also.
 
        var loadstartFired = false;
 
        var setLoadstartFired = function setLoadstartFired() {
 
          loadstartFired = true;
 
        };
 
        _this.on('loadstart', setLoadstartFired);
 

	
 
        var triggerLoadstart = function triggerLoadstart() {
 
          // We did miss the original loadstart. Make sure the player
 
          // sees loadstart before loadedmetadata
 
          if (!loadstartFired) {
 
            this.trigger('loadstart');
 
          }
 
        };
 
        _this.on('loadedmetadata', triggerLoadstart);
 

	
 
        _this.ready(function () {
 
          this.off('loadstart', setLoadstartFired);
 
          this.off('loadedmetadata', triggerLoadstart);
 

	
 
          if (!loadstartFired) {
 
            // We did miss the original native loadstart. Fire it now.
 
            this.trigger('loadstart');
 
          }
 
        });
 

	
 
        return {
 
          v: undefined
 
        };
 
      })();
 

	
 
      if (typeof _ret === 'object') return _ret.v;
 
    }
 

	
 
    // From here on we know that loadstart already fired and we missed it.
 
    // The other readyState events aren't as much of a problem if we double
 
    // them, so not going to go to as much trouble as loadstart to prevent
 
    // that unless we find reason to.
 
    var eventsToTrigger = ['loadstart'];
 

	
 
    // loadedmetadata: newly equal to HAVE_METADATA (1) or greater
 
    eventsToTrigger.push('loadedmetadata');
 

	
 
    // loadeddata: newly increased to HAVE_CURRENT_DATA (2) or greater
 
    if (el.readyState >= 2) {
 
      eventsToTrigger.push('loadeddata');
 
    }
 

	
 
    // canplay: newly increased to HAVE_FUTURE_DATA (3) or greater
 
    if (el.readyState >= 3) {
 
      eventsToTrigger.push('canplay');
 
    }
 

	
 
    // canplaythrough: newly equal to HAVE_ENOUGH_DATA (4)
 
    if (el.readyState >= 4) {
 
      eventsToTrigger.push('canplaythrough');
 
    }
 

	
 
    // We still need to give the player time to add event listeners
 
    this.ready(function () {
 
      eventsToTrigger.forEach(function (type) {
 
        this.trigger(type);
 
      }, this);
 
    });
 
  };
 

	
 
  Html5.prototype.proxyNativeTextTracks_ = function proxyNativeTextTracks_() {
 
    var tt = this.el().textTracks;
 

	
 
    if (tt && tt.addEventListener) {
 
      tt.addEventListener('change', this.handleTextTrackChange_);
 
      tt.addEventListener('addtrack', this.handleTextTrackAdd_);
 
      tt.addEventListener('removetrack', this.handleTextTrackRemove_);
 
    }
 
  };
 

	
 
  Html5.prototype.handleTextTrackChange = function handleTextTrackChange(e) {
 
    var tt = this.textTracks();
 
    this.textTracks().trigger({
 
      type: 'change',
 
      target: tt,
 
      currentTarget: tt,
 
      srcElement: tt
 
    });
 
  };
 

	
 
  Html5.prototype.handleTextTrackAdd = function handleTextTrackAdd(e) {
 
    this.textTracks().addTrack_(e.track);
 
  };
 

	
 
  Html5.prototype.handleTextTrackRemove = function handleTextTrackRemove(e) {
 
    this.textTracks().removeTrack_(e.track);
 
  };
 

	
 
  /**
 
   * Play for html5 tech
 
   *
 
   * @method play
 
   */
 

	
 
  Html5.prototype.play = function play() {
 
    this.el_.play();
 
  };
 

	
 
  /**
 
   * Pause for html5 tech
 
   *
 
   * @method pause
 
   */
 

	
 
  Html5.prototype.pause = function pause() {
 
    this.el_.pause();
 
  };
 

	
 
  /**
 
   * Paused for html5 tech
 
   *
 
   * @return {Boolean}
 
   * @method paused
 
   */
 

	
 
  Html5.prototype.paused = function paused() {
 
    return this.el_.paused;
 
  };
 

	
 
  /**
 
   * Get current time
 
   *
 
   * @return {Number}
 
   * @method currentTime
 
   */
 

	
 
  Html5.prototype.currentTime = function currentTime() {
 
    return this.el_.currentTime;
 
  };
 

	
 
  /**
 
   * Set current time
 
   *
 
   * @param {Number} seconds Current time of video
 
   * @method setCurrentTime
 
   */
 

	
 
  Html5.prototype.setCurrentTime = function setCurrentTime(seconds) {
 
    try {
 
      this.el_.currentTime = seconds;
 
    } catch (e) {
 
      _utilsLogJs2['default'](e, 'Video is not ready. (Video.js)');
 
      // this.warning(VideoJS.warnings.videoNotReady);
 
    }
 
  };
 

	
 
  /**
 
   * Get duration
 
   *
 
   * @return {Number}
 
   * @method duration
 
   */
 

	
 
  Html5.prototype.duration = function duration() {
 
    return this.el_.duration || 0;
 
  };
 

	
 
  /**
 
   * Get a TimeRange object that represents the intersection
 
   * of the time ranges for which the user agent has all
 
   * relevant media
 
   *
 
   * @return {TimeRangeObject}
 
   * @method buffered
 
   */
 

	
 
  Html5.prototype.buffered = function buffered() {
 
    return this.el_.buffered;
 
  };
 

	
 
  /**
 
   * Get volume level
 
   *
 
   * @return {Number}
 
   * @method volume
 
   */
 

	
 
  Html5.prototype.volume = function volume() {
 
    return this.el_.volume;
 
  };
 

	
 
  /**
 
   * Set volume level
 
   *
 
   * @param {Number} percentAsDecimal Volume percent as a decimal
 
   * @method setVolume
 
   */
 

	
 
  Html5.prototype.setVolume = function setVolume(percentAsDecimal) {
 
    this.el_.volume = percentAsDecimal;
 
  };
 

	
 
  /**
 
   * Get if muted
 
   *
 
   * @return {Boolean}
 
   * @method muted
 
   */
 

	
 
  Html5.prototype.muted = function muted() {
 
    return this.el_.muted;
 
  };
 

	
 
  /**
 
   * Set muted
 
   *
 
   * @param {Boolean} If player is to be muted or note
 
   * @method setMuted
 
   */
 

	
 
  Html5.prototype.setMuted = function setMuted(muted) {
 
    this.el_.muted = muted;
 
  };
 

	
 
  /**
 
   * Get player width
 
   *
 
   * @return {Number}
 
   * @method width
 
   */
 

	
 
  Html5.prototype.width = function width() {
 
    return this.el_.offsetWidth;
 
  };
 

	
 
  /**
 
   * Get player height
 
   *
 
   * @return {Number}
 
   * @method height
 
   */
 

	
 
  Html5.prototype.height = function height() {
 
    return this.el_.offsetHeight;
 
  };
 

	
 
  /**
 
   * Get if there is fullscreen support
 
   *
 
   * @return {Boolean}
 
   * @method supportsFullScreen
 
   */
 

	
 
  Html5.prototype.supportsFullScreen = function supportsFullScreen() {
 
    if (typeof this.el_.webkitEnterFullScreen === 'function') {
 
      var userAgent = _globalWindow2['default'].navigator.userAgent;
 
      // Seems to be broken in Chromium/Chrome && Safari in Leopard
 
      if (/Android/.test(userAgent) || !/Chrome|Mac OS X 10.5/.test(userAgent)) {
 
        return true;
 
      }
 
    }
 
    return false;
 
  };
 

	
 
  /**
 
   * Request to enter fullscreen
 
   *
 
   * @method enterFullScreen
 
   */
 

	
 
  Html5.prototype.enterFullScreen = function enterFullScreen() {
 
    var video = this.el_;
 

	
 
    if ('webkitDisplayingFullscreen' in video) {
 
      this.one('webkitbeginfullscreen', function () {
 
        this.one('webkitendfullscreen', function () {
 
          this.trigger('fullscreenchange', { isFullscreen: false });
 
        });
 

	
 
        this.trigger('fullscreenchange', { isFullscreen: true });
 
      });
 
    }
 

	
 
    if (video.paused && video.networkState <= video.HAVE_METADATA) {
 
      // attempt to prime the video element for programmatic access
 
      // this isn't necessary on the desktop but shouldn't hurt
 
      this.el_.play();
 

	
 
      // playing and pausing synchronously during the transition to fullscreen
 
      // can get iOS ~6.1 devices into a play/pause loop
 
      this.setTimeout(function () {
 
        video.pause();
 
        video.webkitEnterFullScreen();
 
      }, 0);
 
    } else {
 
      video.webkitEnterFullScreen();
 
    }
 
  };
 

	
 
  /**
 
   * Request to exit fullscreen
 
   *
 
   * @method exitFullScreen
 
   */
 

	
 
  Html5.prototype.exitFullScreen = function exitFullScreen() {
 
    this.el_.webkitExitFullScreen();
 
  };
 

	
 
  /**
 
   * Get/set video
 
   *
 
   * @param {Object=} src Source object
 
   * @return {Object}
 
   * @method src
 
   */
 

	
 
  Html5.prototype.src = function src(_src) {
 
    if (_src === undefined) {
 
      return this.el_.src;
 
    } else {
 
      // Setting src through `src` instead of `setSrc` will be deprecated
 
      this.setSrc(_src);
 
    }
 
  };
 

	
 
  /**
 
   * Set video
 
   *
 
   * @param {Object} src Source object
 
   * @deprecated
 
   * @method setSrc
 
   */
 

	
 
  Html5.prototype.setSrc = function setSrc(src) {
 
    this.el_.src = src;
 
  };
 

	
 
  /**
 
   * Load media into player
 
   *
 
   * @method load
 
   */
 

	
 
  Html5.prototype.load = function load() {
 
    this.el_.load();
 
  };
 

	
 
  /**
 
   * Get current source
 
   *
 
   * @return {Object}
 
   * @method currentSrc
 
   */
 

	
 
  Html5.prototype.currentSrc = function currentSrc() {
 
    return this.el_.currentSrc;
 
  };
 

	
 
  /**
 
   * Get poster
 
   *
 
   * @return {String}
 
   * @method poster
 
   */
 

	
 
  Html5.prototype.poster = function poster() {
 
    return this.el_.poster;
 
  };
 

	
 
  /**
 
   * Set poster
 
   *
 
   * @param {String} val URL to poster image
 
   * @method
 
   */
 

	
 
  Html5.prototype.setPoster = function setPoster(val) {
 
    this.el_.poster = val;
 
  };
 

	
 
  /**
 
   * Get preload attribute
 
   *
 
   * @return {String}
 
   * @method preload
 
   */
 

	
 
  Html5.prototype.preload = function preload() {
 
    return this.el_.preload;
 
  };
 

	
 
  /**
 
   * Set preload attribute
 
   *
 
   * @param {String} val Value for preload attribute
 
   * @method setPreload
 
   */
 

	
 
  Html5.prototype.setPreload = function setPreload(val) {
 
    this.el_.preload = val;
 
  };
 

	
 
  /**
 
   * Get autoplay attribute
 
   *
 
   * @return {String}
 
   * @method autoplay
 
   */
 

	
 
  Html5.prototype.autoplay = function autoplay() {
 
    return this.el_.autoplay;
 
  };
 

	
 
  /**
 
   * Set autoplay attribute
 
   *
 
   * @param {String} val Value for preload attribute
 
   * @method setAutoplay
 
   */
 

	
 
  Html5.prototype.setAutoplay = function setAutoplay(val) {
 
    this.el_.autoplay = val;
 
  };
 

	
 
  /**
 
   * Get controls attribute
 
   *
 
   * @return {String}
 
   * @method controls
 
   */
 

	
 
  Html5.prototype.controls = function controls() {
 
    return this.el_.controls;
 
  };
 

	
 
  /**
 
   * Set controls attribute
 
   *
 
   * @param {String} val Value for controls attribute
 
   * @method setControls
 
   */
 

	
 
  Html5.prototype.setControls = function setControls(val) {
 
    this.el_.controls = !!val;
 
  };
 

	
 
  /**
 
   * Get loop attribute
 
   *
 
   * @return {String}
 
   * @method loop
 
   */
 

	
 
  Html5.prototype.loop = function loop() {
 
    return this.el_.loop;
 
  };
 

	
 
  /**
 
   * Set loop attribute
 
   *
 
   * @param {String} val Value for loop attribute
 
   * @method setLoop
 
   */
 

	
 
  Html5.prototype.setLoop = function setLoop(val) {
 
    this.el_.loop = val;
 
  };
 

	
 
  /**
 
   * Get error value
 
   *
 
   * @return {String}
 
   * @method error
 
   */
 

	
 
  Html5.prototype.error = function error() {
 
    return this.el_.error;
 
  };
 

	
 
  /**
 
   * Get whether or not the player is in the "seeking" state
 
   *
 
   * @return {Boolean}
 
   * @method seeking
 
   */
 

	
 
  Html5.prototype.seeking = function seeking() {
 
    return this.el_.seeking;
 
  };
 

	
 
  /**
 
   * Get a TimeRanges object that represents the
 
   * ranges of the media resource to which it is possible
 
   * for the user agent to seek.
 
   *
 
   * @return {TimeRangeObject}
 
   * @method seekable
 
   */
 

	
 
  Html5.prototype.seekable = function seekable() {
 
    return this.el_.seekable;
 
  };
 

	
 
  /**
 
   * Get if video ended
 
   *
 
   * @return {Boolean}
 
   * @method ended
 
   */
 

	
 
  Html5.prototype.ended = function ended() {
 
    return this.el_.ended;
 
  };
 

	
 
  /**
 
   * Get the value of the muted content attribute
 
   * This attribute has no dynamic effect, it only
 
   * controls the default state of the element
 
   *
 
   * @return {Boolean}
 
   * @method defaultMuted
 
   */
 

	
 
  Html5.prototype.defaultMuted = function defaultMuted() {
 
    return this.el_.defaultMuted;
 
  };
 

	
 
  /**
 
   * Get desired speed at which the media resource is to play
 
   *
 
   * @return {Number}
 
   * @method playbackRate
 
   */
 

	
 
  Html5.prototype.playbackRate = function playbackRate() {
 
    return this.el_.playbackRate;
 
  };
 

	
 
  /**
 
   * Returns a TimeRanges object that represents the ranges of the
 
   * media resource that the user agent has played.
 
   * @return {TimeRangeObject} the range of points on the media
 
   * timeline that has been reached through normal playback
 
   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-played
 
   */
 

	
 
  Html5.prototype.played = function played() {
 
    return this.el_.played;
 
  };
 

	
 
  /**
 
   * Set desired speed at which the media resource is to play
 
   *
 
   * @param {Number} val Speed at which the media resource is to play
 
   * @method setPlaybackRate
 
   */
 

	
 
  Html5.prototype.setPlaybackRate = function setPlaybackRate(val) {
 
    this.el_.playbackRate = val;
 
  };
 

	
 
  /**
 
   * Get the current state of network activity for the element, from
 
   * the list below
 
   * NETWORK_EMPTY (numeric value 0)
 
   * NETWORK_IDLE (numeric value 1)
 
   * NETWORK_LOADING (numeric value 2)
 
   * NETWORK_NO_SOURCE (numeric value 3)
 
   *
 
   * @return {Number}
 
   * @method networkState
 
   */
 

	
 
  Html5.prototype.networkState = function networkState() {
 
    return this.el_.networkState;
 
  };
 

	
 
  /**
 
   * Get a value that expresses the current state of the element
 
   * with respect to rendering the current playback position, from
 
   * the codes in the list below
 
   * HAVE_NOTHING (numeric value 0)
 
   * HAVE_METADATA (numeric value 1)
 
   * HAVE_CURRENT_DATA (numeric value 2)
 
   * HAVE_FUTURE_DATA (numeric value 3)
 
   * HAVE_ENOUGH_DATA (numeric value 4)
 
   *
 
   * @return {Number}
 
   * @method readyState
 
   */
 

	
 
  Html5.prototype.readyState = function readyState() {
 
    return this.el_.readyState;
 
  };
 

	
 
  /**
 
   * Get width of video
 
   *
 
   * @return {Number}
 
   * @method videoWidth
 
   */
 

	
 
  Html5.prototype.videoWidth = function videoWidth() {
 
    return this.el_.videoWidth;
 
  };
 

	
 
  /**
 
   * Get height of video
 
   *
 
   * @return {Number}
 
   * @method videoHeight
 
   */
 

	
 
  Html5.prototype.videoHeight = function videoHeight() {
 
    return this.el_.videoHeight;
 
  };
 

	
 
  /**
 
   * Get text tracks
 
   *
 
   * @return {TextTrackList}
 
   * @method textTracks
 
   */
 

	
 
  Html5.prototype.textTracks = function textTracks() {
 
    return _Tech.prototype.textTracks.call(this);
 
  };
 

	
 
  /**
 
   * Creates and returns a text track object
 
   *
 
   * @param {String} kind Text track kind (subtitles, captions, descriptions
 
   *                                       chapters and metadata)
 
   * @param {String=} label Label to identify the text track
 
   * @param {String=} language Two letter language abbreviation
 
   * @return {TextTrackObject}
 
   * @method addTextTrack
 
   */
 

	
 
  Html5.prototype.addTextTrack = function addTextTrack(kind, label, language) {
 
    if (!this['featuresNativeTextTracks']) {
 
      return _Tech.prototype.addTextTrack.call(this, kind, label, language);
 
    }
 

	
 
    return this.el_.addTextTrack(kind, label, language);
 
  };
 

	
 
  /**
 
   * Creates and returns a remote text track object
 
   *
 
   * @param {Object} options The object should contain values for
 
   * kind, language, label and src (location of the WebVTT file)
 
   * @return {TextTrackObject}
 
   * @method addRemoteTextTrack
 
   */
 

	
 
  Html5.prototype.addRemoteTextTrack = function addRemoteTextTrack() {
 
    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
 

	
 
    if (!this['featuresNativeTextTracks']) {
 
      return _Tech.prototype.addRemoteTextTrack.call(this, options);
 
    }
 

	
 
    var track = _globalDocument2['default'].createElement('track');
 

	
 
    if (options['kind']) {
 
      track['kind'] = options['kind'];
 
    }
 
    if (options['label']) {
 
      track['label'] = options['label'];
 
    }
 
    if (options['language'] || options['srclang']) {
 
      track['srclang'] = options['language'] || options['srclang'];
 
    }
 
    if (options['default']) {
 
      track['default'] = options['default'];
 
    }
 
    if (options['id']) {
 
      track['id'] = options['id'];
 
    }
 
    if (options['src']) {
 
      track['src'] = options['src'];
 
    }
 

	
 
    this.el().appendChild(track);
 

	
 
    this.remoteTextTracks().addTrack_(track.track);
 

	
 
    return track;
 
  };
 

	
 
  /**
 
   * Remove remote text track from TextTrackList object
 
   *
 
   * @param {TextTrackObject} track Texttrack object to remove
 
   * @method removeRemoteTextTrack
 
   */
 

	
 
  Html5.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) {
 
    if (!this['featuresNativeTextTracks']) {
 
      return _Tech.prototype.removeRemoteTextTrack.call(this, track);
 
    }
 

	
 
    var tracks, i;
 

	
 
    this.remoteTextTracks().removeTrack_(track);
 

	
 
    tracks = this.el().querySelectorAll('track');
 

	
 
    i = tracks.length;
 
    while (i--) {
 
      if (track === tracks[i] || track === tracks[i].track) {
 
        this.el().removeChild(tracks[i]);
 
      }
 
    }
 
  };
 

	
 
  return Html5;
 
})(_techJs2['default']);
 

	
 
Html5.TEST_VID = _globalDocument2['default'].createElement('video');
 
var track = _globalDocument2['default'].createElement('track');
 
track.kind = 'captions';
 
track.srclang = 'en';
 
track.label = 'English';
 
Html5.TEST_VID.appendChild(track);
 

	
 
/*
 
 * Check if HTML5 video is supported by this browser/device
 
 *
 
 * @return {Boolean}
 
 */
 
Html5.isSupported = function () {
 
  // IE9 with no Media Player is a LIAR! (#984)
 
  try {
 
    Html5.TEST_VID['volume'] = 0.5;
 
  } catch (e) {
 
    return false;
 
  }
 

	
 
  return !!Html5.TEST_VID.canPlayType;
 
};
 

	
 
// Add Source Handler pattern functions to this tech
 
_techJs2['default'].withSourceHandlers(Html5);
 

	
 
/*
 
 * The default native source handler.
 
 * This simply passes the source to the video element. Nothing fancy.
 
 *
 
 * @param  {Object} source   The source object
 
 * @param  {Html5} tech  The instance of the HTML5 tech
 
 */
 
Html5.nativeSourceHandler = {};
 

	
 
/*
 
 * Check if the video element can handle the source natively
 
 *
 
 * @param  {Object} source  The source object
 
 * @return {String}         'probably', 'maybe', or '' (empty string)
 
 */
 
Html5.nativeSourceHandler.canHandleSource = function (source) {
 
  var match, ext;
 

	
 
  function canPlayType(type) {
 
    // IE9 on Windows 7 without MediaPlayer throws an error here
 
    // https://github.com/videojs/video.js/issues/519
 
    try {
 
      return Html5.TEST_VID.canPlayType(type);
 
    } catch (e) {
 
      return '';
 
    }
 
  }
 

	
 
  // If a type was provided we should rely on that
 
  if (source.type) {
 
    return canPlayType(source.type);
 
  } else if (source.src) {
 
    // If no type, fall back to checking 'video/[EXTENSION]'
 
    ext = Url.getFileExtension(source.src);
 

	
 
    return canPlayType('video/' + ext);
 
  }
 

	
 
  return '';
 
};
 

	
 
/*
 
 * Pass the source to the video element
 
 * Adaptive source handlers will have more complicated workflows before passing
 
 * video data to the video element
 
 *
 
 * @param  {Object} source    The source object
 
 * @param  {Html5} tech   The instance of the Html5 tech
 
 */
 
Html5.nativeSourceHandler.handleSource = function (source, tech) {
 
  tech.setSrc(source.src);
 
};
 

	
 
/*
 
* Clean up the source handler when disposing the player or switching sources..
 
* (no cleanup is needed when supporting the format natively)
 
*/
 
Html5.nativeSourceHandler.dispose = function () {};
 

	
 
// Register the native source handler
 
Html5.registerSourceHandler(Html5.nativeSourceHandler);
 

	
 
/*
 
 * Check if the volume can be changed in this browser/device.
 
 * Volume cannot be changed in a lot of mobile devices.
 
 * Specifically, it can't be changed from 1 on iOS.
 
 *
 
 * @return {Boolean}
 
 */
 
Html5.canControlVolume = function () {
 
  var volume = Html5.TEST_VID.volume;
 
  Html5.TEST_VID.volume = volume / 2 + 0.1;
 
  return volume !== Html5.TEST_VID.volume;
 
};
 

	
 
/*
 
 * Check if playbackRate is supported in this browser/device.
 
 *
 
 * @return {Number} [description]
 
 */
 
Html5.canControlPlaybackRate = function () {
 
  var playbackRate = Html5.TEST_VID.playbackRate;
 
  Html5.TEST_VID.playbackRate = playbackRate / 2 + 0.1;
 
  return playbackRate !== Html5.TEST_VID.playbackRate;
 
};
 

	
 
/*
 
 * Check to see if native text tracks are supported by this browser/device
 
 *
 
 * @return {Boolean}
 
 */
 
Html5.supportsNativeTextTracks = function () {
 
  var supportsTextTracks;
 

	
 
  // Figure out native text track support
 
  // If mode is a number, we cannot change it because it'll disappear from view.
 
  // Browsers with numeric modes include IE10 and older (<=2013) samsung android models.
 
  // Firefox isn't playing nice either with modifying the mode
 
  // TODO: Investigate firefox: https://github.com/videojs/video.js/issues/1862
 
  supportsTextTracks = !!Html5.TEST_VID.textTracks;
 
  if (supportsTextTracks && Html5.TEST_VID.textTracks.length > 0) {
 
    supportsTextTracks = typeof Html5.TEST_VID.textTracks[0]['mode'] !== 'number';
 
  }
 
  if (supportsTextTracks && browser.IS_FIREFOX) {
 
    supportsTextTracks = false;
 
  }
 
  if (supportsTextTracks && !('onremovetrack' in Html5.TEST_VID.textTracks)) {
 
    supportsTextTracks = false;
 
  }
 

	
 
  return supportsTextTracks;
 
};
 

	
 
/**
 
 * An array of events available on the Html5 tech.
 
 *
 
 * @private
 
 * @type {Array}
 
 */
 
Html5.Events = ['loadstart', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'loadedmetadata', 'loadeddata', 'canplay', 'canplaythrough', 'playing', 'waiting', 'seeking', 'seeked', 'ended', 'durationchange', 'timeupdate', 'progress', 'play', 'pause', 'ratechange', 'volumechange'];
 

	
 
/*
 
 * Set the tech's volume control support status
 
 *
 
 * @type {Boolean}
 
 */
 
Html5.prototype['featuresVolumeControl'] = Html5.canControlVolume();
 

	
 
/*
 
 * Set the tech's playbackRate support status
 
 *
 
 * @type {Boolean}
 
 */
 
Html5.prototype['featuresPlaybackRate'] = Html5.canControlPlaybackRate();
 

	
 
/*
 
 * Set the tech's status on moving the video element.
 
 * In iOS, if you move a video element in the DOM, it breaks video playback.
 
 *
 
 * @type {Boolean}
 
 */
 
Html5.prototype['movingMediaElementInDOM'] = !browser.IS_IOS;
 

	
 
/*
 
 * Set the the tech's fullscreen resize support status.
 
 * HTML video is able to automatically resize when going to fullscreen.
 
 * (No longer appears to be used. Can probably be removed.)
 
 */
 
Html5.prototype['featuresFullscreenResize'] = true;
 

	
 
/*
 
 * Set the tech's progress event support status
 
 * (this disables the manual progress events of the Tech)
 
 */
 
Html5.prototype['featuresProgressEvents'] = true;
 

	
 
/*
 
 * Sets the tech's status on native text track support
 
 *
 
 * @type {Boolean}
 
 */
 
Html5.prototype['featuresNativeTextTracks'] = Html5.supportsNativeTextTracks();
 

	
 
// HTML5 Feature detection and Device Fixes --------------------------------- //
 
var canPlayType = undefined;
 
var mpegurlRE = /^application\/(?:x-|vnd\.apple\.)mpegurl/i;
 
var mp4RE = /^video\/mp4/i;
 

	
 
Html5.patchCanPlayType = function () {
 
  // Android 4.0 and above can play HLS to some extent but it reports being unable to do so
 
  if (browser.ANDROID_VERSION >= 4.0) {
 
    if (!canPlayType) {
 
      canPlayType = Html5.TEST_VID.constructor.prototype.canPlayType;
 
    }
 

	
 
    Html5.TEST_VID.constructor.prototype.canPlayType = function (type) {
 
      if (type && mpegurlRE.test(type)) {
 
        return 'maybe';
 
      }
 
      return canPlayType.call(this, type);
 
    };
 
  }
 

	
 
  // Override Android 2.2 and less canPlayType method which is broken
 
  if (browser.IS_OLD_ANDROID) {
 
    if (!canPlayType) {
 
      canPlayType = Html5.TEST_VID.constructor.prototype.canPlayType;
 
    }
 

	
 
    Html5.TEST_VID.constructor.prototype.canPlayType = function (type) {
 
      if (type && mp4RE.test(type)) {
 
        return 'maybe';
 
      }
 
      return canPlayType.call(this, type);
 
    };
 
  }
 
};
 

	
 
Html5.unpatchCanPlayType = function () {
 
  var r = Html5.TEST_VID.constructor.prototype.canPlayType;
 
  Html5.TEST_VID.constructor.prototype.canPlayType = canPlayType;
 
  canPlayType = null;
 
  return r;
 
};
 

	
 
// by default, patch the video element
 
Html5.patchCanPlayType();
 

	
 
Html5.disposeMediaElement = function (el) {
 
  if (!el) {
 
    return;
 
  }
 

	
 
  if (el.parentNode) {
 
    el.parentNode.removeChild(el);
 
  }
 

	
 
  // remove any child track or source nodes to prevent their loading
 
  while (el.hasChildNodes()) {
 
    el.removeChild(el.firstChild);
 
  }
 

	
 
  // remove any src reference. not setting `src=''` because that causes a warning
 
  // in firefox
 
  el.removeAttribute('src');
 

	
 
  // force the media element to update its loading state by calling load()
 
  // however IE on Windows 7N has a bug that throws an error so need a try/catch (#793)
 
  if (typeof el.load === 'function') {
 
    // wrapping in an iife so it's not deoptimized (#1060#discussion_r10324473)
 
    (function () {
 
      try {
 
        el.load();
 
      } catch (e) {
 
        // not supported
 
      }
 
    })();
 
  }
 
};
 

	
 
_component2['default'].registerComponent('Html5', Html5);
 
exports['default'] = Html5;
 
module.exports = exports['default'];
 

	
 
},{"../component":58,"../utils/browser.js":115,"../utils/dom.js":118,"../utils/fn.js":120,"../utils/log.js":123,"../utils/merge-options.js":124,"../utils/url.js":128,"./tech.js":107,"global/document":1,"global/window":2,"object.assign":43}],106:[function(_dereq_,module,exports){
 
/**
 
 * @file loader.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _component = _dereq_('../component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _utilsToTitleCaseJs = _dereq_('../utils/to-title-case.js');
 

	
 
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
 

	
 
/**
 
 * The Media Loader is the component that decides which playback technology to load
 
 * when the player is initialized.
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends Component
 
 * @class MediaLoader
 
 */
 

	
 
var MediaLoader = (function (_Component) {
 
  _inherits(MediaLoader, _Component);
 

	
 
  function MediaLoader(player, options, ready) {
 
    _classCallCheck(this, MediaLoader);
 

	
 
    _Component.call(this, player, options, ready);
 

	
 
    // If there are no sources when the player is initialized,
 
    // load the first supported playback technology.
 

	
 
    if (!options.playerOptions['sources'] || options.playerOptions['sources'].length === 0) {
 
      for (var i = 0, j = options.playerOptions['techOrder']; i < j.length; i++) {
 
        var techName = _utilsToTitleCaseJs2['default'](j[i]);
 
        var tech = _component2['default'].getComponent(techName);
 

	
 
        // Check if the browser supports this technology
 
        if (tech && tech.isSupported()) {
 
          player.loadTech_(techName);
 
          break;
 
        }
 
      }
 
    } else {
 
      // // Loop through playback technologies (HTML5, Flash) and check for support.
 
      // // Then load the best source.
 
      // // A few assumptions here:
 
      // //   All playback technologies respect preload false.
 
      player.src(options.playerOptions['sources']);
 
    }
 
  }
 

	
 
  return MediaLoader;
 
})(_component2['default']);
 

	
 
_component2['default'].registerComponent('MediaLoader', MediaLoader);
 
exports['default'] = MediaLoader;
 
module.exports = exports['default'];
 

	
 
},{"../component":58,"../utils/to-title-case.js":127,"global/window":2}],107:[function(_dereq_,module,exports){
 
/**
 
 * @file tech.js
 
 * Media Technology Controller - Base class for media playback
 
 * technology controllers like Flash and HTML5
 
 */
 

	
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _component = _dereq_('../component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _tracksTextTrack = _dereq_('../tracks/text-track');
 

	
 
var _tracksTextTrack2 = _interopRequireDefault(_tracksTextTrack);
 

	
 
var _tracksTextTrackList = _dereq_('../tracks/text-track-list');
 

	
 
var _tracksTextTrackList2 = _interopRequireDefault(_tracksTextTrackList);
 

	
 
var _utilsFnJs = _dereq_('../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsLogJs = _dereq_('../utils/log.js');
 

	
 
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
 

	
 
var _utilsTimeRangesJs = _dereq_('../utils/time-ranges.js');
 

	
 
var _utilsBufferJs = _dereq_('../utils/buffer.js');
 

	
 
var _mediaErrorJs = _dereq_('../media-error.js');
 

	
 
var _mediaErrorJs2 = _interopRequireDefault(_mediaErrorJs);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
/**
 
 * Base class for media (HTML5 Video, Flash) controllers
 
 *
 
 * @param {Object=} options Options object
 
 * @param {Function=} ready Ready callback function
 
 * @extends Component
 
 * @class Tech
 
 */
 

	
 
var Tech = (function (_Component) {
 
  _inherits(Tech, _Component);
 

	
 
  function Tech() {
 
    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
 
    var ready = arguments.length <= 1 || arguments[1] === undefined ? function () {} : arguments[1];
 

	
 
    _classCallCheck(this, Tech);
 

	
 
    // we don't want the tech to report user activity automatically.
 
    // This is done manually in addControlsListeners
 
    options.reportTouchActivity = false;
 
    _Component.call(this, null, options, ready);
 

	
 
    // keep track of whether the current source has played at all to
 
    // implement a very limited played()
 
    this.hasStarted_ = false;
 
    this.on('playing', function () {
 
      this.hasStarted_ = true;
 
    });
 
    this.on('loadstart', function () {
 
      this.hasStarted_ = false;
 
    });
 

	
 
    this.textTracks_ = options.textTracks;
 

	
 
    // Manually track progress in cases where the browser/flash player doesn't report it.
 
    if (!this.featuresProgressEvents) {
 
      this.manualProgressOn();
 
    }
 

	
 
    // Manually track timeupdates in cases where the browser/flash player doesn't report it.
 
    if (!this.featuresTimeupdateEvents) {
 
      this.manualTimeUpdatesOn();
 
    }
 

	
 
    if (options.nativeCaptions === false || options.nativeTextTracks === false) {
 
      this.featuresNativeTextTracks = false;
 
    }
 

	
 
    if (!this.featuresNativeTextTracks) {
 
      this.emulateTextTracks();
 
    }
 

	
 
    this.initTextTrackListeners();
 

	
 
    // Turn on component tap events
 
    this.emitTapEvents();
 
  }
 

	
 
  /*
 
   * List of associated text tracks
 
   *
 
   * @type {Array}
 
   * @private
 
   */
 

	
 
  /* Fallbacks for unsupported event types
 
  ================================================================================ */
 
  // Manually trigger progress events based on changes to the buffered amount
 
  // Many flash players and older HTML5 browsers don't send progress or progress-like events
 
  /**
 
   * Turn on progress events
 
   *
 
   * @method manualProgressOn
 
   */
 

	
 
  Tech.prototype.manualProgressOn = function manualProgressOn() {
 
    this.on('durationchange', this.onDurationChange);
 

	
 
    this.manualProgress = true;
 

	
 
    // Trigger progress watching when a source begins loading
 
    this.one('ready', this.trackProgress);
 
  };
 

	
 
  /**
 
   * Turn off progress events
 
   *
 
   * @method manualProgressOff
 
   */
 

	
 
  Tech.prototype.manualProgressOff = function manualProgressOff() {
 
    this.manualProgress = false;
 
    this.stopTrackingProgress();
 

	
 
    this.off('durationchange', this.onDurationChange);
 
  };
 

	
 
  /**
 
   * Track progress
 
   *
 
   * @method trackProgress
 
   */
 

	
 
  Tech.prototype.trackProgress = function trackProgress() {
 
    this.stopTrackingProgress();
 
    this.progressInterval = this.setInterval(Fn.bind(this, function () {
 
      // Don't trigger unless buffered amount is greater than last time
 

	
 
      var numBufferedPercent = this.bufferedPercent();
 

	
 
      if (this.bufferedPercent_ !== numBufferedPercent) {
 
        this.trigger('progress');
 
      }
 

	
 
      this.bufferedPercent_ = numBufferedPercent;
 

	
 
      if (numBufferedPercent === 1) {
 
        this.stopTrackingProgress();
 
      }
 
    }), 500);
 
  };
 

	
 
  /**
 
   * Update duration
 
   *
 
   * @method onDurationChange
 
   */
 

	
 
  Tech.prototype.onDurationChange = function onDurationChange() {
 
    this.duration_ = this.duration();
 
  };
 

	
 
  /**
 
   * Create and get TimeRange object for buffering
 
   *
 
   * @return {TimeRangeObject}
 
   * @method buffered
 
   */
 

	
 
  Tech.prototype.buffered = function buffered() {
 
    return _utilsTimeRangesJs.createTimeRange(0, 0);
 
  };
 

	
 
  /**
 
   * Get buffered percent
 
   *
 
   * @return {Number}
 
   * @method bufferedPercent
 
   */
 

	
 
  Tech.prototype.bufferedPercent = function bufferedPercent() {
 
    return _utilsBufferJs.bufferedPercent(this.buffered(), this.duration_);
 
  };
 

	
 
  /**
 
   * Stops tracking progress by clearing progress interval
 
   *
 
   * @method stopTrackingProgress
 
   */
 

	
 
  Tech.prototype.stopTrackingProgress = function stopTrackingProgress() {
 
    this.clearInterval(this.progressInterval);
 
  };
 

	
 
  /*! Time Tracking -------------------------------------------------------------- */
 
  /**
 
   * Set event listeners for on play and pause and tracking current time
 
   *
 
   * @method manualTimeUpdatesOn
 
   */
 

	
 
  Tech.prototype.manualTimeUpdatesOn = function manualTimeUpdatesOn() {
 
    this.manualTimeUpdates = true;
 

	
 
    this.on('play', this.trackCurrentTime);
 
    this.on('pause', this.stopTrackingCurrentTime);
 
  };
 

	
 
  /**
 
   * Remove event listeners for on play and pause and tracking current time
 
   *
 
   * @method manualTimeUpdatesOff
 
   */
 

	
 
  Tech.prototype.manualTimeUpdatesOff = function manualTimeUpdatesOff() {
 
    this.manualTimeUpdates = false;
 
    this.stopTrackingCurrentTime();
 
    this.off('play', this.trackCurrentTime);
 
    this.off('pause', this.stopTrackingCurrentTime);
 
  };
 

	
 
  /**
 
   * Tracks current time
 
   *
 
   * @method trackCurrentTime
 
   */
 

	
 
  Tech.prototype.trackCurrentTime = function trackCurrentTime() {
 
    if (this.currentTimeInterval) {
 
      this.stopTrackingCurrentTime();
 
    }
 
    this.currentTimeInterval = this.setInterval(function () {
 
      this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });
 
    }, 250); // 42 = 24 fps // 250 is what Webkit uses // FF uses 15
 
  };
 

	
 
  /**
 
   * Turn off play progress tracking (when paused or dragging)
 
   *
 
   * @method stopTrackingCurrentTime
 
   */
 

	
 
  Tech.prototype.stopTrackingCurrentTime = function stopTrackingCurrentTime() {
 
    this.clearInterval(this.currentTimeInterval);
 

	
 
    // #1002 - if the video ends right before the next timeupdate would happen,
 
    // the progress bar won't make it all the way to the end
 
    this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });
 
  };
 

	
 
  /**
 
   * Turn off any manual progress or timeupdate tracking
 
   *
 
   * @method dispose
 
   */
 

	
 
  Tech.prototype.dispose = function dispose() {
 
    // clear out text tracks because we can't reuse them between techs
 
    var textTracks = this.textTracks();
 

	
 
    if (textTracks) {
 
      var i = textTracks.length;
 
      while (i--) {
 
        this.removeRemoteTextTrack(textTracks[i]);
 
      }
 
    }
 

	
 
    // Turn off any manual progress or timeupdate tracking
 
    if (this.manualProgress) {
 
      this.manualProgressOff();
 
    }
 

	
 
    if (this.manualTimeUpdates) {
 
      this.manualTimeUpdatesOff();
 
    }
 

	
 
    _Component.prototype.dispose.call(this);
 
  };
 

	
 
  /**
 
   * When invoked without an argument, returns a MediaError object
 
   * representing the current error state of the player or null if
 
   * there is no error. When invoked with an argument, set the current
 
   * error state of the player.
 
   * @param {MediaError=} err    Optional an error object
 
   * @return {MediaError}        the current error object or null
 
   * @method error
 
   */
 

	
 
  Tech.prototype.error = function error(err) {
 
    if (err !== undefined) {
 
      if (err instanceof _mediaErrorJs2['default']) {
 
        this.error_ = err;
 
      } else {
 
        this.error_ = new _mediaErrorJs2['default'](err);
 
      }
 
      this.trigger('error');
 
    }
 
    return this.error_;
 
  };
 

	
 
  /**
 
   * Return the time ranges that have been played through for the
 
   * current source. This implementation is incomplete. It does not
 
   * track the played time ranges, only whether the source has played
 
   * at all or not.
 
   * @return {TimeRangeObject} a single time range if this video has
 
   * played or an empty set of ranges if not.
 
   * @method played
 
   */
 

	
 
  Tech.prototype.played = function played() {
 
    if (this.hasStarted_) {
 
      return _utilsTimeRangesJs.createTimeRange(0, 0);
 
    }
 
    return _utilsTimeRangesJs.createTimeRange();
 
  };
 

	
 
  /**
 
   * Set current time
 
   *
 
   * @method setCurrentTime
 
   */
 

	
 
  Tech.prototype.setCurrentTime = function setCurrentTime() {
 
    // improve the accuracy of manual timeupdates
 
    if (this.manualTimeUpdates) {
 
      this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });
 
    }
 
  };
 

	
 
  /**
 
   * Initialize texttrack listeners
 
   *
 
   * @method initTextTrackListeners
 
   */
 

	
 
  Tech.prototype.initTextTrackListeners = function initTextTrackListeners() {
 
    var textTrackListChanges = Fn.bind(this, function () {
 
      this.trigger('texttrackchange');
 
    });
 

	
 
    var tracks = this.textTracks();
 

	
 
    if (!tracks) return;
 

	
 
    tracks.addEventListener('removetrack', textTrackListChanges);
 
    tracks.addEventListener('addtrack', textTrackListChanges);
 

	
 
    this.on('dispose', Fn.bind(this, function () {
 
      tracks.removeEventListener('removetrack', textTrackListChanges);
 
      tracks.removeEventListener('addtrack', textTrackListChanges);
 
    }));
 
  };
 

	
 
  /**
 
   * Emulate texttracks
 
   *
 
   * @method emulateTextTracks
 
   */
 

	
 
  Tech.prototype.emulateTextTracks = function emulateTextTracks() {
 
    if (!_globalWindow2['default']['WebVTT'] && this.el().parentNode != null) {
 
      var script = _globalDocument2['default'].createElement('script');
 
      script.src = this.options_['vtt.js'] || '../node_modules/vtt.js/dist/vtt.js';
 
      this.el().parentNode.appendChild(script);
 
      _globalWindow2['default']['WebVTT'] = true;
 
    }
 

	
 
    var tracks = this.textTracks();
 
    if (!tracks) {
 
      return;
 
    }
 

	
 
    var textTracksChanges = Fn.bind(this, function () {
 
      var _this = this;
 

	
 
      var updateDisplay = function updateDisplay() {
 
        return _this.trigger('texttrackchange');
 
      };
 

	
 
      updateDisplay();
 

	
 
      for (var i = 0; i < tracks.length; i++) {
 
        var track = tracks[i];
 
        track.removeEventListener('cuechange', updateDisplay);
 
        if (track.mode === 'showing') {
 
          track.addEventListener('cuechange', updateDisplay);
 
        }
 
      }
 
    });
 

	
 
    tracks.addEventListener('change', textTracksChanges);
 

	
 
    this.on('dispose', function () {
 
      tracks.removeEventListener('change', textTracksChanges);
 
    });
 
  };
 

	
 
  /*
 
   * Provide default methods for text tracks.
 
   *
 
   * Html5 tech overrides these.
 
   */
 

	
 
  /**
 
   * Get texttracks
 
   *
 
   * @returns {TextTrackList}
 
   * @method textTracks
 
   */
 

	
 
  Tech.prototype.textTracks = function textTracks() {
 
    this.textTracks_ = this.textTracks_ || new _tracksTextTrackList2['default']();
 
    return this.textTracks_;
 
  };
 

	
 
  /**
 
   * Get remote texttracks
 
   *
 
   * @returns {TextTrackList}
 
   * @method remoteTextTracks
 
   */
 

	
 
  Tech.prototype.remoteTextTracks = function remoteTextTracks() {
 
    this.remoteTextTracks_ = this.remoteTextTracks_ || new _tracksTextTrackList2['default']();
 
    return this.remoteTextTracks_;
 
  };
 

	
 
  /**
 
   * Creates and returns a remote text track object
 
   *
 
   * @param {String} kind Text track kind (subtitles, captions, descriptions
 
   *                                       chapters and metadata)
 
   * @param {String=} label Label to identify the text track
 
   * @param {String=} language Two letter language abbreviation
 
   * @return {TextTrackObject}
 
   * @method addTextTrack
 
   */
 

	
 
  Tech.prototype.addTextTrack = function addTextTrack(kind, label, language) {
 
    if (!kind) {
 
      throw new Error('TextTrack kind is required but was not provided');
 
    }
 

	
 
    return createTrackHelper(this, kind, label, language);
 
  };
 

	
 
  /**
 
   * Creates and returns a remote text track object
 
   *
 
   * @param {Object} options The object should contain values for
 
   * kind, language, label and src (location of the WebVTT file)
 
   * @return {TextTrackObject}
 
   * @method addRemoteTextTrack
 
   */
 

	
 
  Tech.prototype.addRemoteTextTrack = function addRemoteTextTrack(options) {
 
    var track = createTrackHelper(this, options.kind, options.label, options.language, options);
 
    this.remoteTextTracks().addTrack_(track);
 
    return {
 
      track: track
 
    };
 
  };
 

	
 
  /**
 
   * Remove remote texttrack
 
   *
 
   * @param {TextTrackObject} track Texttrack to remove
 
   * @method removeRemoteTextTrack
 
   */
 

	
 
  Tech.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) {
 
    this.textTracks().removeTrack_(track);
 
    this.remoteTextTracks().removeTrack_(track);
 
  };
 

	
 
  /**
 
   * Provide a default setPoster method for techs
 
   * Poster support for techs should be optional, so we don't want techs to
 
   * break if they don't have a way to set a poster.
 
   *
 
   * @method setPoster
 
   */
 

	
 
  Tech.prototype.setPoster = function setPoster() {};
 

	
 
  return Tech;
 
})(_component2['default']);
 

	
 
Tech.prototype.textTracks_;
 

	
 
var createTrackHelper = function createTrackHelper(self, kind, label, language) {
 
  var options = arguments.length <= 4 || arguments[4] === undefined ? {} : arguments[4];
 

	
 
  var tracks = self.textTracks();
 

	
 
  options.kind = kind;
 

	
 
  if (label) {
 
    options.label = label;
 
  }
 
  if (language) {
 
    options.language = language;
 
  }
 
  options.tech = self;
 

	
 
  var track = new _tracksTextTrack2['default'](options);
 
  tracks.addTrack_(track);
 

	
 
  return track;
 
};
 

	
 
Tech.prototype.featuresVolumeControl = true;
 

	
 
// Resizing plugins using request fullscreen reloads the plugin
 
Tech.prototype.featuresFullscreenResize = false;
 
Tech.prototype.featuresPlaybackRate = false;
 

	
 
// Optional events that we can manually mimic with timers
 
// currently not triggered by video-js-swf
 
Tech.prototype.featuresProgressEvents = false;
 
Tech.prototype.featuresTimeupdateEvents = false;
 

	
 
Tech.prototype.featuresNativeTextTracks = false;
 

	
 
/*
 
 * A functional mixin for techs that want to use the Source Handler pattern.
 
 *
 
 * ##### EXAMPLE:
 
 *
 
 *   Tech.withSourceHandlers.call(MyTech);
 
 *
 
 */
 
Tech.withSourceHandlers = function (_Tech) {
 
  /*
 
   * Register a source handler
 
   * Source handlers are scripts for handling specific formats.
 
   * The source handler pattern is used for adaptive formats (HLS, DASH) that
 
   * manually load video data and feed it into a Source Buffer (Media Source Extensions)
 
   * @param  {Function} handler  The source handler
 
   * @param  {Boolean}  first    Register it before any existing handlers
 
   */
 
  _Tech.registerSourceHandler = function (handler, index) {
 
    var handlers = _Tech.sourceHandlers;
 

	
 
    if (!handlers) {
 
      handlers = _Tech.sourceHandlers = [];
 
    }
 

	
 
    if (index === undefined) {
 
      // add to the end of the list
 
      index = handlers.length;
 
    }
 

	
 
    handlers.splice(index, 0, handler);
 
  };
 

	
 
  /*
 
   * Return the first source handler that supports the source
 
   * TODO: Answer question: should 'probably' be prioritized over 'maybe'
 
   * @param  {Object} source The source object
 
   * @returns {Object}       The first source handler that supports the source
 
   * @returns {null}         Null if no source handler is found
 
   */
 
  _Tech.selectSourceHandler = function (source) {
 
    var handlers = _Tech.sourceHandlers || [];
 
    var can = undefined;
 

	
 
    for (var i = 0; i < handlers.length; i++) {
 
      can = handlers[i].canHandleSource(source);
 

	
 
      if (can) {
 
        return handlers[i];
 
      }
 
    }
 

	
 
    return null;
 
  };
 

	
 
  /*
 
   * Check if the tech can support the given source
 
   * @param  {Object} srcObj  The source object
 
   * @return {String}         'probably', 'maybe', or '' (empty string)
 
   */
 
  _Tech.canPlaySource = function (srcObj) {
 
    var sh = _Tech.selectSourceHandler(srcObj);
 

	
 
    if (sh) {
 
      return sh.canHandleSource(srcObj);
 
    }
 

	
 
    return '';
 
  };
 

	
 
  var originalSeekable = _Tech.prototype.seekable;
 

	
 
  // when a source handler is registered, prefer its implementation of
 
  // seekable when present.
 
  _Tech.prototype.seekable = function () {
 
    if (this.sourceHandler_ && this.sourceHandler_.seekable) {
 
      return this.sourceHandler_.seekable();
 
    }
 
    return originalSeekable.call(this);
 
  };
 

	
 
  /*
 
   * Create a function for setting the source using a source object
 
   * and source handlers.
 
   * Should never be called unless a source handler was found.
 
   * @param {Object} source  A source object with src and type keys
 
   * @return {Tech} self
 
   */
 
  _Tech.prototype.setSource = function (source) {
 
    var sh = _Tech.selectSourceHandler(source);
 

	
 
    if (!sh) {
 
      // Fall back to a native source hander when unsupported sources are
 
      // deliberately set
 
      if (_Tech.nativeSourceHandler) {
 
        sh = _Tech.nativeSourceHandler;
 
      } else {
 
        _utilsLogJs2['default'].error('No source hander found for the current source.');
 
      }
 
    }
 

	
 
    // Dispose any existing source handler
 
    this.disposeSourceHandler();
 
    this.off('dispose', this.disposeSourceHandler);
 

	
 
    this.currentSource_ = source;
 
    this.sourceHandler_ = sh.handleSource(source, this);
 
    this.on('dispose', this.disposeSourceHandler);
 

	
 
    return this;
 
  };
 

	
 
  /*
 
   * Clean up any existing source handler
 
   */
 
  _Tech.prototype.disposeSourceHandler = function () {
 
    if (this.sourceHandler_ && this.sourceHandler_.dispose) {
 
      this.sourceHandler_.dispose();
 
    }
 
  };
 
};
 

	
 
_component2['default'].registerComponent('Tech', Tech);
 
// Old name for Tech
 
_component2['default'].registerComponent('MediaTechController', Tech);
 
exports['default'] = Tech;
 
module.exports = exports['default'];
 

	
 
},{"../component":58,"../media-error.js":94,"../tracks/text-track":114,"../tracks/text-track-list":112,"../utils/buffer.js":116,"../utils/fn.js":120,"../utils/log.js":123,"../utils/time-ranges.js":126,"global/document":1,"global/window":2}],108:[function(_dereq_,module,exports){
 
/**
 
 * @file text-track-cue-list.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
var _utilsBrowserJs = _dereq_('../utils/browser.js');
 

	
 
var browser = _interopRequireWildcard(_utilsBrowserJs);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
/*
 
 * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcuelist
 
 *
 
 * interface TextTrackCueList {
 
 *   readonly attribute unsigned long length;
 
 *   getter TextTrackCue (unsigned long index);
 
 *   TextTrackCue? getCueById(DOMString id);
 
 * };
 
 */
 

	
 
var TextTrackCueList = function TextTrackCueList(cues) {
 
  var list = this;
 

	
 
  if (browser.IS_IE8) {
 
    list = _globalDocument2['default'].createElement('custom');
 

	
 
    for (var prop in TextTrackCueList.prototype) {
 
      list[prop] = TextTrackCueList.prototype[prop];
 
    }
 
  }
 

	
 
  TextTrackCueList.prototype.setCues_.call(list, cues);
 

	
 
  Object.defineProperty(list, 'length', {
 
    get: function get() {
 
      return this.length_;
 
    }
 
  });
 

	
 
  if (browser.IS_IE8) {
 
    return list;
 
  }
 
};
 

	
 
TextTrackCueList.prototype.setCues_ = function (cues) {
 
  var oldLength = this.length || 0;
 
  var i = 0;
 
  var l = cues.length;
 

	
 
  this.cues_ = cues;
 
  this.length_ = cues.length;
 

	
 
  var defineProp = function defineProp(i) {
 
    if (!('' + i in this)) {
 
      Object.defineProperty(this, '' + i, {
 
        get: function get() {
 
          return this.cues_[i];
 
        }
 
      });
 
    }
 
  };
 

	
 
  if (oldLength < l) {
 
    i = oldLength;
 

	
 
    for (; i < l; i++) {
 
      defineProp.call(this, i);
 
    }
 
  }
 
};
 

	
 
TextTrackCueList.prototype.getCueById = function (id) {
 
  var result = null;
 
  for (var i = 0, l = this.length; i < l; i++) {
 
    var cue = this[i];
 
    if (cue.id === id) {
 
      result = cue;
 
      break;
 
    }
 
  }
 

	
 
  return result;
 
};
 

	
 
exports['default'] = TextTrackCueList;
 
module.exports = exports['default'];
 

	
 
},{"../utils/browser.js":115,"global/document":1}],109:[function(_dereq_,module,exports){
 
/**
 
 * @file text-track-display.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _component = _dereq_('../component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _menuMenuJs = _dereq_('../menu/menu.js');
 

	
 
var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs);
 

	
 
var _menuMenuItemJs = _dereq_('../menu/menu-item.js');
 

	
 
var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs);
 

	
 
var _menuMenuButtonJs = _dereq_('../menu/menu-button.js');
 

	
 
var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs);
 

	
 
var _utilsFnJs = _dereq_('../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var darkGray = '#222';
 
var lightGray = '#ccc';
 
var fontMap = {
 
  monospace: 'monospace',
 
  sansSerif: 'sans-serif',
 
  serif: 'serif',
 
  monospaceSansSerif: '"Andale Mono", "Lucida Console", monospace',
 
  monospaceSerif: '"Courier New", monospace',
 
  proportionalSansSerif: 'sans-serif',
 
  proportionalSerif: 'serif',
 
  casual: '"Comic Sans MS", Impact, fantasy',
 
  script: '"Monotype Corsiva", cursive',
 
  smallcaps: '"Andale Mono", "Lucida Console", monospace, sans-serif'
 
};
 

	
 
/**
 
 * The component for displaying text track cues
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends Component
 
 * @class TextTrackDisplay
 
 */
 

	
 
var TextTrackDisplay = (function (_Component) {
 
  _inherits(TextTrackDisplay, _Component);
 

	
 
  function TextTrackDisplay(player, options, ready) {
 
    _classCallCheck(this, TextTrackDisplay);
 

	
 
    _Component.call(this, player, options, ready);
 

	
 
    player.on('loadstart', Fn.bind(this, this.toggleDisplay));
 
    player.on('texttrackchange', Fn.bind(this, this.updateDisplay));
 

	
 
    // This used to be called during player init, but was causing an error
 
    // if a track should show by default and the display hadn't loaded yet.
 
    // Should probably be moved to an external track loader when we support
 
    // tracks that don't need a display.
 
    player.ready(Fn.bind(this, function () {
 
      if (player.tech_ && player.tech_['featuresNativeTextTracks']) {
 
        this.hide();
 
        return;
 
      }
 

	
 
      player.on('fullscreenchange', Fn.bind(this, this.updateDisplay));
 

	
 
      var tracks = this.options_.playerOptions['tracks'] || [];
 
      for (var i = 0; i < tracks.length; i++) {
 
        var track = tracks[i];
 
        this.player_.addRemoteTextTrack(track);
 
      }
 
    }));
 
  }
 

	
 
  /**
 
  * Add cue HTML to display
 
  *
 
  * @param {Number} color Hex number for color, like #f0e
 
  * @param {Number} opacity Value for opacity,0.0 - 1.0
 
  * @return {RGBAColor} In the form 'rgba(255, 0, 0, 0.3)'
 
  * @method constructColor
 
  */
 

	
 
  /**
 
   * Toggle display texttracks
 
   *
 
   * @method toggleDisplay
 
   */
 

	
 
  TextTrackDisplay.prototype.toggleDisplay = function toggleDisplay() {
 
    if (this.player_.tech_ && this.player_.tech_['featuresNativeTextTracks']) {
 
      this.hide();
 
    } else {
 
      this.show();
 
    }
 
  };
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  TextTrackDisplay.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-text-track-display'
 
    });
 
  };
 

	
 
  /**
 
   * Clear display texttracks
 
   *
 
   * @method clearDisplay
 
   */
 

	
 
  TextTrackDisplay.prototype.clearDisplay = function clearDisplay() {
 
    if (typeof _globalWindow2['default']['WebVTT'] === 'function') {
 
      _globalWindow2['default']['WebVTT']['processCues'](_globalWindow2['default'], [], this.el_);
 
    }
 
  };
 

	
 
  /**
 
   * Update display texttracks
 
   *
 
   * @method updateDisplay
 
   */
 

	
 
  TextTrackDisplay.prototype.updateDisplay = function updateDisplay() {
 
    var tracks = this.player_.textTracks();
 

	
 
    this.clearDisplay();
 

	
 
    if (!tracks) {
 
      return;
 
    }
 

	
 
    for (var i = 0; i < tracks.length; i++) {
 
      var track = tracks[i];
 
      if (track['mode'] === 'showing') {
 
        this.updateForTrack(track);
 
      }
 
    }
 
  };
 

	
 
  /**
 
   * Add texttrack to texttrack list
 
   *
 
   * @param {TextTrackObject} track Texttrack object to be added to list
 
   * @method updateForTrack
 
   */
 

	
 
  TextTrackDisplay.prototype.updateForTrack = function updateForTrack(track) {
 
    if (typeof _globalWindow2['default']['WebVTT'] !== 'function' || !track['activeCues']) {
 
      return;
 
    }
 

	
 
    var overrides = this.player_['textTrackSettings'].getValues();
 

	
 
    var cues = [];
 
    for (var _i = 0; _i < track['activeCues'].length; _i++) {
 
      cues.push(track['activeCues'][_i]);
 
    }
 

	
 
    _globalWindow2['default']['WebVTT']['processCues'](_globalWindow2['default'], track['activeCues'], this.el_);
 

	
 
    var i = cues.length;
 
    while (i--) {
 
      var cueDiv = cues[i].displayState;
 
      if (overrides.color) {
 
        cueDiv.firstChild.style.color = overrides.color;
 
      }
 
      if (overrides.textOpacity) {
 
        tryUpdateStyle(cueDiv.firstChild, 'color', constructColor(overrides.color || '#fff', overrides.textOpacity));
 
      }
 
      if (overrides.backgroundColor) {
 
        cueDiv.firstChild.style.backgroundColor = overrides.backgroundColor;
 
      }
 
      if (overrides.backgroundOpacity) {
 
        tryUpdateStyle(cueDiv.firstChild, 'backgroundColor', constructColor(overrides.backgroundColor || '#000', overrides.backgroundOpacity));
 
      }
 
      if (overrides.windowColor) {
 
        if (overrides.windowOpacity) {
 
          tryUpdateStyle(cueDiv, 'backgroundColor', constructColor(overrides.windowColor, overrides.windowOpacity));
 
        } else {
 
          cueDiv.style.backgroundColor = overrides.windowColor;
 
        }
 
      }
 
      if (overrides.edgeStyle) {
 
        if (overrides.edgeStyle === 'dropshadow') {
 
          cueDiv.firstChild.style.textShadow = '2px 2px 3px ' + darkGray + ', 2px 2px 4px ' + darkGray + ', 2px 2px 5px ' + darkGray;
 
        } else if (overrides.edgeStyle === 'raised') {
 
          cueDiv.firstChild.style.textShadow = '1px 1px ' + darkGray + ', 2px 2px ' + darkGray + ', 3px 3px ' + darkGray;
 
        } else if (overrides.edgeStyle === 'depressed') {
 
          cueDiv.firstChild.style.textShadow = '1px 1px ' + lightGray + ', 0 1px ' + lightGray + ', -1px -1px ' + darkGray + ', 0 -1px ' + darkGray;
 
        } else if (overrides.edgeStyle === 'uniform') {
 
          cueDiv.firstChild.style.textShadow = '0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray;
 
        }
 
      }
 
      if (overrides.fontPercent && overrides.fontPercent !== 1) {
 
        var fontSize = _globalWindow2['default'].parseFloat(cueDiv.style.fontSize);
 
        cueDiv.style.fontSize = fontSize * overrides.fontPercent + 'px';
 
        cueDiv.style.height = 'auto';
 
        cueDiv.style.top = 'auto';
 
        cueDiv.style.bottom = '2px';
 
      }
 
      if (overrides.fontFamily && overrides.fontFamily !== 'default') {
 
        if (overrides.fontFamily === 'small-caps') {
 
          cueDiv.firstChild.style.fontVariant = 'small-caps';
 
        } else {
 
          cueDiv.firstChild.style.fontFamily = fontMap[overrides.fontFamily];
 
        }
 
      }
 
    }
 
  };
 

	
 
  return TextTrackDisplay;
 
})(_component2['default']);
 

	
 
function constructColor(color, opacity) {
 
  return 'rgba(' +
 
  // color looks like "#f0e"
 
  parseInt(color[1] + color[1], 16) + ',' + parseInt(color[2] + color[2], 16) + ',' + parseInt(color[3] + color[3], 16) + ',' + opacity + ')';
 
}
 

	
 
/**
 
 * Try to update style
 
 * Some style changes will throw an error, particularly in IE8. Those should be noops.
 
 *
 
 * @param {Element} el The element to be styles
 
 * @param {CSSProperty} style The CSS property to be styled
 
 * @param {CSSStyle} rule The actual style to be applied to the property
 
 * @method tryUpdateStyle
 
 */
 
function tryUpdateStyle(el, style, rule) {
 
  //
 
  try {
 
    el.style[style] = rule;
 
  } catch (e) {}
 
}
 

	
 
_component2['default'].registerComponent('TextTrackDisplay', TextTrackDisplay);
 
exports['default'] = TextTrackDisplay;
 
module.exports = exports['default'];
 

	
 
},{"../component":58,"../menu/menu-button.js":95,"../menu/menu-item.js":96,"../menu/menu.js":97,"../utils/fn.js":120,"global/document":1,"global/window":2}],110:[function(_dereq_,module,exports){
 
/**
 
 * @file text-track-enums.js
 
 *
 
 * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackmode
 
 *
 
 * enum TextTrackMode { "disabled",  "hidden",  "showing" };
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 
var TextTrackMode = {
 
  'disabled': 'disabled',
 
  'hidden': 'hidden',
 
  'showing': 'showing'
 
};
 

	
 
/*
 
 * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackkind
 
 *
 
 * enum TextTrackKind { "subtitles",  "captions",  "descriptions",  "chapters",  "metadata" };
 
 */
 
var TextTrackKind = {
 
  'subtitles': 'subtitles',
 
  'captions': 'captions',
 
  'descriptions': 'descriptions',
 
  'chapters': 'chapters',
 
  'metadata': 'metadata'
 
};
 

	
 
exports.TextTrackMode = TextTrackMode;
 
exports.TextTrackKind = TextTrackKind;
 

	
 
},{}],111:[function(_dereq_,module,exports){
 
/**
 
 * Utilities for capturing text track state and re-creating tracks
 
 * based on a capture.
 
 *
 
 * @file text-track-list-converter.js
 
 */
 

	
 
/**
 
 * Examine a single text track and return a JSON-compatible javascript
 
 * object that represents the text track's state.
 
 * @param track {TextTrackObject} the text track to query
 
 * @return {Object} a serializable javascript representation of the
 
 * @private
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 
var trackToJson_ = function trackToJson_(track) {
 
  return {
 
    kind: track.kind,
 
    label: track.label,
 
    language: track.language,
 
    id: track.id,
 
    inBandMetadataTrackDispatchType: track.inBandMetadataTrackDispatchType,
 
    mode: track.mode,
 
    cues: track.cues && Array.prototype.map.call(track.cues, function (cue) {
 
      return {
 
        startTime: cue.startTime,
 
        endTime: cue.endTime,
 
        text: cue.text,
 
        id: cue.id
 
      };
 
    }),
 
    src: track.src
 
  };
 
};
 

	
 
/**
 
 * Examine a tech and return a JSON-compatible javascript array that
 
 * represents the state of all text tracks currently configured. The
 
 * return array is compatible with `jsonToTextTracks`.
 
 * @param tech {tech} the tech object to query
 
 * @return {Array} a serializable javascript representation of the
 
 * @function textTracksToJson
 
 */
 
var textTracksToJson = function textTracksToJson(tech) {
 
  var trackEls = tech.el().querySelectorAll('track');
 

	
 
  var trackObjs = Array.prototype.map.call(trackEls, function (t) {
 
    return t.track;
 
  });
 
  var tracks = Array.prototype.map.call(trackEls, function (trackEl) {
 
    var json = trackToJson_(trackEl.track);
 
    json.src = trackEl.src;
 
    return json;
 
  });
 

	
 
  return tracks.concat(Array.prototype.filter.call(tech.textTracks(), function (track) {
 
    return trackObjs.indexOf(track) === -1;
 
  }).map(trackToJson_));
 
};
 

	
 
/**
 
 * Creates a set of remote text tracks on a tech based on an array of
 
 * javascript text track representations.
 
 * @param json {Array} an array of text track representation objects,
 
 * like those that would be produced by `textTracksToJson`
 
 * @param tech {tech} the tech to create text tracks on
 
 * @function jsonToTextTracks
 
 */
 
var jsonToTextTracks = function jsonToTextTracks(json, tech) {
 
  json.forEach(function (track) {
 
    var addedTrack = tech.addRemoteTextTrack(track).track;
 
    if (!track.src && track.cues) {
 
      track.cues.forEach(function (cue) {
 
        return addedTrack.addCue(cue);
 
      });
 
    }
 
  });
 

	
 
  return tech.textTracks();
 
};
 

	
 
exports['default'] = { textTracksToJson: textTracksToJson, jsonToTextTracks: jsonToTextTracks, trackToJson_: trackToJson_ };
 
module.exports = exports['default'];
 

	
 
},{}],112:[function(_dereq_,module,exports){
 
/**
 
 * @file text-track-list.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _eventTarget = _dereq_('../event-target');
 

	
 
var _eventTarget2 = _interopRequireDefault(_eventTarget);
 

	
 
var _utilsFnJs = _dereq_('../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsBrowserJs = _dereq_('../utils/browser.js');
 

	
 
var browser = _interopRequireWildcard(_utilsBrowserJs);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
/*
 
 * https://html.spec.whatwg.org/multipage/embedded-content.html#texttracklist
 
 *
 
 * interface TextTrackList : EventTarget {
 
 *   readonly attribute unsigned long length;
 
 *   getter TextTrack (unsigned long index);
 
 *   TextTrack? getTrackById(DOMString id);
 
 *
 
 *   attribute EventHandler onchange;
 
 *   attribute EventHandler onaddtrack;
 
 *   attribute EventHandler onremovetrack;
 
 * };
 
 */
 
var TextTrackList = function TextTrackList(tracks) {
 
  var list = this;
 

	
 
  if (browser.IS_IE8) {
 
    list = _globalDocument2['default'].createElement('custom');
 

	
 
    for (var prop in TextTrackList.prototype) {
 
      list[prop] = TextTrackList.prototype[prop];
 
    }
 
  }
 

	
 
  tracks = tracks || [];
 
  list.tracks_ = [];
 

	
 
  Object.defineProperty(list, 'length', {
 
    get: function get() {
 
      return this.tracks_.length;
 
    }
 
  });
 

	
 
  for (var i = 0; i < tracks.length; i++) {
 
    list.addTrack_(tracks[i]);
 
  }
 

	
 
  if (browser.IS_IE8) {
 
    return list;
 
  }
 
};
 

	
 
TextTrackList.prototype = Object.create(_eventTarget2['default'].prototype);
 
TextTrackList.prototype.constructor = TextTrackList;
 

	
 
/*
 
 * change - One or more tracks in the track list have been enabled or disabled.
 
 * addtrack - A track has been added to the track list.
 
 * removetrack - A track has been removed from the track list.
 
 */
 
TextTrackList.prototype.allowedEvents_ = {
 
  'change': 'change',
 
  'addtrack': 'addtrack',
 
  'removetrack': 'removetrack'
 
};
 

	
 
// emulate attribute EventHandler support to allow for feature detection
 
for (var _event in TextTrackList.prototype.allowedEvents_) {
 
  TextTrackList.prototype['on' + _event] = null;
 
}
 

	
 
TextTrackList.prototype.addTrack_ = function (track) {
 
  var index = this.tracks_.length;
 
  if (!('' + index in this)) {
 
    Object.defineProperty(this, index, {
 
      get: function get() {
 
        return this.tracks_[index];
 
      }
 
    });
 
  }
 

	
 
  track.addEventListener('modechange', Fn.bind(this, function () {
 
    this.trigger('change');
 
  }));
 
  this.tracks_.push(track);
 

	
 
  this.trigger({
 
    type: 'addtrack',
 
    track: track
 
  });
 
};
 

	
 
TextTrackList.prototype.removeTrack_ = function (rtrack) {
 
  var result = null;
 
  var track = undefined;
 

	
 
  for (var i = 0, l = this.length; i < l; i++) {
 
    track = this[i];
 
    if (track === rtrack) {
 
      this.tracks_.splice(i, 1);
 
      break;
 
    }
 
  }
 

	
 
  this.trigger({
 
    type: 'removetrack',
 
    track: track
 
  });
 
};
 

	
 
TextTrackList.prototype.getTrackById = function (id) {
 
  var result = null;
 

	
 
  for (var i = 0, l = this.length; i < l; i++) {
 
    var track = this[i];
 
    if (track.id === id) {
 
      result = track;
 
      break;
 
    }
 
  }
 

	
 
  return result;
 
};
 

	
 
exports['default'] = TextTrackList;
 
module.exports = exports['default'];
 

	
 
},{"../event-target":90,"../utils/browser.js":115,"../utils/fn.js":120,"global/document":1}],113:[function(_dereq_,module,exports){
 
/**
 
 * @file text-track-settings.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _component = _dereq_('../component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _utilsEventsJs = _dereq_('../utils/events.js');
 

	
 
var Events = _interopRequireWildcard(_utilsEventsJs);
 

	
 
var _utilsFnJs = _dereq_('../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsLogJs = _dereq_('../utils/log.js');
 

	
 
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
 

	
 
var _safeJsonParseTuple = _dereq_('safe-json-parse/tuple');
 

	
 
var _safeJsonParseTuple2 = _interopRequireDefault(_safeJsonParseTuple);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
/**
 
 * Manipulate settings of texttracks
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @extends Component
 
 * @class TextTrackSettings
 
 */
 

	
 
var TextTrackSettings = (function (_Component) {
 
  _inherits(TextTrackSettings, _Component);
 

	
 
  function TextTrackSettings(player, options) {
 
    _classCallCheck(this, TextTrackSettings);
 

	
 
    _Component.call(this, player, options);
 
    this.hide();
 

	
 
    // Grab `persistTextTrackSettings` from the player options if not passed in child options
 
    if (options.persistTextTrackSettings === undefined) {
 
      this.options_.persistTextTrackSettings = this.options_.playerOptions.persistTextTrackSettings;
 
    }
 

	
 
    Events.on(this.el().querySelector('.vjs-done-button'), 'click', Fn.bind(this, function () {
 
      this.saveSettings();
 
      this.hide();
 
    }));
 

	
 
    Events.on(this.el().querySelector('.vjs-default-button'), 'click', Fn.bind(this, function () {
 
      this.el().querySelector('.vjs-fg-color > select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-bg-color > select').selectedIndex = 0;
 
      this.el().querySelector('.window-color > select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-text-opacity > select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-bg-opacity > select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-window-opacity > select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-edge-style select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-font-family select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-font-percent select').selectedIndex = 2;
 
      this.updateDisplay();
 
    }));
 

	
 
    Events.on(this.el().querySelector('.vjs-fg-color > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-bg-color > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.window-color > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-text-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-bg-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-window-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-font-percent select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-edge-style select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-font-family select'), 'change', Fn.bind(this, this.updateDisplay));
 

	
 
    if (this.options_.persistTextTrackSettings) {
 
      this.restoreSettings();
 
    }
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  TextTrackSettings.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-caption-settings vjs-modal-overlay',
 
      innerHTML: captionOptionsMenuTemplate()
 
    });
 
  };
 

	
 
  /**
 
   * Get texttrack settings 
 
   * Settings are
 
   * .vjs-edge-style
 
   * .vjs-font-family
 
   * .vjs-fg-color
 
   * .vjs-text-opacity
 
   * .vjs-bg-color
 
   * .vjs-bg-opacity
 
   * .window-color
 
   * .vjs-window-opacity 
 
   *
 
   * @return {Object} 
 
   * @method getValues
 
   */
 

	
 
  TextTrackSettings.prototype.getValues = function getValues() {
 
    var el = this.el();
 

	
 
    var textEdge = getSelectedOptionValue(el.querySelector('.vjs-edge-style select'));
 
    var fontFamily = getSelectedOptionValue(el.querySelector('.vjs-font-family select'));
 
    var fgColor = getSelectedOptionValue(el.querySelector('.vjs-fg-color > select'));
 
    var textOpacity = getSelectedOptionValue(el.querySelector('.vjs-text-opacity > select'));
 
    var bgColor = getSelectedOptionValue(el.querySelector('.vjs-bg-color > select'));
 
    var bgOpacity = getSelectedOptionValue(el.querySelector('.vjs-bg-opacity > select'));
 
    var windowColor = getSelectedOptionValue(el.querySelector('.window-color > select'));
 
    var windowOpacity = getSelectedOptionValue(el.querySelector('.vjs-window-opacity > select'));
 
    var fontPercent = _globalWindow2['default']['parseFloat'](getSelectedOptionValue(el.querySelector('.vjs-font-percent > select')));
 

	
 
    var result = {
 
      'backgroundOpacity': bgOpacity,
 
      'textOpacity': textOpacity,
 
      'windowOpacity': windowOpacity,
 
      'edgeStyle': textEdge,
 
      'fontFamily': fontFamily,
 
      'color': fgColor,
 
      'backgroundColor': bgColor,
 
      'windowColor': windowColor,
 
      'fontPercent': fontPercent
 
    };
 
    for (var _name in result) {
 
      if (result[_name] === '' || result[_name] === 'none' || _name === 'fontPercent' && result[_name] === 1.00) {
 
        delete result[_name];
 
      }
 
    }
 
    return result;
 
  };
 

	
 
  /**
 
   * Set texttrack settings 
 
   * Settings are
 
   * .vjs-edge-style
 
   * .vjs-font-family
 
   * .vjs-fg-color
 
   * .vjs-text-opacity
 
   * .vjs-bg-color
 
   * .vjs-bg-opacity
 
   * .window-color
 
   * .vjs-window-opacity 
 
   *
 
   * @param {Object} values Object with texttrack setting values
 
   * @method setValues
 
   */
 

	
 
  TextTrackSettings.prototype.setValues = function setValues(values) {
 
    var el = this.el();
 

	
 
    setSelectedOption(el.querySelector('.vjs-edge-style select'), values.edgeStyle);
 
    setSelectedOption(el.querySelector('.vjs-font-family select'), values.fontFamily);
 
    setSelectedOption(el.querySelector('.vjs-fg-color > select'), values.color);
 
    setSelectedOption(el.querySelector('.vjs-text-opacity > select'), values.textOpacity);
 
    setSelectedOption(el.querySelector('.vjs-bg-color > select'), values.backgroundColor);
 
    setSelectedOption(el.querySelector('.vjs-bg-opacity > select'), values.backgroundOpacity);
 
    setSelectedOption(el.querySelector('.window-color > select'), values.windowColor);
 
    setSelectedOption(el.querySelector('.vjs-window-opacity > select'), values.windowOpacity);
 

	
 
    var fontPercent = values.fontPercent;
 

	
 
    if (fontPercent) {
 
      fontPercent = fontPercent.toFixed(2);
 
    }
 

	
 
    setSelectedOption(el.querySelector('.vjs-font-percent > select'), fontPercent);
 
  };
 

	
 
  /**
 
   * Restore texttrack settings 
 
   *
 
   * @method restoreSettings
 
   */
 

	
 
  TextTrackSettings.prototype.restoreSettings = function restoreSettings() {
 
    var _safeParseTuple = _safeJsonParseTuple2['default'](_globalWindow2['default'].localStorage.getItem('vjs-text-track-settings'));
 

	
 
    var err = _safeParseTuple[0];
 
    var values = _safeParseTuple[1];
 

	
 
    if (err) {
 
      _utilsLogJs2['default'].error(err);
 
    }
 

	
 
    if (values) {
 
      this.setValues(values);
 
    }
 
  };
 

	
 
  /**
 
   * Save texttrack settings to local storage 
 
   *
 
   * @method saveSettings
 
   */
 

	
 
  TextTrackSettings.prototype.saveSettings = function saveSettings() {
 
    if (!this.options_.persistTextTrackSettings) {
 
      return;
 
    }
 

	
 
    var values = this.getValues();
 
    try {
 
      if (Object.getOwnPropertyNames(values).length > 0) {
 
        _globalWindow2['default'].localStorage.setItem('vjs-text-track-settings', JSON.stringify(values));
 
      } else {
 
        _globalWindow2['default'].localStorage.removeItem('vjs-text-track-settings');
 
      }
 
    } catch (e) {}
 
  };
 

	
 
  /**
 
   * Update display of texttrack settings  
 
   *
 
   * @method updateDisplay
 
   */
 

	
 
  TextTrackSettings.prototype.updateDisplay = function updateDisplay() {
 
    var ttDisplay = this.player_.getChild('textTrackDisplay');
 
    if (ttDisplay) {
 
      ttDisplay.updateDisplay();
 
    }
 
  };
 

	
 
  return TextTrackSettings;
 
})(_component2['default']);
 

	
 
_component2['default'].registerComponent('TextTrackSettings', TextTrackSettings);
 

	
 
function getSelectedOptionValue(target) {
 
  var selectedOption = undefined;
 
  // not all browsers support selectedOptions, so, fallback to options
 
  if (target.selectedOptions) {
 
    selectedOption = target.selectedOptions[0];
 
  } else if (target.options) {
 
    selectedOption = target.options[target.options.selectedIndex];
 
  }
 

	
 
  return selectedOption.value;
 
}
 

	
 
function setSelectedOption(target, value) {
 
  if (!value) {
 
    return;
 
  }
 

	
 
  var i = undefined;
 
  for (i = 0; i < target.options.length; i++) {
 
    var option = target.options[i];
 
    if (option.value === value) {
 
      break;
 
    }
 
  }
 

	
 
  target.selectedIndex = i;
 
}
 

	
 
function captionOptionsMenuTemplate() {
 
  var template = '<div class="vjs-tracksettings">\n      <div class="vjs-tracksettings-colors">\n        <div class="vjs-fg-color vjs-tracksetting">\n            <label class="vjs-label">Foreground</label>\n            <select>\n              <option value="">---</option>\n              <option value="#FFF">White</option>\n              <option value="#000">Black</option>\n              <option value="#F00">Red</option>\n              <option value="#0F0">Green</option>\n              <option value="#00F">Blue</option>\n              <option value="#FF0">Yellow</option>\n              <option value="#F0F">Magenta</option>\n              <option value="#0FF">Cyan</option>\n            </select>\n            <span class="vjs-text-opacity vjs-opacity">\n              <select>\n                <option value="">---</option>\n                <option value="1">Opaque</option>\n                <option value="0.5">Semi-Opaque</option>\n              </select>\n            </span>\n        </div> <!-- vjs-fg-color -->\n        <div class="vjs-bg-color vjs-tracksetting">\n            <label class="vjs-label">Background</label>\n            <select>\n              <option value="">---</option>\n              <option value="#FFF">White</option>\n              <option value="#000">Black</option>\n              <option value="#F00">Red</option>\n              <option value="#0F0">Green</option>\n              <option value="#00F">Blue</option>\n              <option value="#FF0">Yellow</option>\n              <option value="#F0F">Magenta</option>\n              <option value="#0FF">Cyan</option>\n            </select>\n            <span class="vjs-bg-opacity vjs-opacity">\n                <select>\n                  <option value="">---</option>\n                  <option value="1">Opaque</option>\n                  <option value="0.5">Semi-Transparent</option>\n                  <option value="0">Transparent</option>\n                </select>\n            </span>\n        </div> <!-- vjs-bg-color -->\n        <div class="window-color vjs-tracksetting">\n            <label class="vjs-label">Window</label>\n            <select>\n              <option value="">---</option>\n              <option value="#FFF">White</option>\n              <option value="#000">Black</option>\n              <option value="#F00">Red</option>\n              <option value="#0F0">Green</option>\n              <option value="#00F">Blue</option>\n              <option value="#FF0">Yellow</option>\n              <option value="#F0F">Magenta</option>\n              <option value="#0FF">Cyan</option>\n            </select>\n            <span class="vjs-window-opacity vjs-opacity">\n                <select>\n                  <option value="">---</option>\n                  <option value="1">Opaque</option>\n                  <option value="0.5">Semi-Transparent</option>\n                  <option value="0">Transparent</option>\n                </select>\n            </span>\n        </div> <!-- vjs-window-color -->\n      </div> <!-- vjs-tracksettings -->\n      <div class="vjs-tracksettings-font">\n        <div class="vjs-font-percent vjs-tracksetting">\n          <label class="vjs-label">Font Size</label>\n          <select>\n            <option value="0.50">50%</option>\n            <option value="0.75">75%</option>\n            <option value="1.00" selected>100%</option>\n            <option value="1.25">125%</option>\n            <option value="1.50">150%</option>\n            <option value="1.75">175%</option>\n            <option value="2.00">200%</option>\n            <option value="3.00">300%</option>\n            <option value="4.00">400%</option>\n          </select>\n        </div> <!-- vjs-font-percent -->\n        <div class="vjs-edge-style vjs-tracksetting">\n          <label class="vjs-label">Text Edge Style</label>\n          <select>\n            <option value="none">None</option>\n            <option value="raised">Raised</option>\n            <option value="depressed">Depressed</option>\n            <option value="uniform">Uniform</option>\n            <option value="dropshadow">Dropshadow</option>\n          </select>\n        </div> <!-- vjs-edge-style -->\n        <div class="vjs-font-family vjs-tracksetting">\n          <label class="vjs-label">Font Family</label>\n          <select>\n            <option value="">Default</option>\n            <option value="monospaceSerif">Monospace Serif</option>\n            <option value="proportionalSerif">Proportional Serif</option>\n            <option value="monospaceSansSerif">Monospace Sans-Serif</option>\n            <option value="proportionalSansSerif">Proportional Sans-Serif</option>\n            <option value="casual">Casual</option>\n            <option value="script">Script</option>\n            <option value="small-caps">Small Caps</option>\n          </select>\n        </div> <!-- vjs-font-family -->\n      </div>\n    </div>\n    <div class="vjs-tracksettings-controls">\n      <button class="vjs-default-button">Defaults</button>\n      <button class="vjs-done-button">Done</button>\n    </div>';
 

	
 
  return template;
 
}
 

	
 
exports['default'] = TextTrackSettings;
 
module.exports = exports['default'];
 

	
 
},{"../component":58,"../utils/events.js":119,"../utils/fn.js":120,"../utils/log.js":123,"global/window":2,"safe-json-parse/tuple":48}],114:[function(_dereq_,module,exports){
 
/**
 
 * @file text-track.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _textTrackCueList = _dereq_('./text-track-cue-list');
 

	
 
var _textTrackCueList2 = _interopRequireDefault(_textTrackCueList);
 

	
 
var _utilsFnJs = _dereq_('../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsGuidJs = _dereq_('../utils/guid.js');
 

	
 
var Guid = _interopRequireWildcard(_utilsGuidJs);
 

	
 
var _utilsBrowserJs = _dereq_('../utils/browser.js');
 

	
 
var browser = _interopRequireWildcard(_utilsBrowserJs);
 

	
 
var _textTrackEnums = _dereq_('./text-track-enums');
 

	
 
var TextTrackEnum = _interopRequireWildcard(_textTrackEnums);
 

	
 
var _utilsLogJs = _dereq_('../utils/log.js');
 

	
 
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
 

	
 
var _eventTarget = _dereq_('../event-target');
 

	
 
var _eventTarget2 = _interopRequireDefault(_eventTarget);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _utilsUrlJs = _dereq_('../utils/url.js');
 

	
 
var _xhr = _dereq_('xhr');
 

	
 
var _xhr2 = _interopRequireDefault(_xhr);
 

	
 
/*
 
 * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrack
 
 *
 
 * interface TextTrack : EventTarget {
 
 *   readonly attribute TextTrackKind kind;
 
 *   readonly attribute DOMString label;
 
 *   readonly attribute DOMString language;
 
 *
 
 *   readonly attribute DOMString id;
 
 *   readonly attribute DOMString inBandMetadataTrackDispatchType;
 
 *
 
 *   attribute TextTrackMode mode;
 
 *
 
 *   readonly attribute TextTrackCueList? cues;
 
 *   readonly attribute TextTrackCueList? activeCues;
 
 *
 
 *   void addCue(TextTrackCue cue);
 
 *   void removeCue(TextTrackCue cue);
 
 *
 
 *   attribute EventHandler oncuechange;
 
 * };
 
 */
 
var TextTrack = function TextTrack() {
 
  var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
 

	
 
  if (!options.tech) {
 
    throw new Error('A tech was not provided.');
 
  }
 

	
 
  var tt = this;
 
  if (browser.IS_IE8) {
 
    tt = _globalDocument2['default'].createElement('custom');
 

	
 
    for (var prop in TextTrack.prototype) {
 
      tt[prop] = TextTrack.prototype[prop];
 
    }
 
  }
 

	
 
  tt.tech_ = options.tech;
 

	
 
  var mode = TextTrackEnum.TextTrackMode[options['mode']] || 'disabled';
 
  var kind = TextTrackEnum.TextTrackKind[options['kind']] || 'subtitles';
 
  var label = options['label'] || '';
 
  var language = options['language'] || options['srclang'] || '';
 
  var id = options['id'] || 'vjs_text_track_' + Guid.newGUID();
 

	
 
  if (kind === 'metadata' || kind === 'chapters') {
 
    mode = 'hidden';
 
  }
 

	
 
  tt.cues_ = [];
 
  tt.activeCues_ = [];
 

	
 
  var cues = new _textTrackCueList2['default'](tt.cues_);
 
  var activeCues = new _textTrackCueList2['default'](tt.activeCues_);
 

	
 
  var changed = false;
 
  var timeupdateHandler = Fn.bind(tt, function () {
 
    this['activeCues'];
 
    if (changed) {
 
      this['trigger']('cuechange');
 
      changed = false;
 
    }
 
  });
 
  if (mode !== 'disabled') {
 
    tt.tech_.on('timeupdate', timeupdateHandler);
 
  }
 

	
 
  Object.defineProperty(tt, 'kind', {
 
    get: function get() {
 
      return kind;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  Object.defineProperty(tt, 'label', {
 
    get: function get() {
 
      return label;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  Object.defineProperty(tt, 'language', {
 
    get: function get() {
 
      return language;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  Object.defineProperty(tt, 'id', {
 
    get: function get() {
 
      return id;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  Object.defineProperty(tt, 'mode', {
 
    get: function get() {
 
      return mode;
 
    },
 
    set: function set(newMode) {
 
      if (!TextTrackEnum.TextTrackMode[newMode]) {
 
        return;
 
      }
 
      mode = newMode;
 
      if (mode === 'showing') {
 
        this.tech_.on('timeupdate', timeupdateHandler);
 
      }
 
      this.trigger('modechange');
 
    }
 
  });
 

	
 
  Object.defineProperty(tt, 'cues', {
 
    get: function get() {
 
      if (!this.loaded_) {
 
        return null;
 
      }
 

	
 
      return cues;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  Object.defineProperty(tt, 'activeCues', {
 
    get: function get() {
 
      if (!this.loaded_) {
 
        return null;
 
      }
 

	
 
      if (this['cues'].length === 0) {
 
        return activeCues; // nothing to do
 
      }
 

	
 
      var ct = this.tech_.currentTime();
 
      var active = [];
 

	
 
      for (var i = 0, l = this['cues'].length; i < l; i++) {
 
        var cue = this['cues'][i];
 
        if (cue['startTime'] <= ct && cue['endTime'] >= ct) {
 
          active.push(cue);
 
        } else if (cue['startTime'] === cue['endTime'] && cue['startTime'] <= ct && cue['startTime'] + 0.5 >= ct) {
 
          active.push(cue);
 
        }
 
      }
 

	
 
      changed = false;
 

	
 
      if (active.length !== this.activeCues_.length) {
 
        changed = true;
 
      } else {
 
        for (var i = 0; i < active.length; i++) {
 
          if (indexOf.call(this.activeCues_, active[i]) === -1) {
 
            changed = true;
 
          }
 
        }
 
      }
 

	
 
      this.activeCues_ = active;
 
      activeCues.setCues_(this.activeCues_);
 

	
 
      return activeCues;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  if (options.src) {
 
    tt.src = options.src;
 
    loadTrack(options.src, tt);
 
  } else {
 
    tt.loaded_ = true;
 
  }
 

	
 
  if (browser.IS_IE8) {
 
    return tt;
 
  }
 
};
 

	
 
TextTrack.prototype = Object.create(_eventTarget2['default'].prototype);
 
TextTrack.prototype.constructor = TextTrack;
 

	
 
/*
 
 * cuechange - One or more cues in the track have become active or stopped being active.
 
 */
 
TextTrack.prototype.allowedEvents_ = {
 
  'cuechange': 'cuechange'
 
};
 

	
 
TextTrack.prototype.addCue = function (cue) {
 
  var tracks = this.tech_.textTracks();
 

	
 
  if (tracks) {
 
    for (var i = 0; i < tracks.length; i++) {
 
      if (tracks[i] !== this) {
 
        tracks[i].removeCue(cue);
 
      }
 
    }
 
  }
 

	
 
  this.cues_.push(cue);
 
  this['cues'].setCues_(this.cues_);
 
};
 

	
 
TextTrack.prototype.removeCue = function (removeCue) {
 
  var removed = false;
 

	
 
  for (var i = 0, l = this.cues_.length; i < l; i++) {
 
    var cue = this.cues_[i];
 
    if (cue === removeCue) {
 
      this.cues_.splice(i, 1);
 
      removed = true;
 
    }
 
  }
 

	
 
  if (removed) {
 
    this.cues.setCues_(this.cues_);
 
  }
 
};
 

	
 
/*
 
* Downloading stuff happens below this point
 
*/
 
var parseCues = function parseCues(srcContent, track) {
 
  if (typeof _globalWindow2['default']['WebVTT'] !== 'function') {
 
    //try again a bit later
 
    return _globalWindow2['default'].setTimeout(function () {
 
      parseCues(srcContent, track);
 
    }, 25);
 
  }
 

	
 
  var parser = new _globalWindow2['default']['WebVTT']['Parser'](_globalWindow2['default'], _globalWindow2['default']['vttjs'], _globalWindow2['default']['WebVTT']['StringDecoder']());
 

	
 
  parser['oncue'] = function (cue) {
 
    track.addCue(cue);
 
  };
 
  parser['onparsingerror'] = function (error) {
 
    _utilsLogJs2['default'].error(error);
 
  };
 

	
 
  parser['parse'](srcContent);
 
  parser['flush']();
 
};
 

	
 
var loadTrack = function loadTrack(src, track) {
 
  var opts = {
 
    uri: src
 
  };
 

	
 
  var crossOrigin = _utilsUrlJs.isCrossOrigin(src);
 
  if (crossOrigin) {
 
    opts.cors = crossOrigin;
 
  }
 

	
 
  _xhr2['default'](opts, Fn.bind(this, function (err, response, responseBody) {
 
    if (err) {
 
      return _utilsLogJs2['default'].error(err, response);
 
    }
 

	
 
    track.loaded_ = true;
 
    parseCues(responseBody, track);
 
  }));
 
};
 

	
 
var indexOf = function indexOf(searchElement, fromIndex) {
 
  if (this == null) {
 
    throw new TypeError('"this" is null or not defined');
 
  }
 

	
 
  var O = Object(this);
 

	
 
  var len = O.length >>> 0;
 

	
 
  if (len === 0) {
 
    return -1;
 
  }
 

	
 
  var n = +fromIndex || 0;
 

	
 
  if (Math.abs(n) === Infinity) {
 
    n = 0;
 
  }
 

	
 
  if (n >= len) {
 
    return -1;
 
  }
 

	
 
  var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
 

	
 
  while (k < len) {
 
    if (k in O && O[k] === searchElement) {
 
      return k;
 
    }
 
    k++;
 
  }
 
  return -1;
 
};
 

	
 
exports['default'] = TextTrack;
 
module.exports = exports['default'];
 

	
 
},{"../event-target":90,"../utils/browser.js":115,"../utils/fn.js":120,"../utils/guid.js":122,"../utils/log.js":123,"../utils/url.js":128,"./text-track-cue-list":108,"./text-track-enums":110,"global/document":1,"global/window":2,"xhr":50}],115:[function(_dereq_,module,exports){
 
/**
 
 * @file browser.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var USER_AGENT = _globalWindow2['default'].navigator.userAgent;
 
var webkitVersionMap = /AppleWebKit\/([\d.]+)/i.exec(USER_AGENT);
 
var appleWebkitVersion = webkitVersionMap ? parseFloat(webkitVersionMap.pop()) : null;
 

	
 
/*
 
 * Device is an iPhone
 
 *
 
 * @type {Boolean}
 
 * @constant
 
 * @private
 
 */
 
var IS_IPHONE = /iPhone/i.test(USER_AGENT);
 
exports.IS_IPHONE = IS_IPHONE;
 
var IS_IPAD = /iPad/i.test(USER_AGENT);
 
exports.IS_IPAD = IS_IPAD;
 
var IS_IPOD = /iPod/i.test(USER_AGENT);
 
exports.IS_IPOD = IS_IPOD;
 
var IS_IOS = IS_IPHONE || IS_IPAD || IS_IPOD;
 

	
 
exports.IS_IOS = IS_IOS;
 
var IOS_VERSION = (function () {
 
  var match = USER_AGENT.match(/OS (\d+)_/i);
 
  if (match && match[1]) {
 
    return match[1];
 
  }
 
})();
 

	
 
exports.IOS_VERSION = IOS_VERSION;
 
var IS_ANDROID = /Android/i.test(USER_AGENT);
 
exports.IS_ANDROID = IS_ANDROID;
 
var ANDROID_VERSION = (function () {
 
  // This matches Android Major.Minor.Patch versions
 
  // ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned
 
  var match = USER_AGENT.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i),
 
      major,
 
      minor;
 

	
 
  if (!match) {
 
    return null;
 
  }
 

	
 
  major = match[1] && parseFloat(match[1]);
 
  minor = match[2] && parseFloat(match[2]);
 

	
 
  if (major && minor) {
 
    return parseFloat(match[1] + '.' + match[2]);
 
  } else if (major) {
 
    return major;
 
  } else {
 
    return null;
 
  }
 
})();
 
exports.ANDROID_VERSION = ANDROID_VERSION;
 
// Old Android is defined as Version older than 2.3, and requiring a webkit version of the android browser
 
var IS_OLD_ANDROID = IS_ANDROID && /webkit/i.test(USER_AGENT) && ANDROID_VERSION < 2.3;
 
exports.IS_OLD_ANDROID = IS_OLD_ANDROID;
 
var IS_NATIVE_ANDROID = IS_ANDROID && ANDROID_VERSION < 5 && appleWebkitVersion < 537;
 

	
 
exports.IS_NATIVE_ANDROID = IS_NATIVE_ANDROID;
 
var IS_FIREFOX = /Firefox/i.test(USER_AGENT);
 
exports.IS_FIREFOX = IS_FIREFOX;
 
var IS_CHROME = /Chrome/i.test(USER_AGENT);
 
exports.IS_CHROME = IS_CHROME;
 
var IS_IE8 = /MSIE\s8\.0/.test(USER_AGENT);
 

	
 
exports.IS_IE8 = IS_IE8;
 
var TOUCH_ENABLED = !!('ontouchstart' in _globalWindow2['default'] || _globalWindow2['default'].DocumentTouch && _globalDocument2['default'] instanceof _globalWindow2['default'].DocumentTouch);
 
exports.TOUCH_ENABLED = TOUCH_ENABLED;
 
var BACKGROUND_SIZE_SUPPORTED = ('backgroundSize' in _globalDocument2['default'].createElement('video').style);
 
exports.BACKGROUND_SIZE_SUPPORTED = BACKGROUND_SIZE_SUPPORTED;
 

	
 
},{"global/document":1,"global/window":2}],116:[function(_dereq_,module,exports){
 
/**
 
 * @file buffer.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 
exports.bufferedPercent = bufferedPercent;
 

	
 
var _timeRangesJs = _dereq_('./time-ranges.js');
 

	
 
/**
 
 * Compute how much your video has been buffered
 
 *
 
 * @param  {Object} Buffered object
 
 * @param  {Number} Total duration
 
 * @return {Number} Percent buffered of the total duration
 
 * @private
 
 * @function bufferedPercent
 
 */
 

	
 
function bufferedPercent(buffered, duration) {
 
  var bufferedDuration = 0,
 
      start,
 
      end;
 

	
 
  if (!duration) {
 
    return 0;
 
  }
 

	
 
  if (!buffered || !buffered.length) {
 
    buffered = _timeRangesJs.createTimeRange(0, 0);
 
  }
 

	
 
  for (var i = 0; i < buffered.length; i++) {
 
    start = buffered.start(i);
 
    end = buffered.end(i);
 

	
 
    // buffered end can be bigger than duration by a very small fraction
 
    if (end > duration) {
 
      end = duration;
 
    }
 

	
 
    bufferedDuration += end - start;
 
  }
 

	
 
  return bufferedDuration / duration;
 
}
 

	
 
},{"./time-ranges.js":126}],117:[function(_dereq_,module,exports){
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _logJs = _dereq_('./log.js');
 

	
 
var _logJs2 = _interopRequireDefault(_logJs);
 

	
 
/**
 
 * Object containing the default behaviors for available handler methods.
 
 *
 
 * @private
 
 * @type {Object}
 
 */
 
var defaultBehaviors = {
 
  get: function get(obj, key) {
 
    return obj[key];
 
  },
 
  set: function set(obj, key, value) {
 
    obj[key] = value;
 
    return true;
 
  }
 
};
 

	
 
/**
 
 * Expose private objects publicly using a Proxy to log deprecation warnings.
 
 *
 
 * Browsers that do not support Proxy objects will simply return the `target`
 
 * object, so it can be directly exposed.
 
 *
 
 * @param {Object} target The target object.
 
 * @param {Object} messages Messages to display from a Proxy. Only operations
 
 *                          with an associated message will be proxied.
 
 * @param {String} [messages.get]
 
 * @param {String} [messages.set]
 
 * @return {Object} A Proxy if supported or the `target` argument.
 
 */
 

	
 
exports['default'] = function (target) {
 
  var messages = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
 

	
 
  if (typeof Proxy === 'function') {
 
    var _ret = (function () {
 
      var handler = {};
 

	
 
      // Build a handler object based on those keys that have both messages
 
      // and default behaviors.
 
      Object.keys(messages).forEach(function (key) {
 
        if (defaultBehaviors.hasOwnProperty(key)) {
 
          handler[key] = function () {
 
            _logJs2['default'].warn(messages[key]);
 
            return defaultBehaviors[key].apply(this, arguments);
 
          };
 
        }
 
      });
 

	
 
      return {
 
        v: new Proxy(target, handler)
 
      };
 
    })();
 

	
 
    if (typeof _ret === 'object') return _ret.v;
 
  }
 
  return target;
 
};
 

	
 
module.exports = exports['default'];
 

	
 
},{"./log.js":123}],118:[function(_dereq_,module,exports){
 
/**
 
 * @file dom.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 
exports.getEl = getEl;
 
exports.createEl = createEl;
 
exports.insertElFirst = insertElFirst;
 
exports.getElData = getElData;
 
exports.hasElData = hasElData;
 
exports.removeElData = removeElData;
 
exports.hasElClass = hasElClass;
 
exports.addElClass = addElClass;
 
exports.removeElClass = removeElClass;
 
exports.setElAttributes = setElAttributes;
 
exports.getElAttributes = getElAttributes;
 
exports.blockTextSelection = blockTextSelection;
 
exports.unblockTextSelection = unblockTextSelection;
 
exports.findElPosition = findElPosition;
 
exports.getPointerPosition = getPointerPosition;
 

	
 
var _templateObject = _taggedTemplateLiteralLoose(['Setting attributes in the second argument of createEl()\n                has been deprecated. Use the third argument instead.\n                createEl(type, properties, attributes). Attempting to set ', ' to ', '.'], ['Setting attributes in the second argument of createEl()\n                has been deprecated. Use the third argument instead.\n                createEl(type, properties, attributes). Attempting to set ', ' to ', '.']);
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _guidJs = _dereq_('./guid.js');
 

	
 
var Guid = _interopRequireWildcard(_guidJs);
 

	
 
var _logJs = _dereq_('./log.js');
 

	
 
var _logJs2 = _interopRequireDefault(_logJs);
 

	
 
var _tsml = _dereq_('tsml');
 

	
 
var _tsml2 = _interopRequireDefault(_tsml);
 

	
 
/**
 
 * Shorthand for document.getElementById()
 
 * Also allows for CSS (jQuery) ID syntax. But nothing other than IDs.
 
 *
 
 * @param  {String} id  Element ID
 
 * @return {Element}    Element with supplied ID
 
 * @function getEl
 
 */
 

	
 
function getEl(id) {
 
  if (id.indexOf('#') === 0) {
 
    id = id.slice(1);
 
  }
 

	
 
  return _globalDocument2['default'].getElementById(id);
 
}
 

	
 
/**
 
 * Creates an element and applies properties.
 
 *
 
 * @param  {String=} tagName    Name of tag to be created.
 
 * @param  {Object=} properties Element properties to be applied.
 
 * @return {Element}
 
 * @function createEl
 
 */
 

	
 
function createEl() {
 
  var tagName = arguments.length <= 0 || arguments[0] === undefined ? 'div' : arguments[0];
 
  var properties = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
 
  var attributes = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
 

	
 
  var el = _globalDocument2['default'].createElement(tagName);
 

	
 
  Object.getOwnPropertyNames(properties).forEach(function (propName) {
 
    var val = properties[propName];
 

	
 
    // See #2176
 
    // We originally were accepting both properties and attributes in the
 
    // same object, but that doesn't work so well.
 
    if (propName.indexOf('aria-') !== -1 || propName === 'role' || propName === 'type') {
 
      _logJs2['default'].warn(_tsml2['default'](_templateObject, propName, val));
 
      el.setAttribute(propName, val);
 
    } else {
 
      el[propName] = val;
 
    }
 
  });
 

	
 
  Object.getOwnPropertyNames(attributes).forEach(function (attrName) {
 
    var val = attributes[attrName];
 
    el.setAttribute(attrName, attributes[attrName]);
 
  });
 

	
 
  return el;
 
}
 

	
 
/**
 
 * Insert an element as the first child node of another
 
 *
 
 * @param  {Element} child   Element to insert
 
 * @param  {Element} parent Element to insert child into
 
 * @private
 
 * @function insertElFirst
 
 */
 

	
 
function insertElFirst(child, parent) {
 
  if (parent.firstChild) {
 
    parent.insertBefore(child, parent.firstChild);
 
  } else {
 
    parent.appendChild(child);
 
  }
 
}
 

	
 
/**
 
 * Element Data Store. Allows for binding data to an element without putting it directly on the element.
 
 * Ex. Event listeners are stored here.
 
 * (also from jsninja.com, slightly modified and updated for closure compiler)
 
 *
 
 * @type {Object}
 
 * @private
 
 */
 
var elData = {};
 

	
 
/*
 
 * Unique attribute name to store an element's guid in
 
 *
 
 * @type {String}
 
 * @constant
 
 * @private
 
 */
 
var elIdAttr = 'vdata' + new Date().getTime();
 

	
 
/**
 
 * Returns the cache object where data for an element is stored
 
 *
 
 * @param  {Element} el Element to store data for.
 
 * @return {Object}
 
 * @function getElData
 
 */
 

	
 
function getElData(el) {
 
  var id = el[elIdAttr];
 

	
 
  if (!id) {
 
    id = el[elIdAttr] = Guid.newGUID();
 
  }
 

	
 
  if (!elData[id]) {
 
    elData[id] = {};
 
  }
 

	
 
  return elData[id];
 
}
 

	
 
/**
 
 * Returns whether or not an element has cached data
 
 *
 
 * @param  {Element} el A dom element
 
 * @return {Boolean}
 
 * @private
 
 * @function hasElData
 
 */
 

	
 
function hasElData(el) {
 
  var id = el[elIdAttr];
 

	
 
  if (!id) {
 
    return false;
 
  }
 

	
 
  return !!Object.getOwnPropertyNames(elData[id]).length;
 
}
 

	
 
/**
 
 * Delete data for the element from the cache and the guid attr from getElementById
 
 *
 
 * @param  {Element} el Remove data for an element
 
 * @private
 
 * @function removeElData
 
 */
 

	
 
function removeElData(el) {
 
  var id = el[elIdAttr];
 

	
 
  if (!id) {
 
    return;
 
  }
 

	
 
  // Remove all stored data
 
  delete elData[id];
 

	
 
  // Remove the elIdAttr property from the DOM node
 
  try {
 
    delete el[elIdAttr];
 
  } catch (e) {
 
    if (el.removeAttribute) {
 
      el.removeAttribute(elIdAttr);
 
    } else {
 
      // IE doesn't appear to support removeAttribute on the document element
 
      el[elIdAttr] = null;
 
    }
 
  }
 
}
 

	
 
/**
 
 * Check if an element has a CSS class
 
 *
 
 * @param {Element} element Element to check
 
 * @param {String} classToCheck Classname to check
 
 * @function hasElClass
 
 */
 

	
 
function hasElClass(element, classToCheck) {
 
  return (' ' + element.className + ' ').indexOf(' ' + classToCheck + ' ') !== -1;
 
}
 

	
 
/**
 
 * Add a CSS class name to an element
 
 *
 
 * @param {Element} element    Element to add class name to
 
 * @param {String} classToAdd Classname to add
 
 * @function addElClass
 
 */
 

	
 
function addElClass(element, classToAdd) {
 
  if (!hasElClass(element, classToAdd)) {
 
    element.className = element.className === '' ? classToAdd : element.className + ' ' + classToAdd;
 
  }
 
}
 

	
 
/**
 
 * Remove a CSS class name from an element
 
 *
 
 * @param {Element} element    Element to remove from class name
 
 * @param {String} classToRemove Classname to remove
 
 * @function removeElClass
 
 */
 

	
 
function removeElClass(element, classToRemove) {
 
  if (!hasElClass(element, classToRemove)) {
 
    return;
 
  }
 

	
 
  var classNames = element.className.split(' ');
 

	
 
  // no arr.indexOf in ie8, and we don't want to add a big shim
 
  for (var i = classNames.length - 1; i >= 0; i--) {
 
    if (classNames[i] === classToRemove) {
 
      classNames.splice(i, 1);
 
    }
 
  }
 

	
 
  element.className = classNames.join(' ');
 
}
 

	
 
/**
 
 * Apply attributes to an HTML element.
 
 *
 
 * @param  {Element} el         Target element.
 
 * @param  {Object=} attributes Element attributes to be applied.
 
 * @private
 
 * @function setElAttributes
 
 */
 

	
 
function setElAttributes(el, attributes) {
 
  Object.getOwnPropertyNames(attributes).forEach(function (attrName) {
 
    var attrValue = attributes[attrName];
 

	
 
    if (attrValue === null || typeof attrValue === 'undefined' || attrValue === false) {
 
      el.removeAttribute(attrName);
 
    } else {
 
      el.setAttribute(attrName, attrValue === true ? '' : attrValue);
 
    }
 
  });
 
}
 

	
 
/**
 
 * Get an element's attribute values, as defined on the HTML tag
 
 * Attributes are not the same as properties. They're defined on the tag
 
 * or with setAttribute (which shouldn't be used with HTML)
 
 * This will return true or false for boolean attributes.
 
 *
 
 * @param  {Element} tag Element from which to get tag attributes
 
 * @return {Object}
 
 * @private
 
 * @function getElAttributes
 
 */
 

	
 
function getElAttributes(tag) {
 
  var obj, knownBooleans, attrs, attrName, attrVal;
 

	
 
  obj = {};
 

	
 
  // known boolean attributes
 
  // we can check for matching boolean properties, but older browsers
 
  // won't know about HTML5 boolean attributes that we still read from
 
  knownBooleans = ',' + 'autoplay,controls,loop,muted,default' + ',';
 

	
 
  if (tag && tag.attributes && tag.attributes.length > 0) {
 
    attrs = tag.attributes;
 

	
 
    for (var i = attrs.length - 1; i >= 0; i--) {
 
      attrName = attrs[i].name;
 
      attrVal = attrs[i].value;
 

	
 
      // check for known booleans
 
      // the matching element property will return a value for typeof
 
      if (typeof tag[attrName] === 'boolean' || knownBooleans.indexOf(',' + attrName + ',') !== -1) {
 
        // the value of an included boolean attribute is typically an empty
 
        // string ('') which would equal false if we just check for a false value.
 
        // we also don't want support bad code like autoplay='false'
 
        attrVal = attrVal !== null ? true : false;
 
      }
 

	
 
      obj[attrName] = attrVal;
 
    }
 
  }
 

	
 
  return obj;
 
}
 

	
 
/**
 
 * Attempt to block the ability to select text while dragging controls
 
 *
 
 * @return {Boolean}
 
 * @method blockTextSelection
 
 */
 

	
 
function blockTextSelection() {
 
  _globalDocument2['default'].body.focus();
 
  _globalDocument2['default'].onselectstart = function () {
 
    return false;
 
  };
 
}
 

	
 
/**
 
 * Turn off text selection blocking
 
 *
 
 * @return {Boolean}
 
 * @method unblockTextSelection
 
 */
 

	
 
function unblockTextSelection() {
 
  _globalDocument2['default'].onselectstart = function () {
 
    return true;
 
  };
 
}
 

	
 
/**
 
 * Offset Left
 
 * getBoundingClientRect technique from
 
 * John Resig http://ejohn.org/blog/getboundingclientrect-is-awesome/
 
 *
 
 * @param {Element} el Element from which to get offset
 
 * @return {Object=}
 
 * @method findElPosition
 
 */
 

	
 
function findElPosition(el) {
 
  var box = undefined;
 

	
 
  if (el.getBoundingClientRect && el.parentNode) {
 
    box = el.getBoundingClientRect();
 
  }
 

	
 
  if (!box) {
 
    return {
 
      left: 0,
 
      top: 0
 
    };
 
  }
 

	
 
  var docEl = _globalDocument2['default'].documentElement;
 
  var body = _globalDocument2['default'].body;
 

	
 
  var clientLeft = docEl.clientLeft || body.clientLeft || 0;
 
  var scrollLeft = _globalWindow2['default'].pageXOffset || body.scrollLeft;
 
  var left = box.left + scrollLeft - clientLeft;
 

	
 
  var clientTop = docEl.clientTop || body.clientTop || 0;
 
  var scrollTop = _globalWindow2['default'].pageYOffset || body.scrollTop;
 
  var top = box.top + scrollTop - clientTop;
 

	
 
  // Android sometimes returns slightly off decimal values, so need to round
 
  return {
 
    left: Math.round(left),
 
    top: Math.round(top)
 
  };
 
}
 

	
 
/**
 
 * Get pointer position in element
 
 * Returns an object with x and y coordinates.
 
 * The base on the coordinates are the bottom left of the element.
 
 *
 
 * @param {Element} el Element on which to get the pointer position on
 
 * @param {Event} event Event object
 
 * @return {Object=} position This object will have x and y coordinates corresponding to the mouse position
 
 * @metho getPointerPosition
 
 */
 

	
 
function getPointerPosition(el, event) {
 
  var position = {};
 
  var box = findElPosition(el);
 
  var boxW = el.offsetWidth;
 
  var boxH = el.offsetHeight;
 

	
 
  var boxY = box.top;
 
  var boxX = box.left;
 
  var pageY = event.pageY;
 
  var pageX = event.pageX;
 

	
 
  if (event.changedTouches) {
 
    pageX = event.changedTouches[0].pageX;
 
    pageY = event.changedTouches[0].pageY;
 
  }
 

	
 
  position.y = Math.max(0, Math.min(1, (boxY - pageY + boxH) / boxH));
 
  position.x = Math.max(0, Math.min(1, (pageX - boxX) / boxW));
 

	
 
  return position;
 
}
 

	
 
},{"./guid.js":122,"./log.js":123,"global/document":1,"global/window":2,"tsml":49}],119:[function(_dereq_,module,exports){
 
/**
 
 * @file events.js
 
 *
 
 * Event System (John Resig - Secrets of a JS Ninja http://jsninja.com/)
 
 * (Original book version wasn't completely usable, so fixed some things and made Closure Compiler compatible)
 
 * This should work very similarly to jQuery's events, however it's based off the book version which isn't as
 
 * robust as jquery's, so there's probably some differences.
 
 */
 

	
 
'use strict';
 

	
 
exports.__esModule = true;
 
exports.on = on;
 
exports.off = off;
 
exports.trigger = trigger;
 
exports.one = one;
 
exports.fixEvent = fixEvent;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
var _domJs = _dereq_('./dom.js');
 

	
 
var Dom = _interopRequireWildcard(_domJs);
 

	
 
var _guidJs = _dereq_('./guid.js');
 

	
 
var Guid = _interopRequireWildcard(_guidJs);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
/**
 
 * Add an event listener to element
 
 * It stores the handler function in a separate cache object
 
 * and adds a generic handler to the element's event,
 
 * along with a unique id (guid) to the element.
 
 *
 
 * @param  {Element|Object}   elem Element or object to bind listeners to
 
 * @param  {String|Array}   type Type of event to bind to.
 
 * @param  {Function} fn   Event listener.
 
 * @method on
 
 */
 

	
 
function on(elem, type, fn) {
 
  if (Array.isArray(type)) {
 
    return _handleMultipleEvents(on, elem, type, fn);
 
  }
 

	
 
  var data = Dom.getElData(elem);
 

	
 
  // We need a place to store all our handler data
 
  if (!data.handlers) data.handlers = {};
 

	
 
  if (!data.handlers[type]) data.handlers[type] = [];
 

	
 
  if (!fn.guid) fn.guid = Guid.newGUID();
 

	
 
  data.handlers[type].push(fn);
 

	
 
  if (!data.dispatcher) {
 
    data.disabled = false;
 

	
 
    data.dispatcher = function (event, hash) {
 

	
 
      if (data.disabled) return;
 
      event = fixEvent(event);
 

	
 
      var handlers = data.handlers[event.type];
 

	
 
      if (handlers) {
 
        // Copy handlers so if handlers are added/removed during the process it doesn't throw everything off.
 
        var handlersCopy = handlers.slice(0);
 

	
 
        for (var m = 0, n = handlersCopy.length; m < n; m++) {
 
          if (event.isImmediatePropagationStopped()) {
 
            break;
 
          } else {
 
            handlersCopy[m].call(elem, event, hash);
 
          }
 
        }
 
      }
 
    };
 
  }
 

	
 
  if (data.handlers[type].length === 1) {
 
    if (elem.addEventListener) {
 
      elem.addEventListener(type, data.dispatcher, false);
 
    } else if (elem.attachEvent) {
 
      elem.attachEvent('on' + type, data.dispatcher);
 
    }
 
  }
 
}
 

	
 
/**
 
 * Removes event listeners from an element
 
 *
 
 * @param  {Element|Object}   elem Object to remove listeners from
 
 * @param  {String|Array=}   type Type of listener to remove. Don't include to remove all events from element.
 
 * @param  {Function} fn   Specific listener to remove. Don't include to remove listeners for an event type.
 
 * @method off
 
 */
 

	
 
function off(elem, type, fn) {
 
  // Don't want to add a cache object through getElData if not needed
 
  if (!Dom.hasElData(elem)) return;
 

	
 
  var data = Dom.getElData(elem);
 

	
 
  // If no events exist, nothing to unbind
 
  if (!data.handlers) {
 
    return;
 
  }
 

	
 
  if (Array.isArray(type)) {
 
    return _handleMultipleEvents(off, elem, type, fn);
 
  }
 

	
 
  // Utility function
 
  var removeType = function removeType(t) {
 
    data.handlers[t] = [];
 
    _cleanUpEvents(elem, t);
 
  };
 

	
 
  // Are we removing all bound events?
 
  if (!type) {
 
    for (var t in data.handlers) {
 
      removeType(t);
 
    }return;
 
  }
 

	
 
  var handlers = data.handlers[type];
 

	
 
  // If no handlers exist, nothing to unbind
 
  if (!handlers) return;
 

	
 
  // If no listener was provided, remove all listeners for type
 
  if (!fn) {
 
    removeType(type);
 
    return;
 
  }
 

	
 
  // We're only removing a single handler
 
  if (fn.guid) {
 
    for (var n = 0; n < handlers.length; n++) {
 
      if (handlers[n].guid === fn.guid) {
 
        handlers.splice(n--, 1);
 
      }
 
    }
 
  }
 

	
 
  _cleanUpEvents(elem, type);
 
}
 

	
 
/**
 
 * Trigger an event for an element
 
 *
 
 * @param  {Element|Object}      elem  Element to trigger an event on
 
 * @param  {Event|Object|String} event A string (the type) or an event object with a type attribute
 
 * @param  {Object} [hash] data hash to pass along with the event
 
 * @return {Boolean=} Returned only if default was prevented
 
 * @method trigger
 
 */
 

	
 
function trigger(elem, event, hash) {
 
  // Fetches element data and a reference to the parent (for bubbling).
 
  // Don't want to add a data object to cache for every parent,
 
  // so checking hasElData first.
 
  var elemData = Dom.hasElData(elem) ? Dom.getElData(elem) : {};
 
  var parent = elem.parentNode || elem.ownerDocument;
 
  // type = event.type || event,
 
  // handler;
 

	
 
  // If an event name was passed as a string, creates an event out of it
 
  if (typeof event === 'string') {
 
    event = { type: event, target: elem };
 
  }
 
  // Normalizes the event properties.
 
  event = fixEvent(event);
 

	
 
  // If the passed element has a dispatcher, executes the established handlers.
 
  if (elemData.dispatcher) {
 
    elemData.dispatcher.call(elem, event, hash);
 
  }
 

	
 
  // Unless explicitly stopped or the event does not bubble (e.g. media events)
 
  // recursively calls this function to bubble the event up the DOM.
 
  if (parent && !event.isPropagationStopped() && event.bubbles === true) {
 
    trigger.call(null, parent, event, hash);
 

	
 
    // If at the top of the DOM, triggers the default action unless disabled.
 
  } else if (!parent && !event.defaultPrevented) {
 
      var targetData = Dom.getElData(event.target);
 

	
 
      // Checks if the target has a default action for this event.
 
      if (event.target[event.type]) {
 
        // Temporarily disables event dispatching on the target as we have already executed the handler.
 
        targetData.disabled = true;
 
        // Executes the default action.
 
        if (typeof event.target[event.type] === 'function') {
 
          event.target[event.type]();
 
        }
 
        // Re-enables event dispatching.
 
        targetData.disabled = false;
 
      }
 
    }
 

	
 
  // Inform the triggerer if the default was prevented by returning false
 
  return !event.defaultPrevented;
 
}
 

	
 
/**
 
 * Trigger a listener only once for an event
 
 *
 
 * @param  {Element|Object}   elem Element or object to
 
 * @param  {String|Array}   type Name/type of event
 
 * @param  {Function} fn Event handler function
 
 * @method one
 
 */
 

	
 
function one(elem, type, fn) {
 
  if (Array.isArray(type)) {
 
    return _handleMultipleEvents(one, elem, type, fn);
 
  }
 
  var func = function func() {
 
    off(elem, type, func);
 
    fn.apply(this, arguments);
 
  };
 
  // copy the guid to the new function so it can removed using the original function's ID
 
  func.guid = fn.guid = fn.guid || Guid.newGUID();
 
  on(elem, type, func);
 
}
 

	
 
/**
 
 * Fix a native event to have standard property values
 
 *
 
 * @param  {Object} event Event object to fix
 
 * @return {Object}
 
 * @private
 
 * @method fixEvent
 
 */
 

	
 
function fixEvent(event) {
 

	
 
  function returnTrue() {
 
    return true;
 
  }
 
  function returnFalse() {
 
    return false;
 
  }
 

	
 
  // Test if fixing up is needed
 
  // Used to check if !event.stopPropagation instead of isPropagationStopped
 
  // But native events return true for stopPropagation, but don't have
 
  // other expected methods like isPropagationStopped. Seems to be a problem
 
  // with the Javascript Ninja code. So we're just overriding all events now.
 
  if (!event || !event.isPropagationStopped) {
 
    var old = event || _globalWindow2['default'].event;
 

	
 
    event = {};
 
    // Clone the old object so that we can modify the values event = {};
 
    // IE8 Doesn't like when you mess with native event properties
 
    // Firefox returns false for event.hasOwnProperty('type') and other props
 
    //  which makes copying more difficult.
 
    // TODO: Probably best to create a whitelist of event props
 
    for (var key in old) {
 
      // Safari 6.0.3 warns you if you try to copy deprecated layerX/Y
 
      // Chrome warns you if you try to copy deprecated keyboardEvent.keyLocation
 
      // and webkitMovementX/Y
 
      if (key !== 'layerX' && key !== 'layerY' && key !== 'keyLocation' && key !== 'webkitMovementX' && key !== 'webkitMovementY') {
 
        // Chrome 32+ warns if you try to copy deprecated returnValue, but
 
        // we still want to if preventDefault isn't supported (IE8).
 
        if (!(key === 'returnValue' && old.preventDefault)) {
 
          event[key] = old[key];
 
        }
 
      }
 
    }
 

	
 
    // The event occurred on this element
 
    if (!event.target) {
 
      event.target = event.srcElement || _globalDocument2['default'];
 
    }
 

	
 
    // Handle which other element the event is related to
 
    if (!event.relatedTarget) {
 
      event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
 
    }
 

	
 
    // Stop the default browser action
 
    event.preventDefault = function () {
 
      if (old.preventDefault) {
 
        old.preventDefault();
 
      }
 
      event.returnValue = false;
 
      old.returnValue = false;
 
      event.defaultPrevented = true;
 
    };
 

	
 
    event.defaultPrevented = false;
 

	
 
    // Stop the event from bubbling
 
    event.stopPropagation = function () {
 
      if (old.stopPropagation) {
 
        old.stopPropagation();
 
      }
 
      event.cancelBubble = true;
 
      old.cancelBubble = true;
 
      event.isPropagationStopped = returnTrue;
 
    };
 

	
 
    event.isPropagationStopped = returnFalse;
 

	
 
    // Stop the event from bubbling and executing other handlers
 
    event.stopImmediatePropagation = function () {
 
      if (old.stopImmediatePropagation) {
 
        old.stopImmediatePropagation();
 
      }
 
      event.isImmediatePropagationStopped = returnTrue;
 
      event.stopPropagation();
 
    };
 

	
 
    event.isImmediatePropagationStopped = returnFalse;
 

	
 
    // Handle mouse position
 
    if (event.clientX != null) {
 
      var doc = _globalDocument2['default'].documentElement,
 
          body = _globalDocument2['default'].body;
 

	
 
      event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
 
      event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
 
    }
 

	
 
    // Handle key presses
 
    event.which = event.charCode || event.keyCode;
 

	
 
    // Fix button for mouse clicks:
 
    // 0 == left; 1 == middle; 2 == right
 
    if (event.button != null) {
 
      event.button = event.button & 1 ? 0 : event.button & 4 ? 1 : event.button & 2 ? 2 : 0;
 
    }
 
  }
 

	
 
  // Returns fixed-up instance
 
  return event;
 
}
 

	
 
/**
 
 * Clean up the listener cache and dispatchers
 
*
 
 * @param  {Element|Object} elem Element to clean up
 
 * @param  {String} type Type of event to clean up
 
 * @private
 
 * @method _cleanUpEvents
 
 */
 
function _cleanUpEvents(elem, type) {
 
  var data = Dom.getElData(elem);
 

	
 
  // Remove the events of a particular type if there are none left
 
  if (data.handlers[type].length === 0) {
 
    delete data.handlers[type];
 
    // data.handlers[type] = null;
 
    // Setting to null was causing an error with data.handlers
 

	
 
    // Remove the meta-handler from the element
 
    if (elem.removeEventListener) {
 
      elem.removeEventListener(type, data.dispatcher, false);
 
    } else if (elem.detachEvent) {
 
      elem.detachEvent('on' + type, data.dispatcher);
 
    }
 
  }
 

	
 
  // Remove the events object if there are no types left
 
  if (Object.getOwnPropertyNames(data.handlers).length <= 0) {
 
    delete data.handlers;
 
    delete data.dispatcher;
 
    delete data.disabled;
 
  }
 

	
 
  // Finally remove the element data if there is no data left
 
  if (Object.getOwnPropertyNames(data).length === 0) {
 
    Dom.removeElData(elem);
 
  }
 
}
 

	
 
/**
 
 * Loops through an array of event types and calls the requested method for each type.
 
 *
 
 * @param  {Function} fn   The event method we want to use.
 
 * @param  {Element|Object} elem Element or object to bind listeners to
 
 * @param  {String}   type Type of event to bind to.
 
 * @param  {Function} callback   Event listener.
 
 * @private
 
 * @function _handleMultipleEvents
 
 */
 
function _handleMultipleEvents(fn, elem, types, callback) {
 
  types.forEach(function (type) {
 
    //Call the event method for each one of the types
 
    fn(elem, type, callback);
 
  });
 
}
 

	
 
},{"./dom.js":118,"./guid.js":122,"global/document":1,"global/window":2}],120:[function(_dereq_,module,exports){
 
/**
 
 * @file fn.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
var _guidJs = _dereq_('./guid.js');
 

	
 
/**
 
 * Bind (a.k.a proxy or Context). A simple method for changing the context of a function
 
 * It also stores a unique id on the function so it can be easily removed from events
 
 *
 
 * @param  {*}   context The object to bind as scope
 
 * @param  {Function} fn      The function to be bound to a scope
 
 * @param  {Number=}   uid     An optional unique ID for the function to be set
 
 * @return {Function}
 
 * @private
 
 * @method bind
 
 */
 
var bind = function bind(context, fn, uid) {
 
  // Make sure the function has a unique ID
 
  if (!fn.guid) {
 
    fn.guid = _guidJs.newGUID();
 
  }
 

	
 
  // Create the new function that changes the context
 
  var ret = function ret() {
 
    return fn.apply(context, arguments);
 
  };
 

	
 
  // Allow for the ability to individualize this function
 
  // Needed in the case where multiple objects might share the same prototype
 
  // IF both items add an event listener with the same function, then you try to remove just one
 
  // it will remove both because they both have the same guid.
 
  // when using this, you need to use the bind method when you remove the listener as well.
 
  // currently used in text tracks
 
  ret.guid = uid ? uid + '_' + fn.guid : fn.guid;
 

	
 
  return ret;
 
};
 
exports.bind = bind;
 

	
 
},{"./guid.js":122}],121:[function(_dereq_,module,exports){
 
/**
 
 * @file format-time.js
 
 *
 
 * Format seconds as a time string, H:MM:SS or M:SS
 
 * Supplying a guide (in seconds) will force a number of leading zeros
 
 * to cover the length of the guide
 
 *
 
 * @param  {Number} seconds Number of seconds to be turned into a string
 
 * @param  {Number} guide   Number (in seconds) to model the string after
 
 * @return {String}         Time formatted as H:MM:SS or M:SS
 
 * @private
 
 * @function formatTime
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 
function formatTime(seconds) {
 
  var guide = arguments.length <= 1 || arguments[1] === undefined ? seconds : arguments[1];
 
  return (function () {
 
    var s = Math.floor(seconds % 60);
 
    var m = Math.floor(seconds / 60 % 60);
 
    var h = Math.floor(seconds / 3600);
 
    var gm = Math.floor(guide / 60 % 60);
 
    var gh = Math.floor(guide / 3600);
 

	
 
    // handle invalid times
 
    if (isNaN(seconds) || seconds === Infinity) {
 
      // '-' is false for all relational operators (e.g. <, >=) so this setting
 
      // will add the minimum number of fields specified by the guide
 
      h = m = s = '-';
 
    }
 

	
 
    // Check if we need to show hours
 
    h = h > 0 || gh > 0 ? h + ':' : '';
 

	
 
    // If hours are showing, we may need to add a leading zero.
 
    // Always show at least one digit of minutes.
 
    m = ((h || gm >= 10) && m < 10 ? '0' + m : m) + ':';
 

	
 
    // Check if leading zero is need for seconds
 
    s = s < 10 ? '0' + s : s;
 

	
 
    return h + m + s;
 
  })();
 
}
 

	
 
exports['default'] = formatTime;
 
module.exports = exports['default'];
 

	
 
},{}],122:[function(_dereq_,module,exports){
 
/**
 
 * @file guid.js
 
 *
 
 * Unique ID for an element or function
 
 * @type {Number}
 
 * @private
 
 */
 
"use strict";
 

	
 
exports.__esModule = true;
 
exports.newGUID = newGUID;
 
var _guid = 1;
 

	
 
/**
 
 * Get the next unique ID
 
 *
 
 * @return {String} 
 
 * @function newGUID
 
 */
 

	
 
function newGUID() {
 
  return _guid++;
 
}
 

	
 
},{}],123:[function(_dereq_,module,exports){
 
/**
 
 * @file log.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
/**
 
 * Log plain debug messages
 
 */
 
var log = function log() {
 
  _logType(null, arguments);
 
};
 

	
 
/**
 
 * Keep a history of log messages
 
 * @type {Array}
 
 */
 
log.history = [];
 

	
 
/**
 
 * Log error messages
 
 */
 
log.error = function () {
 
  _logType('error', arguments);
 
};
 

	
 
/**
 
 * Log warning messages
 
 */
 
log.warn = function () {
 
  _logType('warn', arguments);
 
};
 

	
 
/**
 
 * Log messages to the console and history based on the type of message
 
 *
 
 * @param  {String} type The type of message, or `null` for `log`
 
 * @param  {Object} args The args to be passed to the log
 
 * @private
 
 * @method _logType
 
 */
 
function _logType(type, args) {
 
  // convert args to an array to get array functions
 
  var argsArray = Array.prototype.slice.call(args);
 
  // if there's no console then don't try to output messages
 
  // they will still be stored in log.history
 
  // Was setting these once outside of this function, but containing them
 
  // in the function makes it easier to test cases where console doesn't exist
 
  var noop = function noop() {};
 

	
 
  var console = _globalWindow2['default']['console'] || {
 
    'log': noop,
 
    'warn': noop,
 
    'error': noop
 
  };
 

	
 
  if (type) {
 
    // add the type to the front of the message
 
    argsArray.unshift(type.toUpperCase() + ':');
 
  } else {
 
    // default to log with no prefix
 
    type = 'log';
 
  }
 

	
 
  // add to history
 
  log.history.push(argsArray);
 

	
 
  // add console prefix after adding to history
 
  argsArray.unshift('VIDEOJS:');
 

	
 
  // call appropriate log function
 
  if (console[type].apply) {
 
    console[type].apply(console, argsArray);
 
  } else {
 
    // ie8 doesn't allow error.apply, but it will just join() the array anyway
 
    console[type](argsArray.join(' '));
 
  }
 
}
 

	
 
exports['default'] = log;
 
module.exports = exports['default'];
 

	
 
},{"global/window":2}],124:[function(_dereq_,module,exports){
 
/**
 
 * @file merge-options.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 
exports['default'] = mergeOptions;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _lodashCompatObjectMerge = _dereq_('lodash-compat/object/merge');
 

	
 
var _lodashCompatObjectMerge2 = _interopRequireDefault(_lodashCompatObjectMerge);
 

	
 
function isPlain(obj) {
 
  return !!obj && typeof obj === 'object' && obj.toString() === '[object Object]' && obj.constructor === Object;
 
}
 

	
 
/**
 
 * Merge customizer. video.js simply overwrites non-simple objects
 
 * (like arrays) instead of attempting to overlay them.
 
 * @see https://lodash.com/docs#merge
 
 */
 
var customizer = function customizer(destination, source) {
 
  // If we're not working with a plain object, copy the value as is
 
  // If source is an array, for instance, it will replace destination
 
  if (!isPlain(source)) {
 
    return source;
 
  }
 

	
 
  // If the new value is a plain object but the first object value is not
 
  // we need to create a new object for the first object to merge with.
 
  // This makes it consistent with how merge() works by default
 
  // and also protects from later changes the to first object affecting
 
  // the second object's values.
 
  if (!isPlain(destination)) {
 
    return mergeOptions(source);
 
  }
 
};
 

	
 
/**
 
 * Merge one or more options objects, recursively merging **only**
 
 * plain object properties.  Previously `deepMerge`.
 
 *
 
 * @param  {...Object} source One or more objects to merge
 
 * @returns {Object}          a new object that is the union of all
 
 * provided objects
 
 * @function mergeOptions
 
 */
 

	
 
function mergeOptions() {
 
  // contruct the call dynamically to handle the variable number of
 
  // objects to merge
 
  var args = Array.prototype.slice.call(arguments);
 

	
 
  // unshift an empty object into the front of the call as the target
 
  // of the merge
 
  args.unshift({});
 

	
 
  // customize conflict resolution to match our historical merge behavior
 
  args.push(customizer);
 

	
 
  _lodashCompatObjectMerge2['default'].apply(null, args);
 

	
 
  // return the mutated result object
 
  return args[0];
 
}
 

	
 
module.exports = exports['default'];
 

	
 
},{"lodash-compat/object/merge":40}],125:[function(_dereq_,module,exports){
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var createStyleElement = function createStyleElement(className) {
 
  var style = _globalDocument2['default'].createElement('style');
 
  style.className = className;
 

	
 
  return style;
 
};
 

	
 
exports.createStyleElement = createStyleElement;
 
var setTextContent = function setTextContent(el, content) {
 
  if (el.styleSheet) {
 
    el.styleSheet.cssText = content;
 
  } else {
 
    el.textContent = content;
 
  }
 
};
 
exports.setTextContent = setTextContent;
 

	
 
},{"global/document":1}],126:[function(_dereq_,module,exports){
 
'use strict';
 

	
 
exports.__esModule = true;
 
exports.createTimeRanges = createTimeRanges;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _logJs = _dereq_('./log.js');
 

	
 
var _logJs2 = _interopRequireDefault(_logJs);
 

	
 
/**
 
 * @file time-ranges.js
 
 *
 
 * Should create a fake TimeRange object
 
 * Mimics an HTML5 time range instance, which has functions that
 
 * return the start and end times for a range
 
 * TimeRanges are returned by the buffered() method
 
 *
 
 * @param  {(Number|Array)} Start of a single range or an array of ranges
 
 * @param  {Number} End of a single range
 
 * @private
 
 * @method createTimeRanges
 
 */
 

	
 
function createTimeRanges(start, end) {
 
  if (Array.isArray(start)) {
 
    return createTimeRangesObj(start);
 
  } else if (start === undefined || end === undefined) {
 
    return createTimeRangesObj();
 
  }
 
  return createTimeRangesObj([[start, end]]);
 
}
 

	
 
exports.createTimeRange = createTimeRanges;
 

	
 
function createTimeRangesObj(ranges) {
 
  if (ranges === undefined || ranges.length === 0) {
 
    return {
 
      length: 0,
 
      start: function start() {
 
        throw new Error('This TimeRanges object is empty');
 
      },
 
      end: function end() {
 
        throw new Error('This TimeRanges object is empty');
 
      }
 
    };
 
  }
 
  return {
 
    length: ranges.length,
 
    start: getRange.bind(null, 'start', 0, ranges),
 
    end: getRange.bind(null, 'end', 1, ranges)
 
  };
 
}
 

	
 
function getRange(fnName, valueIndex, ranges, rangeIndex) {
 
  if (rangeIndex === undefined) {
 
    _logJs2['default'].warn('DEPRECATED: Function \'' + fnName + '\' on \'TimeRanges\' called without an index argument.');
 
    rangeIndex = 0;
 
  }
 
  rangeCheck(fnName, rangeIndex, ranges.length - 1);
 
  return ranges[rangeIndex][valueIndex];
 
}
 

	
 
function rangeCheck(fnName, index, maxIndex) {
 
  if (index < 0 || index > maxIndex) {
 
    throw new Error('Failed to execute \'' + fnName + '\' on \'TimeRanges\': The index provided (' + index + ') is greater than or equal to the maximum bound (' + maxIndex + ').');
 
  }
 
}
 

	
 
},{"./log.js":123}],127:[function(_dereq_,module,exports){
 
/**
 
 * @file to-title-case.js
 
 *
 
 * Uppercase the first letter of a string
 
 *
 
 * @param  {String} string String to be uppercased
 
 * @return {String}
 
 * @private
 
 * @method toTitleCase
 
 */
 
"use strict";
 

	
 
exports.__esModule = true;
 
function toTitleCase(string) {
 
  return string.charAt(0).toUpperCase() + string.slice(1);
 
}
 

	
 
exports["default"] = toTitleCase;
 
module.exports = exports["default"];
 

	
 
},{}],128:[function(_dereq_,module,exports){
 
/**
 
 * @file url.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
/**
 
 * Resolve and parse the elements of a URL
 
 *
 
 * @param  {String} url The url to parse
 
 * @return {Object}     An object of url details
 
 * @method parseUrl
 
 */
 
var parseUrl = function parseUrl(url) {
 
  var props = ['protocol', 'hostname', 'port', 'pathname', 'search', 'hash', 'host'];
 

	
 
  // add the url to an anchor and let the browser parse the URL
 
  var a = _globalDocument2['default'].createElement('a');
 
  a.href = url;
 

	
 
  // IE8 (and 9?) Fix
 
  // ie8 doesn't parse the URL correctly until the anchor is actually
 
  // added to the body, and an innerHTML is needed to trigger the parsing
 
  var addToBody = a.host === '' && a.protocol !== 'file:';
 
  var div = undefined;
 
  if (addToBody) {
 
    div = _globalDocument2['default'].createElement('div');
 
    div.innerHTML = '<a href="' + url + '"></a>';
 
    a = div.firstChild;
 
    // prevent the div from affecting layout
 
    div.setAttribute('style', 'display:none; position:absolute;');
 
    _globalDocument2['default'].body.appendChild(div);
 
  }
 

	
 
  // Copy the specific URL properties to a new object
 
  // This is also needed for IE8 because the anchor loses its
 
  // properties when it's removed from the dom
 
  var details = {};
 
  for (var i = 0; i < props.length; i++) {
 
    details[props[i]] = a[props[i]];
 
  }
 

	
 
  // IE9 adds the port to the host property unlike everyone else. If
 
  // a port identifier is added for standard ports, strip it.
 
  if (details.protocol === 'http:') {
 
    details.host = details.host.replace(/:80$/, '');
 
  }
 
  if (details.protocol === 'https:') {
 
    details.host = details.host.replace(/:443$/, '');
 
  }
 

	
 
  if (addToBody) {
 
    _globalDocument2['default'].body.removeChild(div);
 
  }
 

	
 
  return details;
 
};
 

	
 
exports.parseUrl = parseUrl;
 
/**
 
 * Get absolute version of relative URL. Used to tell flash correct URL.
 
 * http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue
 
 *
 
 * @param  {String} url URL to make absolute
 
 * @return {String}     Absolute URL
 
 * @private
 
 * @method getAbsoluteURL
 
 */
 
var getAbsoluteURL = function getAbsoluteURL(url) {
 
  // Check if absolute URL
 
  if (!url.match(/^https?:\/\//)) {
 
    // Convert to absolute URL. Flash hosted off-site needs an absolute URL.
 
    var div = _globalDocument2['default'].createElement('div');
 
    div.innerHTML = '<a href="' + url + '">x</a>';
 
    url = div.firstChild.href;
 
  }
 

	
 
  return url;
 
};
 

	
 
exports.getAbsoluteURL = getAbsoluteURL;
 
/**
 
 * Returns the extension of the passed file name. It will return an empty string if you pass an invalid path
 
 *
 
 * @param {String}    path    The fileName path like '/path/to/file.mp4'
 
 * @returns {String}          The extension in lower case or an empty string if no extension could be found.
 
 * @method getFileExtension
 
 */
 
var getFileExtension = function getFileExtension(path) {
 
  if (typeof path === 'string') {
 
    var splitPathRe = /^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/\?]+)))(?:[\/]*|[\?].*)$/i;
 
    var pathParts = splitPathRe.exec(path);
 

	
 
    if (pathParts) {
 
      return pathParts.pop().toLowerCase();
 
    }
 
  }
 

	
 
  return '';
 
};
 

	
 
exports.getFileExtension = getFileExtension;
 
/**
 
 * Returns whether the url passed is a cross domain request or not.
 
 *
 
 * @param {String} url The url to check
 
 * @return {Boolean}   Whether it is a cross domain request or not
 
 * @method isCrossOrigin
 
 */
 
var isCrossOrigin = function isCrossOrigin(url) {
 
  var urlInfo = parseUrl(url);
 
  var winLoc = _globalWindow2['default'].location;
 

	
 
  // IE8 protocol relative urls will return ':' for protocol
 
  var srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol;
 

	
 
  // Check if url is for another domain/origin
 
  // IE8 doesn't know location.origin, so we won't rely on it here
 
  var crossOrigin = srcProtocol + urlInfo.host !== winLoc.protocol + winLoc.host;
 

	
 
  return crossOrigin;
 
};
 
exports.isCrossOrigin = isCrossOrigin;
 

	
 
},{"global/document":1,"global/window":2}],129:[function(_dereq_,module,exports){
 
/**
 
 * @file video.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _setup = _dereq_('./setup');
 

	
 
var setup = _interopRequireWildcard(_setup);
 

	
 
var _utilsStylesheetJs = _dereq_('./utils/stylesheet.js');
 

	
 
var stylesheet = _interopRequireWildcard(_utilsStylesheetJs);
 

	
 
var _component = _dereq_('./component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _eventTarget = _dereq_('./event-target');
 

	
 
var _eventTarget2 = _interopRequireDefault(_eventTarget);
 

	
 
var _utilsEventsJs = _dereq_('./utils/events.js');
 

	
 
var Events = _interopRequireWildcard(_utilsEventsJs);
 

	
 
var _player = _dereq_('./player');
 

	
 
var _player2 = _interopRequireDefault(_player);
 

	
 
var _pluginsJs = _dereq_('./plugins.js');
 

	
 
var _pluginsJs2 = _interopRequireDefault(_pluginsJs);
 

	
 
var _srcJsUtilsMergeOptionsJs = _dereq_('../../src/js/utils/merge-options.js');
 

	
 
var _srcJsUtilsMergeOptionsJs2 = _interopRequireDefault(_srcJsUtilsMergeOptionsJs);
 

	
 
var _utilsFnJs = _dereq_('./utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _tracksTextTrackJs = _dereq_('./tracks/text-track.js');
 

	
 
var _tracksTextTrackJs2 = _interopRequireDefault(_tracksTextTrackJs);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
var _utilsTimeRangesJs = _dereq_('./utils/time-ranges.js');
 

	
 
var _utilsFormatTimeJs = _dereq_('./utils/format-time.js');
 

	
 
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
 

	
 
var _utilsLogJs = _dereq_('./utils/log.js');
 

	
 
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
 

	
 
var _utilsDomJs = _dereq_('./utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsBrowserJs = _dereq_('./utils/browser.js');
 

	
 
var browser = _interopRequireWildcard(_utilsBrowserJs);
 

	
 
var _utilsUrlJs = _dereq_('./utils/url.js');
 

	
 
var Url = _interopRequireWildcard(_utilsUrlJs);
 

	
 
var _extendJs = _dereq_('./extend.js');
 

	
 
var _extendJs2 = _interopRequireDefault(_extendJs);
 

	
 
var _lodashCompatObjectMerge = _dereq_('lodash-compat/object/merge');
 

	
 
var _lodashCompatObjectMerge2 = _interopRequireDefault(_lodashCompatObjectMerge);
 

	
 
var _utilsCreateDeprecationProxyJs = _dereq_('./utils/create-deprecation-proxy.js');
 

	
 
var _utilsCreateDeprecationProxyJs2 = _interopRequireDefault(_utilsCreateDeprecationProxyJs);
 

	
 
var _xhr = _dereq_('xhr');
 

	
 
var _xhr2 = _interopRequireDefault(_xhr);
 

	
 
// Include the built-in techs
 

	
 
var _techHtml5Js = _dereq_('./tech/html5.js');
 

	
 
var _techHtml5Js2 = _interopRequireDefault(_techHtml5Js);
 

	
 
var _techFlashJs = _dereq_('./tech/flash.js');
 

	
 
var _techFlashJs2 = _interopRequireDefault(_techFlashJs);
 

	
 
// HTML5 Element Shim for IE8
 
if (typeof HTMLVideoElement === 'undefined') {
 
  _globalDocument2['default'].createElement('video');
 
  _globalDocument2['default'].createElement('audio');
 
  _globalDocument2['default'].createElement('track');
 
}
 

	
 
/**
 
 * Doubles as the main function for users to create a player instance and also
 
 * the main library object.
 
 * The `videojs` function can be used to initialize or retrieve a player.
 
 * ```js
 
 *     var myPlayer = videojs('my_video_id');
 
 * ```
 
 *
 
 * @param  {String|Element} id      Video element or video element ID
 
 * @param  {Object=} options        Optional options object for config/settings
 
 * @param  {Function=} ready        Optional ready callback
 
 * @return {Player}                 A player instance
 
 * @mixes videojs
 
 * @method videojs
 
 */
 
var videojs = function videojs(id, options, ready) {
 
  var tag; // Element of ID
 

	
 
  // Allow for element or ID to be passed in
 
  // String ID
 
  if (typeof id === 'string') {
 

	
 
    // Adjust for jQuery ID syntax
 
    if (id.indexOf('#') === 0) {
 
      id = id.slice(1);
 
    }
 

	
 
    // If a player instance has already been created for this ID return it.
 
    if (videojs.getPlayers()[id]) {
 

	
 
      // If options or ready funtion are passed, warn
 
      if (options) {
 
        _utilsLogJs2['default'].warn('Player "' + id + '" is already initialised. Options will not be applied.');
 
      }
 

	
 
      if (ready) {
 
        videojs.getPlayers()[id].ready(ready);
 
      }
 

	
 
      return videojs.getPlayers()[id];
 

	
 
      // Otherwise get element for ID
 
    } else {
 
        tag = Dom.getEl(id);
 
      }
 

	
 
    // ID is a media element
 
  } else {
 
      tag = id;
 
    }
 

	
 
  // Check for a useable element
 
  if (!tag || !tag.nodeName) {
 
    // re: nodeName, could be a box div also
 
    throw new TypeError('The element or ID supplied is not valid. (videojs)'); // Returns
 
  }
 

	
 
  // Element may have a player attr referring to an already created player instance.
 
  // If not, set up a new player and return the instance.
 
  return tag['player'] || new _player2['default'](tag, options, ready);
 
};
 

	
 
// Add default styles
 
var style = _globalDocument2['default'].querySelector('.vjs-styles-defaults');
 
if (!style) {
 
  style = stylesheet.createStyleElement('vjs-styles-defaults');
 
  var head = _globalDocument2['default'].querySelector('head');
 
  head.insertBefore(style, head.firstChild);
 
  stylesheet.setTextContent(style, '\n    .video-js {\n      width: 300px;\n      height: 150px;\n    }\n\n    .vjs-fluid {\n      padding-top: 56.25%\n    }\n  ');
 
}
 

	
 
// Run Auto-load players
 
// You have to wait at least once in case this script is loaded after your video in the DOM (weird behavior only with minified version)
 
setup.autoSetupTimeout(1, videojs);
 

	
 
/*
 
 * Current software version (semver)
 
 *
 
 * @type {String}
 
 */
 
videojs.VERSION = '5.0.0';
 

	
 
/**
 
 * The global options object. These are the settings that take effect
 
 * if no overrides are specified when the player is created.
 
 *
 
 * ```js
 
 *     videojs.options.autoplay = true
 
 *     // -> all players will autoplay by default
 
 * ```
 
 *
 
 * @type {Object}
 
 */
 
videojs.options = _player2['default'].prototype.options_;
 

	
 
/**
 
 * Get an object with the currently created players, keyed by player ID
 
 *
 
 * @return {Object} The created players
 
 * @mixes videojs
 
 * @method getPlayers
 
 */
 
videojs.getPlayers = function () {
 
  return _player2['default'].players;
 
};
 

	
 
/**
 
 * For backward compatibility, expose players object.
 
 *
 
 * @deprecated
 
 * @memberOf videojs
 
 * @property {Object|Proxy} players
 
 */
 
videojs.players = _utilsCreateDeprecationProxyJs2['default'](_player2['default'].players, {
 
  get: 'Access to videojs.players is deprecated; use videojs.getPlayers instead',
 
  set: 'Modification of videojs.players is deprecated'
 
});
 

	
 
/**
 
 * Get a component class object by name
 
 * ```js
 
 *     var VjsButton = videojs.getComponent('Button');
 
 *     // Create a new instance of the component
 
 *     var myButton = new VjsButton(myPlayer);
 
 * ```
 
 *
 
 * @return {Component} Component identified by name
 
 * @mixes videojs
 
 * @method getComponent
 
 */
 
videojs.getComponent = _component2['default'].getComponent;
 

	
 
/**
 
 * Register a component so it can referred to by name
 
 * Used when adding to other
 
 * components, either through addChild
 
 * `component.addChild('myComponent')`
 
 * or through default children options
 
 * `{ children: ['myComponent'] }`.
 
 * ```js
 
 *     // Get a component to subclass
 
 *     var VjsButton = videojs.getComponent('Button');
 
 *     // Subclass the component (see 'extend' doc for more info)
 
 *     var MySpecialButton = videojs.extend(VjsButton, {});
 
 *     // Register the new component
 
 *     VjsButton.registerComponent('MySepcialButton', MySepcialButton);
 
 *     // (optionally) add the new component as a default player child
 
 *     myPlayer.addChild('MySepcialButton');
 
 * ```
 
 * NOTE: You could also just initialize the component before adding.
 
 * `component.addChild(new MyComponent());`
 
 *
 
 * @param {String} The class name of the component
 
 * @param {Component} The component class
 
 * @return {Component} The newly registered component
 
 * @mixes videojs
 
 * @method registerComponent
 
 */
 
videojs.registerComponent = _component2['default'].registerComponent;
 

	
 
/**
 
 * A suite of browser and device tests
 
 *
 
 * @type {Object}
 
 * @private
 
 */
 
videojs.browser = browser;
 

	
 
/**
 
 * Whether or not the browser supports touch events. Included for backward
 
 * compatibility with 4.x, but deprecated. Use `videojs.browser.TOUCH_ENABLED`
 
 * instead going forward.
 
 *
 
 * @deprecated
 
 * @type {Boolean}
 
 */
 
videojs.TOUCH_ENABLED = browser.TOUCH_ENABLED;
 

	
 
/**
 
 * Subclass an existing class
 
 * Mimics ES6 subclassing with the `extend` keyword
 
 * ```js
 
 *     // Create a basic javascript 'class'
 
 *     function MyClass(name){
 
 *       // Set a property at initialization
 
 *       this.myName = name;
 
 *     }
 
 *     // Create an instance method
 
 *     MyClass.prototype.sayMyName = function(){
 
 *       alert(this.myName);
 
 *     };
 
 *     // Subclass the exisitng class and change the name
 
 *     // when initializing
 
 *     var MySubClass = videojs.extend(MyClass, {
 
 *       constructor: function(name) {
 
 *         // Call the super class constructor for the subclass
 
 *         MyClass.call(this, name)
 
 *       }
 
 *     });
 
 *     // Create an instance of the new sub class
 
 *     var myInstance = new MySubClass('John');
 
 *     myInstance.sayMyName(); // -> should alert "John"
 
 * ```
 
 *
 
 * @param {Function} The Class to subclass
 
 * @param {Object} An object including instace methods for the new class
 
 *                   Optionally including a `constructor` function
 
 * @return {Function} The newly created subclass
 
 * @mixes videojs
 
 * @method extend
 
 */
 
videojs.extend = _extendJs2['default'];
 

	
 
/**
 
 * Merge two options objects recursively
 
 * Performs a deep merge like lodash.merge but **only merges plain objects**
 
 * (not arrays, elements, anything else)
 
 * Other values will be copied directly from the second object.
 
 * ```js
 
 *     var defaultOptions = {
 
 *       foo: true,
 
 *       bar: {
 
 *         a: true,
 
 *         b: [1,2,3]
 
 *       }
 
 *     };
 
 *     var newOptions = {
 
 *       foo: false,
 
 *       bar: {
 
 *         b: [4,5,6]
 
 *       }
 
 *     };
 
 *     var result = videojs.mergeOptions(defaultOptions, newOptions);
 
 *     // result.foo = false;
 
 *     // result.bar.a = true;
 
 *     // result.bar.b = [4,5,6];
 
 * ```
 
 *
 
 * @param {Object} The options object whose values will be overriden
 
 * @param {Object} The options object with values to override the first
 
 * @param {Object} Any number of additional options objects
 
 *
 
 * @return {Object} a new object with the merged values
 
 * @mixes videojs
 
 * @method mergeOptions
 
 */
 
videojs.mergeOptions = _srcJsUtilsMergeOptionsJs2['default'];
 

	
 
/**
 
 * Change the context (this) of a function
 
 *
 
 *     videojs.bind(newContext, function(){
 
 *       this === newContext
 
 *     });
 
 *
 
 * NOTE: as of v5.0 we require an ES5 shim, so you should use the native
 
 * `function(){}.bind(newContext);` instead of this.
 
 *
 
 * @param  {*}        context The object to bind as scope
 
 * @param  {Function} fn      The function to be bound to a scope
 
 * @param  {Number=}  uid     An optional unique ID for the function to be set
 
 * @return {Function}
 
 */
 
videojs.bind = Fn.bind;
 

	
 
/**
 
 * Create a Video.js player plugin
 
 * Plugins are only initialized when options for the plugin are included
 
 * in the player options, or the plugin function on the player instance is
 
 * called.
 
 * **See the plugin guide in the docs for a more detailed example**
 
 * ```js
 
 *     // Make a plugin that alerts when the player plays
 
 *     videojs.plugin('myPlugin', function(myPluginOptions) {
 
 *       myPluginOptions = myPluginOptions || {};
 
 *
 
 *       var player = this;
 
 *       var alertText = myPluginOptions.text || 'Player is playing!'
 
 *
 
 *       player.on('play', function(){
 
 *         alert(alertText);
 
 *       });
 
 *     });
 
 *     // USAGE EXAMPLES
 
 *     // EXAMPLE 1: New player with plugin options, call plugin immediately
 
 *     var player1 = videojs('idOne', {
 
 *       myPlugin: {
 
 *         text: 'Custom text!'
 
 *       }
 
 *     });
 
 *     // Click play
 
 *     // --> Should alert 'Custom text!'
 
 *     // EXAMPLE 3: New player, initialize plugin later
 
 *     var player3 = videojs('idThree');
 
 *     // Click play
 
 *     // --> NO ALERT
 
 *     // Click pause
 
 *     // Initialize plugin using the plugin function on the player instance
 
 *     player3.myPlugin({
 
 *       text: 'Plugin added later!'
 
 *     });
 
 *     // Click play
 
 *     // --> Should alert 'Plugin added later!'
 
 * ```
 
 *
 
 * @param {String} The plugin name
 
 * @param {Function} The plugin function that will be called with options
 
 * @mixes videojs
 
 * @method plugin
 
 */
 
videojs.plugin = _pluginsJs2['default'];
 

	
 
/**
 
 * Adding languages so that they're available to all players.
 
 * ```js
 
 *     videojs.addLanguage('es', { 'Hello': 'Hola' });
 
 * ```
 
 *
 
 * @param  {String} code The language code or dictionary property
 
 * @param  {Object} data The data values to be translated
 
 * @return {Object} The resulting language dictionary object
 
 * @mixes videojs
 
 * @method addLanguage
 
 */
 
videojs.addLanguage = function (code, data) {
 
  var _merge;
 

	
 
  code = ('' + code).toLowerCase();
 
  return _lodashCompatObjectMerge2['default'](videojs.options.languages, (_merge = {}, _merge[code] = data, _merge))[code];
 
};
 

	
 
/**
 
 * Log debug messages.
 
 *
 
 * @param {...Object} messages One or more messages to log
 
 */
 
videojs.log = _utilsLogJs2['default'];
 

	
 
/**
 
 * Creates an emulated TimeRange object.
 
 *
 
 * @param  {Number|Array} start Start time in seconds or an array of ranges
 
 * @param  {Number} end   End time in seconds
 
 * @return {Object}       Fake TimeRange object
 
 * @method createTimeRange
 
 */
 
videojs.createTimeRange = videojs.createTimeRanges = _utilsTimeRangesJs.createTimeRanges;
 

	
 
/**
 
 * Format seconds as a time string, H:MM:SS or M:SS
 
 * Supplying a guide (in seconds) will force a number of leading zeros
 
 * to cover the length of the guide
 
 *
 
 * @param  {Number} seconds Number of seconds to be turned into a string
 
 * @param  {Number} guide   Number (in seconds) to model the string after
 
 * @return {String}         Time formatted as H:MM:SS or M:SS
 
 * @method formatTime
 
 */
 
videojs.formatTime = _utilsFormatTimeJs2['default'];
 

	
 
/**
 
 * Resolve and parse the elements of a URL
 
 *
 
 * @param  {String} url The url to parse
 
 * @return {Object}     An object of url details
 
 * @method parseUrl
 
 */
 
videojs.parseUrl = Url.parseUrl;
 

	
 
/**
 
 * Returns whether the url passed is a cross domain request or not.
 
 *
 
 * @param {String} url The url to check
 
 * @return {Boolean}   Whether it is a cross domain request or not
 
 * @method isCrossOrigin
 
 */
 
videojs.isCrossOrigin = Url.isCrossOrigin;
 

	
 
/**
 
 * Event target class.
 
 *
 
 * @type {Function}
 
 */
 
videojs.EventTarget = _eventTarget2['default'];
 

	
 
/**
 
 * Add an event listener to element
 
 * It stores the handler function in a separate cache object
 
 * and adds a generic handler to the element's event,
 
 * along with a unique id (guid) to the element.
 
 *
 
 * @param  {Element|Object}   elem Element or object to bind listeners to
 
 * @param  {String|Array}   type Type of event to bind to.
 
 * @param  {Function} fn   Event listener.
 
 * @method on
 
 */
 
videojs.on = Events.on;
 

	
 
/**
 
 * Trigger a listener only once for an event
 
 *
 
 * @param  {Element|Object}   elem Element or object to
 
 * @param  {String|Array}   type Name/type of event
 
 * @param  {Function} fn Event handler function
 
 * @method one
 
 */
 
videojs.one = Events.one;
 

	
 
/**
 
 * Removes event listeners from an element
 
 *
 
 * @param  {Element|Object}   elem Object to remove listeners from
 
 * @param  {String|Array=}   type Type of listener to remove. Don't include to remove all events from element.
 
 * @param  {Function} fn   Specific listener to remove. Don't include to remove listeners for an event type.
 
 * @method off
 
 */
 
videojs.off = Events.off;
 

	
 
/**
 
 * Trigger an event for an element
 
 *
 
 * @param  {Element|Object}      elem  Element to trigger an event on
 
 * @param  {Event|Object|String} event A string (the type) or an event object with a type attribute
 
 * @param  {Object} [hash] data hash to pass along with the event
 
 * @return {Boolean=} Returned only if default was prevented
 
 * @method trigger
 
 */
 
videojs.trigger = Events.trigger;
 

	
 
/**
 
 * A cross-browser XMLHttpRequest wrapper. Here's a simple example:
 
 *
 
 *     videojs.xhr({
 
 *       body: someJSONString,
 
 *       uri: "/foo",
 
 *       headers: {
 
 *         "Content-Type": "application/json"
 
 *       }
 
 *     }, function (err, resp, body) {
 
 *       // check resp.statusCode
 
 *     });
 
 *
 
 * Check out the [full
 
 * documentation](https://github.com/Raynos/xhr/blob/v2.1.0/README.md)
 
 * for more options.
 
 *
 
 * @param {Object} options settings for the request.
 
 * @return {XMLHttpRequest|XDomainRequest} the request object.
 
 * @see https://github.com/Raynos/xhr
 
 */
 
videojs.xhr = _xhr2['default'];
 

	
 
/**
 
 * TextTrack class
 
 *
 
 * @type {Function}
 
 */
 
videojs.TextTrack = _tracksTextTrackJs2['default'];
 

	
 
// REMOVING: We probably should add this to the migration plugin
 
// // Expose but deprecate the window[componentName] method for accessing components
 
// Object.getOwnPropertyNames(Component.components).forEach(function(name){
 
//   let component = Component.components[name];
 
//
 
//   // A deprecation warning as the constuctor
 
//   module.exports[name] = function(player, options, ready){
 
//     log.warn('Using videojs.'+name+' to access the '+name+' component has been deprecated. Please use videojs.getComponent("componentName")');
 
//
 
//     return new Component(player, options, ready);
 
//   };
 
//
 
//   // Allow the prototype and class methods to be accessible still this way
 
//   // Though anything that attempts to override class methods will no longer work
 
//   assign(module.exports[name], component);
 
// });
 

	
 
/*
 
 * Custom Universal Module Definition (UMD)
 
 *
 
 * Video.js will never be a non-browser lib so we can simplify UMD a bunch and
 
 * still support requirejs and browserify. This also needs to be closure
 
 * compiler compatible, so string keys are used.
 
 */
 
if (typeof define === 'function' && define['amd']) {
 
  define('videojs', [], function () {
 
    return videojs;
 
  });
 

	
 
  // checking that module is an object too because of umdjs/umd#35
 
} else if (typeof exports === 'object' && typeof module === 'object') {
 
    module['exports'] = videojs;
 
  }
 

	
 
exports['default'] = videojs;
 
module.exports = exports['default'];
 

	
 
},{"../../src/js/utils/merge-options.js":124,"./component":58,"./event-target":90,"./extend.js":91,"./player":98,"./plugins.js":99,"./setup":101,"./tech/flash.js":104,"./tech/html5.js":105,"./tracks/text-track.js":114,"./utils/browser.js":115,"./utils/create-deprecation-proxy.js":117,"./utils/dom.js":118,"./utils/events.js":119,"./utils/fn.js":120,"./utils/format-time.js":121,"./utils/log.js":123,"./utils/stylesheet.js":125,"./utils/time-ranges.js":126,"./utils/url.js":128,"global/document":1,"lodash-compat/object/merge":40,"object.assign":43,"xhr":50}]},{},[129])(129)
 
});
 

	
 

	
 
//# sourceMappingURL=video.js.map
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/alt/video.novtt.min.js
Show inline comments
 
new file 100644
 
/**
 
 * @license
 
 * Video.js 5.0.0 <http://videojs.com/>
 
 * Copyright Brightcove, Inc. <https://www.brightcove.com/>
 
 * Available under Apache License Version 2.0
 
 * <https://github.com/videojs/video.js/blob/master/LICENSE>
 
 */
 
!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.videojs=a()}}(function(){var a;return function b(a,c,d){function e(g,h){if(!c[g]){if(!a[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};a[g][0].call(k.exports,function(b){var c=a[g][1][b];return e(c?c:b)},k,k.exports,b,a,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b){(function(c){var d="undefined"!=typeof c?c:"undefined"!=typeof window?window:{},e=a("min-document");if("undefined"!=typeof document)b.exports=document;else{var f=d["__GLOBAL_DOCUMENT_CACHE@4"];f||(f=d["__GLOBAL_DOCUMENT_CACHE@4"]=e),b.exports=f}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"min-document":3}],2:[function(a,b){(function(a){b.exports="undefined"!=typeof window?window:"undefined"!=typeof a?a:"undefined"!=typeof self?self:{}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],3:[function(){},{}],4:[function(a,b){var c=a("../internal/getNative"),d=c(Date,"now"),e=d||function(){return(new Date).getTime()};b.exports=e},{"../internal/getNative":20}],5:[function(a,b){function c(a,b,c){function h(){r&&clearTimeout(r),n&&clearTimeout(n),t=0,n=r=s=void 0}function i(b,c){c&&clearTimeout(c),n=r=s=void 0,b&&(t=e(),o=a.apply(q,m),r||n||(m=q=void 0))}function j(){var a=b-(e()-p);0>=a||a>b?i(s,n):r=setTimeout(j,a)}function k(){i(v,r)}function l(){if(m=arguments,p=e(),q=this,s=v&&(r||!w),u===!1)var c=w&&!r;else{n||w||(t=p);var d=u-(p-t),f=0>=d||d>u;f?(n&&(n=clearTimeout(n)),t=p,o=a.apply(q,m)):n||(n=setTimeout(k,d))}return f&&r?r=clearTimeout(r):r||b===u||(r=setTimeout(j,b)),c&&(f=!0,o=a.apply(q,m)),!f||r||n||(m=q=void 0),o}var m,n,o,p,q,r,s,t=0,u=!1,v=!0;if("function"!=typeof a)throw new TypeError(f);if(b=0>b?0:+b||0,c===!0){var w=!0;v=!1}else d(c)&&(w=!!c.leading,u="maxWait"in c&&g(+c.maxWait||0,b),v="trailing"in c?!!c.trailing:v);return l.cancel=h,l}var d=a("../lang/isObject"),e=a("../date/now"),f="Expected a function",g=Math.max;b.exports=c},{"../date/now":4,"../lang/isObject":33}],6:[function(a,b){function c(a,b){if("function"!=typeof a)throw new TypeError(d);return b=e(void 0===b?a.length-1:+b||0,0),function(){for(var c=arguments,d=-1,f=e(c.length-b,0),g=Array(f);++d<f;)g[d]=c[b+d];switch(b){case 0:return a.call(this,g);case 1:return a.call(this,c[0],g);case 2:return a.call(this,c[0],c[1],g)}var h=Array(b+1);for(d=-1;++d<b;)h[d]=c[d];return h[b]=g,a.apply(this,h)}}var d="Expected a function",e=Math.max;b.exports=c},{}],7:[function(a,b){function c(a,b,c){var g=!0,h=!0;if("function"!=typeof a)throw new TypeError(f);return c===!1?g=!1:e(c)&&(g="leading"in c?!!c.leading:g,h="trailing"in c?!!c.trailing:h),d(a,b,{leading:g,maxWait:+b,trailing:h})}var d=a("./debounce"),e=a("../lang/isObject"),f="Expected a function";b.exports=c},{"../lang/isObject":33,"./debounce":5}],8:[function(a,b){function c(a,b){var c=-1,d=a.length;for(b||(b=Array(d));++c<d;)b[c]=a[c];return b}b.exports=c},{}],9:[function(a,b){function c(a,b){for(var c=-1,d=a.length;++c<d&&b(a[c],c,a)!==!1;);return a}b.exports=c},{}],10:[function(a,b){function c(a,b,c){c||(c={});for(var d=-1,e=b.length;++d<e;){var f=b[d];c[f]=a[f]}return c}b.exports=c},{}],11:[function(a,b){var c=a("./createBaseFor"),d=c();b.exports=d},{"./createBaseFor":18}],12:[function(a,b){function c(a,b){return d(a,b,e)}var d=a("./baseFor"),e=a("../object/keysIn");b.exports=c},{"../object/keysIn":39,"./baseFor":11}],13:[function(a,b){function c(a,b,l,m,n){if(!h(a))return a;var o=g(b)&&(f(b)||j(b)),p=o?void 0:k(b);return d(p||b,function(d,f){if(p&&(f=d,d=b[f]),i(d))m||(m=[]),n||(n=[]),e(a,b,f,c,l,m,n);else{var g=a[f],h=l?l(g,d,f,a,b):void 0,j=void 0===h;j&&(h=d),void 0===h&&(!o||f in a)||!j&&(h===h?h===g:g!==g)||(a[f]=h)}}),a}var d=a("./arrayEach"),e=a("./baseMergeDeep"),f=a("../lang/isArray"),g=a("./isArrayLike"),h=a("../lang/isObject"),i=a("./isObjectLike"),j=a("../lang/isTypedArray"),k=a("../object/keys");b.exports=c},{"../lang/isArray":30,"../lang/isObject":33,"../lang/isTypedArray":36,"../object/keys":38,"./arrayEach":9,"./baseMergeDeep":14,"./isArrayLike":21,"./isObjectLike":26}],14:[function(a,b){function c(a,b,c,k,l,m,n){for(var o=m.length,p=b[c];o--;)if(m[o]==p)return void(a[c]=n[o]);var q=a[c],r=l?l(q,p,c,a,b):void 0,s=void 0===r;s&&(r=p,g(p)&&(f(p)||i(p))?r=f(q)?q:g(q)?d(q):[]:h(p)||e(p)?r=e(q)?j(q):h(q)?q:{}:s=!1),m.push(p),n.push(r),s?a[c]=k(r,p,l,m,n):(r===r?r!==q:q===q)&&(a[c]=r)}var d=a("./arrayCopy"),e=a("../lang/isArguments"),f=a("../lang/isArray"),g=a("./isArrayLike"),h=a("../lang/isPlainObject"),i=a("../lang/isTypedArray"),j=a("../lang/toPlainObject");b.exports=c},{"../lang/isArguments":29,"../lang/isArray":30,"../lang/isPlainObject":34,"../lang/isTypedArray":36,"../lang/toPlainObject":37,"./arrayCopy":8,"./isArrayLike":21}],15:[function(a,b){function c(a){return function(b){return null==b?void 0:d(b)[a]}}var d=a("./toObject");b.exports=c},{"./toObject":28}],16:[function(a,b){function c(a,b,c){if("function"!=typeof a)return d;if(void 0===b)return a;switch(c){case 1:return function(c){return a.call(b,c)};case 3:return function(c,d,e){return a.call(b,c,d,e)};case 4:return function(c,d,e,f){return a.call(b,c,d,e,f)};case 5:return function(c,d,e,f,g){return a.call(b,c,d,e,f,g)}}return function(){return a.apply(b,arguments)}}var d=a("../utility/identity");b.exports=c},{"../utility/identity":42}],17:[function(a,b){function c(a){return f(function(b,c){var f=-1,g=null==b?0:c.length,h=g>2?c[g-2]:void 0,i=g>2?c[2]:void 0,j=g>1?c[g-1]:void 0;for("function"==typeof h?(h=d(h,j,5),g-=2):(h="function"==typeof j?j:void 0,g-=h?1:0),i&&e(c[0],c[1],i)&&(h=3>g?void 0:h,g=1);++f<g;){var k=c[f];k&&a(b,k,h)}return b})}var d=a("./bindCallback"),e=a("./isIterateeCall"),f=a("../function/restParam");b.exports=c},{"../function/restParam":6,"./bindCallback":16,"./isIterateeCall":24}],18:[function(a,b){function c(a){return function(b,c,e){for(var f=d(b),g=e(b),h=g.length,i=a?h:-1;a?i--:++i<h;){var j=g[i];if(c(f[j],j,f)===!1)break}return b}}var d=a("./toObject");b.exports=c},{"./toObject":28}],19:[function(a,b){var c=a("./baseProperty"),d=c("length");b.exports=d},{"./baseProperty":15}],20:[function(a,b){function c(a,b){var c=null==a?void 0:a[b];return d(c)?c:void 0}var d=a("../lang/isNative");b.exports=c},{"../lang/isNative":32}],21:[function(a,b){function c(a){return null!=a&&e(d(a))}var d=a("./getLength"),e=a("./isLength");b.exports=c},{"./getLength":19,"./isLength":25}],22:[function(a,b){var c=function(){try{Object({toString:0}+"")}catch(a){return function(){return!1}}return function(a){return"function"!=typeof a.toString&&"string"==typeof(a+"")}}();b.exports=c},{}],23:[function(a,b){function c(a,b){return a="number"==typeof a||d.test(a)?+a:-1,b=null==b?e:b,a>-1&&a%1==0&&b>a}var d=/^\d+$/,e=9007199254740991;b.exports=c},{}],24:[function(a,b){function c(a,b,c){if(!f(c))return!1;var g=typeof b;if("number"==g?d(c)&&e(b,c.length):"string"==g&&b in c){var h=c[b];return a===a?a===h:h!==h}return!1}var d=a("./isArrayLike"),e=a("./isIndex"),f=a("../lang/isObject");b.exports=c},{"../lang/isObject":33,"./isArrayLike":21,"./isIndex":23}],25:[function(a,b){function c(a){return"number"==typeof a&&a>-1&&a%1==0&&d>=a}var d=9007199254740991;b.exports=c},{}],26:[function(a,b){function c(a){return!!a&&"object"==typeof a}b.exports=c},{}],27:[function(a,b){function c(a){for(var b=i(a),c=b.length,j=c&&a.length,l=!!j&&g(j)&&(e(a)||d(a)||h(a)),m=-1,n=[];++m<c;){var o=b[m];(l&&f(o,j)||k.call(a,o))&&n.push(o)}return n}var d=a("../lang/isArguments"),e=a("../lang/isArray"),f=a("./isIndex"),g=a("./isLength"),h=a("../lang/isString"),i=a("../object/keysIn"),j=Object.prototype,k=j.hasOwnProperty;b.exports=c},{"../lang/isArguments":29,"../lang/isArray":30,"../lang/isString":35,"../object/keysIn":39,"./isIndex":23,"./isLength":25}],28:[function(a,b){function c(a){if(f.unindexedChars&&e(a)){for(var b=-1,c=a.length,g=Object(a);++b<c;)g[b]=a.charAt(b);return g}return d(a)?a:Object(a)}var d=a("../lang/isObject"),e=a("../lang/isString"),f=a("../support");b.exports=c},{"../lang/isObject":33,"../lang/isString":35,"../support":41}],29:[function(a,b){function c(a){return e(a)&&d(a)&&g.call(a,"callee")&&!h.call(a,"callee")}var d=a("../internal/isArrayLike"),e=a("../internal/isObjectLike"),f=Object.prototype,g=f.hasOwnProperty,h=f.propertyIsEnumerable;b.exports=c},{"../internal/isArrayLike":21,"../internal/isObjectLike":26}],30:[function(a,b){var c=a("../internal/getNative"),d=a("../internal/isLength"),e=a("../internal/isObjectLike"),f="[object Array]",g=Object.prototype,h=g.toString,i=c(Array,"isArray"),j=i||function(a){return e(a)&&d(a.length)&&h.call(a)==f};b.exports=j},{"../internal/getNative":20,"../internal/isLength":25,"../internal/isObjectLike":26}],31:[function(a,b){function c(a){return d(a)&&g.call(a)==e}var d=a("./isObject"),e="[object Function]",f=Object.prototype,g=f.toString;b.exports=c},{"./isObject":33}],32:[function(a,b){function c(a){return null==a?!1:d(a)?k.test(i.call(a)):f(a)&&(e(a)?k:g).test(a)}var d=a("./isFunction"),e=a("../internal/isHostObject"),f=a("../internal/isObjectLike"),g=/^\[object .+?Constructor\]$/,h=Object.prototype,i=Function.prototype.toString,j=h.hasOwnProperty,k=RegExp("^"+i.call(j).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");b.exports=c},{"../internal/isHostObject":22,"../internal/isObjectLike":26,"./isFunction":31}],33:[function(a,b){function c(a){var b=typeof a;return!!a&&("object"==b||"function"==b)}b.exports=c},{}],34:[function(a,b){function c(a){var b;if(!g(a)||l.call(a)!=i||f(a)||e(a)||!k.call(a,"constructor")&&(b=a.constructor,"function"==typeof b&&!(b instanceof b)))return!1;var c;return h.ownLast?(d(a,function(a,b,d){return c=k.call(d,b),!1}),c!==!1):(d(a,function(a,b){c=b}),void 0===c||k.call(a,c))}var d=a("../internal/baseForIn"),e=a("./isArguments"),f=a("../internal/isHostObject"),g=a("../internal/isObjectLike"),h=a("../support"),i="[object Object]",j=Object.prototype,k=j.hasOwnProperty,l=j.toString;b.exports=c},{"../internal/baseForIn":12,"../internal/isHostObject":22,"../internal/isObjectLike":26,"../support":41,"./isArguments":29}],35:[function(a,b){function c(a){return"string"==typeof a||d(a)&&g.call(a)==e}var d=a("../internal/isObjectLike"),e="[object String]",f=Object.prototype,g=f.toString;b.exports=c},{"../internal/isObjectLike":26}],36:[function(a,b){function c(a){return e(a)&&d(a.length)&&!!C[E.call(a)]}var d=a("../internal/isLength"),e=a("../internal/isObjectLike"),f="[object Arguments]",g="[object Array]",h="[object Boolean]",i="[object Date]",j="[object Error]",k="[object Function]",l="[object Map]",m="[object Number]",n="[object Object]",o="[object RegExp]",p="[object Set]",q="[object String]",r="[object WeakMap]",s="[object ArrayBuffer]",t="[object Float32Array]",u="[object Float64Array]",v="[object Int8Array]",w="[object Int16Array]",x="[object Int32Array]",y="[object Uint8Array]",z="[object Uint8ClampedArray]",A="[object Uint16Array]",B="[object Uint32Array]",C={};C[t]=C[u]=C[v]=C[w]=C[x]=C[y]=C[z]=C[A]=C[B]=!0,C[f]=C[g]=C[s]=C[h]=C[i]=C[j]=C[k]=C[l]=C[m]=C[n]=C[o]=C[p]=C[q]=C[r]=!1;var D=Object.prototype,E=D.toString;b.exports=c},{"../internal/isLength":25,"../internal/isObjectLike":26}],37:[function(a,b){function c(a){return d(a,e(a))}var d=a("../internal/baseCopy"),e=a("../object/keysIn");b.exports=c},{"../internal/baseCopy":10,"../object/keysIn":39}],38:[function(a,b){var c=a("../internal/getNative"),d=a("../internal/isArrayLike"),e=a("../lang/isObject"),f=a("../internal/shimKeys"),g=a("../support"),h=c(Object,"keys"),i=h?function(a){var b=null==a?void 0:a.constructor;return"function"==typeof b&&b.prototype===a||("function"==typeof a?g.enumPrototypes:d(a))?f(a):e(a)?h(a):[]}:f;b.exports=i},{"../internal/getNative":20,"../internal/isArrayLike":21,"../internal/shimKeys":27,"../lang/isObject":33,"../support":41}],39:[function(a,b){function c(a){if(null==a)return[];j(a)||(a=Object(a));var b=a.length;b=b&&i(b)&&(f(a)||e(a)||k(a))&&b||0;for(var c=a.constructor,d=-1,m=g(c)&&c.prototype||x,n=m===a,o=Array(b),q=b>0,r=l.enumErrorProps&&(a===w||a instanceof Error),t=l.enumPrototypes&&g(a);++d<b;)o[d]=d+"";for(var C in a)t&&"prototype"==C||r&&("message"==C||"name"==C)||q&&h(C,b)||"constructor"==C&&(n||!z.call(a,C))||o.push(C);if(l.nonEnumShadows&&a!==x){var D=a===y?u:a===w?p:A.call(a),E=B[D]||B[s];for(D==s&&(m=x),b=v.length;b--;){C=v[b];var F=E[C];n&&F||(F?!z.call(a,C):a[C]===m[C])||o.push(C)}}return o}var d=a("../internal/arrayEach"),e=a("../lang/isArguments"),f=a("../lang/isArray"),g=a("../lang/isFunction"),h=a("../internal/isIndex"),i=a("../internal/isLength"),j=a("../lang/isObject"),k=a("../lang/isString"),l=a("../support"),m="[object Array]",n="[object Boolean]",o="[object Date]",p="[object Error]",q="[object Function]",r="[object Number]",s="[object Object]",t="[object RegExp]",u="[object String]",v=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],w=Error.prototype,x=Object.prototype,y=String.prototype,z=x.hasOwnProperty,A=x.toString,B={};B[m]=B[o]=B[r]={constructor:!0,toLocaleString:!0,toString:!0,valueOf:!0},B[n]=B[u]={constructor:!0,toString:!0,valueOf:!0},B[p]=B[q]=B[t]={constructor:!0,toString:!0},B[s]={constructor:!0},d(v,function(a){for(var b in B)if(z.call(B,b)){var c=B[b];c[a]=z.call(c,a)}}),b.exports=c},{"../internal/arrayEach":9,"../internal/isIndex":23,"../internal/isLength":25,"../lang/isArguments":29,"../lang/isArray":30,"../lang/isFunction":31,"../lang/isObject":33,"../lang/isString":35,"../support":41}],40:[function(a,b){var c=a("../internal/baseMerge"),d=a("../internal/createAssigner"),e=d(c);b.exports=e},{"../internal/baseMerge":13,"../internal/createAssigner":17}],41:[function(a,b){var c=Array.prototype,d=Error.prototype,e=Object.prototype,f=e.propertyIsEnumerable,g=c.splice,h={};!function(a){var b=function(){this.x=a},c={0:a,length:a},e=[];b.prototype={valueOf:a,y:a};for(var i in new b)e.push(i);h.enumErrorProps=f.call(d,"message")||f.call(d,"name"),h.enumPrototypes=f.call(b,"prototype"),h.nonEnumShadows=!/valueOf/.test(e),h.ownLast="x"!=e[0],h.spliceObjects=(g.call(c,0,1),!c[0]),h.unindexedChars="x"[0]+Object("x")[0]!="xx"}(1,0),b.exports=h},{}],42:[function(a,b){function c(a){return a}b.exports=c},{}],43:[function(a,b){"use strict";var c=a("object-keys"),d=function(a){return"undefined"!=typeof a&&null!==a},e="function"==typeof Symbol&&"symbol"==typeof Symbol(),f=a("define-properties"),g=Object,h=Array.prototype.push,i=Object.prototype.propertyIsEnumerable,j=function(a){if(!d(a))throw new TypeError("target must be an object");var b,f,j,k,l,m=g(a);for(b=1;b<arguments.length;++b){if(f=g(arguments[b]),k=c(f),e&&Object.getOwnPropertySymbols)for(l=Object.getOwnPropertySymbols(f),j=0;j<l.length;++j)i.call(f,l[j])&&h.call(k,l[j]);for(j=0;j<k.length;++j)m[k[j]]=f[k[j]]}return m};f(j,{shim:function(){var a=function(){if(!Object.assign||!Object.preventExtensions)return!1;var a=Object.preventExtensions({1:2});try{Object.assign(a,"xy")}catch(b){return"y"===a[1]}};return f(Object,{assign:j},{assign:a}),Object.assign||j}}),b.exports=j},{"define-properties":44,"object-keys":46}],44:[function(a,b){"use strict";var c=a("object-keys"),d=a("foreach"),e="function"==typeof Symbol&&"symbol"==typeof Symbol(),f=Object.prototype.toString,g=function(a){return"function"==typeof a&&"[object Function]"===f.call(a)},h=function(){var a={};try{Object.defineProperty(a,"x",{value:a,enumerable:!1});for(var b in a)return!1;return a.x===a}catch(c){return!1}},i=Object.defineProperty&&h(),j=function(a,b,c,d){(!(b in a)||g(d)&&d())&&(i?Object.defineProperty(a,b,{configurable:!0,enumerable:!1,writable:!0,value:c}):a[b]=c)},k=function(a,b){var f=arguments.length>2?arguments[2]:{},g=c(b);e&&(g=g.concat(Object.getOwnPropertySymbols(b))),d(g,function(c){j(a,c,b[c],f[c])})};k.supportsDescriptors=!!i,b.exports=k},{foreach:45,"object-keys":46}],45:[function(a,b){var c=Object.prototype.hasOwnProperty,d=Object.prototype.toString;b.exports=function(a,b,e){if("[object Function]"!==d.call(b))throw new TypeError("iterator must be a function");var f=a.length;if(f===+f)for(var g=0;f>g;g++)b.call(e,a[g],g,a);else for(var h in a)c.call(a,h)&&b.call(e,a[h],h,a)}},{}],46:[function(a,b){"use strict";var c=Object.prototype.hasOwnProperty,d=Object.prototype.toString,e=Array.prototype.slice,f=a("./isArguments"),g=!{toString:null}.propertyIsEnumerable("toString"),h=function(){}.propertyIsEnumerable("prototype"),i=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],j=function(a){var b=a.constructor;return b&&b.prototype===a},k={$window:!0,$console:!0,$parent:!0,$self:!0,$frames:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0},l=function(){if("undefined"==typeof window)return!1;for(var a in window)if(!k["$"+a]&&c.call(window,a)&&null!==window[a]&&"object"==typeof window[a])try{j(window[a])}catch(b){return!0}return!1}(),m=function(a){if("undefined"==typeof window&&!l)return j(a);try{return j(a)}catch(b){return!1}},n=function(a){var b=null!==a&&"object"==typeof a,e="[object Function]"===d.call(a),j=f(a),k=b&&"[object String]"===d.call(a),l=[];if(!b&&!e&&!j)throw new TypeError("Object.keys called on a non-object");var n=h&&e;if(k&&a.length>0&&!c.call(a,0))for(var o=0;o<a.length;++o)l.push(String(o));if(j&&a.length>0)for(var p=0;p<a.length;++p)l.push(String(p));else for(var q in a)n&&"prototype"===q||!c.call(a,q)||l.push(String(q));if(g)for(var r=m(a),s=0;s<i.length;++s)r&&"constructor"===i[s]||!c.call(a,i[s])||l.push(i[s]);return l};n.shim=function(){if(Object.keys){var a=function(){return 2===(Object.keys(arguments)||"").length}(1,2);if(!a){var b=Object.keys;Object.keys=function(a){return b(f(a)?e.call(a):a)}}}else Object.keys=n;return Object.keys||n},b.exports=n},{"./isArguments":47}],47:[function(a,b){"use strict";var c=Object.prototype.toString;b.exports=function(a){var b=c.call(a),d="[object Arguments]"===b;return d||(d="[object Array]"!==b&&null!==a&&"object"==typeof a&&"number"==typeof a.length&&a.length>=0&&"[object Function]"===c.call(a.callee)),d}},{}],48:[function(a,b){function c(a,b){var c,d=null;try{c=JSON.parse(a,b)}catch(e){d=e}return[d,c]}b.exports=c},{}],49:[function(a,b){function c(a){return a.replace(/\n\r?\s*/g,"")}b.exports=function(a){for(var b="",d=0;d<arguments.length;d++)b+=c(a[d])+(arguments[d+1]||"");return b}},{}],50:[function(a,b){"use strict";function c(a){for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}function d(a,b){function e(){4===l.readyState&&j()}function f(){var a=void 0;if(l.response?a=l.response:"text"!==l.responseType&&l.responseType||(a=l.responseText||l.responseXML),u)try{a=JSON.parse(a)}catch(b){}return a}function i(a){clearTimeout(o),a instanceof Error||(a=new Error(""+(a||"Unknown XMLHttpRequest Error"))),a.statusCode=0,b(a,k)}function j(){if(!n){var c;clearTimeout(o),c=a.useXDR&&void 0===l.status?200:1223===l.status?204:l.status;var d=k,e=null;0!==c?(d={body:f(),statusCode:c,method:q,headers:{},url:p,rawRequest:l},l.getAllResponseHeaders&&(d.headers=h(l.getAllResponseHeaders()))):e=new Error("Internal XMLHttpRequest Error"),b(e,d,d.body)}}var k={body:void 0,headers:{},statusCode:0,method:q,url:p,rawRequest:l};if("string"==typeof a&&(a={uri:a}),a=a||{},"undefined"==typeof b)throw new Error("callback argument missing");b=g(b);var l=a.xhr||null;l||(l=a.cors||a.useXDR?new d.XDomainRequest:new d.XMLHttpRequest);var m,n,o,p=l.url=a.uri||a.url,q=l.method=a.method||"GET",r=a.body||a.data,s=l.headers=a.headers||{},t=!!a.sync,u=!1;if("json"in a&&(u=!0,s.accept||s.Accept||(s.Accept="application/json"),"GET"!==q&&"HEAD"!==q&&(s["content-type"]||s["Content-Type"]||(s["Content-Type"]="application/json"),r=JSON.stringify(a.json))),l.onreadystatechange=e,l.onload=j,l.onerror=i,l.onprogress=function(){},l.ontimeout=i,l.open(q,p,!t,a.username,a.password),t||(l.withCredentials=!!a.withCredentials),!t&&a.timeout>0&&(o=setTimeout(function(){n=!0,l.abort("timeout");var a=new Error("XMLHttpRequest timeout");a.code="ETIMEDOUT",i(a)},a.timeout)),l.setRequestHeader)for(m in s)s.hasOwnProperty(m)&&l.setRequestHeader(m,s[m]);else if(a.headers&&!c(a.headers))throw new Error("Headers cannot be set on an XDomainRequest object");return"responseType"in a&&(l.responseType=a.responseType),"beforeSend"in a&&"function"==typeof a.beforeSend&&a.beforeSend(l),l.send(r),l}function e(){}var f=a("global/window"),g=a("once"),h=a("parse-headers");b.exports=d,d.XMLHttpRequest=f.XMLHttpRequest||e,d.XDomainRequest="withCredentials"in new d.XMLHttpRequest?d.XMLHttpRequest:f.XDomainRequest},{"global/window":2,once:51,"parse-headers":55}],51:[function(a,b){function c(a){var b=!1;return function(){return b?void 0:(b=!0,a.apply(this,arguments))}}b.exports=c,c.proto=c(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return c(this)},configurable:!0})})},{}],52:[function(a,b){function c(a,b,c){if(!g(b))throw new TypeError("iterator must be a function");arguments.length<3&&(c=this),"[object Array]"===h.call(a)?d(a,b,c):"string"==typeof a?e(a,b,c):f(a,b,c)}function d(a,b,c){for(var d=0,e=a.length;e>d;d++)i.call(a,d)&&b.call(c,a[d],d,a)}function e(a,b,c){for(var d=0,e=a.length;e>d;d++)b.call(c,a.charAt(d),d,a)}function f(a,b,c){for(var d in a)i.call(a,d)&&b.call(c,a[d],d,a)}var g=a("is-function");b.exports=c;var h=Object.prototype.toString,i=Object.prototype.hasOwnProperty},{"is-function":53}],53:[function(a,b){function c(a){var b=d.call(a);return"[object Function]"===b||"function"==typeof a&&"[object RegExp]"!==b||"undefined"!=typeof window&&(a===window.setTimeout||a===window.alert||a===window.confirm||a===window.prompt)}b.exports=c;var d=Object.prototype.toString},{}],54:[function(a,b,c){function d(a){return a.replace(/^\s*|\s*$/g,"")}c=b.exports=d,c.left=function(a){return a.replace(/^\s*/,"")},c.right=function(a){return a.replace(/\s*$/,"")}},{}],55:[function(a,b){var c=a("trim"),d=a("for-each"),e=function(a){return"[object Array]"===Object.prototype.toString.call(a)};b.exports=function(a){if(!a)return{};var b={};return d(c(a).split("\n"),function(a){var d=a.indexOf(":"),f=c(a.slice(0,d)).toLowerCase(),g=c(a.slice(d+1));"undefined"==typeof b[f]?b[f]=g:e(b[f])?b[f].push(g):b[f]=[b[f],g]}),b}},{"for-each":52,trim:54}],56:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("./button.js"),h=d(g),i=a("./component.js"),j=d(i),k=function(a){function b(c,d){e(this,b),a.call(this,c,d)}return f(b,a),b.prototype.buildCSSClass=function(){return"vjs-big-play-button"},b.prototype.handleClick=function(){this.player_.play()},b}(h["default"]);k.prototype.controlText_="Play Video",j["default"].registerComponent("BigPlayButton",k),c["default"]=k,b.exports=c["default"]},{"./button.js":57,"./component.js":58}],57:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("./component"),i=e(h),j=a("./utils/dom.js"),k=d(j),l=a("./utils/events.js"),m=d(l),n=a("./utils/fn.js"),o=d(n),p=a("global/document"),q=e(p),r=a("object.assign"),s=e(r),t=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.emitTapEvents(),this.on("tap",this.handleClick),this.on("click",this.handleClick),this.on("focus",this.handleFocus),this.on("blur",this.handleBlur)}return g(b,a),b.prototype.createEl=function(){var b=arguments.length<=0||void 0===arguments[0]?"button":arguments[0],c=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],d=arguments.length<=2||void 0===arguments[2]?{}:arguments[2];c=s["default"]({className:this.buildCSSClass(),tabIndex:0},c),d=s["default"]({role:"button",type:"button","aria-live":"polite"},d);var e=a.prototype.createEl.call(this,b,c,d);return this.controlTextEl_=k.createEl("span",{className:"vjs-control-text"}),e.appendChild(this.controlTextEl_),this.controlText(this.controlText_),e},b.prototype.controlText=function(a){return a?(this.controlText_=a,this.controlTextEl_.innerHTML=this.localize(this.controlText_),this):this.controlText_||"Need Text"},b.prototype.buildCSSClass=function(){return"vjs-control vjs-button "+a.prototype.buildCSSClass.call(this)},b.prototype.handleClick=function(){},b.prototype.handleFocus=function(){m.on(q["default"],"keydown",o.bind(this,this.handleKeyPress))},b.prototype.handleKeyPress=function(a){(32===a.which||13===a.which)&&(a.preventDefault(),this.handleClick(a))},b.prototype.handleBlur=function(){m.off(q["default"],"keydown",o.bind(this,this.handleKeyPress))},b}(i["default"]);i["default"].registerComponent("Button",t),c["default"]=t,b.exports=c["default"]},{"./component":58,"./utils/dom.js":118,"./utils/events.js":119,"./utils/fn.js":120,"global/document":1,"object.assign":43}],58:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}c.__esModule=!0;var g=a("global/window"),h=e(g),i=a("./utils/dom.js"),j=d(i),k=a("./utils/fn.js"),l=d(k),m=a("./utils/guid.js"),n=d(m),o=a("./utils/events.js"),p=d(o),q=a("./utils/log.js"),r=e(q),s=a("./utils/to-title-case.js"),t=e(s),u=a("object.assign"),v=e(u),w=a("./utils/merge-options.js"),x=e(w),y=function(){function a(b,c,d){if(f(this,a),this.player_=!b&&this.play?b=this:b,this.options_=x["default"]({},this.options_),c=this.options_=x["default"](this.options_,c),this.id_=c.id||c.el&&c.el.id,!this.id_){var e=b&&b.id&&b.id()||"no_player";this.id_=e+"_component_"+n.newGUID()}this.name_=c.name||null,c.el?this.el_=c.el:c.createEl!==!1&&(this.el_=this.createEl()),this.children_=[],this.childIndex_={},this.childNameIndex_={},c.initChildren!==!1&&this.initChildren(),this.ready(d),c.reportTouchActivity!==!1&&this.enableTouchActivity()}return a.prototype.dispose=function(){if(this.trigger({type:"dispose",bubbles:!1}),this.children_)for(var a=this.children_.length-1;a>=0;a--)this.children_[a].dispose&&this.children_[a].dispose();this.children_=null,this.childIndex_=null,this.childNameIndex_=null,this.off(),this.el_.parentNode&&this.el_.parentNode.removeChild(this.el_),j.removeElData(this.el_),this.el_=null},a.prototype.player=function(){return this.player_},a.prototype.options=function(a){return r["default"].warn("this.options() has been deprecated and will be moved to the constructor in 6.0"),a?(this.options_=x["default"](this.options_,a),this.options_):this.options_},a.prototype.el=function(){return this.el_},a.prototype.createEl=function(a,b,c){return j.createEl(a,b,c)},a.prototype.localize=function(a){var b=this.player_.language&&this.player_.language(),c=this.player_.languages&&this.player_.languages();if(!b||!c)return a;var d=c[b];if(d&&d[a])return d[a];var e=b.split("-")[0],f=c[e];return f&&f[a]?f[a]:a},a.prototype.contentEl=function(){return this.contentEl_||this.el_},a.prototype.id=function(){return this.id_},a.prototype.name=function(){return this.name_},a.prototype.children=function(){return this.children_},a.prototype.getChildById=function(a){return this.childIndex_[a]},a.prototype.getChild=function(a){return this.childNameIndex_[a]},a.prototype.addChild=function(b){var c=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],d=void 0,e=void 0;if("string"==typeof b){e=b,c||(c={}),c===!0&&(r["default"].warn("Initializing a child component with `true` is deprecated. Children should be defined in an array when possible, but if necessary use an object instead of `true`."),c={});var f=c.componentClass||t["default"](e);c.name=e;var g=a.getComponent(f);d=new g(this.player_||this,c)}else d=b;return this.children_.push(d),"function"==typeof d.id&&(this.childIndex_[d.id()]=d),e=e||d.name&&d.name(),e&&(this.childNameIndex_[e]=d),"function"==typeof d.el&&d.el()&&this.contentEl().appendChild(d.el()),d},a.prototype.removeChild=function(a){if("string"==typeof a&&(a=this.getChild(a)),a&&this.children_){for(var b=!1,c=this.children_.length-1;c>=0;c--)if(this.children_[c]===a){b=!0,this.children_.splice(c,1);break}if(b){this.childIndex_[a.id()]=null,this.childNameIndex_[a.name()]=null;var d=a.el();d&&d.parentNode===this.contentEl()&&this.contentEl().removeChild(a.el())}}},a.prototype.initChildren=function(){var a=this,b=this.options_.children;b&&!function(){var c=a.options_,d=function(b,d){void 0!==c[b]&&(d=c[b]),d!==!1&&(d===!0&&(d={}),d.playerOptions=a.options_.playerOptions,a[b]=a.addChild(b,d))};if(Array.isArray(b))for(var e=0;e<b.length;e++){var f=b[e],g=void 0,h=void 0;"string"==typeof f?(g=f,h={}):(g=f.name,h=f),d(g,h)}else Object.getOwnPropertyNames(b).forEach(function(a){d(a,b[a])})}()},a.prototype.buildCSSClass=function(){return""},a.prototype.on=function(a,b,c){var d=this;return"string"==typeof a||Array.isArray(a)?p.on(this.el_,a,l.bind(this,b)):!function(){var e=a,f=b,g=l.bind(d,c),h=function(){return d.off(e,f,g)};h.guid=g.guid,d.on("dispose",h);var i=function(){return d.off("dispose",h)};i.guid=g.guid,a.nodeName?(p.on(e,f,g),p.on(e,"dispose",i)):"function"==typeof a.on&&(e.on(f,g),e.on("dispose",i))}(),this},a.prototype.off=function(a,b,c){if(!a||"string"==typeof a||Array.isArray(a))p.off(this.el_,a,b);else{var d=a,e=b,f=l.bind(this,c);this.off("dispose",f),a.nodeName?(p.off(d,e,f),p.off(d,"dispose",f)):(d.off(e,f),d.off("dispose",f))}return this},a.prototype.one=function(a,b,c){var d=this,e=arguments;return"string"==typeof a||Array.isArray(a)?p.one(this.el_,a,l.bind(this,b)):!function(){var f=a,g=b,h=l.bind(d,c),i=function j(){d.off(f,g,j),h.apply(null,e)};i.guid=h.guid,d.on(f,g,i)}(),this},a.prototype.trigger=function(a,b){return p.trigger(this.el_,a,b),this},a.prototype.ready=function(a){var b=arguments.length<=1||void 0===arguments[1]?!1:arguments[1];return a&&(this.isReady_?b?a.call(this):this.setTimeout(a,1):(this.readyQueue_=this.readyQueue_||[],this.readyQueue_.push(a))),this},a.prototype.triggerReady=function(){this.isReady_=!0,this.setTimeout(function(){var a=this.readyQueue_;this.readyQueue_=[],a&&a.length>0&&a.forEach(function(a){a.call(this)},this),this.trigger("ready")},1)},a.prototype.hasClass=function(a){return j.hasElClass(this.el_,a)},a.prototype.addClass=function(a){return j.addElClass(this.el_,a),this},a.prototype.removeClass=function(a){return j.removeElClass(this.el_,a),this},a.prototype.show=function(){return this.removeClass("vjs-hidden"),this},a.prototype.hide=function(){return this.addClass("vjs-hidden"),this},a.prototype.lockShowing=function(){return this.addClass("vjs-lock-showing"),
 
this},a.prototype.unlockShowing=function(){return this.removeClass("vjs-lock-showing"),this},a.prototype.width=function(a,b){return this.dimension("width",a,b)},a.prototype.height=function(a,b){return this.dimension("height",a,b)},a.prototype.dimensions=function(a,b){return this.width(a,!0).height(b)},a.prototype.dimension=function(a,b,c){if(void 0!==b)return(null===b||b!==b)&&(b=0),this.el_.style[a]=-1!==(""+b).indexOf("%")||-1!==(""+b).indexOf("px")?b:"auto"===b?"":b+"px",c||this.trigger("resize"),this;if(!this.el_)return 0;var d=this.el_.style[a],e=d.indexOf("px");return-1!==e?parseInt(d.slice(0,e),10):parseInt(this.el_["offset"+t["default"](a)],10)},a.prototype.emitTapEvents=function(){var a=0,b=null,c=10,d=200,e=void 0;this.on("touchstart",function(c){1===c.touches.length&&(b=v["default"]({},c.touches[0]),a=(new Date).getTime(),e=!0)}),this.on("touchmove",function(a){if(a.touches.length>1)e=!1;else if(b){var d=a.touches[0].pageX-b.pageX,f=a.touches[0].pageY-b.pageY,g=Math.sqrt(d*d+f*f);g>c&&(e=!1)}});var f=function(){e=!1};this.on("touchleave",f),this.on("touchcancel",f),this.on("touchend",function(c){if(b=null,e===!0){var f=(new Date).getTime()-a;d>f&&(c.preventDefault(),this.trigger("tap"))}})},a.prototype.enableTouchActivity=function(){if(this.player()&&this.player().reportUserActivity){var a=l.bind(this.player(),this.player().reportUserActivity),b=void 0;this.on("touchstart",function(){a(),this.clearInterval(b),b=this.setInterval(a,250)});var c=function(){a(),this.clearInterval(b)};this.on("touchmove",a),this.on("touchend",c),this.on("touchcancel",c)}},a.prototype.setTimeout=function(a,b){a=l.bind(this,a);var c=h["default"].setTimeout(a,b),d=function(){this.clearTimeout(c)};return d.guid="vjs-timeout-"+c,this.on("dispose",d),c},a.prototype.clearTimeout=function(a){h["default"].clearTimeout(a);var b=function(){};return b.guid="vjs-timeout-"+a,this.off("dispose",b),a},a.prototype.setInterval=function(a,b){a=l.bind(this,a);var c=h["default"].setInterval(a,b),d=function(){this.clearInterval(c)};return d.guid="vjs-interval-"+c,this.on("dispose",d),c},a.prototype.clearInterval=function(a){h["default"].clearInterval(a);var b=function(){};return b.guid="vjs-interval-"+a,this.off("dispose",b),a},a.registerComponent=function(b,c){return a.components_||(a.components_={}),a.components_[b]=c,c},a.getComponent=function(b){return a.components_&&a.components_[b]?a.components_[b]:h["default"]&&h["default"].videojs&&h["default"].videojs[b]?(r["default"].warn("The "+b+" component was added to the videojs object when it should be registered using videojs.registerComponent(name, component)"),h["default"].videojs[b]):void 0},a.extend=function(b){b=b||{},r["default"].warn("Component.extend({}) has been deprecated, use videojs.extend(Component, {}) instead");var c=b.init||b.init||this.prototype.init||this.prototype.init||function(){},d=function(){c.apply(this,arguments)};d.prototype=Object.create(this.prototype),d.prototype.constructor=d,d.extend=a.extend;for(var e in b)b.hasOwnProperty(e)&&(d.prototype[e]=b[e]);return d},a}();y.registerComponent("Component",y),c["default"]=y,b.exports=c["default"]},{"./utils/dom.js":118,"./utils/events.js":119,"./utils/fn.js":120,"./utils/guid.js":122,"./utils/log.js":123,"./utils/merge-options.js":124,"./utils/to-title-case.js":127,"global/window":2,"object.assign":43}],59:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../component.js"),h=d(g),i=a("./play-toggle.js"),j=(d(i),a("./time-controls/current-time-display.js")),k=(d(j),a("./time-controls/duration-display.js")),l=(d(k),a("./time-controls/time-divider.js")),m=(d(l),a("./time-controls/remaining-time-display.js")),n=(d(m),a("./live-display.js")),o=(d(n),a("./progress-control/progress-control.js")),p=(d(o),a("./fullscreen-toggle.js")),q=(d(p),a("./volume-control/volume-control.js")),r=(d(q),a("./volume-menu-button.js")),s=(d(r),a("./mute-toggle.js")),t=(d(s),a("./text-track-controls/chapters-button.js")),u=(d(t),a("./text-track-controls/subtitles-button.js")),v=(d(u),a("./text-track-controls/captions-button.js")),w=(d(v),a("./playback-rate-menu/playback-rate-menu-button.js")),x=(d(w),a("./spacer-controls/custom-control-spacer.js")),y=(d(x),function(a){function b(){e(this,b),a.apply(this,arguments)}return f(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-control-bar"})},b}(h["default"]));y.prototype.options_={loadEvent:"play",children:["playToggle","volumeMenuButton","currentTimeDisplay","timeDivider","durationDisplay","progressControl","liveDisplay","remainingTimeDisplay","customControlSpacer","playbackRateMenuButton","chaptersButton","subtitlesButton","captionsButton","fullscreenToggle"]},h["default"].registerComponent("ControlBar",y),c["default"]=y,b.exports=c["default"]},{"../component.js":58,"./fullscreen-toggle.js":60,"./live-display.js":61,"./mute-toggle.js":62,"./play-toggle.js":63,"./playback-rate-menu/playback-rate-menu-button.js":64,"./progress-control/progress-control.js":69,"./spacer-controls/custom-control-spacer.js":71,"./text-track-controls/captions-button.js":74,"./text-track-controls/chapters-button.js":75,"./text-track-controls/subtitles-button.js":78,"./time-controls/current-time-display.js":81,"./time-controls/duration-display.js":82,"./time-controls/remaining-time-display.js":83,"./time-controls/time-divider.js":84,"./volume-control/volume-control.js":86,"./volume-menu-button.js":88}],60:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../button.js"),h=d(g),i=a("../component.js"),j=d(i),k=function(a){function b(){e(this,b),a.apply(this,arguments)}return f(b,a),b.prototype.buildCSSClass=function(){return"vjs-fullscreen-control "+a.prototype.buildCSSClass.call(this)},b.prototype.handleClick=function(){this.player_.isFullscreen()?(this.player_.exitFullscreen(),this.controlText("Fullscreen")):(this.player_.requestFullscreen(),this.controlText("Non-Fullscreen"))},b}(h["default"]);k.prototype.controlText_="Fullscreen",j["default"].registerComponent("FullscreenToggle",k),c["default"]=k,b.exports=c["default"]},{"../button.js":57,"../component.js":58}],61:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../component"),i=e(h),j=a("../utils/dom.js"),k=d(j),l=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.updateShowing(),this.on(this.player(),"durationchange",this.updateShowing)}return g(b,a),b.prototype.createEl=function(){var b=a.prototype.createEl.call(this,"div",{className:"vjs-live-control vjs-control"});return this.contentEl_=k.createEl("div",{className:"vjs-live-display",innerHTML:'<span class="vjs-control-text">'+this.localize("Stream Type")+"</span>"+this.localize("LIVE")},{"aria-live":"off"}),b.appendChild(this.contentEl_),b},b.prototype.updateShowing=function(){this.player().duration()===1/0?this.show():this.hide()},b}(i["default"]);i["default"].registerComponent("LiveDisplay",l),c["default"]=l,b.exports=c["default"]},{"../component":58,"../utils/dom.js":118}],62:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../button"),i=e(h),j=a("../component"),k=e(j),l=a("../utils/dom.js"),m=d(l),n=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.on(c,"volumechange",this.update),c.tech_&&c.tech_.featuresVolumeControl===!1&&this.addClass("vjs-hidden"),this.on(c,"loadstart",function(){this.update(),c.tech_.featuresVolumeControl===!1?this.addClass("vjs-hidden"):this.removeClass("vjs-hidden")})}return g(b,a),b.prototype.buildCSSClass=function(){return"vjs-mute-control "+a.prototype.buildCSSClass.call(this)},b.prototype.handleClick=function(){this.player_.muted(this.player_.muted()?!1:!0)},b.prototype.update=function(){var a=this.player_.volume(),b=3;0===a||this.player_.muted()?b=0:.33>a?b=1:.67>a&&(b=2);var c=this.player_.muted()?"Unmute":"Mute",d=this.localize(c);this.controlText()!==d&&this.controlText(d);for(var e=0;4>e;e++)m.removeElClass(this.el_,"vjs-vol-"+e);m.addElClass(this.el_,"vjs-vol-"+b)},b}(i["default"]);n.prototype.controlText_="Mute",k["default"].registerComponent("MuteToggle",n),c["default"]=n,b.exports=c["default"]},{"../button":57,"../component":58,"../utils/dom.js":118}],63:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../button.js"),h=d(g),i=a("../component.js"),j=d(i),k=function(a){function b(c,d){e(this,b),a.call(this,c,d),this.on(c,"play",this.handlePlay),this.on(c,"pause",this.handlePause)}return f(b,a),b.prototype.buildCSSClass=function(){return"vjs-play-control "+a.prototype.buildCSSClass.call(this)},b.prototype.handleClick=function(){this.player_.paused()?this.player_.play():this.player_.pause()},b.prototype.handlePlay=function(){this.removeClass("vjs-paused"),this.addClass("vjs-playing"),this.controlText("Pause")},b.prototype.handlePause=function(){this.removeClass("vjs-playing"),this.addClass("vjs-paused"),this.controlText("Play")},b}(h["default"]);k.prototype.controlText_="Play",j["default"].registerComponent("PlayToggle",k),c["default"]=k,b.exports=c["default"]},{"../button.js":57,"../component.js":58}],64:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../menu/menu-button.js"),i=e(h),j=a("../../menu/menu.js"),k=e(j),l=a("./playback-rate-menu-item.js"),m=e(l),n=a("../../component.js"),o=e(n),p=a("../../utils/dom.js"),q=d(p),r=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.updateVisibility(),this.updateLabel(),this.on(c,"loadstart",this.updateVisibility),this.on(c,"ratechange",this.updateLabel)}return g(b,a),b.prototype.createEl=function(){var b=a.prototype.createEl.call(this);return this.labelEl_=q.createEl("div",{className:"vjs-playback-rate-value",innerHTML:1}),b.appendChild(this.labelEl_),b},b.prototype.buildCSSClass=function(){return"vjs-playback-rate "+a.prototype.buildCSSClass.call(this)},b.prototype.createMenu=function(){var a=new k["default"](this.player()),b=this.playbackRates();if(b)for(var c=b.length-1;c>=0;c--)a.addChild(new m["default"](this.player(),{rate:b[c]+"x"}));return a},b.prototype.updateARIAAttributes=function(){this.el().setAttribute("aria-valuenow",this.player().playbackRate())},b.prototype.handleClick=function(){for(var a=this.player().playbackRate(),b=this.playbackRates(),c=b[0],d=0;d<b.length;d++)if(b[d]>a){c=b[d];break}this.player().playbackRate(c)},b.prototype.playbackRates=function(){return this.options_.playbackRates||this.options_.playerOptions&&this.options_.playerOptions.playbackRates},b.prototype.playbackRateSupported=function(){return this.player().tech_&&this.player().tech_.featuresPlaybackRate&&this.playbackRates()&&this.playbackRates().length>0},b.prototype.updateVisibility=function(){this.playbackRateSupported()?this.removeClass("vjs-hidden"):this.addClass("vjs-hidden")},b.prototype.updateLabel=function(){this.playbackRateSupported()&&(this.labelEl_.innerHTML=this.player().playbackRate()+"x")},b}(i["default"]);r.prototype.controlText_="Playback Rate",o["default"].registerComponent("PlaybackRateMenuButton",r),c["default"]=r,b.exports=c["default"]},{"../../component.js":58,"../../menu/menu-button.js":95,"../../menu/menu.js":97,"../../utils/dom.js":118,"./playback-rate-menu-item.js":65}],65:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../../menu/menu-item.js"),h=d(g),i=a("../../component.js"),j=d(i),k=function(a){function b(c,d){e(this,b);var f=d.rate,g=parseFloat(f,10);d.label=f,d.selected=1===g,a.call(this,c,d),this.label=f,this.rate=g,this.on(c,"ratechange",this.update)}return f(b,a),b.prototype.handleClick=function(){a.prototype.handleClick.call(this),this.player().playbackRate(this.rate)},b.prototype.update=function(){this.selected(this.player().playbackRate()===this.rate)},b}(h["default"]);k.prototype.contentElType="button",j["default"].registerComponent("PlaybackRateMenuItem",k),c["default"]=k,b.exports=c["default"]},{"../../component.js":58,"../../menu/menu-item.js":96}],66:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../component.js"),i=e(h),j=a("../../utils/dom.js"),k=d(j),l=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.on(c,"progress",this.update)}return g(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-load-progress",innerHTML:'<span class="vjs-control-text"><span>'+this.localize("Loaded")+"</span>: 0%</span>"})},b.prototype.update=function(){var a=this.player_.buffered(),b=this.player_.duration(),c=this.player_.bufferedEnd(),d=this.el_.children,e=function(a,b){var c=a/b||0;return 100*(c>=1?1:c)+"%"};this.el_.style.width=e(c,b);for(var f=0;f<a.length;f++){var g=a.start(f),h=a.end(f),i=d[f];i||(i=this.el_.appendChild(k.createEl())),i.style.left=e(g,c),i.style.width=e(h-g,c)}for(var f=d.length;f>a.length;f--)this.el_.removeChild(d[f-1])},b}(i["default"]);i["default"].registerComponent("LoadProgressBar",l),c["default"]=l,b.exports=c["default"]},{"../../component.js":58,"../../utils/dom.js":118}],67:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../component.js"),i=e(h),j=a("../../utils/dom.js"),k=d(j),l=a("../../utils/fn.js"),m=d(l),n=a("../../utils/format-time.js"),o=e(n),p=a("lodash-compat/function/throttle"),q=e(p),r=function(a){function b(c,d){var e=this;f(this,b),a.call(this,c,d),this.update(0,0),c.on("ready",function(){e.on(c.controlBar.progressControl.el(),"mousemove",q["default"](m.bind(e,e.handleMouseMove),25))})}return g(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-mouse-display"})},b.prototype.handleMouseMove=function(a){var b=this.player_.duration(),c=this.calculateDistance(a)*b,d=a.pageX-k.findElPosition(this.el().parentNode).left;this.update(c,d)},b.prototype.update=function(a,b){var c=o["default"](a,this.player_.duration());this.el().style.left=b+"px",this.el().setAttribute("data-current-time",c)},b.prototype.calculateDistance=function(a){return k.getPointerPosition(this.el().parentNode,a).x},b}(i["default"]);i["default"].registerComponent("MouseTimeDisplay",r),c["default"]=r,b.exports=c["default"]},{"../../component.js":58,"../../utils/dom.js":118,"../../utils/fn.js":120,"../../utils/format-time.js":121,"lodash-compat/function/throttle":7}],68:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../component.js"),i=e(h),j=a("../../utils/fn.js"),k=d(j),l=a("../../utils/format-time.js"),m=e(l),n=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.updateDataAttr(),this.on(c,"timeupdate",this.updateDataAttr),c.ready(k.bind(this,this.updateDataAttr))}return g(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-play-progress vjs-slider-bar",innerHTML:'<span class="vjs-control-text"><span>'+this.localize("Progress")+"</span>: 0%</span>"})},b.prototype.updateDataAttr=function(){var a=this.player_.scrubbing()?this.player_.getCache().currentTime:this.player_.currentTime();this.el_.setAttribute("data-current-time",m["default"](a,this.player_.duration()))},b}(i["default"]);i["default"].registerComponent("PlayProgressBar",n),c["default"]=n,b.exports=c["default"]},{"../../component.js":58,"../../utils/fn.js":120,"../../utils/format-time.js":121}],69:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../../component.js"),h=d(g),i=a("./seek-bar.js"),j=(d(i),a("./mouse-time-display.js")),k=(d(j),function(a){function b(){e(this,b),a.apply(this,arguments)}return f(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-progress-control vjs-control"})},b}(h["default"]));k.prototype.options_={children:["seekBar"]},h["default"].registerComponent("ProgressControl",k),c["default"]=k,b.exports=c["default"]},{"../../component.js":58,"./mouse-time-display.js":67,"./seek-bar.js":70}],70:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../slider/slider.js"),i=e(h),j=a("../../component.js"),k=e(j),l=a("./load-progress-bar.js"),m=(e(l),a("./play-progress-bar.js")),n=(e(m),a("../../utils/fn.js")),o=d(n),p=a("../../utils/format-time.js"),q=e(p),r=a("object.assign"),s=(e(r),function(a){function b(c,d){f(this,b),a.call(this,c,d),this.on(c,"timeupdate",this.updateARIAAttributes),c.ready(o.bind(this,this.updateARIAAttributes))}return g(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-progress-holder"},{"aria-label":"video progress bar"})},b.prototype.updateARIAAttributes=function(){var a=this.player_.scrubbing()?this.player_.getCache().currentTime:this.player_.currentTime();this.el_.setAttribute("aria-valuenow",(100*this.getPercent()).toFixed(2)),this.el_.setAttribute("aria-valuetext",q["default"](a,this.player_.duration()))},b.prototype.getPercent=function(){var a=this.player_.currentTime()/this.player_.duration();return a>=1?1:a},b.prototype.handleMouseDown=function(b){a.prototype.handleMouseDown.call(this,b),this.player_.scrubbing(!0),this.videoWasPlaying=!this.player_.paused(),this.player_.pause()},b.prototype.handleMouseMove=function(a){var b=this.calculateDistance(a)*this.player_.duration();b===this.player_.duration()&&(b-=.1),this.player_.currentTime(b)},b.prototype.handleMouseUp=function(b){a.prototype.handleMouseUp.call(this,b),this.player_.scrubbing(!1),this.videoWasPlaying&&this.player_.play()},b.prototype.stepForward=function(){this.player_.currentTime(this.player_.currentTime()+5)},b.prototype.stepBack=function(){this.player_.currentTime(this.player_.currentTime()-5)},b}(i["default"]));s.prototype.options_={children:["loadProgressBar","mouseTimeDisplay","playProgressBar"],barName:"playProgressBar"},s.prototype.playerEvent="timeupdate",k["default"].registerComponent("SeekBar",s),c["default"]=s,b.exports=c["default"]},{"../../component.js":58,"../../slider/slider.js":102,"../../utils/fn.js":120,"../../utils/format-time.js":121,"./load-progress-bar.js":66,"./play-progress-bar.js":68,"object.assign":43}],71:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("./spacer.js"),h=d(g),i=a("../../component.js"),j=d(i),k=function(a){function b(){e(this,b),a.apply(this,arguments)}return f(b,a),b.prototype.buildCSSClass=function(){return"vjs-custom-control-spacer "+a.prototype.buildCSSClass.call(this)},b.prototype.createEl=function(){var b=a.prototype.createEl.call(this,{className:this.buildCSSClass()});return b.innerHTML="&nbsp;",b},b}(h["default"]);j["default"].registerComponent("CustomControlSpacer",k),c["default"]=k,b.exports=c["default"]},{"../../component.js":58,"./spacer.js":72}],72:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../../component.js"),h=d(g),i=function(a){function b(){e(this,b),a.apply(this,arguments)}return f(b,a),b.prototype.buildCSSClass=function(){return"vjs-spacer "+a.prototype.buildCSSClass.call(this)},b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:this.buildCSSClass()})},b}(h["default"]);h["default"].registerComponent("Spacer",i),c["default"]=i,b.exports=c["default"]},{"../../component.js":58}],73:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("./text-track-menu-item.js"),h=d(g),i=a("../../component.js"),j=d(i),k=function(a){function b(c,d){e(this,b),d.track={kind:d.kind,player:c,label:d.kind+" settings","default":!1,mode:"disabled"},a.call(this,c,d),this.addClass("vjs-texttrack-settings")}return f(b,a),b.prototype.handleClick=function(){this.player().getChild("textTrackSettings").show()},b}(h["default"]);j["default"].registerComponent("CaptionSettingsMenuItem",k),c["default"]=k,b.exports=c["default"]},{"../../component.js":58,"./text-track-menu-item.js":80}],74:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("./text-track-button.js"),h=d(g),i=a("../../component.js"),j=d(i),k=a("./caption-settings-menu-item.js"),l=d(k),m=function(a){function b(c,d,f){e(this,b),a.call(this,c,d,f),this.el_.setAttribute("aria-label","Captions Menu")}return f(b,a),b.prototype.buildCSSClass=function(){return"vjs-captions-button "+a.prototype.buildCSSClass.call(this)},b.prototype.update=function(){var b=2;a.prototype.update.call(this),this.player().tech_&&this.player().tech_.featuresNativeTextTracks&&(b=1),this.items&&this.items.length>b?this.show():this.hide()},b.prototype.createItems=function(){var b=[];return this.player().tech_&&this.player().tech_.featuresNativeTextTracks||b.push(new l["default"](this.player_,{kind:this.kind_})),a.prototype.createItems.call(this,b)},b}(h["default"]);m.prototype.kind_="captions",m.prototype.controlText_="Captions",j["default"].registerComponent("CaptionsButton",m),c["default"]=m,b.exports=c["default"]},{"../../component.js":58,"./caption-settings-menu-item.js":73,"./text-track-button.js":79}],75:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("./text-track-button.js"),i=e(h),j=a("../../component.js"),k=e(j),l=a("./text-track-menu-item.js"),m=e(l),n=a("./chapters-track-menu-item.js"),o=e(n),p=a("../../menu/menu.js"),q=e(p),r=a("../../utils/dom.js"),s=d(r),t=a("../../utils/fn.js"),u=d(t),v=a("../../utils/to-title-case.js"),w=e(v),x=a("global/window"),y=e(x),z=function(a){function b(c,d,e){f(this,b),a.call(this,c,d,e),this.el_.setAttribute("aria-label","Chapters Menu")}return g(b,a),b.prototype.buildCSSClass=function(){return"vjs-chapters-button "+a.prototype.buildCSSClass.call(this)},b.prototype.createItems=function(){var a=[],b=this.player_.textTracks();if(!b)return a;for(var c=0;c<b.length;c++){var d=b[c];d.kind===this.kind_&&a.push(new m["default"](this.player_,{track:d}))}return a},b.prototype.createMenu=function(){for(var a=this.player_.textTracks()||[],b=void 0,c=this.items=[],d=0,e=a.length;e>d;d++){var f=a[d];if(f.kind===this.kind_){if(f.cues){b=f;break}f.mode="hidden",y["default"].setTimeout(u.bind(this,function(){this.createMenu()}),100)}}var g=this.menu;if(void 0===g&&(g=new q["default"](this.player_),g.contentEl().appendChild(s.createEl("li",{className:"vjs-menu-title",innerHTML:w["default"](this.kind_),tabIndex:-1}))),b){for(var h=b.cues,i=void 0,d=0,e=h.length;e>d;d++){i=h[d];var j=new o["default"](this.player_,{track:b,cue:i});c.push(j),g.addChild(j)}this.addChild(g)}return this.items.length>0&&this.show(),g},b}(i["default"]);z.prototype.kind_="chapters",z.prototype.controlText_="Chapters",k["default"].registerComponent("ChaptersButton",z),c["default"]=z,b.exports=c["default"]},{"../../component.js":58,"../../menu/menu.js":97,"../../utils/dom.js":118,"../../utils/fn.js":120,"../../utils/to-title-case.js":127,"./chapters-track-menu-item.js":76,"./text-track-button.js":79,"./text-track-menu-item.js":80,"global/window":2}],76:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,
 
configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../menu/menu-item.js"),i=e(h),j=a("../../component.js"),k=e(j),l=a("../../utils/fn.js"),m=d(l),n=function(a){function b(c,d){f(this,b);var e=d.track,g=d.cue,h=c.currentTime();d.label=g.text,d.selected=g.startTime<=h&&h<g.endTime,a.call(this,c,d),this.track=e,this.cue=g,e.addEventListener("cuechange",m.bind(this,this.update))}return g(b,a),b.prototype.handleClick=function(){a.prototype.handleClick.call(this),this.player_.currentTime(this.cue.startTime),this.update(this.cue.startTime)},b.prototype.update=function(){var a=this.cue,b=this.player_.currentTime();this.selected(a.startTime<=b&&b<a.endTime)},b}(i["default"]);k["default"].registerComponent("ChaptersTrackMenuItem",n),c["default"]=n,b.exports=c["default"]},{"../../component.js":58,"../../menu/menu-item.js":96,"../../utils/fn.js":120}],77:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("./text-track-menu-item.js"),h=d(g),i=a("../../component.js"),j=d(i),k=function(a){function b(c,d){e(this,b),d.track={kind:d.kind,player:c,label:d.kind+" off","default":!1,mode:"disabled"},a.call(this,c,d),this.selected(!0)}return f(b,a),b.prototype.handleTracksChange=function(){for(var a=this.player().textTracks(),b=!0,c=0,d=a.length;d>c;c++){var e=a[c];if(e.kind===this.track.kind&&"showing"===e.mode){b=!1;break}}this.selected(b)},b}(h["default"]);j["default"].registerComponent("OffTextTrackMenuItem",k),c["default"]=k,b.exports=c["default"]},{"../../component.js":58,"./text-track-menu-item.js":80}],78:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("./text-track-button.js"),h=d(g),i=a("../../component.js"),j=d(i),k=function(a){function b(c,d,f){e(this,b),a.call(this,c,d,f),this.el_.setAttribute("aria-label","Subtitles Menu")}return f(b,a),b.prototype.buildCSSClass=function(){return"vjs-subtitles-button "+a.prototype.buildCSSClass.call(this)},b}(h["default"]);k.prototype.kind_="subtitles",k.prototype.controlText_="Subtitles",j["default"].registerComponent("SubtitlesButton",k),c["default"]=k,b.exports=c["default"]},{"../../component.js":58,"./text-track-button.js":79}],79:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../menu/menu-button.js"),i=e(h),j=a("../../component.js"),k=e(j),l=a("../../utils/fn.js"),m=d(l),n=a("./text-track-menu-item.js"),o=e(n),p=a("./off-text-track-menu-item.js"),q=e(p),r=function(a){function b(c,d){f(this,b),a.call(this,c,d);var e=this.player_.textTracks();if(this.items.length<=1&&this.hide(),e){var g=m.bind(this,this.update);e.addEventListener("removetrack",g),e.addEventListener("addtrack",g),this.player_.on("dispose",function(){e.removeEventListener("removetrack",g),e.removeEventListener("addtrack",g)})}}return g(b,a),b.prototype.createItems=function(){var a=arguments.length<=0||void 0===arguments[0]?[]:arguments[0];a.push(new q["default"](this.player_,{kind:this.kind_}));var b=this.player_.textTracks();if(!b)return a;for(var c=0;c<b.length;c++){var d=b[c];d.kind===this.kind_&&a.push(new o["default"](this.player_,{track:d}))}return a},b}(i["default"]);k["default"].registerComponent("TextTrackButton",r),c["default"]=r,b.exports=c["default"]},{"../../component.js":58,"../../menu/menu-button.js":95,"../../utils/fn.js":120,"./off-text-track-menu-item.js":77,"./text-track-menu-item.js":80}],80:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../menu/menu-item.js"),i=e(h),j=a("../../component.js"),k=e(j),l=a("../../utils/fn.js"),m=d(l),n=a("global/window"),o=e(n),p=a("global/document"),q=e(p),r=function(a){function b(c,d){var e=this;f(this,b);var g=d.track,h=c.textTracks();d.label=g.label||g.language||"Unknown",d.selected=g["default"]||"showing"===g.mode,a.call(this,c,d),this.track=g,h&&!function(){var a=m.bind(e,e.handleTracksChange);h.addEventListener("change",a),e.on("dispose",function(){h.removeEventListener("change",a)})}(),h&&void 0===h.onchange&&!function(){var a=void 0;e.on(["tap","click"],function(){if("object"!=typeof o["default"].Event)try{a=new o["default"].Event("change")}catch(b){}a||(a=q["default"].createEvent("Event"),a.initEvent("change",!0,!0)),h.dispatchEvent(a)})}()}return g(b,a),b.prototype.handleClick=function(b){var c=this.track.kind,d=this.player_.textTracks();if(a.prototype.handleClick.call(this,b),d)for(var e=0;e<d.length;e++){var f=d[e];f.kind===c&&(f.mode=f===this.track?"showing":"disabled")}},b.prototype.handleTracksChange=function(){this.selected("showing"===this.track.mode)},b}(i["default"]);k["default"].registerComponent("TextTrackMenuItem",r),c["default"]=r,b.exports=c["default"]},{"../../component.js":58,"../../menu/menu-item.js":96,"../../utils/fn.js":120,"global/document":1,"global/window":2}],81:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../component.js"),i=e(h),j=a("../../utils/dom.js"),k=d(j),l=a("../../utils/format-time.js"),m=e(l),n=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.on(c,"timeupdate",this.updateContent)}return g(b,a),b.prototype.createEl=function(){var b=a.prototype.createEl.call(this,"div",{className:"vjs-current-time vjs-time-control vjs-control"});return this.contentEl_=k.createEl("div",{className:"vjs-current-time-display",innerHTML:'<span class="vjs-control-text">Current Time </span>0:00'},{"aria-live":"off"}),b.appendChild(this.contentEl_),b},b.prototype.updateContent=function(){var a=this.player_.scrubbing()?this.player_.getCache().currentTime:this.player_.currentTime(),b=this.localize("Current Time"),c=m["default"](a,this.player_.duration());this.contentEl_.innerHTML='<span class="vjs-control-text">'+b+"</span> "+c},b}(i["default"]);i["default"].registerComponent("CurrentTimeDisplay",n),c["default"]=n,b.exports=c["default"]},{"../../component.js":58,"../../utils/dom.js":118,"../../utils/format-time.js":121}],82:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../component.js"),i=e(h),j=a("../../utils/dom.js"),k=d(j),l=a("../../utils/format-time.js"),m=e(l),n=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.on(c,"timeupdate",this.updateContent),this.on(c,"loadedmetadata",this.updateContent)}return g(b,a),b.prototype.createEl=function(){var b=a.prototype.createEl.call(this,"div",{className:"vjs-duration vjs-time-control vjs-control"});return this.contentEl_=k.createEl("div",{className:"vjs-duration-display",innerHTML:'<span class="vjs-control-text">'+this.localize("Duration Time")+"</span> 0:00"},{"aria-live":"off"}),b.appendChild(this.contentEl_),b},b.prototype.updateContent=function(){var a=this.player_.duration();if(a){var b=this.localize("Duration Time"),c=m["default"](a);this.contentEl_.innerHTML='<span class="vjs-control-text">'+b+"</span> "+c}},b}(i["default"]);i["default"].registerComponent("DurationDisplay",n),c["default"]=n,b.exports=c["default"]},{"../../component.js":58,"../../utils/dom.js":118,"../../utils/format-time.js":121}],83:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../component.js"),i=e(h),j=a("../../utils/dom.js"),k=d(j),l=a("../../utils/format-time.js"),m=e(l),n=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.on(c,"timeupdate",this.updateContent)}return g(b,a),b.prototype.createEl=function(){var b=a.prototype.createEl.call(this,"div",{className:"vjs-remaining-time vjs-time-control vjs-control"});return this.contentEl_=k.createEl("div",{className:"vjs-remaining-time-display",innerHTML:'<span class="vjs-control-text">'+this.localize("Remaining Time")+"</span> -0:00"},{"aria-live":"off"}),b.appendChild(this.contentEl_),b},b.prototype.updateContent=function(){if(this.player_.duration()){var a=this.localize("Remaining Time"),b=m["default"](this.player_.remainingTime());this.contentEl_.innerHTML='<span class="vjs-control-text">'+a+"</span> -"+b}},b}(i["default"]);i["default"].registerComponent("RemainingTimeDisplay",n),c["default"]=n,b.exports=c["default"]},{"../../component.js":58,"../../utils/dom.js":118,"../../utils/format-time.js":121}],84:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../../component.js"),h=d(g),i=function(a){function b(){e(this,b),a.apply(this,arguments)}return f(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-time-control vjs-time-divider",innerHTML:"<div><span>/</span></div>"})},b}(h["default"]);h["default"].registerComponent("TimeDivider",i),c["default"]=i,b.exports=c["default"]},{"../../component.js":58}],85:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../slider/slider.js"),i=e(h),j=a("../../component.js"),k=e(j),l=a("../../utils/fn.js"),m=d(l),n=a("./volume-level.js"),o=(e(n),function(a){function b(c,d){f(this,b),a.call(this,c,d),this.on(c,"volumechange",this.updateARIAAttributes),c.ready(m.bind(this,this.updateARIAAttributes))}return g(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-volume-bar vjs-slider-bar"},{"aria-label":"volume level"})},b.prototype.handleMouseMove=function(a){this.player_.muted()&&this.player_.muted(!1),this.player_.volume(this.calculateDistance(a))},b.prototype.getPercent=function(){return this.player_.muted()?0:this.player_.volume()},b.prototype.stepForward=function(){this.player_.volume(this.player_.volume()+.1)},b.prototype.stepBack=function(){this.player_.volume(this.player_.volume()-.1)},b.prototype.updateARIAAttributes=function(){var a=(100*this.player_.volume()).toFixed(2);this.el_.setAttribute("aria-valuenow",a),this.el_.setAttribute("aria-valuetext",a+"%")},b}(i["default"]));o.prototype.options_={children:["volumeLevel"],barName:"volumeLevel"},o.prototype.playerEvent="volumechange",k["default"].registerComponent("VolumeBar",o),c["default"]=o,b.exports=c["default"]},{"../../component.js":58,"../../slider/slider.js":102,"../../utils/fn.js":120,"./volume-level.js":87}],86:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../../component.js"),h=d(g),i=a("./volume-bar.js"),j=(d(i),function(a){function b(c,d){e(this,b),a.call(this,c,d),c.tech_&&c.tech_.featuresVolumeControl===!1&&this.addClass("vjs-hidden"),this.on(c,"loadstart",function(){c.tech_.featuresVolumeControl===!1?this.addClass("vjs-hidden"):this.removeClass("vjs-hidden")})}return f(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-volume-control vjs-control"})},b}(h["default"]));j.prototype.options_={children:["volumeBar"]},h["default"].registerComponent("VolumeControl",j),c["default"]=j,b.exports=c["default"]},{"../../component.js":58,"./volume-bar.js":85}],87:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../../component.js"),h=d(g),i=function(a){function b(){e(this,b),a.apply(this,arguments)}return f(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-volume-level",innerHTML:'<span class="vjs-control-text"></span>'})},b}(h["default"]);h["default"].registerComponent("VolumeLevel",i),c["default"]=i,b.exports=c["default"]},{"../../component.js":58}],88:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../button.js"),h=(d(g),a("../component.js")),i=d(h),j=a("../menu/menu.js"),k=d(j),l=a("../menu/menu-button.js"),m=d(l),n=a("./mute-toggle.js"),o=d(n),p=a("./volume-control/volume-bar.js"),q=d(p),r=function(a){function b(c){function d(){c.tech_&&c.tech_.featuresVolumeControl===!1?this.addClass("vjs-hidden"):this.removeClass("vjs-hidden")}var f=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];e(this,b),void 0===f.inline&&(f.inline=!0),void 0===f.vertical&&(f.vertical=f.inline?!1:!0),f.volumeBar=f.volumeBar||{},f.volumeBar.vertical=!!f.vertical,a.call(this,c,f),this.on(c,"volumechange",this.volumeUpdate),this.on(c,"loadstart",this.volumeUpdate),d.call(this),this.on(c,"loadstart",d),this.on(this.volumeBar,["slideractive","focus"],function(){this.addClass("vjs-slider-active")}),this.on(this.volumeBar,["sliderinactive","blur"],function(){this.removeClass("vjs-slider-active")})}return f(b,a),b.prototype.buildCSSClass=function(){var b="";return b=this.options_.vertical?"vjs-volume-menu-button-vertical":"vjs-volume-menu-button-horizontal","vjs-volume-menu-button "+a.prototype.buildCSSClass.call(this)+" "+b},b.prototype.createMenu=function(){var a=new k["default"](this.player_,{contentElType:"div"}),b=new q["default"](this.player_,this.options_.volumeBar);return a.addChild(b),this.volumeBar=b,a},b.prototype.handleClick=function(){o["default"].prototype.handleClick.call(this),a.prototype.handleClick.call(this)},b}(m["default"]);r.prototype.volumeUpdate=o["default"].prototype.update,r.prototype.controlText_="Mute",i["default"].registerComponent("VolumeMenuButton",r),c["default"]=r,b.exports=c["default"]},{"../button.js":57,"../component.js":58,"../menu/menu-button.js":95,"../menu/menu.js":97,"./mute-toggle.js":62,"./volume-control/volume-bar.js":85}],89:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("./component"),i=e(h),j=a("./utils/dom.js"),k=d(j),l=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.update(),this.on(c,"error",this.update)}return g(b,a),b.prototype.createEl=function(){var b=a.prototype.createEl.call(this,"div",{className:"vjs-error-display"});return this.contentEl_=k.createEl("div"),b.appendChild(this.contentEl_),b},b.prototype.update=function(){this.player().error()&&(this.contentEl_.innerHTML=this.localize(this.player().error().message))},b}(i["default"]);i["default"].registerComponent("ErrorDisplay",l),c["default"]=l,b.exports=c["default"]},{"./component":58,"./utils/dom.js":118}],90:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}c.__esModule=!0;var e=a("./utils/events.js"),f=d(e),g=function(){};g.prototype.allowedEvents_={},g.prototype.on=function(a,b){var c=this.addEventListener;this.addEventListener=Function.prototype,f.on(this,a,b),this.addEventListener=c},g.prototype.addEventListener=g.prototype.on,g.prototype.off=function(a,b){f.off(this,a,b)},g.prototype.removeEventListener=g.prototype.off,g.prototype.one=function(a,b){f.one(this,a,b)},g.prototype.trigger=function(a){var b=a.type||a;"string"==typeof a&&(a={type:b}),a=f.fixEvent(a),this.allowedEvents_[b]&&this["on"+b]&&this["on"+b](a),f.trigger(this,a)},g.prototype.dispatchEvent=g.prototype.trigger,c["default"]=g,b.exports=c["default"]},{"./utils/events.js":119}],91:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var e=a("./utils/log"),f=d(e),g=function(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(a.super_=b)},h=function(a){var b=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],c=function(){a.apply(this,arguments)},d={};"object"==typeof b?("function"==typeof b.init&&(f["default"].warn("Constructor logic via init() is deprecated; please use constructor() instead."),b.constructor=b.init),b.constructor!==Object.prototype.constructor&&(c=b.constructor),d=b):"function"==typeof b&&(c=b),g(c,a);for(var e in d)d.hasOwnProperty(e)&&(c.prototype[e]=d[e]);return c};c["default"]=h,b.exports=c["default"]},{"./utils/log":123}],92:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;for(var e=a("global/document"),f=d(e),g={},h=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],i=h[0],j=void 0,k=0;k<h.length;k++)if(h[k][1]in f["default"]){j=h[k];break}if(j)for(var k=0;k<j.length;k++)g[i[k]]=j[k];c["default"]=g,b.exports=c["default"]},{"global/document":1}],93:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("./component"),h=d(g),i=function(a){function b(){e(this,b),a.apply(this,arguments)}return f(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-loading-spinner"})},b}(h["default"]);h["default"].registerComponent("LoadingSpinner",i),c["default"]=i,b.exports=c["default"]},{"./component":58}],94:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var e=a("object.assign"),f=d(e),g=function i(a){"number"==typeof a?this.code=a:"string"==typeof a?this.message=a:"object"==typeof a&&f["default"](this,a),this.message||(this.message=i.defaultMessages[this.code]||"")};g.prototype.code=0,g.prototype.message="",g.prototype.status=null,g.errorTypes=["MEDIA_ERR_CUSTOM","MEDIA_ERR_ABORTED","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED","MEDIA_ERR_ENCRYPTED"],g.defaultMessages={1:"You aborted the media playback",2:"A network error caused the media download to fail part-way.",3:"The media playback was aborted due to a corruption problem or because the media used features your browser did not support.",4:"The media could not be loaded, either because the server or network failed or because the format is not supported.",5:"The media is encrypted and we do not have the keys to decrypt it."};for(var h=0;h<g.errorTypes.length;h++)g[g.errorTypes[h]]=h,g.prototype[g.errorTypes[h]]=h;c["default"]=g,b.exports=c["default"]},{"object.assign":43}],95:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../button.js"),i=e(h),j=a("../component.js"),k=e(j),l=a("./menu.js"),m=e(l),n=a("../utils/dom.js"),o=d(n),p=a("../utils/fn.js"),q=d(p),r=a("../utils/to-title-case.js"),s=e(r),t=function(a){function b(c){var d=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];f(this,b),a.call(this,c,d),this.update(),this.on("keydown",this.handleKeyPress),this.el_.setAttribute("aria-haspopup",!0),this.el_.setAttribute("role","button")}return g(b,a),b.prototype.update=function(){var a=this.createMenu();this.menu&&this.removeChild(this.menu),this.menu=a,this.addChild(a),this.buttonPressed_=!1,this.items&&0===this.items.length?this.hide():this.items&&this.items.length>1&&this.show()},b.prototype.createMenu=function(){var a=new m["default"](this.player_);if(this.options_.title&&a.contentEl().appendChild(o.createEl("li",{className:"vjs-menu-title",innerHTML:s["default"](this.options_.title),tabIndex:-1})),this.items=this.createItems(),this.items)for(var b=0;b<this.items.length;b++)a.addItem(this.items[b]);return a},b.prototype.createItems=function(){},b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:this.buildCSSClass()})},b.prototype.buildCSSClass=function(){var b="vjs-menu-button";return b+=this.options_.inline===!0?"-inline":"-popup","vjs-menu-button "+b+" "+a.prototype.buildCSSClass.call(this)},b.prototype.handleFocus=function(){},b.prototype.handleBlur=function(){},b.prototype.handleClick=function(){this.one("mouseout",q.bind(this,function(){this.menu.unlockShowing(),this.el_.blur()})),this.buttonPressed_?this.unpressButton():this.pressButton()},b.prototype.handleKeyPress=function(a){32===a.which||13===a.which?(this.buttonPressed_?this.unpressButton():this.pressButton(),a.preventDefault()):27===a.which&&(this.buttonPressed_&&this.unpressButton(),a.preventDefault())},b.prototype.pressButton=function(){this.buttonPressed_=!0,this.menu.lockShowing(),this.el_.setAttribute("aria-pressed",!0),this.items&&this.items.length>0&&this.items[0].el().focus()},b.prototype.unpressButton=function(){this.buttonPressed_=!1,this.menu.unlockShowing(),this.el_.setAttribute("aria-pressed",!1)},b}(i["default"]);k["default"].registerComponent("MenuButton",t),c["default"]=t,b.exports=c["default"]},{"../button.js":57,"../component.js":58,"../utils/dom.js":118,"../utils/fn.js":120,"../utils/to-title-case.js":127,"./menu.js":97}],96:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../button.js"),h=d(g),i=a("../component.js"),j=d(i),k=a("object.assign"),l=d(k),m=function(a){function b(c,d){e(this,b),a.call(this,c,d),this.selected(d.selected)}return f(b,a),b.prototype.createEl=function(b,c,d){return a.prototype.createEl.call(this,"li",l["default"]({className:"vjs-menu-item",innerHTML:this.localize(this.options_.label)},c),d)},b.prototype.handleClick=function(){this.selected(!0)},b.prototype.selected=function(a){a?(this.addClass("vjs-selected"),this.el_.setAttribute("aria-selected",!0)):(this.removeClass("vjs-selected"),this.el_.setAttribute("aria-selected",!1))},b}(h["default"]);j["default"].registerComponent("MenuItem",m),c["default"]=m,b.exports=c["default"]},{"../button.js":57,"../component.js":58,"object.assign":43}],97:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../component.js"),i=e(h),j=a("../utils/dom.js"),k=d(j),l=a("../utils/fn.js"),m=d(l),n=a("../utils/events.js"),o=d(n),p=function(a){function b(){f(this,b),a.apply(this,arguments)}return g(b,a),b.prototype.addItem=function(a){this.addChild(a),a.on("click",m.bind(this,function(){this.unlockShowing()}))},b.prototype.createEl=function(){var b=this.options_.contentElType||"ul";this.contentEl_=k.createEl(b,{className:"vjs-menu-content"});var c=a.prototype.createEl.call(this,"div",{append:this.contentEl_,className:"vjs-menu"});return c.appendChild(this.contentEl_),o.on(c,"click",function(a){a.preventDefault(),a.stopImmediatePropagation()}),c},b}(i["default"]);i["default"].registerComponent("Menu",p),c["default"]=p,b.exports=c["default"]},{"../component.js":58,"../utils/dom.js":118,"../utils/events.js":119,"../utils/fn.js":120}],98:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("./component.js"),i=e(h),j=a("global/document"),k=e(j),l=a("global/window"),m=e(l),n=a("./utils/events.js"),o=d(n),p=a("./utils/dom.js"),q=d(p),r=a("./utils/fn.js"),s=d(r),t=a("./utils/guid.js"),u=d(t),v=a("./utils/browser.js"),w=(d(v),
 
a("./utils/log.js")),x=e(w),y=a("./utils/to-title-case.js"),z=e(y),A=a("./utils/time-ranges.js"),B=a("./utils/buffer.js"),C=a("./utils/stylesheet.js"),D=d(C),E=a("./fullscreen-api.js"),F=e(E),G=a("./media-error.js"),H=e(G),I=a("safe-json-parse/tuple"),J=e(I),K=a("object.assign"),L=e(K),M=a("./utils/merge-options.js"),N=e(M),O=a("./tracks/text-track-list-converter.js"),P=e(O),Q=a("./tech/loader.js"),R=(e(Q),a("./poster-image.js")),S=(e(R),a("./tracks/text-track-display.js")),T=(e(S),a("./loading-spinner.js")),U=(e(T),a("./big-play-button.js")),V=(e(U),a("./control-bar/control-bar.js")),W=(e(V),a("./error-display.js")),X=(e(W),a("./tracks/text-track-settings.js")),Y=(e(X),a("./tech/html5.js")),Z=(e(Y),function(a){function b(c,d,e){var g=this;if(f(this,b),c.id=c.id||"vjs_video_"+u.newGUID(),d=L["default"](b.getTagSettings(c),d),d.initChildren=!1,d.createEl=!1,d.reportTouchActivity=!1,a.call(this,null,d,e),!this.options_||!this.options_.techOrder||!this.options_.techOrder.length)throw new Error("No techOrder specified. Did you overwrite videojs.options instead of just changing the properties you want to override?");this.tag=c,this.tagAttributes=c&&q.getElAttributes(c),this.language(this.options_.language),d.languages?!function(){var a={};Object.getOwnPropertyNames(d.languages).forEach(function(b){a[b.toLowerCase()]=d.languages[b]}),g.languages_=a}():this.languages_=b.prototype.options_.languages,this.cache_={},this.poster_=d.poster||"",this.controls_=!!d.controls,c.controls=!1,this.scrubbing_=!1,this.el_=this.createEl();var h=N["default"](this.options_);d.plugins&&!function(){var a=d.plugins;Object.getOwnPropertyNames(a).forEach(function(b){"function"==typeof this[b]?this[b](a[b]):x["default"].error("Unable to find plugin:",b)},g)}(),this.options_.playerOptions=h,this.initChildren(),this.isAudio("audio"===c.nodeName.toLowerCase()),this.addClass(this.controls()?"vjs-controls-enabled":"vjs-controls-disabled"),this.isAudio()&&this.addClass("vjs-audio"),this.flexNotSupported_()&&this.addClass("vjs-no-flex"),b.players[this.id_]=this,this.userActive(!0),this.reportUserActivity(),this.listenForUserActivity_(),this.on("fullscreenchange",this.handleFullscreenChange_),this.on("stageclick",this.handleStageClick_)}return g(b,a),b.prototype.dispose=function(){this.trigger("dispose"),this.off("dispose"),this.styleEl_&&this.styleEl_.parentNode.removeChild(this.styleEl_),b.players[this.id_]=null,this.tag&&this.tag.player&&(this.tag.player=null),this.el_&&this.el_.player&&(this.el_.player=null),this.tech_&&this.tech_.dispose(),a.prototype.dispose.call(this)},b.prototype.createEl=function(){var b=this.el_=a.prototype.createEl.call(this,"div"),c=this.tag;c.removeAttribute("width"),c.removeAttribute("height");var d=q.getElAttributes(c);Object.getOwnPropertyNames(d).forEach(function(a){"class"===a?b.className=d[a]:b.setAttribute(a,d[a])}),c.id+="_html5_api",c.className="vjs-tech",c.player=b.player=this,this.addClass("vjs-paused"),this.styleEl_=D.createStyleElement("vjs-styles-dimensions");var e=k["default"].querySelector(".vjs-styles-defaults"),f=k["default"].querySelector("head");return f.insertBefore(this.styleEl_,e?e.nextSibling:f.firstChild),this.width(this.options_.width),this.height(this.options_.height),this.fluid(this.options_.fluid),this.aspectRatio(this.options_.aspectRatio),c.initNetworkState_=c.networkState,c.parentNode&&c.parentNode.insertBefore(b,c),q.insertElFirst(c,b),this.el_=b,b},b.prototype.width=function(a){return this.dimension("width",a)},b.prototype.height=function(a){return this.dimension("height",a)},b.prototype.dimension=function(a,b){var c=a+"_";if(void 0===b)return this[c]||0;if(""===b)this[c]=void 0;else{var d=parseFloat(b);if(isNaN(d))return x["default"].error('Improper value "'+b+'" supplied for for '+a),this;this[c]=d}return this.updateStyleEl_(),this},b.prototype.fluid=function(a){return void 0===a?!!this.fluid_:(this.fluid_=!!a,void(a?this.addClass("vjs-fluid"):this.removeClass("vjs-fluid")))},b.prototype.aspectRatio=function(a){if(void 0===a)return this.aspectRatio_;if(!/^\d+\:\d+$/.test(a))throw new Error("Improper value supplied for aspect ratio. The format should be width:height, for example 16:9.");this.aspectRatio_=a,this.fluid(!0),this.updateStyleEl_()},b.prototype.updateStyleEl_=function(){var a=void 0,b=void 0,c=void 0;c=void 0!==this.aspectRatio_&&"auto"!==this.aspectRatio_?this.aspectRatio_:this.videoWidth()?this.videoWidth()+":"+this.videoHeight():"16:9";var d=c.split(":"),e=d[1]/d[0];a=void 0!==this.width_?this.width_:void 0!==this.height_?this.height_/e:this.videoWidth()||300,b=void 0!==this.height_?this.height_:a*e;var f=this.id()+"-dimensions";this.addClass(f),D.setTextContent(this.styleEl_,"\n      ."+f+" {\n        width: "+a+"px;\n        height: "+b+"px;\n      }\n\n      ."+f+".vjs-fluid {\n        padding-top: "+100*e+"%;\n      }\n    ")},b.prototype.loadTech_=function(a,b){this.tech_&&this.unloadTech_(),"Html5"!==a&&this.tag&&(i["default"].getComponent("Html5").disposeMediaElement(this.tag),this.tag.player=null,this.tag=null),this.techName_=a,this.isReady_=!1;var c=L["default"]({nativeControlsForTouch:this.options_.nativeControlsForTouch,source:b,playerId:this.id(),techId:this.id()+"_"+a+"_api",textTracks:this.textTracks_,autoplay:this.options_.autoplay,preload:this.options_.preload,loop:this.options_.loop,muted:this.options_.muted,poster:this.poster(),language:this.language(),"vtt.js":this.options_["vtt.js"]},this.options_[a.toLowerCase()]);this.tag&&(c.tag=this.tag),b&&(this.currentType_=b.type,b.src===this.cache_.src&&this.cache_.currentTime>0&&(c.startTime=this.cache_.currentTime),this.cache_.src=b.src);var d=i["default"].getComponent(a);this.tech_=new d(c),this.tech_.ready(s.bind(this,this.handleTechReady_),!0),P["default"].jsonToTextTracks(this.textTracksJson_||[],this.tech_),this.on(this.tech_,"loadstart",this.handleTechLoadStart_),this.on(this.tech_,"waiting",this.handleTechWaiting_),this.on(this.tech_,"canplay",this.handleTechCanPlay_),this.on(this.tech_,"canplaythrough",this.handleTechCanPlayThrough_),this.on(this.tech_,"playing",this.handleTechPlaying_),this.on(this.tech_,"ended",this.handleTechEnded_),this.on(this.tech_,"seeking",this.handleTechSeeking_),this.on(this.tech_,"seeked",this.handleTechSeeked_),this.on(this.tech_,"play",this.handleTechPlay_),this.on(this.tech_,"firstplay",this.handleTechFirstPlay_),this.on(this.tech_,"pause",this.handleTechPause_),this.on(this.tech_,"progress",this.handleTechProgress_),this.on(this.tech_,"durationchange",this.handleTechDurationChange_),this.on(this.tech_,"fullscreenchange",this.handleTechFullscreenChange_),this.on(this.tech_,"error",this.handleTechError_),this.on(this.tech_,"suspend",this.handleTechSuspend_),this.on(this.tech_,"abort",this.handleTechAbort_),this.on(this.tech_,"emptied",this.handleTechEmptied_),this.on(this.tech_,"stalled",this.handleTechStalled_),this.on(this.tech_,"loadedmetadata",this.handleTechLoadedMetaData_),this.on(this.tech_,"loadeddata",this.handleTechLoadedData_),this.on(this.tech_,"timeupdate",this.handleTechTimeUpdate_),this.on(this.tech_,"ratechange",this.handleTechRateChange_),this.on(this.tech_,"volumechange",this.handleTechVolumeChange_),this.on(this.tech_,"texttrackchange",this.handleTechTextTrackChange_),this.on(this.tech_,"loadedmetadata",this.updateStyleEl_),this.on(this.tech_,"posterchange",this.handleTechPosterChange_),this.usingNativeControls(this.techGet_("controls")),this.controls()&&!this.usingNativeControls()&&this.addTechControlsListeners_(),this.tech_.el().parentNode===this.el()||"Html5"===a&&this.tag||q.insertElFirst(this.tech_.el(),this.el()),this.tag&&(this.tag.player=null,this.tag=null)},b.prototype.unloadTech_=function(){this.textTracks_=this.textTracks(),this.textTracksJson_=P["default"].textTracksToJson(this),this.isReady_=!1,this.tech_.dispose(),this.tech_=!1},b.prototype.addTechControlsListeners_=function(){this.removeTechControlsListeners_(),this.on(this.tech_,"mousedown",this.handleTechClick_),this.on(this.tech_,"touchstart",this.handleTechTouchStart_),this.on(this.tech_,"touchmove",this.handleTechTouchMove_),this.on(this.tech_,"touchend",this.handleTechTouchEnd_),this.on(this.tech_,"tap",this.handleTechTap_)},b.prototype.removeTechControlsListeners_=function(){this.off(this.tech_,"tap",this.handleTechTap_),this.off(this.tech_,"touchstart",this.handleTechTouchStart_),this.off(this.tech_,"touchmove",this.handleTechTouchMove_),this.off(this.tech_,"touchend",this.handleTechTouchEnd_),this.off(this.tech_,"mousedown",this.handleTechClick_)},b.prototype.handleTechReady_=function(){this.triggerReady(),this.cache_.volume&&this.techCall_("setVolume",this.cache_.volume),this.handleTechPosterChange_(),this.handleTechDurationChange_(),this.tag&&this.options_.autoplay&&this.paused()&&(delete this.tag.poster,this.play())},b.prototype.handleTechLoadStart_=function(){this.removeClass("vjs-ended"),this.error(null),this.paused()?(this.hasStarted(!1),this.trigger("loadstart")):(this.trigger("loadstart"),this.trigger("firstplay"))},b.prototype.hasStarted=function(a){return void 0!==a?(this.hasStarted_!==a&&(this.hasStarted_=a,a?(this.addClass("vjs-has-started"),this.trigger("firstplay")):this.removeClass("vjs-has-started")),this):!!this.hasStarted_},b.prototype.handleTechPlay_=function(){this.removeClass("vjs-ended"),this.removeClass("vjs-paused"),this.addClass("vjs-playing"),this.hasStarted(!0),this.trigger("play")},b.prototype.handleTechWaiting_=function(){this.addClass("vjs-waiting"),this.trigger("waiting")},b.prototype.handleTechCanPlay_=function(){this.removeClass("vjs-waiting"),this.trigger("canplay")},b.prototype.handleTechCanPlayThrough_=function(){this.removeClass("vjs-waiting"),this.trigger("canplaythrough")},b.prototype.handleTechPlaying_=function(){this.removeClass("vjs-waiting"),this.trigger("playing")},b.prototype.handleTechSeeking_=function(){this.addClass("vjs-seeking"),this.trigger("seeking")},b.prototype.handleTechSeeked_=function(){this.removeClass("vjs-seeking"),this.trigger("seeked")},b.prototype.handleTechFirstPlay_=function(){this.options_.starttime&&this.currentTime(this.options_.starttime),this.addClass("vjs-has-started"),this.trigger("firstplay")},b.prototype.handleTechPause_=function(){this.removeClass("vjs-playing"),this.addClass("vjs-paused"),this.trigger("pause")},b.prototype.handleTechProgress_=function(){this.trigger("progress")},b.prototype.handleTechEnded_=function(){this.addClass("vjs-ended"),this.options_.loop?(this.currentTime(0),this.play()):this.paused()||this.pause(),this.trigger("ended")},b.prototype.handleTechDurationChange_=function(){this.duration(this.techGet_("duration"))},b.prototype.handleTechClick_=function(a){0===a.button&&this.controls()&&(this.paused()?this.play():this.pause())},b.prototype.handleTechTap_=function(){this.userActive(!this.userActive())},b.prototype.handleTechTouchStart_=function(){this.userWasActive=this.userActive()},b.prototype.handleTechTouchMove_=function(){this.userWasActive&&this.reportUserActivity()},b.prototype.handleTechTouchEnd_=function(a){a.preventDefault()},b.prototype.handleFullscreenChange_=function(){this.isFullscreen()?this.addClass("vjs-fullscreen"):this.removeClass("vjs-fullscreen")},b.prototype.handleStageClick_=function(){this.reportUserActivity()},b.prototype.handleTechFullscreenChange_=function(a,b){b&&this.isFullscreen(b.isFullscreen),this.trigger("fullscreenchange")},b.prototype.handleTechError_=function(){var a=this.tech_.error();this.error(a&&a.code)},b.prototype.handleTechSuspend_=function(){this.trigger("suspend")},b.prototype.handleTechAbort_=function(){this.trigger("abort")},b.prototype.handleTechEmptied_=function(){this.trigger("emptied")},b.prototype.handleTechStalled_=function(){this.trigger("stalled")},b.prototype.handleTechLoadedMetaData_=function(){this.trigger("loadedmetadata")},b.prototype.handleTechLoadedData_=function(){this.trigger("loadeddata")},b.prototype.handleTechTimeUpdate_=function(){this.trigger("timeupdate")},b.prototype.handleTechRateChange_=function(){this.trigger("ratechange")},b.prototype.handleTechVolumeChange_=function(){this.trigger("volumechange")},b.prototype.handleTechTextTrackChange_=function(){this.trigger("texttrackchange")},b.prototype.getCache=function(){return this.cache_},b.prototype.techCall_=function(a,b){if(this.tech_&&!this.tech_.isReady_)this.tech_.ready(function(){this[a](b)},!0);else try{this.tech_[a](b)}catch(c){throw x["default"](c),c}},b.prototype.techGet_=function(a){if(this.tech_&&this.tech_.isReady_)try{return this.tech_[a]()}catch(b){throw void 0===this.tech_[a]?x["default"]("Video.js: "+a+" method not defined for "+this.techName_+" playback technology.",b):"TypeError"===b.name?(x["default"]("Video.js: "+a+" unavailable on "+this.techName_+" playback technology element.",b),this.tech_.isReady_=!1):x["default"](b),b}},b.prototype.play=function(){return this.techCall_("play"),this},b.prototype.pause=function(){return this.techCall_("pause"),this},b.prototype.paused=function(){return this.techGet_("paused")===!1?!1:!0},b.prototype.scrubbing=function(a){return void 0!==a?(this.scrubbing_=!!a,a?this.addClass("vjs-scrubbing"):this.removeClass("vjs-scrubbing"),this):this.scrubbing_},b.prototype.currentTime=function(a){return void 0!==a?(this.techCall_("setCurrentTime",a),this):this.cache_.currentTime=this.techGet_("currentTime")||0},b.prototype.duration=function(a){return void 0===a?this.cache_.duration||0:(a=parseFloat(a)||0,0>a&&(a=1/0),a!==this.cache_.duration&&(this.cache_.duration=a,a===1/0?this.addClass("vjs-live"):this.removeClass("vjs-live"),this.trigger("durationchange")),this)},b.prototype.remainingTime=function(){return this.duration()-this.currentTime()},b.prototype.buffered=function c(){var c=this.techGet_("buffered");return c&&c.length||(c=A.createTimeRange(0,0)),c},b.prototype.bufferedPercent=function(){return B.bufferedPercent(this.buffered(),this.duration())},b.prototype.bufferedEnd=function(){var a=this.buffered(),b=this.duration(),c=a.end(a.length-1);return c>b&&(c=b),c},b.prototype.volume=function(a){var b=void 0;return void 0!==a?(b=Math.max(0,Math.min(1,parseFloat(a))),this.cache_.volume=b,this.techCall_("setVolume",b),this):(b=parseFloat(this.techGet_("volume")),isNaN(b)?1:b)},b.prototype.muted=function(a){return void 0!==a?(this.techCall_("setMuted",a),this):this.techGet_("muted")||!1},b.prototype.supportsFullScreen=function(){return this.techGet_("supportsFullScreen")||!1},b.prototype.isFullscreen=function(a){return void 0!==a?(this.isFullscreen_=!!a,this):!!this.isFullscreen_},b.prototype.requestFullscreen=function(){var a=F["default"];return this.isFullscreen(!0),a.requestFullscreen?(o.on(k["default"],a.fullscreenchange,s.bind(this,function b(){this.isFullscreen(k["default"][a.fullscreenElement]),this.isFullscreen()===!1&&o.off(k["default"],a.fullscreenchange,b),this.trigger("fullscreenchange")})),this.el_[a.requestFullscreen]()):this.tech_.supportsFullScreen()?this.techCall_("enterFullScreen"):(this.enterFullWindow(),this.trigger("fullscreenchange")),this},b.prototype.exitFullscreen=function(){var a=F["default"];return this.isFullscreen(!1),a.requestFullscreen?k["default"][a.exitFullscreen]():this.tech_.supportsFullScreen()?this.techCall_("exitFullScreen"):(this.exitFullWindow(),this.trigger("fullscreenchange")),this},b.prototype.enterFullWindow=function(){this.isFullWindow=!0,this.docOrigOverflow=k["default"].documentElement.style.overflow,o.on(k["default"],"keydown",s.bind(this,this.fullWindowOnEscKey)),k["default"].documentElement.style.overflow="hidden",q.addElClass(k["default"].body,"vjs-full-window"),this.trigger("enterFullWindow")},b.prototype.fullWindowOnEscKey=function(a){27===a.keyCode&&(this.isFullscreen()===!0?this.exitFullscreen():this.exitFullWindow())},b.prototype.exitFullWindow=function(){this.isFullWindow=!1,o.off(k["default"],"keydown",this.fullWindowOnEscKey),k["default"].documentElement.style.overflow=this.docOrigOverflow,q.removeElClass(k["default"].body,"vjs-full-window"),this.trigger("exitFullWindow")},b.prototype.selectSource=function(a){for(var b=0,c=this.options_.techOrder;b<c.length;b++){var d=z["default"](c[b]),e=i["default"].getComponent(d);if(e){if(e.isSupported())for(var f=0,g=a;f<g.length;f++){var h=g[f];if(e.canPlaySource(h))return{source:h,tech:d}}}else x["default"].error('The "'+d+'" tech is undefined. Skipped browser support check for that tech.')}return!1},b.prototype.src=function(a){if(void 0===a)return this.techGet_("src");var b=i["default"].getComponent(this.techName_);return Array.isArray(a)?this.sourceList_(a):"string"==typeof a?this.src({src:a}):a instanceof Object&&(a.type&&!b.canPlaySource(a)?this.sourceList_([a]):(this.cache_.src=a.src,this.currentType_=a.type||"",this.ready(function(){b.prototype.hasOwnProperty("setSource")?this.techCall_("setSource",a):this.techCall_("src",a.src),"auto"===this.options_.preload&&this.load(),this.options_.autoplay&&this.play()},!0))),this},b.prototype.sourceList_=function(a){var b=this.selectSource(a);b?b.tech===this.techName_?this.src(b.source):this.loadTech_(b.tech,b.source):(this.setTimeout(function(){this.error({code:4,message:this.localize(this.options_.notSupportedMessage)})},0),this.triggerReady())},b.prototype.load=function(){return this.techCall_("load"),this},b.prototype.currentSrc=function(){return this.techGet_("currentSrc")||this.cache_.src||""},b.prototype.currentType=function(){return this.currentType_||""},b.prototype.preload=function(a){return void 0!==a?(this.techCall_("setPreload",a),this.options_.preload=a,this):this.techGet_("preload")},b.prototype.autoplay=function(a){return void 0!==a?(this.techCall_("setAutoplay",a),this.options_.autoplay=a,this):this.techGet_("autoplay",a)},b.prototype.loop=function(a){return void 0!==a?(this.techCall_("setLoop",a),this.options_.loop=a,this):this.techGet_("loop")},b.prototype.poster=function(a){return void 0===a?this.poster_:(a||(a=""),this.poster_=a,this.techCall_("setPoster",a),this.trigger("posterchange"),this)},b.prototype.handleTechPosterChange_=function(){!this.poster_&&this.tech_&&this.tech_.poster&&(this.poster_=this.tech_.poster()||"",this.trigger("posterchange"))},b.prototype.controls=function(a){return void 0!==a?(a=!!a,this.controls_!==a&&(this.controls_=a,this.usingNativeControls()&&this.techCall_("setControls",a),a?(this.removeClass("vjs-controls-disabled"),this.addClass("vjs-controls-enabled"),this.trigger("controlsenabled"),this.usingNativeControls()||this.addTechControlsListeners_()):(this.removeClass("vjs-controls-enabled"),this.addClass("vjs-controls-disabled"),this.trigger("controlsdisabled"),this.usingNativeControls()||this.removeTechControlsListeners_())),this):!!this.controls_},b.prototype.usingNativeControls=function(a){return void 0!==a?(a=!!a,this.usingNativeControls_!==a&&(this.usingNativeControls_=a,a?(this.addClass("vjs-using-native-controls"),this.trigger("usingnativecontrols")):(this.removeClass("vjs-using-native-controls"),this.trigger("usingcustomcontrols"))),this):!!this.usingNativeControls_},b.prototype.error=function(a){return void 0===a?this.error_||null:null===a?(this.error_=a,this.removeClass("vjs-error"),this):(this.error_=a instanceof H["default"]?a:new H["default"](a),this.trigger("error"),this.addClass("vjs-error"),x["default"].error("(CODE:"+this.error_.code+" "+H["default"].errorTypes[this.error_.code]+")",this.error_.message,this.error_),this)},b.prototype.ended=function(){return this.techGet_("ended")},b.prototype.seeking=function(){return this.techGet_("seeking")},b.prototype.seekable=function(){return this.techGet_("seekable")},b.prototype.reportUserActivity=function(){this.userActivity_=!0},b.prototype.userActive=function(a){return void 0!==a?(a=!!a,a!==this.userActive_&&(this.userActive_=a,a?(this.userActivity_=!0,this.removeClass("vjs-user-inactive"),this.addClass("vjs-user-active"),this.trigger("useractive")):(this.userActivity_=!1,this.tech_&&this.tech_.one("mousemove",function(a){a.stopPropagation(),a.preventDefault()}),this.removeClass("vjs-user-active"),this.addClass("vjs-user-inactive"),this.trigger("userinactive"))),this):this.userActive_},b.prototype.listenForUserActivity_=function(){var a=void 0,b=void 0,c=void 0,d=s.bind(this,this.reportUserActivity),e=function(a){(a.screenX!==b||a.screenY!==c)&&(b=a.screenX,c=a.screenY,d())},f=function(){d(),this.clearInterval(a),a=this.setInterval(d,250)},g=function(){d(),this.clearInterval(a)};this.on("mousedown",f),this.on("mousemove",e),this.on("mouseup",g),this.on("keydown",d),this.on("keyup",d);{var h=void 0;this.setInterval(function(){if(this.userActivity_){this.userActivity_=!1,this.userActive(!0),this.clearTimeout(h);var a=this.options_.inactivityTimeout;a>0&&(h=this.setTimeout(function(){this.userActivity_||this.userActive(!1)},a))}},250)}},b.prototype.playbackRate=function(a){return void 0!==a?(this.techCall_("setPlaybackRate",a),this):this.tech_&&this.tech_.featuresPlaybackRate?this.techGet_("playbackRate"):1},b.prototype.isAudio=function(a){return void 0!==a?(this.isAudio_=!!a,this):!!this.isAudio_},b.prototype.networkState=function(){return this.techGet_("networkState")},b.prototype.readyState=function(){return this.techGet_("readyState")},b.prototype.textTracks=function(){return this.tech_&&this.tech_.textTracks()},b.prototype.remoteTextTracks=function(){return this.tech_&&this.tech_.remoteTextTracks()},b.prototype.addTextTrack=function(a,b,c){return this.tech_&&this.tech_.addTextTrack(a,b,c)},b.prototype.addRemoteTextTrack=function(a){return this.tech_&&this.tech_.addRemoteTextTrack(a)},b.prototype.removeRemoteTextTrack=function(a){this.tech_&&this.tech_.removeRemoteTextTrack(a)},b.prototype.videoWidth=function(){return this.tech_&&this.tech_.videoWidth&&this.tech_.videoWidth()||0},b.prototype.videoHeight=function(){return this.tech_&&this.tech_.videoHeight&&this.tech_.videoHeight()||0},b.prototype.language=function(a){return void 0===a?this.language_:(this.language_=(""+a).toLowerCase(),this)},b.prototype.languages=function(){return N["default"](b.prototype.options_.languages,this.languages_)},b.prototype.toJSON=function(){var a=N["default"](this.options_),b=a.tracks;a.tracks=[];for(var c=0;c<b.length;c++){var d=b[c];d=N["default"](d),d.player=void 0,a.tracks[c]=d}return a},b.getTagSettings=function(a){var b={sources:[],tracks:[]},c=q.getElAttributes(a),d=c["data-setup"];if(null!==d){var e=J["default"](d||"{}"),f=e[0],g=e[1];f&&x["default"].error(f),L["default"](c,g)}if(L["default"](b,c),a.hasChildNodes())for(var h=a.childNodes,i=0,j=h.length;j>i;i++){var k=h[i],l=k.nodeName.toLowerCase();"source"===l?b.sources.push(q.getElAttributes(k)):"track"===l&&b.tracks.push(q.getElAttributes(k))}return b},b}(i["default"]));Z.players={};var $=m["default"].navigator;Z.prototype.options_={techOrder:["html5","flash"],html5:{},flash:{},defaultVolume:0,inactivityTimeout:2e3,playbackRates:[],children:["mediaLoader","posterImage","textTrackDisplay","loadingSpinner","bigPlayButton","controlBar","errorDisplay","textTrackSettings"],language:k["default"].getElementsByTagName("html")[0].getAttribute("lang")||$.languages&&$.languages[0]||$.userLanguage||$.language||"en",languages:{},notSupportedMessage:"No compatible source was found for this video."},Z.prototype.handleLoadedMetaData_,Z.prototype.handleLoadedData_,Z.prototype.handleUserActive_,Z.prototype.handleUserInactive_,Z.prototype.handleTimeUpdate_,Z.prototype.handleVolumeChange_,Z.prototype.handleError_,Z.prototype.flexNotSupported_=function(){var a=k["default"].createElement("i");return!("flexBasis"in a.style||"webkitFlexBasis"in a.style||"mozFlexBasis"in a.style||"msFlexBasis"in a.style||"msFlexOrder"in a.style)},i["default"].registerComponent("Player",Z),c["default"]=Z,b.exports=c["default"]},{"./big-play-button.js":56,"./component.js":58,"./control-bar/control-bar.js":59,"./error-display.js":89,"./fullscreen-api.js":92,"./loading-spinner.js":93,"./media-error.js":94,"./poster-image.js":100,"./tech/html5.js":105,"./tech/loader.js":106,"./tracks/text-track-display.js":109,"./tracks/text-track-list-converter.js":111,"./tracks/text-track-settings.js":113,"./utils/browser.js":115,"./utils/buffer.js":116,"./utils/dom.js":118,"./utils/events.js":119,"./utils/fn.js":120,"./utils/guid.js":122,"./utils/log.js":123,"./utils/merge-options.js":124,"./utils/stylesheet.js":125,"./utils/time-ranges.js":126,"./utils/to-title-case.js":127,"global/document":1,"global/window":2,"object.assign":43,"safe-json-parse/tuple":48}],99:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var e=a("./player.js"),f=d(e),g=function(a,b){f["default"].prototype[a]=b};c["default"]=g,b.exports=c["default"]},{"./player.js":98}],100:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("./button.js"),i=e(h),j=a("./component.js"),k=e(j),l=a("./utils/fn.js"),m=d(l),n=a("./utils/dom.js"),o=d(n),p=a("./utils/browser.js"),q=d(p),r=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.update(),c.on("posterchange",m.bind(this,this.update))}return g(b,a),b.prototype.dispose=function(){this.player().off("posterchange",this.update),a.prototype.dispose.call(this)},b.prototype.createEl=function(){var a=o.createEl("div",{className:"vjs-poster",tabIndex:-1});return q.BACKGROUND_SIZE_SUPPORTED||(this.fallbackImg_=o.createEl("img"),a.appendChild(this.fallbackImg_)),a},b.prototype.update=function(){var a=this.player().poster();this.setSrc(a),a?this.show():this.hide()},b.prototype.setSrc=function(a){if(this.fallbackImg_)this.fallbackImg_.src=a;else{var b="";a&&(b='url("'+a+'")'),this.el_.style.backgroundImage=b}},b.prototype.handleClick=function(){this.player_.paused()?this.player_.play():this.player_.pause()},b}(i["default"]);k["default"].registerComponent("PosterImage",r),c["default"]=r,b.exports=c["default"]},{"./button.js":57,"./component.js":58,"./utils/browser.js":115,"./utils/dom.js":118,"./utils/fn.js":120}],101:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}c.__esModule=!0;var f=a("./utils/events.js"),g=e(f),h=a("global/document"),i=d(h),j=a("global/window"),k=d(j),l=!1,m=void 0,n=function(){var a=i["default"].getElementsByTagName("video"),b=i["default"].getElementsByTagName("audio"),c=[];if(a&&a.length>0)for(var d=0,e=a.length;e>d;d++)c.push(a[d]);if(b&&b.length>0)for(var d=0,e=b.length;e>d;d++)c.push(b[d]);if(c&&c.length>0)for(var d=0,e=c.length;e>d;d++){var f=c[d];if(!f||!f.getAttribute){o(1);break}if(void 0===f.player){var g=f.getAttribute("data-setup");if(null!==g){m(f)}}}else l||o(1)},o=function(a,b){m=b,setTimeout(n,a)};"complete"===i["default"].readyState?l=!0:g.one(k["default"],"load",function(){l=!0});var p=function(){return l};c.autoSetup=n,c.autoSetupTimeout=o,c.hasLoaded=p},{"./utils/events.js":119,"global/document":1,"global/window":2}],102:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../component.js"),i=e(h),j=a("../utils/dom.js"),k=d(j),l=a("global/document"),m=e(l),n=a("object.assign"),o=e(n),p=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.bar=this.getChild(this.options_.barName),this.vertical(!!this.options_.vertical),this.on("mousedown",this.handleMouseDown),this.on("touchstart",this.handleMouseDown),this.on("focus",this.handleFocus),this.on("blur",this.handleBlur),this.on("click",this.handleClick),this.on(c,"controlsvisible",this.update),this.on(c,this.playerEvent,this.update)}return g(b,a),b.prototype.createEl=function(b){var c=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],d=arguments.length<=2||void 0===arguments[2]?{}:arguments[2];return c.className=c.className+" vjs-slider",c=o["default"]({tabIndex:0},c),d=o["default"]({role:"slider","aria-valuenow":0,"aria-valuemin":0,"aria-valuemax":100,tabIndex:0},d),a.prototype.createEl.call(this,b,c,d)},b.prototype.handleMouseDown=function(a){a.preventDefault(),k.blockTextSelection(),this.addClass("vjs-sliding"),this.trigger("slideractive"),this.on(m["default"],"mousemove",this.handleMouseMove),this.on(m["default"],"mouseup",this.handleMouseUp),this.on(m["default"],"touchmove",this.handleMouseMove),this.on(m["default"],"touchend",this.handleMouseUp),this.handleMouseMove(a)},b.prototype.handleMouseMove=function(){},b.prototype.handleMouseUp=function(){k.unblockTextSelection(),this.removeClass("vjs-sliding"),this.trigger("sliderinactive"),this.off(m["default"],"mousemove",this.handleMouseMove),this.off(m["default"],"mouseup",this.handleMouseUp),this.off(m["default"],"touchmove",this.handleMouseMove),this.off(m["default"],"touchend",this.handleMouseUp),this.update()},b.prototype.update=function(){if(this.el_){var a=this.getPercent(),b=this.bar;if(b){("number"!=typeof a||a!==a||0>a||a===1/0)&&(a=0);var c=(100*a).toFixed(2)+"%";this.vertical()?b.el().style.height=c:b.el().style.width=c}}},b.prototype.calculateDistance=function(a){var b=k.getPointerPosition(this.el_,a);return this.vertical()?b.y:b.x},b.prototype.handleFocus=function(){this.on(m["default"],"keydown",this.handleKeyPress)},b.prototype.handleKeyPress=function(a){37===a.which||40===a.which?(a.preventDefault(),this.stepBack()):(38===a.which||39===a.which)&&(a.preventDefault(),this.stepForward())},b.prototype.handleBlur=function(){this.off(m["default"],"keydown",this.handleKeyPress)},b.prototype.handleClick=function(a){a.stopImmediatePropagation(),a.preventDefault()},b.prototype.vertical=function(a){return void 0===a?this.vertical_||!1:(this.vertical_=!!a,this.addClass(this.vertical_?"vjs-slider-vertical":"vjs-slider-horizontal"),this)},b}(i["default"]);i["default"].registerComponent("Slider",p),c["default"]=p,b.exports=c["default"]},{"../component.js":58,"../utils/dom.js":118,"global/document":1,"object.assign":43}],103:[function(a,b,c){"use strict";function d(a){return a.streamingFormats={"rtmp/mp4":"MP4","rtmp/flv":"FLV"},a.streamFromParts=function(a,b){return a+"&"+b},a.streamToParts=function(a){var b={connection:"",stream:""};if(!a)return b;var c=a.indexOf("&"),d=void 0;return-1!==c?d=c+1:(c=d=a.lastIndexOf("/")+1,0===c&&(c=d=a.length)),b.connection=a.substring(0,c),b.stream=a.substring(d,a.length),b},a.isStreamingType=function(b){return b in a.streamingFormats},a.RTMP_RE=/^rtmp[set]?:\/\//i,a.isStreamingSrc=function(b){return a.RTMP_RE.test(b)},a.rtmpSourceHandler={},a.rtmpSourceHandler.canHandleSource=function(b){return a.isStreamingType(b.type)||a.isStreamingSrc(b.src)?"maybe":""},a.rtmpSourceHandler.handleSource=function(b,c){var d=a.streamToParts(b.src);c.setRtmpConnection(d.connection),c.setRtmpStream(d.stream)},a.registerSourceHandler(a.rtmpSourceHandler),a}c.__esModule=!0,c["default"]=d,b.exports=c["default"]},{}],104:[function(a,b,c){
 
"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}function h(a){var b=a.charAt(0).toUpperCase()+a.slice(1);A["set"+b]=function(b){return this.el_.vjs_setProperty(a,b)}}function i(a){A[a]=function(){return this.el_.vjs_getProperty(a)}}c.__esModule=!0;for(var j=a("./tech"),k=e(j),l=a("../utils/dom.js"),m=d(l),n=a("../utils/url.js"),o=d(n),p=a("../utils/time-ranges.js"),q=a("./flash-rtmp"),r=e(q),s=a("../component"),t=e(s),u=a("global/window"),v=e(u),w=a("object.assign"),x=e(w),y=v["default"].navigator,z=function(a){function b(c,d){f(this,b),a.call(this,c,d),c.source&&this.ready(function(){this.setSource(c.source)},!0),c.startTime&&this.ready(function(){this.load(),this.play(),this.currentTime(c.startTime)},!0),v["default"].videojs=v["default"].videojs||{},v["default"].videojs.Flash=v["default"].videojs.Flash||{},v["default"].videojs.Flash.onReady=b.onReady,v["default"].videojs.Flash.onEvent=b.onEvent,v["default"].videojs.Flash.onError=b.onError,this.on("seeked",function(){this.lastSeekTarget_=void 0})}return g(b,a),b.prototype.createEl=function(){var a=this.options_;a.swf||(a.swf="//vjs.zencdn.net/swf/5.0.0-rc1/video-js.swf");var c=a.techId,d=x["default"]({readyFunction:"videojs.Flash.onReady",eventProxyFunction:"videojs.Flash.onEvent",errorEventProxyFunction:"videojs.Flash.onError",autoplay:a.autoplay,preload:a.preload,loop:a.loop,muted:a.muted},a.flashVars),e=x["default"]({wmode:"opaque",bgcolor:"#000000"},a.params),f=x["default"]({id:c,name:c,"class":"vjs-tech"},a.attributes);return this.el_=b.embed(a.swf,d,e,f),this.el_.tech=this,this.el_},b.prototype.play=function(){this.ended()&&this.setCurrentTime(0),this.el_.vjs_play()},b.prototype.pause=function(){this.el_.vjs_pause()},b.prototype.src=function(a){return void 0===a?this.currentSrc():this.setSrc(a)},b.prototype.setSrc=function(a){if(a=o.getAbsoluteURL(a),this.el_.vjs_src(a),this.autoplay()){var b=this;this.setTimeout(function(){b.play()},0)}},b.prototype.seeking=function(){return void 0!==this.lastSeekTarget_},b.prototype.setCurrentTime=function(b){var c=this.seekable();c.length&&(b=b>c.start(0)?b:c.start(0),b=b<c.end(c.length-1)?b:c.end(c.length-1),this.lastSeekTarget_=b,this.trigger("seeking"),this.el_.vjs_setProperty("currentTime",b),a.prototype.setCurrentTime.call(this))},b.prototype.currentTime=function(){return this.seeking()?this.lastSeekTarget_||0:this.el_.vjs_getProperty("currentTime")},b.prototype.currentSrc=function(){return this.currentSource_?this.currentSource_.src:this.el_.vjs_getProperty("currentSrc")},b.prototype.load=function(){this.el_.vjs_load()},b.prototype.poster=function(){this.el_.vjs_getProperty("poster")},b.prototype.setPoster=function(){},b.prototype.seekable=function(){var a=this.duration();return 0===a?p.createTimeRange():p.createTimeRange(0,a)},b.prototype.buffered=function(){var a=this.el_.vjs_getProperty("buffered");return 0===a.length?p.createTimeRange():p.createTimeRange(a[0][0],a[0][1])},b.prototype.supportsFullScreen=function(){return!1},b.prototype.enterFullScreen=function(){return!1},b}(k["default"]),A=z.prototype,B="rtmpConnection,rtmpStream,preload,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted".split(","),C="networkState,readyState,initialTime,duration,startOffsetTime,paused,ended,videoTracks,audioTracks,videoWidth,videoHeight".split(","),D=0;D<B.length;D++)i(B[D]),h(B[D]);for(var D=0;D<C.length;D++)i(C[D]);z.isSupported=function(){return z.version()[0]>=10},k["default"].withSourceHandlers(z),z.nativeSourceHandler={},z.nativeSourceHandler.canHandleSource=function(a){function b(a){var b=o.getFileExtension(a);return b?"video/"+b:""}var c;return c=a.type?a.type.replace(/;.*/,"").toLowerCase():b(a.src),c in z.formats?"maybe":""},z.nativeSourceHandler.handleSource=function(a,b){b.setSrc(a.src)},z.nativeSourceHandler.dispose=function(){},z.registerSourceHandler(z.nativeSourceHandler),z.formats={"video/flv":"FLV","video/x-flv":"FLV","video/mp4":"MP4","video/m4v":"MP4"},z.onReady=function(a){var b=m.getEl(a),c=b&&b.tech;c&&c.el()&&z.checkReady(c)},z.checkReady=function(a){a.el()&&(a.el().vjs_getProperty?a.triggerReady():this.setTimeout(function(){z.checkReady(a)},50))},z.onEvent=function(a,b){var c=m.getEl(a).tech;c.trigger(b)},z.onError=function(a,b){var c=m.getEl(a).tech;return"srcnotfound"===b?c.error(4):void c.error("FLASH: "+b)},z.version=function(){var a="0,0,0";try{a=new v["default"].ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version").replace(/\D+/g,",").match(/^,?(.+),?$/)[1]}catch(b){try{y.mimeTypes["application/x-shockwave-flash"].enabledPlugin&&(a=(y.plugins["Shockwave Flash 2.0"]||y.plugins["Shockwave Flash"]).description.replace(/\D+/g,",").match(/^,?(.+),?$/)[1])}catch(c){}}return a.split(",")},z.embed=function(a,b,c,d){var e=z.getEmbedCode(a,b,c,d),f=m.createEl("div",{innerHTML:e}).childNodes[0];return f},z.getEmbedCode=function(a,b,c,d){var e='<object type="application/x-shockwave-flash" ',f="",g="",h="";return b&&Object.getOwnPropertyNames(b).forEach(function(a){f+=a+"="+b[a]+"&amp;"}),c=x["default"]({movie:a,flashvars:f,allowScriptAccess:"always",allowNetworking:"all"},c),Object.getOwnPropertyNames(c).forEach(function(a){g+='<param name="'+a+'" value="'+c[a]+'" />'}),d=x["default"]({data:a,width:"100%",height:"100%"},d),Object.getOwnPropertyNames(d).forEach(function(a){h+=a+'="'+d[a]+'" '}),""+e+h+">"+g+"</object>"},r["default"](z),t["default"].registerComponent("Flash",z),c["default"]=z,b.exports=c["default"]},{"../component":58,"../utils/dom.js":118,"../utils/time-ranges.js":126,"../utils/url.js":128,"./flash-rtmp":103,"./tech":107,"global/window":2,"object.assign":43}],105:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("./tech.js"),i=e(h),j=a("../component"),k=e(j),l=a("../utils/dom.js"),m=d(l),n=a("../utils/url.js"),o=d(n),p=a("../utils/fn.js"),q=d(p),r=a("../utils/log.js"),s=e(r),t=a("../utils/browser.js"),u=d(t),v=a("global/document"),w=e(v),x=a("global/window"),y=e(x),z=a("object.assign"),A=e(z),B=a("../utils/merge-options.js"),C=e(B),D=function(a){function b(c,d){f(this,b),a.call(this,c,d);var e=c.source;if(e&&(this.el_.currentSrc!==e.src||c.tag&&3===c.tag.initNetworkState_)?this.setSource(e):this.handleLateInit_(this.el_),this.el_.hasChildNodes()){for(var g=this.el_.childNodes,h=g.length,i=[];h--;){var j=g[h],k=j.nodeName.toLowerCase();"track"===k&&(this.featuresNativeTextTracks?this.remoteTextTracks().addTrack_(j.track):i.push(j))}for(var l=0;l<i.length;l++)this.el_.removeChild(i[l])}this.featuresNativeTextTracks&&(this.handleTextTrackChange_=q.bind(this,this.handleTextTrackChange),this.handleTextTrackAdd_=q.bind(this,this.handleTextTrackAdd),this.handleTextTrackRemove_=q.bind(this,this.handleTextTrackRemove),this.proxyNativeTextTracks_()),(u.TOUCH_ENABLED&&c.nativeControlsForTouch===!0||u.IS_IPHONE||u.IS_NATIVE_ANDROID)&&this.setControls(!0),this.triggerReady()}return g(b,a),b.prototype.dispose=function(){var c=this.el().textTracks,d=this.textTracks();c&&c.removeEventListener&&(c.removeEventListener("change",this.handleTextTrackChange_),c.removeEventListener("addtrack",this.handleTextTrackAdd_),c.removeEventListener("removetrack",this.handleTextTrackRemove_));for(var e=d.length;e--;)d.removeTrack_(d[e]);b.disposeMediaElement(this.el_),a.prototype.dispose.call(this)},b.prototype.createEl=function(){var a=this.options_.tag;if(!a||this.movingMediaElementInDOM===!1)if(a){var c=a.cloneNode(!0);a.parentNode.insertBefore(c,a),b.disposeMediaElement(a),a=c}else{a=w["default"].createElement("video");var d=this.options_.tag&&m.getElAttributes(this.options_.tag),e=C["default"]({},d);u.TOUCH_ENABLED&&this.options_.nativeControlsForTouch===!0||delete e.controls,m.setElAttributes(a,A["default"](e,{id:this.options_.techId,"class":"vjs-tech"}))}for(var f=["autoplay","preload","loop","muted"],g=f.length-1;g>=0;g--){var h=f[g],i={};"undefined"!=typeof this.options_[h]&&(i[h]=this.options_[h]),m.setElAttributes(a,i)}return a},b.prototype.handleLateInit_=function(a){var b=this;if(0!==a.networkState&&3!==a.networkState){if(0===a.readyState){var c=function(){var a=!1,c=function(){a=!0};b.on("loadstart",c);var d=function(){a||this.trigger("loadstart")};return b.on("loadedmetadata",d),b.ready(function(){this.off("loadstart",c),this.off("loadedmetadata",d),a||this.trigger("loadstart")}),{v:void 0}}();if("object"==typeof c)return c.v}var d=["loadstart"];d.push("loadedmetadata"),a.readyState>=2&&d.push("loadeddata"),a.readyState>=3&&d.push("canplay"),a.readyState>=4&&d.push("canplaythrough"),this.ready(function(){d.forEach(function(a){this.trigger(a)},this)})}},b.prototype.proxyNativeTextTracks_=function(){var a=this.el().textTracks;a&&a.addEventListener&&(a.addEventListener("change",this.handleTextTrackChange_),a.addEventListener("addtrack",this.handleTextTrackAdd_),a.addEventListener("removetrack",this.handleTextTrackRemove_))},b.prototype.handleTextTrackChange=function(){var a=this.textTracks();this.textTracks().trigger({type:"change",target:a,currentTarget:a,srcElement:a})},b.prototype.handleTextTrackAdd=function(a){this.textTracks().addTrack_(a.track)},b.prototype.handleTextTrackRemove=function(a){this.textTracks().removeTrack_(a.track)},b.prototype.play=function(){this.el_.play()},b.prototype.pause=function(){this.el_.pause()},b.prototype.paused=function(){return this.el_.paused},b.prototype.currentTime=function(){return this.el_.currentTime},b.prototype.setCurrentTime=function(a){try{this.el_.currentTime=a}catch(b){s["default"](b,"Video is not ready. (Video.js)")}},b.prototype.duration=function(){return this.el_.duration||0},b.prototype.buffered=function(){return this.el_.buffered},b.prototype.volume=function(){return this.el_.volume},b.prototype.setVolume=function(a){this.el_.volume=a},b.prototype.muted=function(){return this.el_.muted},b.prototype.setMuted=function(a){this.el_.muted=a},b.prototype.width=function(){return this.el_.offsetWidth},b.prototype.height=function(){return this.el_.offsetHeight},b.prototype.supportsFullScreen=function(){if("function"==typeof this.el_.webkitEnterFullScreen){var a=y["default"].navigator.userAgent;if(/Android/.test(a)||!/Chrome|Mac OS X 10.5/.test(a))return!0}return!1},b.prototype.enterFullScreen=function(){var a=this.el_;"webkitDisplayingFullscreen"in a&&this.one("webkitbeginfullscreen",function(){this.one("webkitendfullscreen",function(){this.trigger("fullscreenchange",{isFullscreen:!1})}),this.trigger("fullscreenchange",{isFullscreen:!0})}),a.paused&&a.networkState<=a.HAVE_METADATA?(this.el_.play(),this.setTimeout(function(){a.pause(),a.webkitEnterFullScreen()},0)):a.webkitEnterFullScreen()},b.prototype.exitFullScreen=function(){this.el_.webkitExitFullScreen()},b.prototype.src=function(a){return void 0===a?this.el_.src:void this.setSrc(a)},b.prototype.setSrc=function(a){this.el_.src=a},b.prototype.load=function(){this.el_.load()},b.prototype.currentSrc=function(){return this.el_.currentSrc},b.prototype.poster=function(){return this.el_.poster},b.prototype.setPoster=function(a){this.el_.poster=a},b.prototype.preload=function(){return this.el_.preload},b.prototype.setPreload=function(a){this.el_.preload=a},b.prototype.autoplay=function(){return this.el_.autoplay},b.prototype.setAutoplay=function(a){this.el_.autoplay=a},b.prototype.controls=function(){return this.el_.controls},b.prototype.setControls=function(a){this.el_.controls=!!a},b.prototype.loop=function(){return this.el_.loop},b.prototype.setLoop=function(a){this.el_.loop=a},b.prototype.error=function(){return this.el_.error},b.prototype.seeking=function(){return this.el_.seeking},b.prototype.seekable=function(){return this.el_.seekable},b.prototype.ended=function(){return this.el_.ended},b.prototype.defaultMuted=function(){return this.el_.defaultMuted},b.prototype.playbackRate=function(){return this.el_.playbackRate},b.prototype.played=function(){return this.el_.played},b.prototype.setPlaybackRate=function(a){this.el_.playbackRate=a},b.prototype.networkState=function(){return this.el_.networkState},b.prototype.readyState=function(){return this.el_.readyState},b.prototype.videoWidth=function(){return this.el_.videoWidth},b.prototype.videoHeight=function(){return this.el_.videoHeight},b.prototype.textTracks=function(){return a.prototype.textTracks.call(this)},b.prototype.addTextTrack=function(b,c,d){return this.featuresNativeTextTracks?this.el_.addTextTrack(b,c,d):a.prototype.addTextTrack.call(this,b,c,d)},b.prototype.addRemoteTextTrack=function(){var b=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];if(!this.featuresNativeTextTracks)return a.prototype.addRemoteTextTrack.call(this,b);var c=w["default"].createElement("track");return b.kind&&(c.kind=b.kind),b.label&&(c.label=b.label),(b.language||b.srclang)&&(c.srclang=b.language||b.srclang),b["default"]&&(c["default"]=b["default"]),b.id&&(c.id=b.id),b.src&&(c.src=b.src),this.el().appendChild(c),this.remoteTextTracks().addTrack_(c.track),c},b.prototype.removeRemoteTextTrack=function(b){if(!this.featuresNativeTextTracks)return a.prototype.removeRemoteTextTrack.call(this,b);var c,d;for(this.remoteTextTracks().removeTrack_(b),c=this.el().querySelectorAll("track"),d=c.length;d--;)(b===c[d]||b===c[d].track)&&this.el().removeChild(c[d])},b}(i["default"]);D.TEST_VID=w["default"].createElement("video");var E=w["default"].createElement("track");E.kind="captions",E.srclang="en",E.label="English",D.TEST_VID.appendChild(E),D.isSupported=function(){try{D.TEST_VID.volume=.5}catch(a){return!1}return!!D.TEST_VID.canPlayType},i["default"].withSourceHandlers(D),D.nativeSourceHandler={},D.nativeSourceHandler.canHandleSource=function(a){function b(a){try{return D.TEST_VID.canPlayType(a)}catch(b){return""}}var c;return a.type?b(a.type):a.src?(c=o.getFileExtension(a.src),b("video/"+c)):""},D.nativeSourceHandler.handleSource=function(a,b){b.setSrc(a.src)},D.nativeSourceHandler.dispose=function(){},D.registerSourceHandler(D.nativeSourceHandler),D.canControlVolume=function(){var a=D.TEST_VID.volume;return D.TEST_VID.volume=a/2+.1,a!==D.TEST_VID.volume},D.canControlPlaybackRate=function(){var a=D.TEST_VID.playbackRate;return D.TEST_VID.playbackRate=a/2+.1,a!==D.TEST_VID.playbackRate},D.supportsNativeTextTracks=function(){var a;return a=!!D.TEST_VID.textTracks,a&&D.TEST_VID.textTracks.length>0&&(a="number"!=typeof D.TEST_VID.textTracks[0].mode),a&&u.IS_FIREFOX&&(a=!1),!a||"onremovetrack"in D.TEST_VID.textTracks||(a=!1),a},D.Events=["loadstart","suspend","abort","error","emptied","stalled","loadedmetadata","loadeddata","canplay","canplaythrough","playing","waiting","seeking","seeked","ended","durationchange","timeupdate","progress","play","pause","ratechange","volumechange"],D.prototype.featuresVolumeControl=D.canControlVolume(),D.prototype.featuresPlaybackRate=D.canControlPlaybackRate(),D.prototype.movingMediaElementInDOM=!u.IS_IOS,D.prototype.featuresFullscreenResize=!0,D.prototype.featuresProgressEvents=!0,D.prototype.featuresNativeTextTracks=D.supportsNativeTextTracks();var F=void 0,G=/^application\/(?:x-|vnd\.apple\.)mpegurl/i,H=/^video\/mp4/i;D.patchCanPlayType=function(){u.ANDROID_VERSION>=4&&(F||(F=D.TEST_VID.constructor.prototype.canPlayType),D.TEST_VID.constructor.prototype.canPlayType=function(a){return a&&G.test(a)?"maybe":F.call(this,a)}),u.IS_OLD_ANDROID&&(F||(F=D.TEST_VID.constructor.prototype.canPlayType),D.TEST_VID.constructor.prototype.canPlayType=function(a){return a&&H.test(a)?"maybe":F.call(this,a)})},D.unpatchCanPlayType=function(){var a=D.TEST_VID.constructor.prototype.canPlayType;return D.TEST_VID.constructor.prototype.canPlayType=F,F=null,a},D.patchCanPlayType(),D.disposeMediaElement=function(a){if(a){for(a.parentNode&&a.parentNode.removeChild(a);a.hasChildNodes();)a.removeChild(a.firstChild);a.removeAttribute("src"),"function"==typeof a.load&&!function(){try{a.load()}catch(b){}}()}},k["default"].registerComponent("Html5",D),c["default"]=D,b.exports=c["default"]},{"../component":58,"../utils/browser.js":115,"../utils/dom.js":118,"../utils/fn.js":120,"../utils/log.js":123,"../utils/merge-options.js":124,"../utils/url.js":128,"./tech.js":107,"global/document":1,"global/window":2,"object.assign":43}],106:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../component"),h=d(g),i=a("global/window"),j=(d(i),a("../utils/to-title-case.js")),k=d(j),l=function(a){function b(c,d,f){if(e(this,b),a.call(this,c,d,f),d.playerOptions.sources&&0!==d.playerOptions.sources.length)c.src(d.playerOptions.sources);else for(var g=0,i=d.playerOptions.techOrder;g<i.length;g++){var j=k["default"](i[g]),l=h["default"].getComponent(j);if(l&&l.isSupported()){c.loadTech_(j);break}}}return f(b,a),b}(h["default"]);h["default"].registerComponent("MediaLoader",l),c["default"]=l,b.exports=c["default"]},{"../component":58,"../utils/to-title-case.js":127,"global/window":2}],107:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../component"),i=e(h),j=a("../tracks/text-track"),k=e(j),l=a("../tracks/text-track-list"),m=e(l),n=a("../utils/fn.js"),o=d(n),p=a("../utils/log.js"),q=e(p),r=a("../utils/time-ranges.js"),s=a("../utils/buffer.js"),t=a("../media-error.js"),u=e(t),v=a("global/window"),w=e(v),x=a("global/document"),y=e(x),z=function(a){function b(){var c=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],d=arguments.length<=1||void 0===arguments[1]?function(){}:arguments[1];f(this,b),c.reportTouchActivity=!1,a.call(this,null,c,d),this.hasStarted_=!1,this.on("playing",function(){this.hasStarted_=!0}),this.on("loadstart",function(){this.hasStarted_=!1}),this.textTracks_=c.textTracks,this.featuresProgressEvents||this.manualProgressOn(),this.featuresTimeupdateEvents||this.manualTimeUpdatesOn(),(c.nativeCaptions===!1||c.nativeTextTracks===!1)&&(this.featuresNativeTextTracks=!1),this.featuresNativeTextTracks||this.emulateTextTracks(),this.initTextTrackListeners(),this.emitTapEvents()}/*! Time Tracking -------------------------------------------------------------- */
 
return g(b,a),b.prototype.manualProgressOn=function(){this.on("durationchange",this.onDurationChange),this.manualProgress=!0,this.one("ready",this.trackProgress)},b.prototype.manualProgressOff=function(){this.manualProgress=!1,this.stopTrackingProgress(),this.off("durationchange",this.onDurationChange)},b.prototype.trackProgress=function(){this.stopTrackingProgress(),this.progressInterval=this.setInterval(o.bind(this,function(){var a=this.bufferedPercent();this.bufferedPercent_!==a&&this.trigger("progress"),this.bufferedPercent_=a,1===a&&this.stopTrackingProgress()}),500)},b.prototype.onDurationChange=function(){this.duration_=this.duration()},b.prototype.buffered=function(){return r.createTimeRange(0,0)},b.prototype.bufferedPercent=function(){return s.bufferedPercent(this.buffered(),this.duration_)},b.prototype.stopTrackingProgress=function(){this.clearInterval(this.progressInterval)},b.prototype.manualTimeUpdatesOn=function(){this.manualTimeUpdates=!0,this.on("play",this.trackCurrentTime),this.on("pause",this.stopTrackingCurrentTime)},b.prototype.manualTimeUpdatesOff=function(){this.manualTimeUpdates=!1,this.stopTrackingCurrentTime(),this.off("play",this.trackCurrentTime),this.off("pause",this.stopTrackingCurrentTime)},b.prototype.trackCurrentTime=function(){this.currentTimeInterval&&this.stopTrackingCurrentTime(),this.currentTimeInterval=this.setInterval(function(){this.trigger({type:"timeupdate",target:this,manuallyTriggered:!0})},250)},b.prototype.stopTrackingCurrentTime=function(){this.clearInterval(this.currentTimeInterval),this.trigger({type:"timeupdate",target:this,manuallyTriggered:!0})},b.prototype.dispose=function(){var b=this.textTracks();if(b)for(var c=b.length;c--;)this.removeRemoteTextTrack(b[c]);this.manualProgress&&this.manualProgressOff(),this.manualTimeUpdates&&this.manualTimeUpdatesOff(),a.prototype.dispose.call(this)},b.prototype.error=function(a){return void 0!==a&&(this.error_=a instanceof u["default"]?a:new u["default"](a),this.trigger("error")),this.error_},b.prototype.played=function(){return this.hasStarted_?r.createTimeRange(0,0):r.createTimeRange()},b.prototype.setCurrentTime=function(){this.manualTimeUpdates&&this.trigger({type:"timeupdate",target:this,manuallyTriggered:!0})},b.prototype.initTextTrackListeners=function(){var a=o.bind(this,function(){this.trigger("texttrackchange")}),b=this.textTracks();b&&(b.addEventListener("removetrack",a),b.addEventListener("addtrack",a),this.on("dispose",o.bind(this,function(){b.removeEventListener("removetrack",a),b.removeEventListener("addtrack",a)})))},b.prototype.emulateTextTracks=function(){if(!w["default"].WebVTT&&null!=this.el().parentNode){var a=y["default"].createElement("script");a.src=this.options_["vtt.js"]||"../node_modules/vtt.js/dist/vtt.js",this.el().parentNode.appendChild(a),w["default"].WebVTT=!0}var b=this.textTracks();if(b){var c=o.bind(this,function(){var a=this,c=function(){return a.trigger("texttrackchange")};c();for(var d=0;d<b.length;d++){var e=b[d];e.removeEventListener("cuechange",c),"showing"===e.mode&&e.addEventListener("cuechange",c)}});b.addEventListener("change",c),this.on("dispose",function(){b.removeEventListener("change",c)})}},b.prototype.textTracks=function(){return this.textTracks_=this.textTracks_||new m["default"],this.textTracks_},b.prototype.remoteTextTracks=function(){return this.remoteTextTracks_=this.remoteTextTracks_||new m["default"],this.remoteTextTracks_},b.prototype.addTextTrack=function(a,b,c){if(!a)throw new Error("TextTrack kind is required but was not provided");return A(this,a,b,c)},b.prototype.addRemoteTextTrack=function(a){var b=A(this,a.kind,a.label,a.language,a);return this.remoteTextTracks().addTrack_(b),{track:b}},b.prototype.removeRemoteTextTrack=function(a){this.textTracks().removeTrack_(a),this.remoteTextTracks().removeTrack_(a)},b.prototype.setPoster=function(){},b}(i["default"]);z.prototype.textTracks_;var A=function(a,b,c,d){var e=arguments.length<=4||void 0===arguments[4]?{}:arguments[4],f=a.textTracks();e.kind=b,c&&(e.label=c),d&&(e.language=d),e.tech=a;var g=new k["default"](e);return f.addTrack_(g),g};z.prototype.featuresVolumeControl=!0,z.prototype.featuresFullscreenResize=!1,z.prototype.featuresPlaybackRate=!1,z.prototype.featuresProgressEvents=!1,z.prototype.featuresTimeupdateEvents=!1,z.prototype.featuresNativeTextTracks=!1,z.withSourceHandlers=function(a){a.registerSourceHandler=function(b,c){var d=a.sourceHandlers;d||(d=a.sourceHandlers=[]),void 0===c&&(c=d.length),d.splice(c,0,b)},a.selectSourceHandler=function(b){for(var c=a.sourceHandlers||[],d=void 0,e=0;e<c.length;e++)if(d=c[e].canHandleSource(b))return c[e];return null},a.canPlaySource=function(b){var c=a.selectSourceHandler(b);return c?c.canHandleSource(b):""};var b=a.prototype.seekable;a.prototype.seekable=function(){return this.sourceHandler_&&this.sourceHandler_.seekable?this.sourceHandler_.seekable():b.call(this)},a.prototype.setSource=function(b){var c=a.selectSourceHandler(b);return c||(a.nativeSourceHandler?c=a.nativeSourceHandler:q["default"].error("No source hander found for the current source.")),this.disposeSourceHandler(),this.off("dispose",this.disposeSourceHandler),this.currentSource_=b,this.sourceHandler_=c.handleSource(b,this),this.on("dispose",this.disposeSourceHandler),this},a.prototype.disposeSourceHandler=function(){this.sourceHandler_&&this.sourceHandler_.dispose&&this.sourceHandler_.dispose()}},i["default"].registerComponent("Tech",z),i["default"].registerComponent("MediaTechController",z),c["default"]=z,b.exports=c["default"]},{"../component":58,"../media-error.js":94,"../tracks/text-track":114,"../tracks/text-track-list":112,"../utils/buffer.js":116,"../utils/fn.js":120,"../utils/log.js":123,"../utils/time-ranges.js":126,"global/document":1,"global/window":2}],108:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}c.__esModule=!0;var f=a("../utils/browser.js"),g=e(f),h=a("global/document"),i=d(h),j=function k(a){var b=this;if(g.IS_IE8){b=i["default"].createElement("custom");for(var c in k.prototype)b[c]=k.prototype[c]}return k.prototype.setCues_.call(b,a),Object.defineProperty(b,"length",{get:function(){return this.length_}}),g.IS_IE8?b:void 0};j.prototype.setCues_=function(a){var b=this.length||0,c=0,d=a.length;this.cues_=a,this.length_=a.length;var e=function(a){""+a in this||Object.defineProperty(this,""+a,{get:function(){return this.cues_[a]}})};if(d>b)for(c=b;d>c;c++)e.call(this,c)},j.prototype.getCueById=function(a){for(var b=null,c=0,d=this.length;d>c;c++){var e=this[c];if(e.id===a){b=e;break}}return b},c["default"]=j,b.exports=c["default"]},{"../utils/browser.js":115,"global/document":1}],109:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}function h(a,b){return"rgba("+parseInt(a[1]+a[1],16)+","+parseInt(a[2]+a[2],16)+","+parseInt(a[3]+a[3],16)+","+b+")"}function i(a,b,c){try{a.style[b]=c}catch(d){}}c.__esModule=!0;var j=a("../component"),k=e(j),l=a("../menu/menu.js"),m=(e(l),a("../menu/menu-item.js")),n=(e(m),a("../menu/menu-button.js")),o=(e(n),a("../utils/fn.js")),p=d(o),q=a("global/document"),r=(e(q),a("global/window")),s=e(r),t="#222",u="#ccc",v={monospace:"monospace",sansSerif:"sans-serif",serif:"serif",monospaceSansSerif:'"Andale Mono", "Lucida Console", monospace',monospaceSerif:'"Courier New", monospace',proportionalSansSerif:"sans-serif",proportionalSerif:"serif",casual:'"Comic Sans MS", Impact, fantasy',script:'"Monotype Corsiva", cursive',smallcaps:'"Andale Mono", "Lucida Console", monospace, sans-serif'},w=function(a){function b(c,d,e){f(this,b),a.call(this,c,d,e),c.on("loadstart",p.bind(this,this.toggleDisplay)),c.on("texttrackchange",p.bind(this,this.updateDisplay)),c.ready(p.bind(this,function(){if(c.tech_&&c.tech_.featuresNativeTextTracks)return void this.hide();c.on("fullscreenchange",p.bind(this,this.updateDisplay));for(var a=this.options_.playerOptions.tracks||[],b=0;b<a.length;b++){var d=a[b];this.player_.addRemoteTextTrack(d)}}))}return g(b,a),b.prototype.toggleDisplay=function(){this.player_.tech_&&this.player_.tech_.featuresNativeTextTracks?this.hide():this.show()},b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-text-track-display"})},b.prototype.clearDisplay=function(){"function"==typeof s["default"].WebVTT&&s["default"].WebVTT.processCues(s["default"],[],this.el_)},b.prototype.updateDisplay=function(){var a=this.player_.textTracks();if(this.clearDisplay(),a)for(var b=0;b<a.length;b++){var c=a[b];"showing"===c.mode&&this.updateForTrack(c)}},b.prototype.updateForTrack=function(a){if("function"==typeof s["default"].WebVTT&&a.activeCues){for(var b=this.player_.textTrackSettings.getValues(),c=[],d=0;d<a.activeCues.length;d++)c.push(a.activeCues[d]);s["default"].WebVTT.processCues(s["default"],a.activeCues,this.el_);for(var e=c.length;e--;){var f=c[e].displayState;if(b.color&&(f.firstChild.style.color=b.color),b.textOpacity&&i(f.firstChild,"color",h(b.color||"#fff",b.textOpacity)),b.backgroundColor&&(f.firstChild.style.backgroundColor=b.backgroundColor),b.backgroundOpacity&&i(f.firstChild,"backgroundColor",h(b.backgroundColor||"#000",b.backgroundOpacity)),b.windowColor&&(b.windowOpacity?i(f,"backgroundColor",h(b.windowColor,b.windowOpacity)):f.style.backgroundColor=b.windowColor),b.edgeStyle&&("dropshadow"===b.edgeStyle?f.firstChild.style.textShadow="2px 2px 3px "+t+", 2px 2px 4px "+t+", 2px 2px 5px "+t:"raised"===b.edgeStyle?f.firstChild.style.textShadow="1px 1px "+t+", 2px 2px "+t+", 3px 3px "+t:"depressed"===b.edgeStyle?f.firstChild.style.textShadow="1px 1px "+u+", 0 1px "+u+", -1px -1px "+t+", 0 -1px "+t:"uniform"===b.edgeStyle&&(f.firstChild.style.textShadow="0 0 4px "+t+", 0 0 4px "+t+", 0 0 4px "+t+", 0 0 4px "+t)),b.fontPercent&&1!==b.fontPercent){var g=s["default"].parseFloat(f.style.fontSize);f.style.fontSize=g*b.fontPercent+"px",f.style.height="auto",f.style.top="auto",f.style.bottom="2px"}b.fontFamily&&"default"!==b.fontFamily&&("small-caps"===b.fontFamily?f.firstChild.style.fontVariant="small-caps":f.firstChild.style.fontFamily=v[b.fontFamily])}}},b}(k["default"]);k["default"].registerComponent("TextTrackDisplay",w),c["default"]=w,b.exports=c["default"]},{"../component":58,"../menu/menu-button.js":95,"../menu/menu-item.js":96,"../menu/menu.js":97,"../utils/fn.js":120,"global/document":1,"global/window":2}],110:[function(a,b,c){"use strict";c.__esModule=!0;var d={disabled:"disabled",hidden:"hidden",showing:"showing"},e={subtitles:"subtitles",captions:"captions",descriptions:"descriptions",chapters:"chapters",metadata:"metadata"};c.TextTrackMode=d,c.TextTrackKind=e},{}],111:[function(a,b,c){"use strict";c.__esModule=!0;var d=function(a){return{kind:a.kind,label:a.label,language:a.language,id:a.id,inBandMetadataTrackDispatchType:a.inBandMetadataTrackDispatchType,mode:a.mode,cues:a.cues&&Array.prototype.map.call(a.cues,function(a){return{startTime:a.startTime,endTime:a.endTime,text:a.text,id:a.id}}),src:a.src}},e=function(a){var b=a.el().querySelectorAll("track"),c=Array.prototype.map.call(b,function(a){return a.track}),e=Array.prototype.map.call(b,function(a){var b=d(a.track);return b.src=a.src,b});return e.concat(Array.prototype.filter.call(a.textTracks(),function(a){return-1===c.indexOf(a)}).map(d))},f=function(a,b){return a.forEach(function(a){var c=b.addRemoteTextTrack(a).track;!a.src&&a.cues&&a.cues.forEach(function(a){return c.addCue(a)})}),b.textTracks()};c["default"]={textTracksToJson:e,jsonToTextTracks:f,trackToJson_:d},b.exports=c["default"]},{}],112:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var f=a("../event-target"),g=e(f),h=a("../utils/fn.js"),i=d(h),j=a("../utils/browser.js"),k=d(j),l=a("global/document"),m=e(l),n=function p(a){var b=this;if(k.IS_IE8){b=m["default"].createElement("custom");for(var c in p.prototype)b[c]=p.prototype[c]}a=a||[],b.tracks_=[],Object.defineProperty(b,"length",{get:function(){return this.tracks_.length}});for(var d=0;d<a.length;d++)b.addTrack_(a[d]);return k.IS_IE8?b:void 0};n.prototype=Object.create(g["default"].prototype),n.prototype.constructor=n,n.prototype.allowedEvents_={change:"change",addtrack:"addtrack",removetrack:"removetrack"};for(var o in n.prototype.allowedEvents_)n.prototype["on"+o]=null;n.prototype.addTrack_=function(a){var b=this.tracks_.length;""+b in this||Object.defineProperty(this,b,{get:function(){return this.tracks_[b]}}),a.addEventListener("modechange",i.bind(this,function(){this.trigger("change")})),this.tracks_.push(a),this.trigger({type:"addtrack",track:a})},n.prototype.removeTrack_=function(a){for(var b=void 0,c=0,d=this.length;d>c;c++)if(b=this[c],b===a){this.tracks_.splice(c,1);break}this.trigger({type:"removetrack",track:b})},n.prototype.getTrackById=function(a){for(var b=null,c=0,d=this.length;d>c;c++){var e=this[c];if(e.id===a){b=e;break}}return b},c["default"]=n,b.exports=c["default"]},{"../event-target":90,"../utils/browser.js":115,"../utils/fn.js":120,"global/document":1}],113:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}function h(a){var b=void 0;return a.selectedOptions?b=a.selectedOptions[0]:a.options&&(b=a.options[a.options.selectedIndex]),b.value}function i(a,b){if(b){var c=void 0;for(c=0;c<a.options.length;c++){var d=a.options[c];if(d.value===b)break}a.selectedIndex=c}}function j(){var a='<div class="vjs-tracksettings">\n      <div class="vjs-tracksettings-colors">\n        <div class="vjs-fg-color vjs-tracksetting">\n            <label class="vjs-label">Foreground</label>\n            <select>\n              <option value="">---</option>\n              <option value="#FFF">White</option>\n              <option value="#000">Black</option>\n              <option value="#F00">Red</option>\n              <option value="#0F0">Green</option>\n              <option value="#00F">Blue</option>\n              <option value="#FF0">Yellow</option>\n              <option value="#F0F">Magenta</option>\n              <option value="#0FF">Cyan</option>\n            </select>\n            <span class="vjs-text-opacity vjs-opacity">\n              <select>\n                <option value="">---</option>\n                <option value="1">Opaque</option>\n                <option value="0.5">Semi-Opaque</option>\n              </select>\n            </span>\n        </div> <!-- vjs-fg-color -->\n        <div class="vjs-bg-color vjs-tracksetting">\n            <label class="vjs-label">Background</label>\n            <select>\n              <option value="">---</option>\n              <option value="#FFF">White</option>\n              <option value="#000">Black</option>\n              <option value="#F00">Red</option>\n              <option value="#0F0">Green</option>\n              <option value="#00F">Blue</option>\n              <option value="#FF0">Yellow</option>\n              <option value="#F0F">Magenta</option>\n              <option value="#0FF">Cyan</option>\n            </select>\n            <span class="vjs-bg-opacity vjs-opacity">\n                <select>\n                  <option value="">---</option>\n                  <option value="1">Opaque</option>\n                  <option value="0.5">Semi-Transparent</option>\n                  <option value="0">Transparent</option>\n                </select>\n            </span>\n        </div> <!-- vjs-bg-color -->\n        <div class="window-color vjs-tracksetting">\n            <label class="vjs-label">Window</label>\n            <select>\n              <option value="">---</option>\n              <option value="#FFF">White</option>\n              <option value="#000">Black</option>\n              <option value="#F00">Red</option>\n              <option value="#0F0">Green</option>\n              <option value="#00F">Blue</option>\n              <option value="#FF0">Yellow</option>\n              <option value="#F0F">Magenta</option>\n              <option value="#0FF">Cyan</option>\n            </select>\n            <span class="vjs-window-opacity vjs-opacity">\n                <select>\n                  <option value="">---</option>\n                  <option value="1">Opaque</option>\n                  <option value="0.5">Semi-Transparent</option>\n                  <option value="0">Transparent</option>\n                </select>\n            </span>\n        </div> <!-- vjs-window-color -->\n      </div> <!-- vjs-tracksettings -->\n      <div class="vjs-tracksettings-font">\n        <div class="vjs-font-percent vjs-tracksetting">\n          <label class="vjs-label">Font Size</label>\n          <select>\n            <option value="0.50">50%</option>\n            <option value="0.75">75%</option>\n            <option value="1.00" selected>100%</option>\n            <option value="1.25">125%</option>\n            <option value="1.50">150%</option>\n            <option value="1.75">175%</option>\n            <option value="2.00">200%</option>\n            <option value="3.00">300%</option>\n            <option value="4.00">400%</option>\n          </select>\n        </div> <!-- vjs-font-percent -->\n        <div class="vjs-edge-style vjs-tracksetting">\n          <label class="vjs-label">Text Edge Style</label>\n          <select>\n            <option value="none">None</option>\n            <option value="raised">Raised</option>\n            <option value="depressed">Depressed</option>\n            <option value="uniform">Uniform</option>\n            <option value="dropshadow">Dropshadow</option>\n          </select>\n        </div> <!-- vjs-edge-style -->\n        <div class="vjs-font-family vjs-tracksetting">\n          <label class="vjs-label">Font Family</label>\n          <select>\n            <option value="">Default</option>\n            <option value="monospaceSerif">Monospace Serif</option>\n            <option value="proportionalSerif">Proportional Serif</option>\n            <option value="monospaceSansSerif">Monospace Sans-Serif</option>\n            <option value="proportionalSansSerif">Proportional Sans-Serif</option>\n            <option value="casual">Casual</option>\n            <option value="script">Script</option>\n            <option value="small-caps">Small Caps</option>\n          </select>\n        </div> <!-- vjs-font-family -->\n      </div>\n    </div>\n    <div class="vjs-tracksettings-controls">\n      <button class="vjs-default-button">Defaults</button>\n      <button class="vjs-done-button">Done</button>\n    </div>';return a}c.__esModule=!0;var k=a("../component"),l=e(k),m=a("../utils/events.js"),n=d(m),o=a("../utils/fn.js"),p=d(o),q=a("../utils/log.js"),r=e(q),s=a("safe-json-parse/tuple"),t=e(s),u=a("global/window"),v=e(u),w=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.hide(),void 0===d.persistTextTrackSettings&&(this.options_.persistTextTrackSettings=this.options_.playerOptions.persistTextTrackSettings),n.on(this.el().querySelector(".vjs-done-button"),"click",p.bind(this,function(){this.saveSettings(),this.hide()})),n.on(this.el().querySelector(".vjs-default-button"),"click",p.bind(this,function(){this.el().querySelector(".vjs-fg-color > select").selectedIndex=0,this.el().querySelector(".vjs-bg-color > select").selectedIndex=0,this.el().querySelector(".window-color > select").selectedIndex=0,this.el().querySelector(".vjs-text-opacity > select").selectedIndex=0,this.el().querySelector(".vjs-bg-opacity > select").selectedIndex=0,this.el().querySelector(".vjs-window-opacity > select").selectedIndex=0,this.el().querySelector(".vjs-edge-style select").selectedIndex=0,this.el().querySelector(".vjs-font-family select").selectedIndex=0,this.el().querySelector(".vjs-font-percent select").selectedIndex=2,this.updateDisplay()})),n.on(this.el().querySelector(".vjs-fg-color > select"),"change",p.bind(this,this.updateDisplay)),n.on(this.el().querySelector(".vjs-bg-color > select"),"change",p.bind(this,this.updateDisplay)),n.on(this.el().querySelector(".window-color > select"),"change",p.bind(this,this.updateDisplay)),n.on(this.el().querySelector(".vjs-text-opacity > select"),"change",p.bind(this,this.updateDisplay)),n.on(this.el().querySelector(".vjs-bg-opacity > select"),"change",p.bind(this,this.updateDisplay)),n.on(this.el().querySelector(".vjs-window-opacity > select"),"change",p.bind(this,this.updateDisplay)),n.on(this.el().querySelector(".vjs-font-percent select"),"change",p.bind(this,this.updateDisplay)),n.on(this.el().querySelector(".vjs-edge-style select"),"change",p.bind(this,this.updateDisplay)),n.on(this.el().querySelector(".vjs-font-family select"),"change",p.bind(this,this.updateDisplay)),this.options_.persistTextTrackSettings&&this.restoreSettings()}return g(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-caption-settings vjs-modal-overlay",innerHTML:j()})},b.prototype.getValues=function(){var a=this.el(),b=h(a.querySelector(".vjs-edge-style select")),c=h(a.querySelector(".vjs-font-family select")),d=h(a.querySelector(".vjs-fg-color > select")),e=h(a.querySelector(".vjs-text-opacity > select")),f=h(a.querySelector(".vjs-bg-color > select")),g=h(a.querySelector(".vjs-bg-opacity > select")),i=h(a.querySelector(".window-color > select")),j=h(a.querySelector(".vjs-window-opacity > select")),k=v["default"].parseFloat(h(a.querySelector(".vjs-font-percent > select"))),l={backgroundOpacity:g,textOpacity:e,windowOpacity:j,edgeStyle:b,fontFamily:c,color:d,backgroundColor:f,windowColor:i,fontPercent:k};for(var m in l)(""===l[m]||"none"===l[m]||"fontPercent"===m&&1===l[m])&&delete l[m];return l},b.prototype.setValues=function(a){var b=this.el();i(b.querySelector(".vjs-edge-style select"),a.edgeStyle),i(b.querySelector(".vjs-font-family select"),a.fontFamily),i(b.querySelector(".vjs-fg-color > select"),a.color),i(b.querySelector(".vjs-text-opacity > select"),a.textOpacity),i(b.querySelector(".vjs-bg-color > select"),a.backgroundColor),i(b.querySelector(".vjs-bg-opacity > select"),a.backgroundOpacity),i(b.querySelector(".window-color > select"),a.windowColor),i(b.querySelector(".vjs-window-opacity > select"),a.windowOpacity);var c=a.fontPercent;c&&(c=c.toFixed(2)),i(b.querySelector(".vjs-font-percent > select"),c)},b.prototype.restoreSettings=function(){var a=t["default"](v["default"].localStorage.getItem("vjs-text-track-settings")),b=a[0],c=a[1];b&&r["default"].error(b),c&&this.setValues(c)},b.prototype.saveSettings=function(){if(this.options_.persistTextTrackSettings){var a=this.getValues();try{Object.getOwnPropertyNames(a).length>0?v["default"].localStorage.setItem("vjs-text-track-settings",JSON.stringify(a)):v["default"].localStorage.removeItem("vjs-text-track-settings")}catch(b){}}},b.prototype.updateDisplay=function(){var a=this.player_.getChild("textTrackDisplay");a&&a.updateDisplay()},b}(l["default"]);l["default"].registerComponent("TextTrackSettings",w),c["default"]=w,b.exports=c["default"]},{"../component":58,"../utils/events.js":119,"../utils/fn.js":120,"../utils/log.js":123,"global/window":2,"safe-json-parse/tuple":48}],114:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var f=a("./text-track-cue-list"),g=e(f),h=a("../utils/fn.js"),i=d(h),j=a("../utils/guid.js"),k=d(j),l=a("../utils/browser.js"),m=d(l),n=a("./text-track-enums"),o=d(n),p=a("../utils/log.js"),q=e(p),r=a("../event-target"),s=e(r),t=a("global/document"),u=e(t),v=a("global/window"),w=e(v),x=a("../utils/url.js"),y=a("xhr"),z=e(y),A=function E(){var a=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];if(!a.tech)throw new Error("A tech was not provided.");var b=this;if(m.IS_IE8){b=u["default"].createElement("custom");for(var c in E.prototype)b[c]=E.prototype[c]}b.tech_=a.tech;var d=o.TextTrackMode[a.mode]||"disabled",e=o.TextTrackKind[a.kind]||"subtitles",f=a.label||"",h=a.language||a.srclang||"",j=a.id||"vjs_text_track_"+k.newGUID();("metadata"===e||"chapters"===e)&&(d="hidden"),b.cues_=[],b.activeCues_=[];var l=new g["default"](b.cues_),n=new g["default"](b.activeCues_),p=!1,q=i.bind(b,function(){this.activeCues,p&&(this.trigger("cuechange"),p=!1)});return"disabled"!==d&&b.tech_.on("timeupdate",q),Object.defineProperty(b,"kind",{get:function(){return e},set:Function.prototype}),Object.defineProperty(b,"label",{get:function(){return f},set:Function.prototype}),Object.defineProperty(b,"language",{get:function(){return h},set:Function.prototype}),Object.defineProperty(b,"id",{get:function(){return j},set:Function.prototype}),Object.defineProperty(b,"mode",{get:function(){return d},set:function(a){o.TextTrackMode[a]&&(d=a,"showing"===d&&this.tech_.on("timeupdate",q),this.trigger("modechange"))}}),Object.defineProperty(b,"cues",{get:function(){return this.loaded_?l:null},set:Function.prototype}),Object.defineProperty(b,"activeCues",{get:function(){if(!this.loaded_)return null;if(0===this.cues.length)return n;for(var a=this.tech_.currentTime(),b=[],c=0,d=this.cues.length;d>c;c++){var e=this.cues[c];e.startTime<=a&&e.endTime>=a?b.push(e):e.startTime===e.endTime&&e.startTime<=a&&e.startTime+.5>=a&&b.push(e)}if(p=!1,b.length!==this.activeCues_.length)p=!0;else for(var c=0;c<b.length;c++)-1===D.call(this.activeCues_,b[c])&&(p=!0);return this.activeCues_=b,n.setCues_(this.activeCues_),n},set:Function.prototype}),a.src?(b.src=a.src,C(a.src,b)):b.loaded_=!0,m.IS_IE8?b:void 0};A.prototype=Object.create(s["default"].prototype),A.prototype.constructor=A,A.prototype.allowedEvents_={cuechange:"cuechange"},A.prototype.addCue=function(a){var b=this.tech_.textTracks();if(b)for(var c=0;c<b.length;c++)b[c]!==this&&b[c].removeCue(a);this.cues_.push(a),this.cues.setCues_(this.cues_)},A.prototype.removeCue=function(a){for(var b=!1,c=0,d=this.cues_.length;d>c;c++){var e=this.cues_[c];e===a&&(this.cues_.splice(c,1),b=!0)}b&&this.cues.setCues_(this.cues_)};var B=function F(a,b){if("function"!=typeof w["default"].WebVTT)return w["default"].setTimeout(function(){F(a,b)},25);var c=new w["default"].WebVTT.Parser(w["default"],w["default"].vttjs,w["default"].WebVTT.StringDecoder());c.oncue=function(a){b.addCue(a)},c.onparsingerror=function(a){q["default"].error(a)},c.parse(a),c.flush()},C=function(a,b){var c={uri:a},d=x.isCrossOrigin(a);d&&(c.cors=d),z["default"](c,i.bind(this,function(a,c,d){return a?q["default"].error(a,c):(b.loaded_=!0,void B(d,b))}))},D=function(a,b){if(null==this)throw new TypeError('"this" is null or not defined');var c=Object(this),d=c.length>>>0;if(0===d)return-1;var e=+b||0;if(Math.abs(e)===1/0&&(e=0),e>=d)return-1;for(var f=Math.max(e>=0?e:d-Math.abs(e),0);d>f;){if(f in c&&c[f]===a)return f;f++}return-1};c["default"]=A,b.exports=c["default"]},{"../event-target":90,"../utils/browser.js":115,"../utils/fn.js":120,"../utils/guid.js":122,"../utils/log.js":123,"../utils/url.js":128,"./text-track-cue-list":108,"./text-track-enums":110,"global/document":1,"global/window":2,xhr:50}],115:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var e=a("global/document"),f=d(e),g=a("global/window"),h=d(g),i=h["default"].navigator.userAgent,j=/AppleWebKit\/([\d.]+)/i.exec(i),k=j?parseFloat(j.pop()):null,l=/iPhone/i.test(i);c.IS_IPHONE=l;var m=/iPad/i.test(i);c.IS_IPAD=m;var n=/iPod/i.test(i);c.IS_IPOD=n;var o=l||m||n;c.IS_IOS=o;var p=function(){var a=i.match(/OS (\d+)_/i);return a&&a[1]?a[1]:void 0}();c.IOS_VERSION=p;var q=/Android/i.test(i);c.IS_ANDROID=q;var r=function(){var a,b,c=i.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i);return c?(a=c[1]&&parseFloat(c[1]),b=c[2]&&parseFloat(c[2]),a&&b?parseFloat(c[1]+"."+c[2]):a?a:null):null}();c.ANDROID_VERSION=r;var s=q&&/webkit/i.test(i)&&2.3>r;c.IS_OLD_ANDROID=s;var t=q&&5>r&&537>k;c.IS_NATIVE_ANDROID=t;var u=/Firefox/i.test(i);c.IS_FIREFOX=u;var v=/Chrome/i.test(i);c.IS_CHROME=v;var w=/MSIE\s8\.0/.test(i);c.IS_IE8=w;var x=!!("ontouchstart"in h["default"]||h["default"].DocumentTouch&&f["default"]instanceof h["default"].DocumentTouch);c.TOUCH_ENABLED=x;var y="backgroundSize"in f["default"].createElement("video").style;c.BACKGROUND_SIZE_SUPPORTED=y},{"global/document":1,"global/window":2}],116:[function(a,b,c){"use strict";function d(a,b){var c,d,f=0;if(!b)return 0;a&&a.length||(a=e.createTimeRange(0,0));for(var g=0;g<a.length;g++)c=a.start(g),d=a.end(g),d>b&&(d=b),f+=d-c;return f/b}c.__esModule=!0,c.bufferedPercent=d;var e=a("./time-ranges.js")},{"./time-ranges.js":126}],117:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var e=a("./log.js"),f=d(e),g={get:function(a,b){return a[b]},set:function(a,b,c){return a[b]=c,!0}};c["default"]=function(a){var b=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];if("function"==typeof Proxy){var c=function(){var c={};return Object.keys(b).forEach(function(a){g.hasOwnProperty(a)&&(c[a]=function(){return f["default"].warn(b[a]),g[a].apply(this,arguments)})}),{v:new Proxy(a,c)}}();if("object"==typeof c)return c.v}return a},b.exports=c["default"]},{"./log.js":123}],118:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){return a.raw=b,a}function g(a){return 0===a.indexOf("#")&&(a=a.slice(1)),x["default"].getElementById(a)}function h(){var a=arguments.length<=0||void 0===arguments[0]?"div":arguments[0],b=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],c=arguments.length<=2||void 0===arguments[2]?{}:arguments[2],d=x["default"].createElement(a);return Object.getOwnPropertyNames(b).forEach(function(a){var c=b[a];-1!==a.indexOf("aria-")||"role"===a||"type"===a?(D["default"].warn(F["default"](v,a,c)),d.setAttribute(a,c)):d[a]=c}),Object.getOwnPropertyNames(c).forEach(function(a){c[a];d.setAttribute(a,c[a])}),d}function i(a,b){b.firstChild?b.insertBefore(a,b.firstChild):b.appendChild(a)}function j(a){var b=a[H];return b||(b=a[H]=B.newGUID()),G[b]||(G[b]={}),G[b]}function k(a){var b=a[H];return b?!!Object.getOwnPropertyNames(G[b]).length:!1}function l(a){var b=a[H];if(b){delete G[b];try{delete a[H]}catch(c){a.removeAttribute?a.removeAttribute(H):a[H]=null}}}function m(a,b){return-1!==(" "+a.className+" ").indexOf(" "+b+" ")}function n(a,b){m(a,b)||(a.className=""===a.className?b:a.className+" "+b)}function o(a,b){if(m(a,b)){for(var c=a.className.split(" "),d=c.length-1;d>=0;d--)c[d]===b&&c.splice(d,1);
 

	
 
a.className=c.join(" ")}}function p(a,b){Object.getOwnPropertyNames(b).forEach(function(c){var d=b[c];null===d||"undefined"==typeof d||d===!1?a.removeAttribute(c):a.setAttribute(c,d===!0?"":d)})}function q(a){var b,c,d,e,f;if(b={},c=",autoplay,controls,loop,muted,default,",a&&a.attributes&&a.attributes.length>0){d=a.attributes;for(var g=d.length-1;g>=0;g--)e=d[g].name,f=d[g].value,("boolean"==typeof a[e]||-1!==c.indexOf(","+e+","))&&(f=null!==f?!0:!1),b[e]=f}return b}function r(){x["default"].body.focus(),x["default"].onselectstart=function(){return!1}}function s(){x["default"].onselectstart=function(){return!0}}function t(a){var b=void 0;if(a.getBoundingClientRect&&a.parentNode&&(b=a.getBoundingClientRect()),!b)return{left:0,top:0};var c=x["default"].documentElement,d=x["default"].body,e=c.clientLeft||d.clientLeft||0,f=z["default"].pageXOffset||d.scrollLeft,g=b.left+f-e,h=c.clientTop||d.clientTop||0,i=z["default"].pageYOffset||d.scrollTop,j=b.top+i-h;return{left:Math.round(g),top:Math.round(j)}}function u(a,b){var c={},d=t(a),e=a.offsetWidth,f=a.offsetHeight,g=d.top,h=d.left,i=b.pageY,j=b.pageX;return b.changedTouches&&(j=b.changedTouches[0].pageX,i=b.changedTouches[0].pageY),c.y=Math.max(0,Math.min(1,(g-i+f)/f)),c.x=Math.max(0,Math.min(1,(j-h)/e)),c}c.__esModule=!0,c.getEl=g,c.createEl=h,c.insertElFirst=i,c.getElData=j,c.hasElData=k,c.removeElData=l,c.hasElClass=m,c.addElClass=n,c.removeElClass=o,c.setElAttributes=p,c.getElAttributes=q,c.blockTextSelection=r,c.unblockTextSelection=s,c.findElPosition=t,c.getPointerPosition=u;var v=f(["Setting attributes in the second argument of createEl()\n                has been deprecated. Use the third argument instead.\n                createEl(type, properties, attributes). Attempting to set "," to ","."],["Setting attributes in the second argument of createEl()\n                has been deprecated. Use the third argument instead.\n                createEl(type, properties, attributes). Attempting to set "," to ","."]),w=a("global/document"),x=e(w),y=a("global/window"),z=e(y),A=a("./guid.js"),B=d(A),C=a("./log.js"),D=e(C),E=a("tsml"),F=e(E),G={},H="vdata"+(new Date).getTime()},{"./guid.js":122,"./log.js":123,"global/document":1,"global/window":2,tsml:49}],119:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function f(a,b,c){if(Array.isArray(b))return l(f,a,b,c);var d=n.getElData(a);d.handlers||(d.handlers={}),d.handlers[b]||(d.handlers[b]=[]),c.guid||(c.guid=p.newGUID()),d.handlers[b].push(c),d.dispatcher||(d.disabled=!1,d.dispatcher=function(b,c){if(!d.disabled){b=j(b);var e=d.handlers[b.type];if(e)for(var f=e.slice(0),g=0,h=f.length;h>g&&!b.isImmediatePropagationStopped();g++)f[g].call(a,b,c)}}),1===d.handlers[b].length&&(a.addEventListener?a.addEventListener(b,d.dispatcher,!1):a.attachEvent&&a.attachEvent("on"+b,d.dispatcher))}function g(a,b,c){if(n.hasElData(a)){var d=n.getElData(a);if(d.handlers){if(Array.isArray(b))return l(g,a,b,c);var e=function(b){d.handlers[b]=[],k(a,b)};if(b){var f=d.handlers[b];if(f){if(!c)return void e(b);if(c.guid)for(var h=0;h<f.length;h++)f[h].guid===c.guid&&f.splice(h--,1);k(a,b)}}else for(var i in d.handlers)e(i)}}}function h(a,b,c){var d=n.hasElData(a)?n.getElData(a):{},e=a.parentNode||a.ownerDocument;if("string"==typeof b&&(b={type:b,target:a}),b=j(b),d.dispatcher&&d.dispatcher.call(a,b,c),e&&!b.isPropagationStopped()&&b.bubbles===!0)h.call(null,e,b,c);else if(!e&&!b.defaultPrevented){var f=n.getElData(b.target);b.target[b.type]&&(f.disabled=!0,"function"==typeof b.target[b.type]&&b.target[b.type](),f.disabled=!1)}return!b.defaultPrevented}function i(a,b,c){if(Array.isArray(b))return l(i,a,b,c);var d=function e(){g(a,b,e),c.apply(this,arguments)};d.guid=c.guid=c.guid||p.newGUID(),f(a,b,d)}function j(a){function b(){return!0}function c(){return!1}if(!a||!a.isPropagationStopped){var d=a||r["default"].event;a={};for(var e in d)"layerX"!==e&&"layerY"!==e&&"keyLocation"!==e&&"webkitMovementX"!==e&&"webkitMovementY"!==e&&("returnValue"===e&&d.preventDefault||(a[e]=d[e]));if(a.target||(a.target=a.srcElement||t["default"]),a.relatedTarget||(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement),a.preventDefault=function(){d.preventDefault&&d.preventDefault(),a.returnValue=!1,d.returnValue=!1,a.defaultPrevented=!0},a.defaultPrevented=!1,a.stopPropagation=function(){d.stopPropagation&&d.stopPropagation(),a.cancelBubble=!0,d.cancelBubble=!0,a.isPropagationStopped=b},a.isPropagationStopped=c,a.stopImmediatePropagation=function(){d.stopImmediatePropagation&&d.stopImmediatePropagation(),a.isImmediatePropagationStopped=b,a.stopPropagation()},a.isImmediatePropagationStopped=c,null!=a.clientX){var f=t["default"].documentElement,g=t["default"].body;a.pageX=a.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=a.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)}a.which=a.charCode||a.keyCode,null!=a.button&&(a.button=1&a.button?0:4&a.button?1:2&a.button?2:0)}return a}function k(a,b){var c=n.getElData(a);0===c.handlers[b].length&&(delete c.handlers[b],a.removeEventListener?a.removeEventListener(b,c.dispatcher,!1):a.detachEvent&&a.detachEvent("on"+b,c.dispatcher)),Object.getOwnPropertyNames(c.handlers).length<=0&&(delete c.handlers,delete c.dispatcher,delete c.disabled),0===Object.getOwnPropertyNames(c).length&&n.removeElData(a)}function l(a,b,c,d){c.forEach(function(c){a(b,c,d)})}c.__esModule=!0,c.on=f,c.off=g,c.trigger=h,c.one=i,c.fixEvent=j;var m=a("./dom.js"),n=e(m),o=a("./guid.js"),p=e(o),q=a("global/window"),r=d(q),s=a("global/document"),t=d(s)},{"./dom.js":118,"./guid.js":122,"global/document":1,"global/window":2}],120:[function(a,b,c){"use strict";c.__esModule=!0;var d=a("./guid.js"),e=function(a,b,c){b.guid||(b.guid=d.newGUID());var e=function(){return b.apply(a,arguments)};return e.guid=c?c+"_"+b.guid:b.guid,e};c.bind=e},{"./guid.js":122}],121:[function(a,b,c){"use strict";function d(a){var b=arguments.length<=1||void 0===arguments[1]?a:arguments[1];return function(){var c=Math.floor(a%60),d=Math.floor(a/60%60),e=Math.floor(a/3600),f=Math.floor(b/60%60),g=Math.floor(b/3600);return(isNaN(a)||a===1/0)&&(e=d=c="-"),e=e>0||g>0?e+":":"",d=((e||f>=10)&&10>d?"0"+d:d)+":",c=10>c?"0"+c:c,e+d+c}()}c.__esModule=!0,c["default"]=d,b.exports=c["default"]},{}],122:[function(a,b,c){"use strict";function d(){return e++}c.__esModule=!0,c.newGUID=d;var e=1},{}],123:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){var c=Array.prototype.slice.call(b),d=function(){},e=g["default"].console||{log:d,warn:d,error:d};a?c.unshift(a.toUpperCase()+":"):a="log",h.history.push(c),c.unshift("VIDEOJS:"),e[a].apply?e[a].apply(e,c):e[a](c.join(" "))}c.__esModule=!0;var f=a("global/window"),g=d(f),h=function(){e(null,arguments)};h.history=[],h.error=function(){e("error",arguments)},h.warn=function(){e("warn",arguments)},c["default"]=h,b.exports=c["default"]},{"global/window":2}],124:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a){return!!a&&"object"==typeof a&&"[object Object]"===a.toString()&&a.constructor===Object}function f(){var a=Array.prototype.slice.call(arguments);return a.unshift({}),a.push(i),h["default"].apply(null,a),a[0]}c.__esModule=!0,c["default"]=f;var g=a("lodash-compat/object/merge"),h=d(g),i=function(a,b){return e(b)?e(a)?void 0:f(b):b};b.exports=c["default"]},{"lodash-compat/object/merge":40}],125:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var e=a("global/document"),f=d(e),g=function(a){var b=f["default"].createElement("style");return b.className=a,b};c.createStyleElement=g;var h=function(a,b){a.styleSheet?a.styleSheet.cssText=b:a.textContent=b};c.setTextContent=h},{"global/document":1}],126:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){return Array.isArray(a)?f(a):void 0===a||void 0===b?f():f([[a,b]])}function f(a){return void 0===a||0===a.length?{length:0,start:function(){throw new Error("This TimeRanges object is empty")},end:function(){throw new Error("This TimeRanges object is empty")}}:{length:a.length,start:g.bind(null,"start",0,a),end:g.bind(null,"end",1,a)}}function g(a,b,c,d){return void 0===d&&(j["default"].warn("DEPRECATED: Function '"+a+"' on 'TimeRanges' called without an index argument."),d=0),h(a,d,c.length-1),c[d][b]}function h(a,b,c){if(0>b||b>c)throw new Error("Failed to execute '"+a+"' on 'TimeRanges': The index provided ("+b+") is greater than or equal to the maximum bound ("+c+").")}c.__esModule=!0,c.createTimeRanges=e;var i=a("./log.js"),j=d(i);c.createTimeRange=e},{"./log.js":123}],127:[function(a,b,c){"use strict";function d(a){return a.charAt(0).toUpperCase()+a.slice(1)}c.__esModule=!0,c["default"]=d,b.exports=c["default"]},{}],128:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var e=a("global/document"),f=d(e),g=a("global/window"),h=d(g),i=function(a){var b=["protocol","hostname","port","pathname","search","hash","host"],c=f["default"].createElement("a");c.href=a;var d=""===c.host&&"file:"!==c.protocol,e=void 0;d&&(e=f["default"].createElement("div"),e.innerHTML='<a href="'+a+'"></a>',c=e.firstChild,e.setAttribute("style","display:none; position:absolute;"),f["default"].body.appendChild(e));for(var g={},h=0;h<b.length;h++)g[b[h]]=c[b[h]];return"http:"===g.protocol&&(g.host=g.host.replace(/:80$/,"")),"https:"===g.protocol&&(g.host=g.host.replace(/:443$/,"")),d&&f["default"].body.removeChild(e),g};c.parseUrl=i;var j=function(a){if(!a.match(/^https?:\/\//)){var b=f["default"].createElement("div");b.innerHTML='<a href="'+a+'">x</a>',a=b.firstChild.href}return a};c.getAbsoluteURL=j;var k=function(a){if("string"==typeof a){var b=/^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/\?]+)))(?:[\/]*|[\?].*)$/i,c=b.exec(a);if(c)return c.pop().toLowerCase()}return""};c.getFileExtension=k;var l=function(a){var b=i(a),c=h["default"].location,d=":"===b.protocol?c.protocol:b.protocol,e=d+b.host!==c.protocol+c.host;return e};c.isCrossOrigin=l},{"global/document":1,"global/window":2}],129:[function(b,c,d){"use strict";function e(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function f(a){return a&&a.__esModule?a:{"default":a}}d.__esModule=!0;{var g=b("global/document"),h=f(g),i=b("./setup"),j=e(i),k=b("./utils/stylesheet.js"),l=e(k),m=b("./component"),n=f(m),o=b("./event-target"),p=f(o),q=b("./utils/events.js"),r=e(q),s=b("./player"),t=f(s),u=b("./plugins.js"),v=f(u),w=b("../../src/js/utils/merge-options.js"),x=f(w),y=b("./utils/fn.js"),z=e(y),A=b("./tracks/text-track.js"),B=f(A),C=b("object.assign"),D=(f(C),b("./utils/time-ranges.js")),E=b("./utils/format-time.js"),F=f(E),G=b("./utils/log.js"),H=f(G),I=b("./utils/dom.js"),J=e(I),K=b("./utils/browser.js"),L=e(K),M=b("./utils/url.js"),N=e(M),O=b("./extend.js"),P=f(O),Q=b("lodash-compat/object/merge"),R=f(Q),S=b("./utils/create-deprecation-proxy.js"),T=f(S),U=b("xhr"),V=f(U),W=b("./tech/html5.js"),X=(f(W),b("./tech/flash.js"));f(X)}"undefined"==typeof HTMLVideoElement&&(h["default"].createElement("video"),h["default"].createElement("audio"),h["default"].createElement("track"));var Y=function _(a,b,c){var d;if("string"==typeof a){if(0===a.indexOf("#")&&(a=a.slice(1)),_.getPlayers()[a])return b&&H["default"].warn('Player "'+a+'" is already initialised. Options will not be applied.'),c&&_.getPlayers()[a].ready(c),_.getPlayers()[a];d=J.getEl(a)}else d=a;if(!d||!d.nodeName)throw new TypeError("The element or ID supplied is not valid. (videojs)");return d.player||new t["default"](d,b,c)},Z=h["default"].querySelector(".vjs-styles-defaults");if(!Z){Z=l.createStyleElement("vjs-styles-defaults");var $=h["default"].querySelector("head");$.insertBefore(Z,$.firstChild),l.setTextContent(Z,"\n    .video-js {\n      width: 300px;\n      height: 150px;\n    }\n\n    .vjs-fluid {\n      padding-top: 56.25%\n    }\n  ")}j.autoSetupTimeout(1,Y),Y.VERSION="5.0.0",Y.options=t["default"].prototype.options_,Y.getPlayers=function(){return t["default"].players},Y.players=T["default"](t["default"].players,{get:"Access to videojs.players is deprecated; use videojs.getPlayers instead",set:"Modification of videojs.players is deprecated"}),Y.getComponent=n["default"].getComponent,Y.registerComponent=n["default"].registerComponent,Y.browser=L,Y.TOUCH_ENABLED=L.TOUCH_ENABLED,Y.extend=P["default"],Y.mergeOptions=x["default"],Y.bind=z.bind,Y.plugin=v["default"],Y.addLanguage=function(a,b){var c;return a=(""+a).toLowerCase(),R["default"](Y.options.languages,(c={},c[a]=b,c))[a]},Y.log=H["default"],Y.createTimeRange=Y.createTimeRanges=D.createTimeRanges,Y.formatTime=F["default"],Y.parseUrl=N.parseUrl,Y.isCrossOrigin=N.isCrossOrigin,Y.EventTarget=p["default"],Y.on=r.on,Y.one=r.one,Y.off=r.off,Y.trigger=r.trigger,Y.xhr=V["default"],Y.TextTrack=B["default"],"function"==typeof a&&a.amd?a("videojs",[],function(){return Y}):"object"==typeof d&&"object"==typeof c&&(c.exports=Y),d["default"]=Y,c.exports=d["default"]},{"../../src/js/utils/merge-options.js":124,"./component":58,"./event-target":90,"./extend.js":91,"./player":98,"./plugins.js":99,"./setup":101,"./tech/flash.js":104,"./tech/html5.js":105,"./tracks/text-track.js":114,"./utils/browser.js":115,"./utils/create-deprecation-proxy.js":117,"./utils/dom.js":118,"./utils/events.js":119,"./utils/fn.js":120,"./utils/format-time.js":121,"./utils/log.js":123,"./utils/stylesheet.js":125,"./utils/time-ranges.js":126,"./utils/url.js":128,"global/document":1,"lodash-compat/object/merge":40,"object.assign":43,xhr:50}]},{},[129])(129)});
 
//# sourceMappingURL=video.novtt.min.js.map
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/alt/video.novtt.min.js.map
Show inline comments
 
new file 100644
 
{"version":3,"file":"video.novtt.min.js","sources":["node_modules/grunt-browserify/node_modules/browserify/node_modules/browser-pack/_prelude.js","node_modules/global/document.js","node_modules/global/window.js","node_modules/grunt-browserify/node_modules/browserify/node_modules/browser-resolve/empty.js","node_modules/lodash-compat/date/now.js","node_modules/lodash-compat/function/debounce.js","node_modules/lodash-compat/function/restParam.js","node_modules/lodash-compat/function/throttle.js","node_modules/lodash-compat/internal/arrayCopy.js","node_modules/lodash-compat/internal/arrayEach.js","node_modules/lodash-compat/internal/baseCopy.js","node_modules/lodash-compat/internal/baseFor.js","node_modules/lodash-compat/internal/baseForIn.js","node_modules/lodash-compat/internal/baseMerge.js","node_modules/lodash-compat/internal/baseMergeDeep.js","node_modules/lodash-compat/internal/baseProperty.js","node_modules/lodash-compat/internal/bindCallback.js","node_modules/lodash-compat/internal/createAssigner.js","node_modules/lodash-compat/internal/createBaseFor.js","node_modules/lodash-compat/internal/getLength.js","node_modules/lodash-compat/internal/getNative.js","node_modules/lodash-compat/internal/isArrayLike.js","node_modules/lodash-compat/internal/isHostObject.js","node_modules/lodash-compat/internal/isIndex.js","node_modules/lodash-compat/internal/isIterateeCall.js","node_modules/lodash-compat/internal/isLength.js","node_modules/lodash-compat/internal/isObjectLike.js","node_modules/lodash-compat/internal/shimKeys.js","node_modules/lodash-compat/internal/toObject.js","node_modules/lodash-compat/lang/isArguments.js","node_modules/lodash-compat/lang/isArray.js","node_modules/lodash-compat/lang/isFunction.js","node_modules/lodash-compat/lang/isNative.js","node_modules/lodash-compat/lang/isObject.js","node_modules/lodash-compat/lang/isPlainObject.js","node_modules/lodash-compat/lang/isString.js","node_modules/lodash-compat/lang/isTypedArray.js","node_modules/lodash-compat/lang/toPlainObject.js","node_modules/lodash-compat/object/keys.js","node_modules/lodash-compat/object/keysIn.js","node_modules/lodash-compat/object/merge.js","node_modules/lodash-compat/support.js","node_modules/lodash-compat/utility/identity.js","node_modules/object.assign/index.js","node_modules/object.assign/node_modules/define-properties/index.js","node_modules/object.assign/node_modules/define-properties/node_modules/foreach/index.js","node_modules/object.assign/node_modules/object-keys/index.js","node_modules/object.assign/node_modules/object-keys/isArguments.js","node_modules/safe-json-parse/tuple.js","node_modules/tsml/tsml.js","node_modules/xhr/index.js","node_modules/xhr/node_modules/once/once.js","node_modules/xhr/node_modules/parse-headers/node_modules/for-each/index.js","node_modules/xhr/node_modules/parse-headers/node_modules/for-each/node_modules/is-function/index.js","node_modules/xhr/node_modules/parse-headers/node_modules/trim/index.js","node_modules/xhr/node_modules/parse-headers/parse-headers.js","src/js/big-play-button.js","src/js/button.js","src/js/component.js","src/js/control-bar/control-bar.js","src/js/control-bar/fullscreen-toggle.js","src/js/control-bar/live-display.js","src/js/control-bar/mute-toggle.js","src/js/control-bar/play-toggle.js","src/js/control-bar/playback-rate-menu/playback-rate-menu-button.js","src/js/control-bar/playback-rate-menu/playback-rate-menu-item.js","src/js/control-bar/progress-control/load-progress-bar.js","src/js/control-bar/progress-control/mouse-time-display.js","src/js/control-bar/progress-control/play-progress-bar.js","src/js/control-bar/progress-control/progress-control.js","src/js/control-bar/progress-control/seek-bar.js","src/js/control-bar/spacer-controls/custom-control-spacer.js","src/js/control-bar/spacer-controls/spacer.js","src/js/control-bar/text-track-controls/caption-settings-menu-item.js","src/js/control-bar/text-track-controls/captions-button.js","src/js/control-bar/text-track-controls/chapters-button.js","src/js/control-bar/text-track-controls/chapters-track-menu-item.js","src/js/control-bar/text-track-controls/off-text-track-menu-item.js","src/js/control-bar/text-track-controls/subtitles-button.js","src/js/control-bar/text-track-controls/text-track-button.js","src/js/control-bar/text-track-controls/text-track-menu-item.js","src/js/control-bar/time-controls/current-time-display.js","src/js/control-bar/time-controls/duration-display.js","src/js/control-bar/time-controls/remaining-time-display.js","src/js/control-bar/time-controls/time-divider.js","src/js/control-bar/volume-control/volume-bar.js","src/js/control-bar/volume-control/volume-control.js","src/js/control-bar/volume-control/volume-level.js","src/js/control-bar/volume-menu-button.js","src/js/error-display.js","src/js/event-target.js","src/js/extend.js","src/js/fullscreen-api.js","src/js/loading-spinner.js","src/js/media-error.js","src/js/menu/menu-button.js","src/js/menu/menu-item.js","src/js/menu/menu.js","src/js/player.js","src/js/plugins.js","src/js/poster-image.js","src/js/setup.js","src/js/slider/slider.js","src/js/tech/flash-rtmp.js","src/js/tech/flash.js","src/js/tech/html5.js","src/js/tech/loader.js","src/js/tech/tech.js","src/js/tracks/text-track-cue-list.js","src/js/tracks/text-track-display.js","src/js/tracks/text-track-enums.js","src/js/tracks/text-track-list-converter.js","src/js/tracks/text-track-list.js","src/js/tracks/text-track-settings.js","src/js/tracks/text-track.js","src/js/utils/browser.js","src/js/utils/buffer.js","src/js/utils/create-deprecation-proxy.js","src/js/utils/dom.js","src/js/utils/events.js","src/js/utils/fn.js","src/js/utils/format-time.js","src/js/utils/guid.js","src/js/utils/log.js","src/js/utils/merge-options.js","src/js/utils/stylesheet.js","src/js/utils/time-ranges.js","src/js/utils/to-title-case.js","src/js/utils/url.js","src/js/video.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","videojs","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length",1,"_dereq_","topLevel","minDoc","document","doccy","min-document",2,3,4,"getNative","nativeNow","Date","now","getTime","../internal/getNative",5,"debounce","func","wait","options","cancel","timeoutId","clearTimeout","maxTimeoutId","lastCalled","trailingCall","undefined","complete","isCalled","id","result","apply","thisArg","args","delayed","remaining","stamp","setTimeout","maxDelayed","trailing","debounced","arguments","leading","maxWait","leadingCall","TypeError","FUNC_ERROR_TEXT","isObject","nativeMax","Math","max","../date/now","../lang/isObject",6,"restParam","start","index","rest","Array","otherArgs",7,"throttle","./debounce",8,"arrayCopy","source","array",9,"arrayEach","iteratee",10,"baseCopy","props","object","key",11,"createBaseFor","baseFor","./createBaseFor",12,"baseForIn","keysIn","../object/keysIn","./baseFor",13,"baseMerge","customizer","stackA","stackB","isSrcArr","isArrayLike","isArray","isTypedArray","keys","srcValue","isObjectLike","baseMergeDeep","value","isCommon","../lang/isArray","../lang/isTypedArray","../object/keys","./arrayEach","./baseMergeDeep","./isArrayLike","./isObjectLike",14,"mergeFunc","isPlainObject","isArguments","toPlainObject","push","../lang/isArguments","../lang/isPlainObject","../lang/toPlainObject","./arrayCopy",15,"toObject","baseProperty","./toObject",16,"bindCallback","argCount","identity","collection","accumulator","other","../utility/identity",17,"createAssigner","assigner","sources","guard","isIterateeCall","../function/restParam","./bindCallback","./isIterateeCall",18,"fromRight","keysFunc","iterable",19,"getLength","./baseProperty",20,"isNative","../lang/isNative",21,"isLength","./getLength","./isLength",22,"isHostObject","Object","toString",23,"reIsUint","test","MAX_SAFE_INTEGER","isIndex",24,"type","./isIndex",25,26,27,"shimKeys","propsLength","allowIndexes","isString","hasOwnProperty","objectProto","prototype","../lang/isString",28,"support","unindexedChars","charAt","../support",29,"propertyIsEnumerable","../internal/isArrayLike","../internal/isObjectLike",30,"arrayTag","objToString","nativeIsArray","../internal/isLength",31,"isFunction","funcTag","./isObject",32,"reIsNative","fnToString","reIsHostCtor","Function","RegExp","replace","../internal/isHostObject","./isFunction",33,34,"Ctor","objectTag","constructor","ownLast","subValue","../internal/baseForIn","./isArguments",35,"stringTag",36,"typedArrayTags","argsTag","boolTag","dateTag","errorTag","mapTag","numberTag","regexpTag","setTag","weakMapTag","arrayBufferTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag",37,"../internal/baseCopy",38,"nativeKeys","../internal/shimKeys",39,"proto","isProto","skipIndexes","skipErrorProps","enumErrorProps","errorProto","skipProto","enumPrototypes","nonEnumShadows","tag","stringProto","nonEnums","nonEnumProps","shadowProps","nonEnum","String","toLocaleString","valueOf","../internal/arrayEach","../internal/isIndex","../lang/isFunction",40,"merge","../internal/baseMerge","../internal/createAssigner",41,"arrayProto","splice","x","0","y","spliceObjects",42,43,"canBeObject","obj","hasSymbols","Symbol","defineProperties","propIsEnumerable","assignShim","target","syms","objTarget","getOwnPropertySymbols","shim","assignHasPendingExceptions","assign","preventExtensions","thrower","define-properties","object-keys",44,"foreach","toStr","fn","arePropertyDescriptorsSupported","defineProperty","enumerable","_","supportsDescriptors","name","predicate","configurable","writable","map","predicates","concat",45,"hasOwn","ctx","k",46,"has","slice","isArgs","hasDontEnumBug","hasProtoEnumBug","dontEnums","equalsConstructorPrototype","ctor","blacklistedKeys","$window","$console","$parent","$self","$frames","$webkitIndexedDB","$webkitStorageInfo","hasAutomationEqualityBug","equalsConstructorPrototypeIfNotBuggy","keysShim","theKeys","j","skipConstructor","keysWorksWithArguments","originalKeys",47,"str","callee",48,"SafeParseTuple","reviver","json","error","err",49,"clean","sa",50,"isEmpty","createXHR","callback","readystatechange","xhr","readyState","loadFunc","getBody","body","response","responseType","responseText","responseXML","isJson","JSON","parse","errorFunc","evt","timeoutTimer","statusCode","failureResponse","aborted","status","useXDR","method","headers","url","uri","rawRequest","getAllResponseHeaders","parseHeaders","once","cors","XDomainRequest","XMLHttpRequest","data","sync","stringify","onreadystatechange","onload","onerror","onprogress","ontimeout","open","username","password","withCredentials","timeout","abort","setRequestHeader","beforeSend","send","noop","global/window","parse-headers",51,"called",52,"forEach","list","iterator","context","forEachArray","forEachString","forEachObject","len","string","is-function",53,"alert","confirm","prompt",54,"trim","right",55,"arg","split","row","indexOf","toLowerCase","Constructor","instance","player_","play","__esModule","newObj","_inherits","subClass","superClass","create","setPrototypeOf","__proto__","_component2","_interopRequireDefault","_component","Dom","_interopRequireWildcard","_utilsDomJs","Button","_Component","player","_classCallCheck","createEl","attributes","_objectAssign2","className","buildCSSClass","tabIndex","role","el","controlTextEl_","handleClick","default","_globalWindow2","_globalWindow","Fn","_utilsFnJs","Component","ready","options_","_utilsMergeOptionsJs2","id_","Guid","newGUID","el_","childIndex_","initChildren","dispose","trigger","bubbles","children_","childNameIndex_","off","_utilsLogJs2","warn","tagName","properties","localize","languages","language","primaryCode","addChild","child","component","componentName","childFound","parentOptions","_this","opts","children","_name","handleAdd","_this2","first","guid","cleanRemover","Events","on","second","bind","third","nodeName","one","_this3","_arguments","newFunc","isReady_","triggerReady","readyQueue","readyQueue_","dimension","widthOrHeight","num","skipListeners","style","pxIndex","touchStart","touchTimeThreshold","couldBeTap","event","touches","firstTouch","xdiff","pageX","touchDistance","sqrt","ydiff","tapMovementThreshold","noTap","touchTime","preventDefault","clearInterval","touchHolding","touchEnd","report","disposeFn","intervalId","setInterval","interval","getComponent","components_","extend","subObj","_name2","ControlBar","exitFullscreen","requestFullscreen","LiveDisplay","contentEl_","aria-live","appendChild","updateShowing","_button2","_button","MuteToggle","_Button","update","tech_","addClass","vol","volume","level","toMute","muted","localizedMute","controlText","removeElClass","addElClass","PlayToggle","removeClass","_playbackRateMenuItemJs2","_playbackRateMenuItemJs","PlaybackRateMenuButton","_MenuButton","labelEl_","createMenu","rates","playbackRates","currentRate","playbackRate","newRate","playbackRateSupported","PlaybackRateMenuItem","label","rate","parseFloat","selected","LoadProgressBar","buffered","duration","percent","time","end","width","percentify","bufferedEnd","part","left","_componentJs2","_componentJs","MouseTimeDisplay","handleMouseMove","position","findElPosition","parentNode","newTime","_utilsFormatTimeJs2","calculateDistance","PlayProgressBar","updateDataAttr","scrubbing","getCache","currentTime","_loadProgressBarJs","SeekBar","_Slider","stepBack","CustomControlSpacer","_Spacer","CaptionSettingsMenuItem","_TextTrackMenuItem","kind","CaptionsButton","_TextTrackButton","threshold","createItems","_chaptersTrackMenuItemJs2","_chaptersTrackMenuItemJs","_menuMenuJs2","_menuMenuJs","ChaptersButton","items","tracks","textTracks","track","kind_","cues","chaptersTrack","menu","contentEl","cue","mi","_menuMenuItemJs2","_menuMenuItemJs","ChaptersTrackMenuItem","_MenuItem","OffTextTrackMenuItem","handleTracksChange","SubtitlesButton","_menuMenuButtonJs2","_menuMenuButtonJs","TextTrackButton","hide","updateHandler","removeEventListener","_offTextTrackMenuItemJs2","TextTrackMenuItem","onchange","Event","_globalDocument2","createEvent","CurrentTimeDisplay","innerHTML","updateContent","localizedText","DurationDisplay","formattedTime","RemainingTimeDisplay","_sliderSliderJs2","_sliderSliderJs","VolumeBar","toFixed","setAttribute","VolumeControl","VolumeMenuButton","updateVisibility","inline","vertical","volumeUpdate","orientationClass","contentElType","_muteToggleJs2","ErrorDisplay","message","_utilsEventsJs","EventTarget","allowedEvents_","ael","addEventListener","extendFn","subClassMethods","methods","init","_utilsLog2","FullscreenApi","apiMap","specApi","browserApi","_objectAssign","MediaError","errorTypes","_menuJs2","_menuJs","MenuButton","title","unlockShowing","handleKeyPress","which","buttonPressed_","unpressButton","pressButton","MenuItem","_selected","append","_globalDocument","_utilsLogJs","_utilsToTitleCaseJs2","_utilsToTitleCaseJs","_utilsMergeOptionsJs","_tracksTextTrackListConverterJs","_errorDisplayJs","reportTouchActivity","languagesToLower","poster_","poster","controls","scrubbing_","playerOptionsCopy","plugins","getOwnPropertyNames","isAudio","Player","players","styleEl_","removeChild","attrs","getElAttributes","attr","stylesheet","createStyleElement","defaultsStyleEl","querySelector","fluid","aspectRatio","initNetworkState_","networkState","privDimension","_dimension","parsedVal","isNaN","bool","fluid_","ratio","updateStyleEl_","aspectRatio_","videoWidth","videoHeight","ratioParts","ratioMultiplier","width_","height_","loadTech_","techName","unloadTech_","disposeMediaElement","techName_","techOptions","nativeControlsForTouch","playerId","techId","textTracks_","preload","loop","vtt.js","src","cache_","startTime","techComponent","handleTechReady_","_tracksTextTrackListConverterJs2","jsonToTextTracks","textTracksJson_","handleTechLoadStart_","handleTechWaiting_","handleTechCanPlay_","handleTechCanPlayThrough_","handleTechPlaying_","handleTechEnded_","handleTechSeeking_","handleTechSeeked_","handleTechPlay_","handleTechFirstPlay_","handleTechPause_","handleTechProgress_","handleTechDurationChange_","handleTechFullscreenChange_","handleTechError_","handleTechSuspend_","handleTechAbort_","handleTechEmptied_","handleTechStalled_","handleTechLoadedData_","handleTechRateChange_","handleTechVolumeChange_","handleTechTextTrackChange_","usingNativeControls","techGet_","insertElFirst","addTechControlsListeners_","removeTechControlsListeners_","paused","hasStarted","_hasStarted","hasStarted_","handleTechClick_","button","techCall_","isScrubbing","seconds","percentAsDecimal","min","fsApi","fullscreenchange","documentFullscreenChange","isFullscreen","fullscreenElement","supportsFullScreen","_fullscreenApiJs2","fullWindowOnEscKey","exitFullWindow","documentElement","overflow","docOrigOverflow","selectSource","techOrder","tech","isSupported","b","canPlaySource","sourceList_","currentTech","load","sourceTech","controls_","error_","userActive","userActive_","stopPropagation","lastMoveX","lastMoveY","handleActivity","reportUserActivity","screenX","screenY","mouseInProgress","handleMouseUp","inactivityTimeout","userActivity_","tagOptions","dataSetup","_safeParseTuple","_safeJsonParseTuple2","hasChildNodes","childNodes","childName","baseOptions","notSupportedMessage","handleError_","flexNotSupported_","createElement","_buttonJs2","_buttonJs","PosterImage","setSrc","fallbackImg_","backgroundImage","autoSetup","vids","getElementsByTagName","audios","mediaEls","mediaEl","getAttribute","autoSetupTimeout","_windowLoaded","vjs","Slider","bar","getChild","barName","handleMouseDown","blockTextSelection","unblockTextSelection","progress","getPercent","percentage","vertical_","../component.js","../utils/dom.js","global/document","object.assign",103,"FlashRtmpDecorator","Flash","rtmp/mp4","rtmp/flv","streamFromParts","connection","stream","parts","streamBegin","connEnd","substring","isStreamingType","srcType","streamingFormats","isStreamingSrc","rtmpSourceHandler","handleSource","srcParts","_createSetter","attrUpper","toUpperCase","_api","val","_createGetter","vjs_getProperty","_tech2","_tech","_utilsUrlJs","setSource","_Tech","swf","objId","flashVars","readyFunction","errorEventProxyFunction","autoplay","params","wmode","bgcolor","Url","getAbsoluteURL","vjs_src","setCurrentTime","seekable","enterFullScreen","_readWrite","_readOnly","nativeSourceHandler","canHandleSource","guessMimeType","ext","getFileExtension","formats","video/flv","onReady","currSwf","getEl","checkReady","eventName","swfID","version","ActiveXObject","GetVariable","match","navigator","description","getEmbedCode","objTag","flashVarsString","paramsString","movie","flashvars","allowNetworking","_techJs2","_techJs","Html5","currentSrc","nodes","node","nodesLength","featuresNativeTextTracks","remoteTextTracks","addTrack_","removeNodes","handleTextTrackRemove_","handleTextTrackRemove","proxyNativeTextTracks_","tt","handleTextTrackChange_","handleTextTrackAdd_","emulatedTt","clone","cloneNode","insertBefore","tagAttributes","browser","TOUCH_ENABLED","setElAttributes","class","settingsAttrs","setLoadstartFired","loadstartFired","triggerLoadstart","eventsToTrigger","handleTextTrackChange","srcElement","webkitEnterFullScreen","video","HAVE_METADATA","addRemoteTextTrack","removeTrack_","querySelectorAll","canPlayType","TEST_VID","supportsNativeTextTracks","supportsTextTracks","IS_FIREFOX","canControlPlaybackRate","patchCanPlayType","ANDROID_VERSION","mpegurlRE","IS_OLD_ANDROID","mp4RE","unpatchCanPlayType","removeAttribute","MediaLoader","playerOptions","_tracksTextTrack2","_tracksTextTrack","Tech","manualProgressOn","featuresTimeupdateEvents","manualTimeUpdatesOn","nativeCaptions","nativeTextTracks","trackProgress","stopTrackingProgress","numBufferedPercent","bufferedPercent","bufferedPercent_","manualProgress","manualProgressOff","_mediaErrorJs2","textTrackListChanges","emulateTextTracks","script","updateDisplay","mode","setPoster","createTrackHelper","featuresVolumeControl","featuresFullscreenResize","handlers","sourceHandlers","selectSourceHandler","can","srcObj","originalSeekable","sh","disposeSourceHandler","sourceHandler_","TextTrackCueList","IS_IE8","prop","setCues_","get","oldLength","length_","defineProp","getCueById","rule","darkGray","lightGray","fontMap","monospace","sansSerif","serif","TextTrackDisplay","toggleDisplay","clearDisplay","updateForTrack","_i","cueDiv","displayState","overrides","color","firstChild","textOpacity","tryUpdateStyle","constructColor","backgroundColor","backgroundOpacity","windowColor","windowOpacity","edgeStyle","textShadow","fontPercent","fontSize","height","top","bottom","fontFamily","fontVariant","showing","trackToJson_","inBandMetadataTrackDispatchType","textTracksToJson","trackEls","trackEl","addedTrack","addCue","_eventTarget2","_eventTarget","TextTrackList","tracks_","change","removetrack","_event","rtrack","getTrackById","selectedOption","selectedOptions","selectedIndex","setSelectedOption","option","TextTrackSettings","persistTextTrackSettings","saveSettings","getValues","textEdge","getSelectedOptionValue","fgColor","bgColor","bgOpacity","setValues","values","restoreSettings","ttDisplay","registerComponent","_textTrackCueList2","_textTrackCueList","_utilsGuidJs","TextTrack","TextTrackEnum","TextTrackMode","cues_","activeCues_","activeCues","changed","timeupdateHandler","set","newMode","loaded_","ct","active","loadTrack","cuechange","removeCue","removed","parseCues","srcContent","parser","crossOrigin","isCrossOrigin","_xhr2","responseBody","O","fromIndex","abs","searchElement","IS_IPHONE","IS_IPAD","USER_AGENT","IS_IPOD","IS_IOS","IOS_VERSION","IS_ANDROID","major","IS_NATIVE_ANDROID","bufferedDuration","_timeRangesJs","createTimeRange","_logJs2","_logJs","defaultBehaviors","messages","Proxy","_ret","handler","propName","_tsml2","_templateObject","getElData","elIdAttr","hasElData","removeElData","elData","element","classToRemove","hasElClass","attrName","attrValue","attrVal","knownBooleans","box","getBoundingClientRect","docEl","scrollLeft","pageXOffset","clientLeft","clientTop","scrollTop","pageYOffset","getPointerPosition","boxW","offsetWidth","boxH","offsetHeight","boxY","pageY","changedTouches","elem","_handleMultipleEvents","dispatcher","fixEvent","handlersCopy","m","isImmediatePropagationStopped","hash","removeType","_cleanUpEvents","elemData","parent","isPropagationStopped","defaultPrevented","targetData","disabled","old","relatedTarget","fromElement","toElement","returnValue","cancelBubble","returnTrue","returnFalse","stopImmediatePropagation","doc","clientY","detachEvent",120,"uid","h","floor","gm","guide","argsArray","console","log","history","unshift","_logType","mergeOptions",126,"createTimeRangesObj","ranges","getRange","rangeIndex","fnName","rangeCheck","createTimeRanges","href","addToBody","host","protocol","div","details","path","splitPathRe","pathParts","exec","urlInfo","parseUrl","_pluginsJs2","_pluginsJs","_tracksTextTrackJs","_utilsFormatTimeJs","_utilsCreateDeprecationProxyJs","_xhr","_techFlashJs","_techHtml5Js","getPlayers","_player2","_lodashCompatObjectMerge2","_merge"],"mappings":"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,4KA0BE,IAAAjB,GAAO,QAAYA,GAAQ8C,EAAAV,EAAAic,GACzB,GAAA5N,EAIF,IAAY,gBAAR3N,GAAqB,CAQrB,GALW,IAAbA,EAAI+Y,QAAS,OACX/Y,EAAAA,EAAA4R,MAAA,IAIA1U,EAAQuyC,aAAazvC,GAW1B,MARGV,6FAIAic,GACDre,EAAAuyC,aAAAzvC,GAAAub,MAAAA,GAGIre,EAAAuyC,aAAAzvC,wBAYP,KAAA2N,IAAAA,EAAAuQ,kFAOA,OAAKvQ,GAAa,QAAK,GAAE+hC,GAAK,WAAY/hC,EAAArO,EAAAic,gEAe5CwD,EAAMgO,EAAAC,mBAA6B,slBA6FnC9vB,EAAQ+oC,kBAAkBpsB,EAAA,WAAAosB,qLAwK1B,+BAAQ0J,EAAG,WAAOzyC,EAAAoC,QAAAqd,WAAAizB,KAAAA,EAAA9xC,GAAAqY,EAAAy5B,IAAA9xC,4RAyJjB,kBAAAnB,IAAAA,EAAA;AhIvgBD;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;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","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})","(function (global){\nvar topLevel = typeof global !== 'undefined' ? global :\n    typeof window !== 'undefined' ? window : {}\nvar minDoc = require('min-document');\n\nif (typeof document !== 'undefined') {\n    module.exports = document;\n} else {\n    var doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];\n\n    if (!doccy) {\n        doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;\n    }\n\n    module.exports = doccy;\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9nbG9iYWwvZG9jdW1lbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9wTGV2ZWwgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6XG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB7fVxudmFyIG1pbkRvYyA9IHJlcXVpcmUoJ21pbi1kb2N1bWVudCcpO1xuXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQ7XG59IGVsc2Uge1xuICAgIHZhciBkb2NjeSA9IHRvcExldmVsWydfX0dMT0JBTF9ET0NVTUVOVF9DQUNIRUA0J107XG5cbiAgICBpZiAoIWRvY2N5KSB7XG4gICAgICAgIGRvY2N5ID0gdG9wTGV2ZWxbJ19fR0xPQkFMX0RPQ1VNRU5UX0NBQ0hFQDQnXSA9IG1pbkRvYztcbiAgICB9XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IGRvY2N5O1xufVxuIl19","(function (global){\nif (typeof window !== \"undefined\") {\n    module.exports = window;\n} else if (typeof global !== \"undefined\") {\n    module.exports = global;\n} else if (typeof self !== \"undefined\"){\n    module.exports = self;\n} else {\n    module.exports = {};\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9nbG9iYWwvd2luZG93LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBzZWxmO1xufSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHt9O1xufVxuIl19",null,"var getNative = require('../internal/getNative');\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeNow = getNative(Date, 'now');\n\n/**\n * Gets the number of milliseconds that have elapsed since the Unix epoch\n * (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @category Date\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => logs the number of milliseconds it took for the deferred function to be invoked\n */\nvar now = nativeNow || function() {\n  return new Date().getTime();\n};\n\nmodule.exports = now;\n","var isObject = require('../lang/isObject'),\n    now = require('../date/now');\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed invocations. Provide an options object to indicate that `func`\n * should be invoked on the leading and/or trailing edge of the `wait` timeout.\n * Subsequent calls to the debounced function return the result of the last\n * `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the debounced function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=false] Specify invoking on the leading\n *  edge of the timeout.\n * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n *  delayed before it's invoked.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n *  edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // avoid costly calculations while the window size is in flux\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // invoke `sendMail` when the click event is fired, debouncing subsequent calls\n * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // ensure `batchLog` is invoked once after 1 second of debounced calls\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', _.debounce(batchLog, 250, {\n *   'maxWait': 1000\n * }));\n *\n * // cancel a debounced call\n * var todoChanges = _.debounce(batchLog, 1000);\n * Object.observe(models.todo, todoChanges);\n *\n * Object.observe(models, function(changes) {\n *   if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {\n *     todoChanges.cancel();\n *   }\n * }, ['delete']);\n *\n * // ...at some point `models.todo` is changed\n * models.todo.completed = true;\n *\n * // ...before 1 second has passed `models.todo` is deleted\n * // which cancels the debounced `todoChanges` call\n * delete models.todo;\n */\nfunction debounce(func, wait, options) {\n  var args,\n      maxTimeoutId,\n      result,\n      stamp,\n      thisArg,\n      timeoutId,\n      trailingCall,\n      lastCalled = 0,\n      maxWait = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = wait < 0 ? 0 : (+wait || 0);\n  if (options === true) {\n    var leading = true;\n    trailing = false;\n  } else if (isObject(options)) {\n    leading = !!options.leading;\n    maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function cancel() {\n    if (timeoutId) {\n      clearTimeout(timeoutId);\n    }\n    if (maxTimeoutId) {\n      clearTimeout(maxTimeoutId);\n    }\n    lastCalled = 0;\n    maxTimeoutId = timeoutId = trailingCall = undefined;\n  }\n\n  function complete(isCalled, id) {\n    if (id) {\n      clearTimeout(id);\n    }\n    maxTimeoutId = timeoutId = trailingCall = undefined;\n    if (isCalled) {\n      lastCalled = now();\n      result = func.apply(thisArg, args);\n      if (!timeoutId && !maxTimeoutId) {\n        args = thisArg = undefined;\n      }\n    }\n  }\n\n  function delayed() {\n    var remaining = wait - (now() - stamp);\n    if (remaining <= 0 || remaining > wait) {\n      complete(trailingCall, maxTimeoutId);\n    } else {\n      timeoutId = setTimeout(delayed, remaining);\n    }\n  }\n\n  function maxDelayed() {\n    complete(trailing, timeoutId);\n  }\n\n  function debounced() {\n    args = arguments;\n    stamp = now();\n    thisArg = this;\n    trailingCall = trailing && (timeoutId || !leading);\n\n    if (maxWait === false) {\n      var leadingCall = leading && !timeoutId;\n    } else {\n      if (!maxTimeoutId && !leading) {\n        lastCalled = stamp;\n      }\n      var remaining = maxWait - (stamp - lastCalled),\n          isCalled = remaining <= 0 || remaining > maxWait;\n\n      if (isCalled) {\n        if (maxTimeoutId) {\n          maxTimeoutId = clearTimeout(maxTimeoutId);\n        }\n        lastCalled = stamp;\n        result = func.apply(thisArg, args);\n      }\n      else if (!maxTimeoutId) {\n        maxTimeoutId = setTimeout(maxDelayed, remaining);\n      }\n    }\n    if (isCalled && timeoutId) {\n      timeoutId = clearTimeout(timeoutId);\n    }\n    else if (!timeoutId && wait !== maxWait) {\n      timeoutId = setTimeout(delayed, wait);\n    }\n    if (leadingCall) {\n      isCalled = true;\n      result = func.apply(thisArg, args);\n    }\n    if (isCalled && !timeoutId && !maxTimeoutId) {\n      args = thisArg = undefined;\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  return debounced;\n}\n\nmodule.exports = debounce;\n","/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as an array.\n *\n * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters).\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.restParam(function(what, names) {\n *   return what + ' ' + _.initial(names).join(', ') +\n *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\nfunction restParam(func, start) {\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        rest = Array(length);\n\n    while (++index < length) {\n      rest[index] = args[start + index];\n    }\n    switch (start) {\n      case 0: return func.call(this, rest);\n      case 1: return func.call(this, args[0], rest);\n      case 2: return func.call(this, args[0], args[1], rest);\n    }\n    var otherArgs = Array(start + 1);\n    index = -1;\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = rest;\n    return func.apply(this, otherArgs);\n  };\n}\n\nmodule.exports = restParam;\n","var debounce = require('./debounce'),\n    isObject = require('../lang/isObject');\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed invocations. Provide an options object to indicate\n * that `func` should be invoked on the leading and/or trailing edge of the\n * `wait` timeout. Subsequent calls to the throttled function return the\n * result of the last `func` call.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the throttled function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=true] Specify invoking on the leading\n *  edge of the timeout.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n *  edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // avoid excessively updating the position while scrolling\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\n *   'trailing': false\n * }));\n *\n * // cancel a trailing throttled call\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n  var leading = true,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  if (options === false) {\n    leading = false;\n  } else if (isObject(options)) {\n    leading = 'leading' in options ? !!options.leading : leading;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n  return debounce(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing });\n}\n\nmodule.exports = throttle;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction arrayCopy(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayCopy;\n","/**\n * A specialized version of `_.forEach` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (iteratee(array[index], index, array) === false) {\n      break;\n    }\n  }\n  return array;\n}\n\nmodule.exports = arrayEach;\n","/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property names to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @returns {Object} Returns `object`.\n */\nfunction baseCopy(source, props, object) {\n  object || (object = {});\n\n  var index = -1,\n      length = props.length;\n\n  while (++index < length) {\n    var key = props[index];\n    object[key] = source[key];\n  }\n  return object;\n}\n\nmodule.exports = baseCopy;\n","var createBaseFor = require('./createBaseFor');\n\n/**\n * The base implementation of `baseForIn` and `baseForOwn` which iterates\n * over `object` properties returned by `keysFunc` invoking `iteratee` for\n * each property. Iteratee functions may exit iteration early by explicitly\n * returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","var baseFor = require('./baseFor'),\n    keysIn = require('../object/keysIn');\n\n/**\n * The base implementation of `_.forIn` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForIn(object, iteratee) {\n  return baseFor(object, iteratee, keysIn);\n}\n\nmodule.exports = baseForIn;\n","var arrayEach = require('./arrayEach'),\n    baseMergeDeep = require('./baseMergeDeep'),\n    isArray = require('../lang/isArray'),\n    isArrayLike = require('./isArrayLike'),\n    isObject = require('../lang/isObject'),\n    isObjectLike = require('./isObjectLike'),\n    isTypedArray = require('../lang/isTypedArray'),\n    keys = require('../object/keys');\n\n/**\n * The base implementation of `_.merge` without support for argument juggling,\n * multiple sources, and `this` binding `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Array} [stackA=[]] Tracks traversed source objects.\n * @param {Array} [stackB=[]] Associates values with source counterparts.\n * @returns {Object} Returns `object`.\n */\nfunction baseMerge(object, source, customizer, stackA, stackB) {\n  if (!isObject(object)) {\n    return object;\n  }\n  var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),\n      props = isSrcArr ? undefined : keys(source);\n\n  arrayEach(props || source, function(srcValue, key) {\n    if (props) {\n      key = srcValue;\n      srcValue = source[key];\n    }\n    if (isObjectLike(srcValue)) {\n      stackA || (stackA = []);\n      stackB || (stackB = []);\n      baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);\n    }\n    else {\n      var value = object[key],\n          result = customizer ? customizer(value, srcValue, key, object, source) : undefined,\n          isCommon = result === undefined;\n\n      if (isCommon) {\n        result = srcValue;\n      }\n      if ((result !== undefined || (isSrcArr && !(key in object))) &&\n          (isCommon || (result === result ? (result !== value) : (value === value)))) {\n        object[key] = result;\n      }\n    }\n  });\n  return object;\n}\n\nmodule.exports = baseMerge;\n","var arrayCopy = require('./arrayCopy'),\n    isArguments = require('../lang/isArguments'),\n    isArray = require('../lang/isArray'),\n    isArrayLike = require('./isArrayLike'),\n    isPlainObject = require('../lang/isPlainObject'),\n    isTypedArray = require('../lang/isTypedArray'),\n    toPlainObject = require('../lang/toPlainObject');\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Array} [stackA=[]] Tracks traversed source objects.\n * @param {Array} [stackB=[]] Associates values with source counterparts.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {\n  var length = stackA.length,\n      srcValue = source[key];\n\n  while (length--) {\n    if (stackA[length] == srcValue) {\n      object[key] = stackB[length];\n      return;\n    }\n  }\n  var value = object[key],\n      result = customizer ? customizer(value, srcValue, key, object, source) : undefined,\n      isCommon = result === undefined;\n\n  if (isCommon) {\n    result = srcValue;\n    if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) {\n      result = isArray(value)\n        ? value\n        : (isArrayLike(value) ? arrayCopy(value) : []);\n    }\n    else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n      result = isArguments(value)\n        ? toPlainObject(value)\n        : (isPlainObject(value) ? value : {});\n    }\n    else {\n      isCommon = false;\n    }\n  }\n  // Add the source value to the stack of traversed objects and associate\n  // it with its merged value.\n  stackA.push(srcValue);\n  stackB.push(result);\n\n  if (isCommon) {\n    // Recursively merge objects and arrays (susceptible to call stack limits).\n    object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);\n  } else if (result === result ? (result !== value) : (value === value)) {\n    object[key] = result;\n  }\n}\n\nmodule.exports = baseMergeDeep;\n","var toObject = require('./toObject');\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n  return function(object) {\n    return object == null ? undefined : toObject(object)[key];\n  };\n}\n\nmodule.exports = baseProperty;\n","var identity = require('../utility/identity');\n\n/**\n * A specialized version of `baseCallback` which only supports `this` binding\n * and specifying the number of arguments to provide to `func`.\n *\n * @private\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {number} [argCount] The number of arguments to provide to `func`.\n * @returns {Function} Returns the callback.\n */\nfunction bindCallback(func, thisArg, argCount) {\n  if (typeof func != 'function') {\n    return identity;\n  }\n  if (thisArg === undefined) {\n    return func;\n  }\n  switch (argCount) {\n    case 1: return function(value) {\n      return func.call(thisArg, value);\n    };\n    case 3: return function(value, index, collection) {\n      return func.call(thisArg, value, index, collection);\n    };\n    case 4: return function(accumulator, value, index, collection) {\n      return func.call(thisArg, accumulator, value, index, collection);\n    };\n    case 5: return function(value, other, key, object, source) {\n      return func.call(thisArg, value, other, key, object, source);\n    };\n  }\n  return function() {\n    return func.apply(thisArg, arguments);\n  };\n}\n\nmodule.exports = bindCallback;\n","var bindCallback = require('./bindCallback'),\n    isIterateeCall = require('./isIterateeCall'),\n    restParam = require('../function/restParam');\n\n/**\n * Creates a `_.assign`, `_.defaults`, or `_.merge` function.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n  return restParam(function(object, sources) {\n    var index = -1,\n        length = object == null ? 0 : sources.length,\n        customizer = length > 2 ? sources[length - 2] : undefined,\n        guard = length > 2 ? sources[2] : undefined,\n        thisArg = length > 1 ? sources[length - 1] : undefined;\n\n    if (typeof customizer == 'function') {\n      customizer = bindCallback(customizer, thisArg, 5);\n      length -= 2;\n    } else {\n      customizer = typeof thisArg == 'function' ? thisArg : undefined;\n      length -= (customizer ? 1 : 0);\n    }\n    if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n      customizer = length < 3 ? undefined : customizer;\n      length = 1;\n    }\n    while (++index < length) {\n      var source = sources[index];\n      if (source) {\n        assigner(object, source, customizer);\n      }\n    }\n    return object;\n  });\n}\n\nmodule.exports = createAssigner;\n","var toObject = require('./toObject');\n\n/**\n * Creates a base function for `_.forIn` or `_.forInRight`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n  return function(object, iteratee, keysFunc) {\n    var iterable = toObject(object),\n        props = keysFunc(object),\n        length = props.length,\n        index = fromRight ? length : -1;\n\n    while ((fromRight ? index-- : ++index < length)) {\n      var key = props[index];\n      if (iteratee(iterable[key], key, iterable) === false) {\n        break;\n      }\n    }\n    return object;\n  };\n}\n\nmodule.exports = createBaseFor;\n","var baseProperty = require('./baseProperty');\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\nmodule.exports = getLength;\n","var isNative = require('../lang/isNative');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = object == null ? undefined : object[key];\n  return isNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var getLength = require('./getLength'),\n    isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(getLength(value));\n}\n\nmodule.exports = isArrayLike;\n","/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    // IE < 9 presents many host objects as `Object` objects that can coerce\n    // to strings despite having improperly defined `toString` methods.\n    return typeof value.toString != 'function' && typeof (value + '') == 'string';\n  };\n}());\n\nmodule.exports = isHostObject;\n","/** Used to detect unsigned integer values. */\nvar reIsUint = /^\\d+$/;\n\n/**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n  return value > -1 && value % 1 == 0 && value < length;\n}\n\nmodule.exports = isIndex;\n","var isArrayLike = require('./isArrayLike'),\n    isIndex = require('./isIndex'),\n    isObject = require('../lang/isObject');\n\n/**\n * Checks if the provided arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n  if (!isObject(object)) {\n    return false;\n  }\n  var type = typeof index;\n  if (type == 'number'\n      ? (isArrayLike(object) && isIndex(index, object.length))\n      : (type == 'string' && index in object)) {\n    var other = object[index];\n    return value === value ? (value === other) : (other !== other);\n  }\n  return false;\n}\n\nmodule.exports = isIterateeCall;\n","/**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n  return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","/**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\nfunction isObjectLike(value) {\n  return !!value && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var isArguments = require('../lang/isArguments'),\n    isArray = require('../lang/isArray'),\n    isIndex = require('./isIndex'),\n    isLength = require('./isLength'),\n    isString = require('../lang/isString'),\n    keysIn = require('../object/keysIn');\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A fallback implementation of `Object.keys` which creates an array of the\n * own enumerable property names of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction shimKeys(object) {\n  var props = keysIn(object),\n      propsLength = props.length,\n      length = propsLength && object.length;\n\n  var allowIndexes = !!length && isLength(length) &&\n    (isArray(object) || isArguments(object) || isString(object));\n\n  var index = -1,\n      result = [];\n\n  while (++index < propsLength) {\n    var key = props[index];\n    if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = shimKeys;\n","var isObject = require('../lang/isObject'),\n    isString = require('../lang/isString'),\n    support = require('../support');\n\n/**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\nfunction toObject(value) {\n  if (support.unindexedChars && isString(value)) {\n    var index = -1,\n        length = value.length,\n        result = Object(value);\n\n    while (++index < length) {\n      result[index] = value.charAt(index);\n    }\n    return result;\n  }\n  return isObject(value) ? value : Object(value);\n}\n\nmodule.exports = toObject;\n","var isArrayLike = require('../internal/isArrayLike'),\n    isObjectLike = require('../internal/isObjectLike');\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Native method references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is classified as an `arguments` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n  return isObjectLike(value) && isArrayLike(value) &&\n    hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');\n}\n\nmodule.exports = isArguments;\n","var getNative = require('../internal/getNative'),\n    isLength = require('../internal/isLength'),\n    isObjectLike = require('../internal/isObjectLike');\n\n/** `Object#toString` result references. */\nvar arrayTag = '[object Array]';\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeIsArray = getNative(Array, 'isArray');\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(function() { return arguments; }());\n * // => false\n */\nvar isArray = nativeIsArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;\n};\n\nmodule.exports = isArray;\n","var isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]';\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in older versions of Chrome and Safari which return 'function' for regexes\n  // and Safari 8 which returns 'object' for typed array constructors.\n  return isObject(value) && objToString.call(value) == funcTag;\n}\n\nmodule.exports = isFunction;\n","var isFunction = require('./isFunction'),\n    isHostObject = require('../internal/isHostObject'),\n    isObjectLike = require('../internal/isObjectLike');\n\n/** Used to detect host constructors (Safari > 5). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar fnToString = Function.prototype.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  fnToString.call(hasOwnProperty).replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * Checks if `value` is a native function.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\nfunction isNative(value) {\n  if (value == null) {\n    return false;\n  }\n  if (isFunction(value)) {\n    return reIsNative.test(fnToString.call(value));\n  }\n  return isObjectLike(value) && (isHostObject(value) ? reIsNative : reIsHostCtor).test(value);\n}\n\nmodule.exports = isNative;\n","/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(1);\n * // => false\n */\nfunction isObject(value) {\n  // Avoid a V8 JIT bug in Chrome 19-20.\n  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n  var type = typeof value;\n  return !!value && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseForIn = require('../internal/baseForIn'),\n    isArguments = require('./isArguments'),\n    isHostObject = require('../internal/isHostObject'),\n    isObjectLike = require('../internal/isObjectLike'),\n    support = require('../support');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * **Note:** This method assumes objects created by the `Object` constructor\n * have no inherited enumerable properties.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n  var Ctor;\n\n  // Exit early for non `Object` objects.\n  if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isHostObject(value) && !isArguments(value)) ||\n      (!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {\n    return false;\n  }\n  // IE < 9 iterates inherited properties before own properties. If the first\n  // iterated property is an object's own property then there are no inherited\n  // enumerable properties.\n  var result;\n  if (support.ownLast) {\n    baseForIn(value, function(subValue, key, object) {\n      result = hasOwnProperty.call(object, key);\n      return false;\n    });\n    return result !== false;\n  }\n  // In most environments an object's own properties are iterated before\n  // its inherited properties. If the last iterated property is an object's\n  // own property then there are no inherited enumerable properties.\n  baseForIn(value, function(subValue, key) {\n    result = key;\n  });\n  return result === undefined || hasOwnProperty.call(value, result);\n}\n\nmodule.exports = isPlainObject;\n","var isObjectLike = require('../internal/isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n  return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);\n}\n\nmodule.exports = isString;\n","var isLength = require('../internal/isLength'),\n    isObjectLike = require('../internal/isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nmodule.exports = isTypedArray;\n","var baseCopy = require('../internal/baseCopy'),\n    keysIn = require('../object/keysIn');\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable\n * properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n  return baseCopy(value, keysIn(value));\n}\n\nmodule.exports = toPlainObject;\n","var getNative = require('../internal/getNative'),\n    isArrayLike = require('../internal/isArrayLike'),\n    isObject = require('../lang/isObject'),\n    shimKeys = require('../internal/shimKeys'),\n    support = require('../support');\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = getNative(Object, 'keys');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nvar keys = !nativeKeys ? shimKeys : function(object) {\n  var Ctor = object == null ? undefined : object.constructor;\n  if ((typeof Ctor == 'function' && Ctor.prototype === object) ||\n      (typeof object == 'function' ? support.enumPrototypes : isArrayLike(object))) {\n    return shimKeys(object);\n  }\n  return isObject(object) ? nativeKeys(object) : [];\n};\n\nmodule.exports = keys;\n","var arrayEach = require('../internal/arrayEach'),\n    isArguments = require('../lang/isArguments'),\n    isArray = require('../lang/isArray'),\n    isFunction = require('../lang/isFunction'),\n    isIndex = require('../internal/isIndex'),\n    isLength = require('../internal/isLength'),\n    isObject = require('../lang/isObject'),\n    isString = require('../lang/isString'),\n    support = require('../support');\n\n/** `Object#toString` result references. */\nvar arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    stringTag = '[object String]';\n\n/** Used to fix the JScript `[[DontEnum]]` bug. */\nvar shadowProps = [\n  'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',\n  'toLocaleString', 'toString', 'valueOf'\n];\n\n/** Used for native method references. */\nvar errorProto = Error.prototype,\n    objectProto = Object.prototype,\n    stringProto = String.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/** Used to avoid iterating over non-enumerable properties in IE < 9. */\nvar nonEnumProps = {};\nnonEnumProps[arrayTag] = nonEnumProps[dateTag] = nonEnumProps[numberTag] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };\nnonEnumProps[boolTag] = nonEnumProps[stringTag] = { 'constructor': true, 'toString': true, 'valueOf': true };\nnonEnumProps[errorTag] = nonEnumProps[funcTag] = nonEnumProps[regexpTag] = { 'constructor': true, 'toString': true };\nnonEnumProps[objectTag] = { 'constructor': true };\n\narrayEach(shadowProps, function(key) {\n  for (var tag in nonEnumProps) {\n    if (hasOwnProperty.call(nonEnumProps, tag)) {\n      var props = nonEnumProps[tag];\n      props[key] = hasOwnProperty.call(props, key);\n    }\n  }\n});\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n  if (object == null) {\n    return [];\n  }\n  if (!isObject(object)) {\n    object = Object(object);\n  }\n  var length = object.length;\n\n  length = (length && isLength(length) &&\n    (isArray(object) || isArguments(object) || isString(object)) && length) || 0;\n\n  var Ctor = object.constructor,\n      index = -1,\n      proto = (isFunction(Ctor) && Ctor.prototype) || objectProto,\n      isProto = proto === object,\n      result = Array(length),\n      skipIndexes = length > 0,\n      skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error),\n      skipProto = support.enumPrototypes && isFunction(object);\n\n  while (++index < length) {\n    result[index] = (index + '');\n  }\n  // lodash skips the `constructor` property when it infers it's iterating\n  // over a `prototype` object because IE < 9 can't set the `[[Enumerable]]`\n  // attribute of an existing property and the `constructor` property of a\n  // prototype defaults to non-enumerable.\n  for (var key in object) {\n    if (!(skipProto && key == 'prototype') &&\n        !(skipErrorProps && (key == 'message' || key == 'name')) &&\n        !(skipIndexes && isIndex(key, length)) &&\n        !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n      result.push(key);\n    }\n  }\n  if (support.nonEnumShadows && object !== objectProto) {\n    var tag = object === stringProto ? stringTag : (object === errorProto ? errorTag : objToString.call(object)),\n        nonEnums = nonEnumProps[tag] || nonEnumProps[objectTag];\n\n    if (tag == objectTag) {\n      proto = objectProto;\n    }\n    length = shadowProps.length;\n    while (length--) {\n      key = shadowProps[length];\n      var nonEnum = nonEnums[key];\n      if (!(isProto && nonEnum) &&\n          (nonEnum ? hasOwnProperty.call(object, key) : object[key] !== proto[key])) {\n        result.push(key);\n      }\n    }\n  }\n  return result;\n}\n\nmodule.exports = keysIn;\n","var baseMerge = require('../internal/baseMerge'),\n    createAssigner = require('../internal/createAssigner');\n\n/**\n * Recursively merges own enumerable properties of the source object(s), that\n * don't resolve to `undefined` into the destination object. Subsequent sources\n * overwrite property assignments of previous sources. If `customizer` is\n * provided it's invoked to produce the merged values of the destination and\n * source properties. If `customizer` returns `undefined` merging is handled\n * by the method instead. The `customizer` is bound to `thisArg` and invoked\n * with five arguments: (objectValue, sourceValue, key, object, source).\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var users = {\n *   'data': [{ 'user': 'barney' }, { 'user': 'fred' }]\n * };\n *\n * var ages = {\n *   'data': [{ 'age': 36 }, { 'age': 40 }]\n * };\n *\n * _.merge(users, ages);\n * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }\n *\n * // using a customizer callback\n * var object = {\n *   'fruits': ['apple'],\n *   'vegetables': ['beet']\n * };\n *\n * var other = {\n *   'fruits': ['banana'],\n *   'vegetables': ['carrot']\n * };\n *\n * _.merge(object, other, function(a, b) {\n *   if (_.isArray(a)) {\n *     return a.concat(b);\n *   }\n * });\n * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }\n */\nvar merge = createAssigner(baseMerge);\n\nmodule.exports = merge;\n","/** Used for native method references. */\nvar arrayProto = Array.prototype,\n    errorProto = Error.prototype,\n    objectProto = Object.prototype;\n\n/** Native method references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable,\n    splice = arrayProto.splice;\n\n/**\n * An object environment feature flags.\n *\n * @static\n * @memberOf _\n * @type Object\n */\nvar support = {};\n\n(function(x) {\n  var Ctor = function() { this.x = x; },\n      object = { '0': x, 'length': x },\n      props = [];\n\n  Ctor.prototype = { 'valueOf': x, 'y': x };\n  for (var key in new Ctor) { props.push(key); }\n\n  /**\n   * Detect if `name` or `message` properties of `Error.prototype` are\n   * enumerable by default (IE < 9, Safari < 5.1).\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') ||\n    propertyIsEnumerable.call(errorProto, 'name');\n\n  /**\n   * Detect if `prototype` properties are enumerable by default.\n   *\n   * Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1\n   * (if the prototype or a property on the prototype has been set)\n   * incorrectly set the `[[Enumerable]]` value of a function's `prototype`\n   * property to `true`.\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.enumPrototypes = propertyIsEnumerable.call(Ctor, 'prototype');\n\n  /**\n   * Detect if properties shadowing those on `Object.prototype` are non-enumerable.\n   *\n   * In IE < 9 an object's own properties, shadowing non-enumerable ones,\n   * are made non-enumerable as well (a.k.a the JScript `[[DontEnum]]` bug).\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.nonEnumShadows = !/valueOf/.test(props);\n\n  /**\n   * Detect if own properties are iterated after inherited properties (IE < 9).\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.ownLast = props[0] != 'x';\n\n  /**\n   * Detect if `Array#shift` and `Array#splice` augment array-like objects\n   * correctly.\n   *\n   * Firefox < 10, compatibility modes of IE 8, and IE < 9 have buggy Array\n   * `shift()` and `splice()` functions that fail to remove the last element,\n   * `value[0]`, of array-like objects even though the \"length\" property is\n   * set to `0`. The `shift()` method is buggy in compatibility modes of IE 8,\n   * while `splice()` is buggy regardless of mode in IE < 9.\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.spliceObjects = (splice.call(object, 0, 1), !object[0]);\n\n  /**\n   * Detect lack of support for accessing string characters by index.\n   *\n   * IE < 8 can't access characters by index. IE 8 can only access characters\n   * by index on string literals, not string objects.\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.unindexedChars = ('x'[0] + Object('x')[0]) != 'xx';\n}(1, 0));\n\nmodule.exports = support;\n","/**\n * This method returns the first argument provided to it.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'user': 'fred' };\n *\n * _.identity(object) === object;\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n","'use strict';\n\n// modified from https://github.com/es-shims/es6-shim\nvar keys = require('object-keys');\nvar canBeObject = function (obj) {\n\treturn typeof obj !== 'undefined' && obj !== null;\n};\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';\nvar defineProperties = require('define-properties');\nvar toObject = Object;\nvar push = Array.prototype.push;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nvar assignShim = function assign(target, source1) {\n\tif (!canBeObject(target)) { throw new TypeError('target must be an object'); }\n\tvar objTarget = toObject(target);\n\tvar s, source, i, props, syms;\n\tfor (s = 1; s < arguments.length; ++s) {\n\t\tsource = toObject(arguments[s]);\n\t\tprops = keys(source);\n\t\tif (hasSymbols && Object.getOwnPropertySymbols) {\n\t\t\tsyms = Object.getOwnPropertySymbols(source);\n\t\t\tfor (i = 0; i < syms.length; ++i) {\n\t\t\t\tif (propIsEnumerable.call(source, syms[i])) {\n\t\t\t\t\tpush.call(props, syms[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (i = 0; i < props.length; ++i) {\n\t\t\tobjTarget[props[i]] = source[props[i]];\n\t\t}\n\t}\n\treturn objTarget;\n};\n\ndefineProperties(assignShim, {\n\tshim: function shimObjectAssign() {\n\t\tvar assignHasPendingExceptions = function () {\n\t\t\tif (!Object.assign || !Object.preventExtensions) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Firefox 37 still has \"pending exception\" logic in its Object.assign implementation,\n\t\t\t// which is 72% slower than our shim, and Firefox 40's native implementation.\n\t\t\tvar thrower = Object.preventExtensions({ 1: 2 });\n\t\t\ttry {\n\t\t\t\tObject.assign(thrower, 'xy');\n\t\t\t} catch (e) {\n\t\t\t\treturn thrower[1] === 'y';\n\t\t\t}\n\t\t};\n\t\tdefineProperties(\n\t\t\tObject,\n\t\t\t{ assign: assignShim },\n\t\t\t{ assign: assignHasPendingExceptions }\n\t\t);\n\t\treturn Object.assign || assignShim;\n\t}\n});\n\nmodule.exports = assignShim;\n","'use strict';\n\nvar keys = require('object-keys');\nvar foreach = require('foreach');\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';\n\nvar toStr = Object.prototype.toString;\n\nvar isFunction = function (fn) {\n\treturn typeof fn === 'function' && toStr.call(fn) === '[object Function]';\n};\n\nvar arePropertyDescriptorsSupported = function () {\n\tvar obj = {};\n\ttry {\n\t\tObject.defineProperty(obj, 'x', { value: obj, enumerable: false });\n        /* eslint-disable no-unused-vars */\n        for (var _ in obj) { return false; }\n        /* eslint-enable no-unused-vars */\n\t\treturn obj.x === obj;\n\t} catch (e) { /* this is IE 8. */\n\t\treturn false;\n\t}\n};\nvar supportsDescriptors = Object.defineProperty && arePropertyDescriptorsSupported();\n\nvar defineProperty = function (object, name, value, predicate) {\n\tif (name in object && (!isFunction(predicate) || !predicate())) {\n\t\treturn;\n\t}\n\tif (supportsDescriptors) {\n\t\tObject.defineProperty(object, name, {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\twritable: true,\n\t\t\tvalue: value\n\t\t});\n\t} else {\n\t\tobject[name] = value;\n\t}\n};\n\nvar defineProperties = function (object, map) {\n\tvar predicates = arguments.length > 2 ? arguments[2] : {};\n\tvar props = keys(map);\n\tif (hasSymbols) {\n\t\tprops = props.concat(Object.getOwnPropertySymbols(map));\n\t}\n\tforeach(props, function (name) {\n\t\tdefineProperty(object, name, map[name], predicates[name]);\n\t});\n};\n\ndefineProperties.supportsDescriptors = !!supportsDescriptors;\n\nmodule.exports = defineProperties;\n","\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar toString = Object.prototype.toString;\n\nmodule.exports = function forEach (obj, fn, ctx) {\n    if (toString.call(fn) !== '[object Function]') {\n        throw new TypeError('iterator must be a function');\n    }\n    var l = obj.length;\n    if (l === +l) {\n        for (var i = 0; i < l; i++) {\n            fn.call(ctx, obj[i], i, obj);\n        }\n    } else {\n        for (var k in obj) {\n            if (hasOwn.call(obj, k)) {\n                fn.call(ctx, obj[k], k, obj);\n            }\n        }\n    }\n};\n\n","'use strict';\n\n// modified from https://github.com/es-shims/es5-shim\nvar has = Object.prototype.hasOwnProperty;\nvar toStr = Object.prototype.toString;\nvar slice = Array.prototype.slice;\nvar isArgs = require('./isArguments');\nvar hasDontEnumBug = !({ 'toString': null }).propertyIsEnumerable('toString');\nvar hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype');\nvar dontEnums = [\n\t'toString',\n\t'toLocaleString',\n\t'valueOf',\n\t'hasOwnProperty',\n\t'isPrototypeOf',\n\t'propertyIsEnumerable',\n\t'constructor'\n];\nvar equalsConstructorPrototype = function (o) {\n\tvar ctor = o.constructor;\n\treturn ctor && ctor.prototype === o;\n};\nvar blacklistedKeys = {\n\t$window: true,\n\t$console: true,\n\t$parent: true,\n\t$self: true,\n\t$frames: true,\n\t$webkitIndexedDB: true,\n\t$webkitStorageInfo: true\n};\nvar hasAutomationEqualityBug = (function () {\n\t/* global window */\n\tif (typeof window === 'undefined') { return false; }\n\tfor (var k in window) {\n\t\tif (!blacklistedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {\n\t\t\ttry {\n\t\t\t\tequalsConstructorPrototype(window[k]);\n\t\t\t} catch (e) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}());\nvar equalsConstructorPrototypeIfNotBuggy = function (o) {\n\t/* global window */\n\tif (typeof window === 'undefined' && !hasAutomationEqualityBug) {\n\t\treturn equalsConstructorPrototype(o);\n\t}\n\ttry {\n\t\treturn equalsConstructorPrototype(o);\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\nvar keysShim = function keys(object) {\n\tvar isObject = object !== null && typeof object === 'object';\n\tvar isFunction = toStr.call(object) === '[object Function]';\n\tvar isArguments = isArgs(object);\n\tvar isString = isObject && toStr.call(object) === '[object String]';\n\tvar theKeys = [];\n\n\tif (!isObject && !isFunction && !isArguments) {\n\t\tthrow new TypeError('Object.keys called on a non-object');\n\t}\n\n\tvar skipProto = hasProtoEnumBug && isFunction;\n\tif (isString && object.length > 0 && !has.call(object, 0)) {\n\t\tfor (var i = 0; i < object.length; ++i) {\n\t\t\ttheKeys.push(String(i));\n\t\t}\n\t}\n\n\tif (isArguments && object.length > 0) {\n\t\tfor (var j = 0; j < object.length; ++j) {\n\t\t\ttheKeys.push(String(j));\n\t\t}\n\t} else {\n\t\tfor (var name in object) {\n\t\t\tif (!(skipProto && name === 'prototype') && has.call(object, name)) {\n\t\t\t\ttheKeys.push(String(name));\n\t\t\t}\n\t\t}\n\t}\n\n\tif (hasDontEnumBug) {\n\t\tvar skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);\n\n\t\tfor (var k = 0; k < dontEnums.length; ++k) {\n\t\t\tif (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {\n\t\t\t\ttheKeys.push(dontEnums[k]);\n\t\t\t}\n\t\t}\n\t}\n\treturn theKeys;\n};\n\nkeysShim.shim = function shimObjectKeys() {\n\tif (!Object.keys) {\n\t\tObject.keys = keysShim;\n\t} else {\n\t\tvar keysWorksWithArguments = (function () {\n\t\t\t// Safari 5.0 bug\n\t\t\treturn (Object.keys(arguments) || '').length === 2;\n\t\t}(1, 2));\n\t\tif (!keysWorksWithArguments) {\n\t\t\tvar originalKeys = Object.keys;\n\t\t\tObject.keys = function keys(object) {\n\t\t\t\tif (isArgs(object)) {\n\t\t\t\t\treturn originalKeys(slice.call(object));\n\t\t\t\t} else {\n\t\t\t\t\treturn originalKeys(object);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n\treturn Object.keys || keysShim;\n};\n\nmodule.exports = keysShim;\n","'use strict';\n\nvar toStr = Object.prototype.toString;\n\nmodule.exports = function isArguments(value) {\n\tvar str = toStr.call(value);\n\tvar isArgs = str === '[object Arguments]';\n\tif (!isArgs) {\n\t\tisArgs = str !== '[object Array]' &&\n\t\t\tvalue !== null &&\n\t\t\ttypeof value === 'object' &&\n\t\t\ttypeof value.length === 'number' &&\n\t\t\tvalue.length >= 0 &&\n\t\t\ttoStr.call(value.callee) === '[object Function]';\n\t}\n\treturn isArgs;\n};\n","module.exports = SafeParseTuple\n\nfunction SafeParseTuple(obj, reviver) {\n    var json\n    var error = null\n\n    try {\n        json = JSON.parse(obj, reviver)\n    } catch (err) {\n        error = err\n    }\n\n    return [error, json]\n}\n","function clean (s) {\n  return s.replace(/\\n\\r?\\s*/g, '')\n}\n\n\nmodule.exports = function tsml (sa) {\n  var s = ''\n    , i = 0\n\n  for (; i < arguments.length; i++)\n    s += clean(sa[i]) + (arguments[i + 1] || '')\n\n  return s\n}","\"use strict\";\nvar window = require(\"global/window\")\nvar once = require(\"once\")\nvar parseHeaders = require(\"parse-headers\")\n\n\n\nmodule.exports = createXHR\ncreateXHR.XMLHttpRequest = window.XMLHttpRequest || noop\ncreateXHR.XDomainRequest = \"withCredentials\" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window.XDomainRequest\n\n\nfunction isEmpty(obj){\n    for(var i in obj){\n        if(obj.hasOwnProperty(i)) return false\n    }\n    return true\n}\n\nfunction createXHR(options, callback) {\n    function readystatechange() {\n        if (xhr.readyState === 4) {\n            loadFunc()\n        }\n    }\n\n    function getBody() {\n        // Chrome with requestType=blob throws errors arround when even testing access to responseText\n        var body = undefined\n\n        if (xhr.response) {\n            body = xhr.response\n        } else if (xhr.responseType === \"text\" || !xhr.responseType) {\n            body = xhr.responseText || xhr.responseXML\n        }\n\n        if (isJson) {\n            try {\n                body = JSON.parse(body)\n            } catch (e) {}\n        }\n\n        return body\n    }\n\n    var failureResponse = {\n                body: undefined,\n                headers: {},\n                statusCode: 0,\n                method: method,\n                url: uri,\n                rawRequest: xhr\n            }\n\n    function errorFunc(evt) {\n        clearTimeout(timeoutTimer)\n        if(!(evt instanceof Error)){\n            evt = new Error(\"\" + (evt || \"Unknown XMLHttpRequest Error\") )\n        }\n        evt.statusCode = 0\n        callback(evt, failureResponse)\n    }\n\n    // will load the data & process the response in a special response object\n    function loadFunc() {\n        if (aborted) return\n        var status\n        clearTimeout(timeoutTimer)\n        if(options.useXDR && xhr.status===undefined) {\n            //IE8 CORS GET successful response doesn't have a status field, but body is fine\n            status = 200\n        } else {\n            status = (xhr.status === 1223 ? 204 : xhr.status)\n        }\n        var response = failureResponse\n        var err = null\n\n        if (status !== 0){\n            response = {\n                body: getBody(),\n                statusCode: status,\n                method: method,\n                headers: {},\n                url: uri,\n                rawRequest: xhr\n            }\n            if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE\n                response.headers = parseHeaders(xhr.getAllResponseHeaders())\n            }\n        } else {\n            err = new Error(\"Internal XMLHttpRequest Error\")\n        }\n        callback(err, response, response.body)\n\n    }\n\n    if (typeof options === \"string\") {\n        options = { uri: options }\n    }\n\n    options = options || {}\n    if(typeof callback === \"undefined\"){\n        throw new Error(\"callback argument missing\")\n    }\n    callback = once(callback)\n\n    var xhr = options.xhr || null\n\n    if (!xhr) {\n        if (options.cors || options.useXDR) {\n            xhr = new createXHR.XDomainRequest()\n        }else{\n            xhr = new createXHR.XMLHttpRequest()\n        }\n    }\n\n    var key\n    var aborted\n    var uri = xhr.url = options.uri || options.url\n    var method = xhr.method = options.method || \"GET\"\n    var body = options.body || options.data\n    var headers = xhr.headers = options.headers || {}\n    var sync = !!options.sync\n    var isJson = false\n    var timeoutTimer\n\n    if (\"json\" in options) {\n        isJson = true\n        headers[\"accept\"] || headers[\"Accept\"] || (headers[\"Accept\"] = \"application/json\") //Don't override existing accept header declared by user\n        if (method !== \"GET\" && method !== \"HEAD\") {\n            headers[\"content-type\"] || headers[\"Content-Type\"] || (headers[\"Content-Type\"] = \"application/json\") //Don't override existing accept header declared by user\n            body = JSON.stringify(options.json)\n        }\n    }\n\n    xhr.onreadystatechange = readystatechange\n    xhr.onload = loadFunc\n    xhr.onerror = errorFunc\n    // IE9 must have onprogress be set to a unique function.\n    xhr.onprogress = function () {\n        // IE must die\n    }\n    xhr.ontimeout = errorFunc\n    xhr.open(method, uri, !sync, options.username, options.password)\n    //has to be after open\n    if(!sync) {\n        xhr.withCredentials = !!options.withCredentials\n    }\n    // Cannot set timeout with sync request\n    // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly\n    // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent\n    if (!sync && options.timeout > 0 ) {\n        timeoutTimer = setTimeout(function(){\n            aborted=true//IE9 may still call readystatechange\n            xhr.abort(\"timeout\")\n            var e = new Error(\"XMLHttpRequest timeout\")\n            e.code = \"ETIMEDOUT\"\n            errorFunc(e)\n        }, options.timeout )\n    }\n\n    if (xhr.setRequestHeader) {\n        for(key in headers){\n            if(headers.hasOwnProperty(key)){\n                xhr.setRequestHeader(key, headers[key])\n            }\n        }\n    } else if (options.headers && !isEmpty(options.headers)) {\n        throw new Error(\"Headers cannot be set on an XDomainRequest object\")\n    }\n\n    if (\"responseType\" in options) {\n        xhr.responseType = options.responseType\n    }\n\n    if (\"beforeSend\" in options &&\n        typeof options.beforeSend === \"function\"\n    ) {\n        options.beforeSend(xhr)\n    }\n\n    xhr.send(body)\n\n    return xhr\n\n\n}\n\nfunction noop() {}\n","module.exports = once\n\nonce.proto = once(function () {\n  Object.defineProperty(Function.prototype, 'once', {\n    value: function () {\n      return once(this)\n    },\n    configurable: true\n  })\n})\n\nfunction once (fn) {\n  var called = false\n  return function () {\n    if (called) return\n    called = true\n    return fn.apply(this, arguments)\n  }\n}\n","var isFunction = require('is-function')\n\nmodule.exports = forEach\n\nvar toString = Object.prototype.toString\nvar hasOwnProperty = Object.prototype.hasOwnProperty\n\nfunction forEach(list, iterator, context) {\n    if (!isFunction(iterator)) {\n        throw new TypeError('iterator must be a function')\n    }\n\n    if (arguments.length < 3) {\n        context = this\n    }\n    \n    if (toString.call(list) === '[object Array]')\n        forEachArray(list, iterator, context)\n    else if (typeof list === 'string')\n        forEachString(list, iterator, context)\n    else\n        forEachObject(list, iterator, context)\n}\n\nfunction forEachArray(array, iterator, context) {\n    for (var i = 0, len = array.length; i < len; i++) {\n        if (hasOwnProperty.call(array, i)) {\n            iterator.call(context, array[i], i, array)\n        }\n    }\n}\n\nfunction forEachString(string, iterator, context) {\n    for (var i = 0, len = string.length; i < len; i++) {\n        // no such thing as a sparse string.\n        iterator.call(context, string.charAt(i), i, string)\n    }\n}\n\nfunction forEachObject(object, iterator, context) {\n    for (var k in object) {\n        if (hasOwnProperty.call(object, k)) {\n            iterator.call(context, object[k], k, object)\n        }\n    }\n}\n","module.exports = isFunction\n\nvar toString = Object.prototype.toString\n\nfunction isFunction (fn) {\n  var string = toString.call(fn)\n  return string === '[object Function]' ||\n    (typeof fn === 'function' && string !== '[object RegExp]') ||\n    (typeof window !== 'undefined' &&\n     // IE8 and below\n     (fn === window.setTimeout ||\n      fn === window.alert ||\n      fn === window.confirm ||\n      fn === window.prompt))\n};\n","\nexports = module.exports = trim;\n\nfunction trim(str){\n  return str.replace(/^\\s*|\\s*$/g, '');\n}\n\nexports.left = function(str){\n  return str.replace(/^\\s*/, '');\n};\n\nexports.right = function(str){\n  return str.replace(/\\s*$/, '');\n};\n","var trim = require('trim')\n  , forEach = require('for-each')\n  , isArray = function(arg) {\n      return Object.prototype.toString.call(arg) === '[object Array]';\n    }\n\nmodule.exports = function (headers) {\n  if (!headers)\n    return {}\n\n  var result = {}\n\n  forEach(\n      trim(headers).split('\\n')\n    , function (row) {\n        var index = row.indexOf(':')\n          , key = trim(row.slice(0, index)).toLowerCase()\n          , value = trim(row.slice(index + 1))\n\n        if (typeof(result[key]) === 'undefined') {\n          result[key] = value\n        } else if (isArray(result[key])) {\n          result[key].push(value)\n        } else {\n          result[key] = [ result[key], value ]\n        }\n      }\n  )\n\n  return result\n}","/**\n * @file big-play-button.js\n */\nimport Button from './button.js';\nimport Component from './component.js';\n\n/**\n * Initial play button. Shows before the video has played. The hiding of the\n * big play button is done via CSS and player states.\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @extends Button\n * @class BigPlayButton\n */\nclass BigPlayButton extends Button {\n\n  constructor(player, options) {\n    super(player, options);\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return 'vjs-big-play-button';\n  }\n\n  /**\n   * Handles click for play\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    this.player_.play();\n  }\n\n}\n\nBigPlayButton.prototype.controlText_ = 'Play Video';\n\nComponent.registerComponent('BigPlayButton', BigPlayButton);\nexport default BigPlayButton;\n","/**\n * @file button.js\n */\nimport Component from './component';\nimport * as Dom from './utils/dom.js';\nimport * as Events from './utils/events.js';\nimport * as Fn from './utils/fn.js';\nimport document from 'global/document';\nimport assign from 'object.assign';\n\n/**\n * Base class for all buttons\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @extends Component\n * @class Button\n */\nclass Button extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n\n    this.emitTapEvents();\n\n    this.on('tap', this.handleClick);\n    this.on('click', this.handleClick);\n    this.on('focus', this.handleFocus);\n    this.on('blur', this.handleBlur);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @param {String=} type Element's node type. e.g. 'div'\n   * @param {Object=} props An object of element attributes that should be set on the element Tag name\n   * @return {Element}\n   * @method createEl\n   */\n  createEl(tag='button', props={}, attributes={}) {\n    props = assign({\n      className: this.buildCSSClass(),\n      tabIndex: 0\n    }, props);\n\n    // Add standard Aria info\n    attributes = assign({\n      role: 'button',\n      type: 'button', // Necessary since the default button type is \"submit\"\n      'aria-live': 'polite' // let the screen reader user know that the text of the button may change\n    }, attributes);\n\n    let el = super.createEl(tag, props, attributes);\n\n    this.controlTextEl_ = Dom.createEl('span', {\n      className: 'vjs-control-text'\n    });\n\n    el.appendChild(this.controlTextEl_);\n\n    this.controlText(this.controlText_);\n\n    return el;\n  }\n\n  /**\n   * Controls text - both request and localize\n   *\n   * @param {String} text Text for button\n   * @return {String}\n   * @method controlText\n   */\n  controlText(text) {\n    if (!text) return this.controlText_ || 'Need Text';\n\n    this.controlText_ = text;\n    this.controlTextEl_.innerHTML = this.localize(this.controlText_);\n\n    return this;\n  }\n\n  /**\n   * Allows sub components to stack CSS class names\n   *\n   * @return {String}\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-control vjs-button ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Handle Click - Override with specific functionality for button\n   *\n   * @method handleClick\n   */\n  handleClick() {}\n\n  /**\n   * Handle Focus - Add keyboard functionality to element\n   *\n   * @method handleFocus\n   */\n  handleFocus() {\n    Events.on(document, 'keydown', Fn.bind(this, this.handleKeyPress));\n  }\n\n  /**\n   * Handle KeyPress (document level) - Trigger click when keys are pressed\n   *\n   * @method handleKeyPress\n   */\n  handleKeyPress(event) {\n    // Check for space bar (32) or enter (13) keys\n    if (event.which === 32 || event.which === 13) {\n      event.preventDefault();\n      this.handleClick(event);\n    }\n  }\n\n  /**\n   * Handle Blur - Remove keyboard triggers\n   *\n   * @method handleBlur\n   */\n  handleBlur() {\n    Events.off(document, 'keydown', Fn.bind(this, this.handleKeyPress));\n  }\n\n}\n\n\nComponent.registerComponent('Button', Button);\nexport default Button;\n","/**\n * @file component.js\n *\n * Player Component - Base class for all UI objects\n */\n\nimport window from 'global/window';\nimport * as Dom from './utils/dom.js';\nimport * as Fn from './utils/fn.js';\nimport * as Guid from './utils/guid.js';\nimport * as Events from './utils/events.js';\nimport log from './utils/log.js';\nimport toTitleCase from './utils/to-title-case.js';\nimport assign from 'object.assign';\nimport mergeOptions from './utils/merge-options.js';\n\n\n/**\n * Base UI Component class\n * Components are embeddable UI objects that are represented by both a\n * javascript object and an element in the DOM. They can be children of other\n * components, and can have many children themselves.\n * ```js\n *     // adding a button to the player\n *     var button = player.addChild('button');\n *     button.el(); // -> button element\n * ```\n * ```html\n *     <div class=\"video-js\">\n *       <div class=\"vjs-button\">Button</div>\n *     </div>\n * ```\n * Components are also event targets.\n * ```js\n *     button.on('click', function(){\n *       console.log('Button Clicked!');\n *     });\n *     button.trigger('customevent');\n * ```\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @class Component\n */\nclass Component {\n\n  constructor(player, options, ready) {\n\n    // The component might be the player itself and we can't pass `this` to super\n    if (!player && this.play) {\n      this.player_ = player = this; // eslint-disable-line\n    } else {\n      this.player_ = player;\n    }\n\n    // Make a copy of prototype.options_ to protect against overriding defaults\n    this.options_ = mergeOptions({}, this.options_);\n\n    // Updated options with supplied options\n    options = this.options_ = mergeOptions(this.options_, options);\n\n    // Get ID from options or options element if one is supplied\n    this.id_ = options.id || (options.el && options.el.id);\n\n    // If there was no ID from the options, generate one\n    if (!this.id_) {\n      // Don't require the player ID function in the case of mock players\n      let id = player && player.id && player.id() || 'no_player';\n\n      this.id_ = `${id}_component_${Guid.newGUID()}`;\n    }\n\n    this.name_ = options.name || null;\n\n    // Create element if one wasn't provided in options\n    if (options.el) {\n      this.el_ = options.el;\n    } else if (options.createEl !== false) {\n      this.el_ = this.createEl();\n    }\n\n    this.children_ = [];\n    this.childIndex_ = {};\n    this.childNameIndex_ = {};\n\n    // Add any child components in options\n    if (options.initChildren !== false) {\n      this.initChildren();\n    }\n\n    this.ready(ready);\n    // Don't want to trigger ready here or it will before init is actually\n    // finished for all children that run this constructor\n\n    if (options.reportTouchActivity !== false) {\n      this.enableTouchActivity();\n    }\n  }\n\n  /**\n   * Dispose of the component and all child components\n   *\n   * @method dispose\n   */\n  dispose() {\n    this.trigger({ type: 'dispose', bubbles: false });\n\n    // Dispose all children.\n    if (this.children_) {\n      for (let i = this.children_.length - 1; i >= 0; i--) {\n        if (this.children_[i].dispose) {\n          this.children_[i].dispose();\n        }\n      }\n    }\n\n    // Delete child references\n    this.children_ = null;\n    this.childIndex_ = null;\n    this.childNameIndex_ = null;\n\n    // Remove all event listeners.\n    this.off();\n\n    // Remove element from DOM\n    if (this.el_.parentNode) {\n      this.el_.parentNode.removeChild(this.el_);\n    }\n\n    Dom.removeElData(this.el_);\n    this.el_ = null;\n  }\n\n  /**\n   * Return the component's player\n   *\n   * @return {Player}\n   * @method player\n   */\n  player() {\n    return this.player_;\n  }\n\n  /**\n   * Deep merge of options objects\n   * Whenever a property is an object on both options objects\n   * the two properties will be merged using mergeOptions.\n   *\n   * ```js\n   *     Parent.prototype.options_ = {\n   *       optionSet: {\n   *         'childOne': { 'foo': 'bar', 'asdf': 'fdsa' },\n   *         'childTwo': {},\n   *         'childThree': {}\n   *       }\n   *     }\n   *     newOptions = {\n   *       optionSet: {\n   *         'childOne': { 'foo': 'baz', 'abc': '123' }\n   *         'childTwo': null,\n   *         'childFour': {}\n   *       }\n   *     }\n   *\n   *     this.options(newOptions);\n   * ```\n   * RESULT\n   * ```js\n   *     {\n   *       optionSet: {\n   *         'childOne': { 'foo': 'baz', 'asdf': 'fdsa', 'abc': '123' },\n   *         'childTwo': null, // Disabled. Won't be initialized.\n   *         'childThree': {},\n   *         'childFour': {}\n   *       }\n   *     }\n   * ```\n   *\n   * @param  {Object} obj Object of new option values\n   * @return {Object}     A NEW object of this.options_ and obj merged\n   * @method options\n   */\n  options(obj) {\n    log.warn('this.options() has been deprecated and will be moved to the constructor in 6.0');\n\n    if (!obj) {\n      return this.options_;\n    }\n\n    this.options_ = mergeOptions(this.options_, obj);\n    return this.options_;\n  }\n\n  /**\n   * Get the component's DOM element\n   * ```js\n   *     var domEl = myComponent.el();\n   * ```\n   *\n   * @return {Element}\n   * @method el\n   */\n  el() {\n    return this.el_;\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @param  {String=} tagName  Element's node type. e.g. 'div'\n   * @param  {Object=} properties An object of properties that should be set\n   * @param  {Object=} attributes An object of attributes that should be set\n   * @return {Element}\n   * @method createEl\n   */\n  createEl(tagName, properties, attributes) {\n    return Dom.createEl(tagName, properties, attributes);\n  }\n\n  localize(string) {\n    let code = this.player_.language && this.player_.language();\n    let languages = this.player_.languages && this.player_.languages();\n\n    if (!code || !languages) {\n      return string;\n    }\n\n    let language = languages[code];\n\n    if (language && language[string]) {\n      return language[string];\n    }\n\n    let primaryCode = code.split('-')[0];\n    let primaryLang = languages[primaryCode];\n\n    if (primaryLang && primaryLang[string]) {\n      return primaryLang[string];\n    }\n\n    return string;\n  }\n\n  /**\n   * Return the component's DOM element where children are inserted.\n   * Will either be the same as el() or a new element defined in createEl().\n   *\n   * @return {Element}\n   * @method contentEl\n   */\n  contentEl() {\n    return this.contentEl_ || this.el_;\n  }\n\n  /**\n   * Get the component's ID\n   * ```js\n   *     var id = myComponent.id();\n   * ```\n   *\n   * @return {String}\n   * @method id\n   */\n  id() {\n    return this.id_;\n  }\n\n  /**\n   * Get the component's name. The name is often used to reference the component.\n   * ```js\n   *     var name = myComponent.name();\n   * ```\n   *\n   * @return {String}\n   * @method name\n   */\n  name() {\n    return this.name_;\n  }\n\n  /**\n   * Get an array of all child components\n   * ```js\n   *     var kids = myComponent.children();\n   * ```\n   *\n   * @return {Array} The children\n   * @method children\n   */\n  children() {\n    return this.children_;\n  }\n\n  /**\n   * Returns a child component with the provided ID\n   *\n   * @return {Component}\n   * @method getChildById\n   */\n  getChildById(id) {\n    return this.childIndex_[id];\n  }\n\n  /**\n   * Returns a child component with the provided name\n   *\n   * @return {Component}\n   * @method getChild\n   */\n  getChild(name) {\n    return this.childNameIndex_[name];\n  }\n\n  /**\n   * Adds a child component inside this component\n   * ```js\n   *     myComponent.el();\n   *     // -> <div class='my-component'></div>\n   *     myComponent.children();\n   *     // [empty array]\n   *\n   *     var myButton = myComponent.addChild('MyButton');\n   *     // -> <div class='my-component'><div class=\"my-button\">myButton<div></div>\n   *     // -> myButton === myComponent.children()[0];\n   * ```\n   * Pass in options for child constructors and options for children of the child\n   * ```js\n   *     var myButton = myComponent.addChild('MyButton', {\n   *       text: 'Press Me',\n   *       buttonChildExample: {\n   *         buttonChildOption: true\n   *       }\n   *     });\n   * ```\n   *\n   * @param {String|Component} child The class name or instance of a child to add\n   * @param {Object=} options Options, including options to be passed to children of the child.\n   * @return {Component} The child component (created by this process if a string was used)\n   * @method addChild\n   */\n  addChild(child, options={}) {\n    let component;\n    let componentName;\n\n    // If child is a string, create nt with options\n    if (typeof child === 'string') {\n      componentName = child;\n\n      // Options can also be specified as a boolean, so convert to an empty object if false.\n      if (!options) {\n        options = {};\n      }\n\n      // Same as above, but true is deprecated so show a warning.\n      if (options === true) {\n        log.warn('Initializing a child component with `true` is deprecated. Children should be defined in an array when possible, but if necessary use an object instead of `true`.');\n        options = {};\n      }\n\n      // If no componentClass in options, assume componentClass is the name lowercased\n      // (e.g. playButton)\n      let componentClassName = options.componentClass || toTitleCase(componentName);\n\n      // Set name through options\n      options.name = componentName;\n\n      // Create a new object & element for this controls set\n      // If there's no .player_, this is a player\n      let ComponentClass = Component.getComponent(componentClassName);\n\n      component = new ComponentClass(this.player_ || this, options);\n\n    // child is a component instance\n    } else {\n      component = child;\n    }\n\n    this.children_.push(component);\n\n    if (typeof component.id === 'function') {\n      this.childIndex_[component.id()] = component;\n    }\n\n    // If a name wasn't used to create the component, check if we can use the\n    // name function of the component\n    componentName = componentName || (component.name && component.name());\n\n    if (componentName) {\n      this.childNameIndex_[componentName] = component;\n    }\n\n    // Add the UI object's element to the container div (box)\n    // Having an element is not required\n    if (typeof component.el === 'function' && component.el()) {\n      this.contentEl().appendChild(component.el());\n    }\n\n    // Return so it can stored on parent object if desired.\n    return component;\n  }\n\n  /**\n   * Remove a child component from this component's list of children, and the\n   * child component's element from this component's element\n   *\n   * @param  {Component} component Component to remove\n   * @method removeChild\n   */\n  removeChild(component) {\n    if (typeof component === 'string') {\n      component = this.getChild(component);\n    }\n\n    if (!component || !this.children_) {\n      return;\n    }\n\n    let childFound = false;\n\n    for (let i = this.children_.length - 1; i >= 0; i--) {\n      if (this.children_[i] === component) {\n        childFound = true;\n        this.children_.splice(i, 1);\n        break;\n      }\n    }\n\n    if (!childFound) {\n      return;\n    }\n\n    this.childIndex_[component.id()] = null;\n    this.childNameIndex_[component.name()] = null;\n\n    let compEl = component.el();\n\n    if (compEl && compEl.parentNode === this.contentEl()) {\n      this.contentEl().removeChild(component.el());\n    }\n  }\n\n  /**\n   * Add and initialize default child components from options\n   * ```js\n   *     // when an instance of MyComponent is created, all children in options\n   *     // will be added to the instance by their name strings and options\n   *     MyComponent.prototype.options_ = {\n   *       children: [\n   *         'myChildComponent'\n   *       ],\n   *       myChildComponent: {\n   *         myChildOption: true\n   *       }\n   *     };\n   *\n   *     // Or when creating the component\n   *     var myComp = new MyComponent(player, {\n   *       children: [\n   *         'myChildComponent'\n   *       ],\n   *       myChildComponent: {\n   *         myChildOption: true\n   *       }\n   *     });\n   * ```\n   * The children option can also be an array of\n   * child options objects (that also include a 'name' key).\n   * This can be used if you have two child components of the\n   * same type that need different options.\n   * ```js\n   *     var myComp = new MyComponent(player, {\n   *       children: [\n   *         'button',\n   *         {\n   *           name: 'button',\n   *           someOtherOption: true\n   *         },\n   *         {\n   *           name: 'button',\n   *           someOtherOption: false\n   *         }\n   *       ]\n   *     });\n   * ```\n   *\n   * @method initChildren\n   */\n  initChildren() {\n    let children = this.options_.children;\n\n    if (children) {\n      // `this` is `parent`\n      let parentOptions = this.options_;\n\n      let handleAdd = (name, opts) => {\n        // Allow options for children to be set at the parent options\n        // e.g. videojs(id, { controlBar: false });\n        // instead of videojs(id, { children: { controlBar: false });\n        if (parentOptions[name] !== undefined) {\n          opts = parentOptions[name];\n        }\n\n        // Allow for disabling default components\n        // e.g. options['children']['posterImage'] = false\n        if (opts === false) {\n          return;\n        }\n\n        // Allow options to be passed as a simple boolean if no configuration\n        // is necessary.\n        if (opts === true) {\n          opts = {};\n        }\n\n        // We also want to pass the original player options to each component as well so they don't need to\n        // reach back into the player for options later.\n        opts.playerOptions = this.options_.playerOptions;\n\n        // Create and add the child component.\n        // Add a direct reference to the child by name on the parent instance.\n        // If two of the same component are used, different names should be supplied\n        // for each\n        this[name] = this.addChild(name, opts);\n      };\n\n      // Allow for an array of children details to passed in the options\n      if (Array.isArray(children)) {\n        for (let i = 0; i < children.length; i++) {\n          let child = children[i];\n          let name;\n          let opts;\n\n          if (typeof child === 'string') {\n            // ['myComponent']\n            name = child;\n            opts = {};\n          } else {\n            // [{ name: 'myComponent', otherOption: true }]\n            name = child.name;\n            opts = child;\n          }\n\n          handleAdd(name, opts);\n        }\n      } else {\n        Object.getOwnPropertyNames(children).forEach(function(name){\n          handleAdd(name, children[name]);\n        });\n      }\n    }\n  }\n\n  /**\n   * Allows sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    // Child classes can include a function that does:\n    // return 'CLASS NAME' + this._super();\n    return '';\n  }\n\n  /**\n   * Add an event listener to this component's element\n   * ```js\n   *     var myFunc = function(){\n   *       var myComponent = this;\n   *       // Do something when the event is fired\n   *     };\n   *\n   *     myComponent.on('eventType', myFunc);\n   * ```\n   * The context of myFunc will be myComponent unless previously bound.\n   * Alternatively, you can add a listener to another element or component.\n   * ```js\n   *     myComponent.on(otherElement, 'eventName', myFunc);\n   *     myComponent.on(otherComponent, 'eventName', myFunc);\n   * ```\n   * The benefit of using this over `VjsEvents.on(otherElement, 'eventName', myFunc)`\n   * and `otherComponent.on('eventName', myFunc)` is that this way the listeners\n   * will be automatically cleaned up when either component is disposed.\n   * It will also bind myComponent as the context of myFunc.\n   * **NOTE**: When using this on elements in the page other than window\n   * and document (both permanent), if you remove the element from the DOM\n   * you need to call `myComponent.trigger(el, 'dispose')` on it to clean up\n   * references to it and allow the browser to garbage collect it.\n   *\n   * @param  {String|Component} first   The event type or other component\n   * @param  {Function|String}      second  The event handler or event type\n   * @param  {Function}             third   The event handler\n   * @return {Component}\n   * @method on\n   */\n  on(first, second, third) {\n    if (typeof first === 'string' || Array.isArray(first)) {\n      Events.on(this.el_, first, Fn.bind(this, second));\n\n    // Targeting another component or element\n    } else {\n      const target = first;\n      const type = second;\n      const fn = Fn.bind(this, third);\n\n      // When this component is disposed, remove the listener from the other component\n      const removeOnDispose = () => this.off(target, type, fn);\n\n      // Use the same function ID so we can remove it later it using the ID\n      // of the original listener\n      removeOnDispose.guid = fn.guid;\n      this.on('dispose', removeOnDispose);\n\n      // If the other component is disposed first we need to clean the reference\n      // to the other component in this component's removeOnDispose listener\n      // Otherwise we create a memory leak.\n      const cleanRemover = () => this.off('dispose', removeOnDispose);\n\n      // Add the same function ID so we can easily remove it later\n      cleanRemover.guid = fn.guid;\n\n      // Check if this is a DOM node\n      if (first.nodeName) {\n        // Add the listener to the other element\n        Events.on(target, type, fn);\n        Events.on(target, 'dispose', cleanRemover);\n\n      // Should be a component\n      // Not using `instanceof Component` because it makes mock players difficult\n      } else if (typeof first.on === 'function') {\n        // Add the listener to the other component\n        target.on(type, fn);\n        target.on('dispose', cleanRemover);\n      }\n    }\n\n    return this;\n  }\n\n  /**\n   * Remove an event listener from this component's element\n   * ```js\n   *     myComponent.off('eventType', myFunc);\n   * ```\n   * If myFunc is excluded, ALL listeners for the event type will be removed.\n   * If eventType is excluded, ALL listeners will be removed from the component.\n   * Alternatively you can use `off` to remove listeners that were added to other\n   * elements or components using `myComponent.on(otherComponent...`.\n   * In this case both the event type and listener function are REQUIRED.\n   * ```js\n   *     myComponent.off(otherElement, 'eventType', myFunc);\n   *     myComponent.off(otherComponent, 'eventType', myFunc);\n   * ```\n   *\n   * @param  {String=|Component}  first  The event type or other component\n   * @param  {Function=|String}       second The listener function or event type\n   * @param  {Function=}              third  The listener for other component\n   * @return {Component}\n   * @method off\n   */\n  off(first, second, third) {\n    if (!first || typeof first === 'string' || Array.isArray(first)) {\n      Events.off(this.el_, first, second);\n    } else {\n      const target = first;\n      const type = second;\n      // Ensure there's at least a guid, even if the function hasn't been used\n      const fn = Fn.bind(this, third);\n\n      // Remove the dispose listener on this component,\n      // which was given the same guid as the event listener\n      this.off('dispose', fn);\n\n      if (first.nodeName) {\n        // Remove the listener\n        Events.off(target, type, fn);\n        // Remove the listener for cleaning the dispose listener\n        Events.off(target, 'dispose', fn);\n      } else {\n        target.off(type, fn);\n        target.off('dispose', fn);\n      }\n    }\n\n    return this;\n  }\n\n  /**\n   * Add an event listener to be triggered only once and then removed\n   * ```js\n   *     myComponent.one('eventName', myFunc);\n   * ```\n   * Alternatively you can add a listener to another element or component\n   * that will be triggered only once.\n   * ```js\n   *     myComponent.one(otherElement, 'eventName', myFunc);\n   *     myComponent.one(otherComponent, 'eventName', myFunc);\n   * ```\n   *\n   * @param  {String|Component}  first   The event type or other component\n   * @param  {Function|String}       second  The listener function or event type\n   * @param  {Function=}             third   The listener function for other component\n   * @return {Component}\n   * @method one\n   */\n  one(first, second, third) {\n    if (typeof first === 'string' || Array.isArray(first)) {\n      Events.one(this.el_, first, Fn.bind(this, second));\n    } else {\n      const target = first;\n      const type = second;\n      const fn = Fn.bind(this, third);\n\n      const newFunc = () => {\n        this.off(target, type, newFunc);\n        fn.apply(null, arguments);\n      };\n\n      // Keep the same function ID so we can remove it later\n      newFunc.guid = fn.guid;\n\n      this.on(target, type, newFunc);\n    }\n\n    return this;\n  }\n\n  /**\n   * Trigger an event on an element\n   * ```js\n   *     myComponent.trigger('eventName');\n   *     myComponent.trigger({'type':'eventName'});\n   *     myComponent.trigger('eventName', {data: 'some data'});\n   *     myComponent.trigger({'type':'eventName'}, {data: 'some data'});\n   * ```\n   *\n   * @param  {Event|Object|String} event  A string (the type) or an event object with a type attribute\n   * @param  {Object} [hash] data hash to pass along with the event\n   * @return {Component}       self\n   * @method trigger\n   */\n  trigger(event, hash) {\n    Events.trigger(this.el_, event, hash);\n    return this;\n  }\n\n  /**\n   * Bind a listener to the component's ready state.\n   * Different from event listeners in that if the ready event has already happened\n   * it will trigger the function immediately.\n   *\n   * @param  {Function} fn Ready listener\n   * @param  {Boolean} sync Exec the listener synchronously if component is ready\n   * @return {Component}\n   * @method ready\n   */\n  ready(fn, sync=false) {\n    if (fn) {\n      if (this.isReady_) {\n        if (sync) {\n          fn.call(this);\n        } else {\n          // Call the function asynchronously by default for consistency\n          this.setTimeout(fn, 1);\n        }\n      } else {\n        this.readyQueue_ = this.readyQueue_ || [];\n        this.readyQueue_.push(fn);\n      }\n    }\n    return this;\n  }\n\n  /**\n   * Trigger the ready listeners\n   *\n   * @return {Component}\n   * @method triggerReady\n   */\n  triggerReady() {\n    this.isReady_ = true;\n\n    // Ensure ready is triggerd asynchronously\n    this.setTimeout(function(){\n      let readyQueue = this.readyQueue_;\n\n      // Reset Ready Queue\n      this.readyQueue_ = [];\n\n      if (readyQueue && readyQueue.length > 0) {\n        readyQueue.forEach(function(fn){\n          fn.call(this);\n        }, this);\n      }\n\n      // Allow for using event listeners also\n      this.trigger('ready');\n    }, 1);\n  }\n\n  /**\n   * Check if a component's element has a CSS class name\n   *\n   * @param {String} classToCheck Classname to check\n   * @return {Component}\n   * @method hasClass\n   */\n  hasClass(classToCheck) {\n    return Dom.hasElClass(this.el_, classToCheck);\n  }\n\n  /**\n   * Add a CSS class name to the component's element\n   *\n   * @param {String} classToAdd Classname to add\n   * @return {Component}\n   * @method addClass\n   */\n  addClass(classToAdd) {\n    Dom.addElClass(this.el_, classToAdd);\n    return this;\n  }\n\n  /**\n   * Remove and return a CSS class name from the component's element\n   *\n   * @param {String} classToRemove Classname to remove\n   * @return {Component}\n   * @method removeClass\n   */\n  removeClass(classToRemove) {\n    Dom.removeElClass(this.el_, classToRemove);\n    return this;\n  }\n\n  /**\n   * Show the component element if hidden\n   *\n   * @return {Component}\n   * @method show\n   */\n  show() {\n    this.removeClass('vjs-hidden');\n    return this;\n  }\n\n  /**\n   * Hide the component element if currently showing\n   *\n   * @return {Component}\n   * @method hide\n   */\n  hide() {\n    this.addClass('vjs-hidden');\n    return this;\n  }\n\n  /**\n   * Lock an item in its visible state\n   * To be used with fadeIn/fadeOut.\n   *\n   * @return {Component}\n   * @private\n   * @method lockShowing\n   */\n  lockShowing() {\n    this.addClass('vjs-lock-showing');\n    return this;\n  }\n\n  /**\n   * Unlock an item to be hidden\n   * To be used with fadeIn/fadeOut.\n   *\n   * @return {Component}\n   * @private\n   * @method unlockShowing\n   */\n  unlockShowing() {\n    this.removeClass('vjs-lock-showing');\n    return this;\n  }\n\n  /**\n   * Set or get the width of the component (CSS values)\n   * Setting the video tag dimension values only works with values in pixels.\n   * Percent values will not work.\n   * Some percents can be used, but width()/height() will return the number + %,\n   * not the actual computed width/height.\n   *\n   * @param  {Number|String=} num   Optional width number\n   * @param  {Boolean} skipListeners Skip the 'resize' event trigger\n   * @return {Component} This component, when setting the width\n   * @return {Number|String} The width, when getting\n   * @method width\n   */\n  width(num, skipListeners) {\n    return this.dimension('width', num, skipListeners);\n  }\n\n  /**\n   * Get or set the height of the component (CSS values)\n   * Setting the video tag dimension values only works with values in pixels.\n   * Percent values will not work.\n   * Some percents can be used, but width()/height() will return the number + %,\n   * not the actual computed width/height.\n   *\n   * @param  {Number|String=} num     New component height\n   * @param  {Boolean=} skipListeners Skip the resize event trigger\n   * @return {Component} This component, when setting the height\n   * @return {Number|String} The height, when getting\n   * @method height\n   */\n  height(num, skipListeners) {\n    return this.dimension('height', num, skipListeners);\n  }\n\n  /**\n   * Set both width and height at the same time\n   *\n   * @param  {Number|String} width Width of player\n   * @param  {Number|String} height Height of player\n   * @return {Component} The component\n   * @method dimensions\n   */\n  dimensions(width, height) {\n    // Skip resize listeners on width for optimization\n    return this.width(width, true).height(height);\n  }\n\n  /**\n   * Get or set width or height\n   * This is the shared code for the width() and height() methods.\n   * All for an integer, integer + 'px' or integer + '%';\n   * Known issue: Hidden elements officially have a width of 0. We're defaulting\n   * to the style.width value and falling back to computedStyle which has the\n   * hidden element issue. Info, but probably not an efficient fix:\n   * http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/\n   *\n   * @param  {String} widthOrHeight  'width' or 'height'\n   * @param  {Number|String=} num     New dimension\n   * @param  {Boolean=} skipListeners Skip resize event trigger\n   * @return {Component} The component if a dimension was set\n   * @return {Number|String} The dimension if nothing was set\n   * @private\n   * @method dimension\n   */\n  dimension(widthOrHeight, num, skipListeners) {\n    if (num !== undefined) {\n      // Set to zero if null or literally NaN (NaN !== NaN)\n      if (num === null || num !== num) {\n        num = 0;\n      }\n\n      // Check if using css width/height (% or px) and adjust\n      if (('' + num).indexOf('%') !== -1 || ('' + num).indexOf('px') !== -1) {\n        this.el_.style[widthOrHeight] = num;\n      } else if (num === 'auto') {\n        this.el_.style[widthOrHeight] = '';\n      } else {\n        this.el_.style[widthOrHeight] = num + 'px';\n      }\n\n      // skipListeners allows us to avoid triggering the resize event when setting both width and height\n      if (!skipListeners) {\n        this.trigger('resize');\n      }\n\n      // Return component\n      return this;\n    }\n\n    // Not setting a value, so getting it\n    // Make sure element exists\n    if (!this.el_) {\n      return 0;\n    }\n\n    // Get dimension value from style\n    let val = this.el_.style[widthOrHeight];\n    let pxIndex = val.indexOf('px');\n\n    if (pxIndex !== -1) {\n      // Return the pixel value with no 'px'\n      return parseInt(val.slice(0, pxIndex), 10);\n    }\n\n    // No px so using % or no style was set, so falling back to offsetWidth/height\n    // If component has display:none, offset will return 0\n    // TODO: handle display:none and no dimension style using px\n    return parseInt(this.el_['offset' + toTitleCase(widthOrHeight)], 10);\n  }\n\n  /**\n   * Emit 'tap' events when touch events are supported\n   * This is used to support toggling the controls through a tap on the video.\n   * We're requiring them to be enabled because otherwise every component would\n   * have this extra overhead unnecessarily, on mobile devices where extra\n   * overhead is especially bad.\n   *\n   * @private\n   * @method emitTapEvents\n   */\n  emitTapEvents() {\n    // Track the start time so we can determine how long the touch lasted\n    let touchStart = 0;\n    let firstTouch = null;\n\n    // Maximum movement allowed during a touch event to still be considered a tap\n    // Other popular libs use anywhere from 2 (hammer.js) to 15, so 10 seems like a nice, round number.\n    const tapMovementThreshold = 10;\n\n    // The maximum length a touch can be while still being considered a tap\n    const touchTimeThreshold = 200;\n\n    let couldBeTap;\n\n    this.on('touchstart', function(event) {\n      // If more than one finger, don't consider treating this as a click\n      if (event.touches.length === 1) {\n        // Copy the touches object to prevent modifying the original\n        firstTouch = assign({}, event.touches[0]);\n        // Record start time so we can detect a tap vs. \"touch and hold\"\n        touchStart = new Date().getTime();\n        // Reset couldBeTap tracking\n        couldBeTap = true;\n      }\n    });\n\n    this.on('touchmove', function(event) {\n      // If more than one finger, don't consider treating this as a click\n      if (event.touches.length > 1) {\n        couldBeTap = false;\n      } else if (firstTouch) {\n        // Some devices will throw touchmoves for all but the slightest of taps.\n        // So, if we moved only a small distance, this could still be a tap\n        const xdiff = event.touches[0].pageX - firstTouch.pageX;\n        const ydiff = event.touches[0].pageY - firstTouch.pageY;\n        const touchDistance = Math.sqrt(xdiff  * xdiff + ydiff  * ydiff);\n\n        if (touchDistance > tapMovementThreshold) {\n          couldBeTap = false;\n        }\n      }\n    });\n\n    const noTap = function() {\n      couldBeTap = false;\n    };\n\n    // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s\n    this.on('touchleave', noTap);\n    this.on('touchcancel', noTap);\n\n    // When the touch ends, measure how long it took and trigger the appropriate\n    // event\n    this.on('touchend', function(event) {\n      firstTouch = null;\n      // Proceed only if the touchmove/leave/cancel event didn't happen\n      if (couldBeTap === true) {\n        // Measure how long the touch lasted\n        const touchTime = new Date().getTime() - touchStart;\n\n        // Make sure the touch was less than the threshold to be considered a tap\n        if (touchTime < touchTimeThreshold) {\n          // Don't let browser turn this into a click\n          event.preventDefault();\n          this.trigger('tap');\n          // It may be good to copy the touchend event object and change the\n          // type to tap, if the other event properties aren't exact after\n          // Events.fixEvent runs (e.g. event.target)\n        }\n      }\n    });\n  }\n\n  /**\n   * Report user touch activity when touch events occur\n   * User activity is used to determine when controls should show/hide. It's\n   * relatively simple when it comes to mouse events, because any mouse event\n   * should show the controls. So we capture mouse events that bubble up to the\n   * player and report activity when that happens.\n   * With touch events it isn't as easy. We can't rely on touch events at the\n   * player level, because a tap (touchstart + touchend) on the video itself on\n   * mobile devices is meant to turn controls off (and on). User activity is\n   * checked asynchronously, so what could happen is a tap event on the video\n   * turns the controls off, then the touchend event bubbles up to the player,\n   * which if it reported user activity, would turn the controls right back on.\n   * (We also don't want to completely block touch events from bubbling up)\n   * Also a touchmove, touch+hold, and anything other than a tap is not supposed\n   * to turn the controls back on on a mobile device.\n   * Here we're setting the default component behavior to report user activity\n   * whenever touch events happen, and this can be turned off by components that\n   * want touch events to act differently.\n   *\n   * @method enableTouchActivity\n   */\n  enableTouchActivity() {\n    // Don't continue if the root player doesn't support reporting user activity\n    if (!this.player() || !this.player().reportUserActivity) {\n      return;\n    }\n\n    // listener for reporting that the user is active\n    const report = Fn.bind(this.player(), this.player().reportUserActivity);\n\n    let touchHolding;\n\n    this.on('touchstart', function() {\n      report();\n      // For as long as the they are touching the device or have their mouse down,\n      // we consider them active even if they're not moving their finger or mouse.\n      // So we want to continue to update that they are active\n      this.clearInterval(touchHolding);\n      // report at the same interval as activityCheck\n      touchHolding = this.setInterval(report, 250);\n    });\n\n    const touchEnd = function(event) {\n      report();\n      // stop the interval that maintains activity if the touch is holding\n      this.clearInterval(touchHolding);\n    };\n\n    this.on('touchmove', report);\n    this.on('touchend', touchEnd);\n    this.on('touchcancel', touchEnd);\n  }\n\n  /**\n   * Creates timeout and sets up disposal automatically.\n   *\n   * @param {Function} fn The function to run after the timeout.\n   * @param {Number} timeout Number of ms to delay before executing specified function.\n   * @return {Number} Returns the timeout ID\n   * @method setTimeout\n   */\n  setTimeout(fn, timeout) {\n    fn = Fn.bind(this, fn);\n\n    // window.setTimeout would be preferable here, but due to some bizarre issue with Sinon and/or Phantomjs, we can't.\n    let timeoutId = window.setTimeout(fn, timeout);\n\n    const disposeFn = function() {\n      this.clearTimeout(timeoutId);\n    };\n\n    disposeFn.guid = `vjs-timeout-${timeoutId}`;\n\n    this.on('dispose', disposeFn);\n\n    return timeoutId;\n  }\n\n  /**\n   * Clears a timeout and removes the associated dispose listener\n   *\n   * @param {Number} timeoutId The id of the timeout to clear\n   * @return {Number} Returns the timeout ID\n   * @method clearTimeout\n   */\n  clearTimeout(timeoutId) {\n    window.clearTimeout(timeoutId);\n\n    const disposeFn = function() {};\n\n    disposeFn.guid = `vjs-timeout-${timeoutId}`;\n\n    this.off('dispose', disposeFn);\n\n    return timeoutId;\n  }\n\n  /**\n   * Creates an interval and sets up disposal automatically.\n   *\n   * @param {Function} fn The function to run every N seconds.\n   * @param {Number} interval Number of ms to delay before executing specified function.\n   * @return {Number} Returns the interval ID\n   * @method setInterval\n   */\n  setInterval(fn, interval) {\n    fn = Fn.bind(this, fn);\n\n    let intervalId = window.setInterval(fn, interval);\n\n    const disposeFn = function() {\n      this.clearInterval(intervalId);\n    };\n\n    disposeFn.guid = `vjs-interval-${intervalId}`;\n\n    this.on('dispose', disposeFn);\n\n    return intervalId;\n  }\n\n  /**\n   * Clears an interval and removes the associated dispose listener\n   *\n   * @param {Number} intervalId The id of the interval to clear\n   * @return {Number} Returns the interval ID\n   * @method clearInterval\n   */\n  clearInterval(intervalId) {\n    window.clearInterval(intervalId);\n\n    const disposeFn = function() {};\n\n    disposeFn.guid = `vjs-interval-${intervalId}`;\n\n    this.off('dispose', disposeFn);\n\n    return intervalId;\n  }\n\n  /**\n   * Registers a component\n   *\n   * @param {String} name Name of the component to register\n   * @param {Object} comp The component to register\n   * @static\n   * @method registerComponent\n   */\n  static registerComponent(name, comp) {\n    if (!Component.components_) {\n      Component.components_ = {};\n    }\n\n    Component.components_[name] = comp;\n    return comp;\n  }\n\n  /**\n   * Gets a component by name\n   *\n   * @param {String} name Name of the component to get\n   * @return {Component}\n   * @static\n   * @method getComponent\n   */\n  static getComponent(name) {\n    if (Component.components_ && Component.components_[name]) {\n      return Component.components_[name];\n    }\n\n    if (window && window.videojs && window.videojs[name]) {\n      log.warn(`The ${name} component was added to the videojs object when it should be registered using videojs.registerComponent(name, component)`);\n      return window.videojs[name];\n    }\n  }\n\n  /**\n   * Sets up the constructor using the supplied init method\n   * or uses the init of the parent object\n   *\n   * @param {Object} props An object of properties\n   * @static\n   * @deprecated\n   * @method extend\n   */\n  static extend(props) {\n    props = props || {};\n\n    log.warn('Component.extend({}) has been deprecated, use videojs.extend(Component, {}) instead');\n\n    // Set up the constructor using the supplied init method\n    // or using the init of the parent object\n    // Make sure to check the unobfuscated version for external libs\n    let init = props.init || props.init || this.prototype.init || this.prototype.init || function() {};\n    // In Resig's simple class inheritance (previously used) the constructor\n    //  is a function that calls `this.init.apply(arguments)`\n    // However that would prevent us from using `ParentObject.call(this);`\n    //  in a Child constructor because the `this` in `this.init`\n    //  would still refer to the Child and cause an infinite loop.\n    // We would instead have to do\n    //    `ParentObject.prototype.init.apply(this, arguments);`\n    //  Bleh. We're not creating a _super() function, so it's good to keep\n    //  the parent constructor reference simple.\n    let subObj = function() {\n      init.apply(this, arguments);\n    };\n\n    // Inherit from this object's prototype\n    subObj.prototype = Object.create(this.prototype);\n    // Reset the constructor property for subObj otherwise\n    // instances of subObj would have the constructor of the parent Object\n    subObj.prototype.constructor = subObj;\n\n    // Make the class extendable\n    subObj.extend = Component.extend;\n\n    // Extend subObj's prototype with functions and other properties from props\n    for (let name in props) {\n      if (props.hasOwnProperty(name)) {\n        subObj.prototype[name] = props[name];\n      }\n    }\n\n    return subObj;\n  }\n}\n\nComponent.registerComponent('Component', Component);\nexport default Component;\n","/**\n * @file control-bar.js\n */\nimport Component from '../component.js';\n\n// Required children\nimport PlayToggle from './play-toggle.js';\nimport CurrentTimeDisplay from './time-controls/current-time-display.js';\nimport DurationDisplay from './time-controls/duration-display.js';\nimport TimeDivider from './time-controls/time-divider.js';\nimport RemainingTimeDisplay from './time-controls/remaining-time-display.js';\nimport LiveDisplay from './live-display.js';\nimport ProgressControl from './progress-control/progress-control.js';\nimport FullscreenToggle from './fullscreen-toggle.js';\nimport VolumeControl from './volume-control/volume-control.js';\nimport VolumeMenuButton from './volume-menu-button.js';\nimport MuteToggle from './mute-toggle.js';\nimport ChaptersButton from './text-track-controls/chapters-button.js';\nimport SubtitlesButton from './text-track-controls/subtitles-button.js';\nimport CaptionsButton from './text-track-controls/captions-button.js';\nimport PlaybackRateMenuButton from './playback-rate-menu/playback-rate-menu-button.js';\nimport CustomControlSpacer from './spacer-controls/custom-control-spacer.js';\n\n/**\n * Container of main controls\n *\n * @extends Component\n * @class ControlBar\n */\nclass ControlBar extends Component {\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-control-bar'\n    });\n  }\n}\n\nControlBar.prototype.options_ = {\n  loadEvent: 'play',\n  children: [\n    'playToggle',\n    'volumeMenuButton',\n    'currentTimeDisplay',\n    'timeDivider',\n    'durationDisplay',\n    'progressControl',\n    'liveDisplay',\n    'remainingTimeDisplay',\n    'customControlSpacer',\n    'playbackRateMenuButton',\n    'chaptersButton',\n    'subtitlesButton',\n    'captionsButton',\n    'fullscreenToggle'\n  ]\n};\n\nComponent.registerComponent('ControlBar', ControlBar);\nexport default ControlBar;\n","/**\n * @file fullscreen-toggle.js\n */\nimport Button from '../button.js';\nimport Component from '../component.js';\n\n/**\n * Toggle fullscreen video\n *\n * @extends Button\n * @class FullscreenToggle\n */\nclass FullscreenToggle extends Button {\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-fullscreen-control ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Handles click for full screen\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    if (!this.player_.isFullscreen()) {\n      this.player_.requestFullscreen();\n      this.controlText('Non-Fullscreen');\n    } else {\n      this.player_.exitFullscreen();\n      this.controlText('Fullscreen');\n    }\n  }\n\n}\n\nFullscreenToggle.prototype.controlText_ = 'Fullscreen';\n\nComponent.registerComponent('FullscreenToggle', FullscreenToggle);\nexport default FullscreenToggle;\n","/**\n * @file live-display.js\n */\nimport Component from '../component';\nimport * as Dom from '../utils/dom.js';\n\n/**\n * Displays the live indicator\n * TODO - Future make it click to snap to live\n *\n * @extends Component\n * @class LiveDisplay\n */\nclass LiveDisplay extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n\n    this.updateShowing();\n    this.on(this.player(), 'durationchange', this.updateShowing);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    var el = super.createEl('div', {\n      className: 'vjs-live-control vjs-control'\n    });\n\n    this.contentEl_ = Dom.createEl('div', {\n      className: 'vjs-live-display',\n      innerHTML: `<span class=\"vjs-control-text\">${this.localize('Stream Type')}</span>${this.localize('LIVE')}`\n    }, {\n      'aria-live': 'off'\n    });\n\n    el.appendChild(this.contentEl_);\n    return el;\n  }\n\n  updateShowing() {\n    if (this.player().duration() === Infinity) {\n      this.show();\n    } else {\n      this.hide();\n    }\n  }\n\n}\n\nComponent.registerComponent('LiveDisplay', LiveDisplay);\nexport default LiveDisplay;\n","/**\n * @file mute-toggle.js\n */\nimport Button from '../button';\nimport Component from '../component';\nimport * as Dom from '../utils/dom.js';\n\n/**\n * A button component for muting the audio\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Button\n * @class MuteToggle\n */\nclass MuteToggle extends Button {\n\n  constructor(player, options) {\n    super(player, options);\n\n    this.on(player, 'volumechange', this.update);\n\n    // hide mute toggle if the current tech doesn't support volume control\n    if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {\n      this.addClass('vjs-hidden');\n    }\n\n    this.on(player, 'loadstart', function() {\n      this.update(); // We need to update the button to account for a default muted state.\n\n      if (player.tech_['featuresVolumeControl'] === false) {\n        this.addClass('vjs-hidden');\n      } else {\n        this.removeClass('vjs-hidden');\n      }\n    });\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-mute-control ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Handle click on mute\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    this.player_.muted( this.player_.muted() ? false : true );\n  }\n\n  /**\n   * Update volume\n   *\n   * @method update\n   */\n  update() {\n    var vol = this.player_.volume(),\n        level = 3;\n\n    if (vol === 0 || this.player_.muted()) {\n      level = 0;\n    } else if (vol < 0.33) {\n      level = 1;\n    } else if (vol < 0.67) {\n      level = 2;\n    }\n\n    // Don't rewrite the button text if the actual text doesn't change.\n    // This causes unnecessary and confusing information for screen reader users.\n    // This check is needed because this function gets called every time the volume level is changed.\n    let toMute = this.player_.muted() ? 'Unmute' : 'Mute';\n    let localizedMute = this.localize(toMute);\n    if (this.controlText() !== localizedMute) {\n      this.controlText(localizedMute);\n    }\n\n    /* TODO improve muted icon classes */\n    for (var i = 0; i < 4; i++) {\n      Dom.removeElClass(this.el_, `vjs-vol-${i}`);\n    }\n    Dom.addElClass(this.el_, `vjs-vol-${level}`);\n  }\n\n}\n\nMuteToggle.prototype.controlText_ = 'Mute';\n\nComponent.registerComponent('MuteToggle', MuteToggle);\nexport default MuteToggle;\n","/**\n * @file play-toggle.js\n */\nimport Button from '../button.js';\nimport Component from '../component.js';\n\n/**\n * Button to toggle between play and pause\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Button\n * @class PlayToggle\n */\nclass PlayToggle extends Button {\n\n  constructor(player, options){\n    super(player, options);\n\n    this.on(player, 'play', this.handlePlay);\n    this.on(player, 'pause', this.handlePause);\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-play-control ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Handle click to toggle between play and pause\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    if (this.player_.paused()) {\n      this.player_.play();\n    } else {\n      this.player_.pause();\n    }\n  }\n\n  /**\n   * Add the vjs-playing class to the element so it can change appearance\n   *\n   * @method handlePlay\n   */\n  handlePlay() {\n    this.removeClass('vjs-paused');\n    this.addClass('vjs-playing');\n    this.controlText('Pause'); // change the button text to \"Pause\"\n  }\n\n  /**\n   * Add the vjs-paused class to the element so it can change appearance\n   *\n   * @method handlePause\n   */\n  handlePause() {\n    this.removeClass('vjs-playing');\n    this.addClass('vjs-paused');\n    this.controlText('Play'); // change the button text to \"Play\"\n  }\n\n}\n\nPlayToggle.prototype.controlText_ = 'Play';\n\nComponent.registerComponent('PlayToggle', PlayToggle);\nexport default PlayToggle;\n","/**\n * @file playback-rate-menu-button.js\n */\nimport MenuButton from '../../menu/menu-button.js';\nimport Menu from '../../menu/menu.js';\nimport PlaybackRateMenuItem from './playback-rate-menu-item.js';\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\n\n/**\n * The component for controlling the playback rate\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuButton\n * @class PlaybackRateMenuButton\n */\nclass PlaybackRateMenuButton extends MenuButton {\n\n  constructor(player, options){\n    super(player, options);\n\n    this.updateVisibility();\n    this.updateLabel();\n\n    this.on(player, 'loadstart', this.updateVisibility);\n    this.on(player, 'ratechange', this.updateLabel);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = super.createEl();\n\n    this.labelEl_ = Dom.createEl('div', {\n      className: 'vjs-playback-rate-value',\n      innerHTML: 1.0\n    });\n\n    el.appendChild(this.labelEl_);\n\n    return el;\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-playback-rate ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Create the playback rate menu\n   *\n   * @return {Menu} Menu object populated with items\n   * @method createMenu\n   */\n  createMenu() {\n    let menu = new Menu(this.player());\n    let rates = this.playbackRates();\n\n    if (rates) {\n      for (let i = rates.length - 1; i >= 0; i--) {\n        menu.addChild(\n          new PlaybackRateMenuItem(this.player(), { 'rate': rates[i] + 'x'})\n        );\n      }\n    }\n\n    return menu;\n  }\n\n  /**\n   * Updates ARIA accessibility attributes\n   *\n   * @method updateARIAAttributes\n   */\n  updateARIAAttributes() {\n    // Current playback rate\n    this.el().setAttribute('aria-valuenow', this.player().playbackRate());\n  }\n\n  /**\n   * Handle menu item click\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    // select next rate option\n    let currentRate = this.player().playbackRate();\n    let rates = this.playbackRates();\n\n    // this will select first one if the last one currently selected\n    let newRate = rates[0];\n    for (let i = 0; i < rates.length ; i++) {\n      if (rates[i] > currentRate) {\n        newRate = rates[i];\n        break;\n      }\n    }\n    this.player().playbackRate(newRate);\n  }\n\n  /**\n   * Get possible playback rates\n   *\n   * @return {Array} Possible playback rates\n   * @method playbackRates\n   */\n  playbackRates() {\n    return this.options_['playbackRates'] || (this.options_.playerOptions && this.options_.playerOptions['playbackRates']);\n  }\n\n  /**\n   * Get supported playback rates\n   *\n   * @return {Array} Supported playback rates\n   * @method playbackRateSupported\n   */\n  playbackRateSupported() {\n    return this.player().tech_\n      && this.player().tech_['featuresPlaybackRate']\n      && this.playbackRates()\n      && this.playbackRates().length > 0\n    ;\n  }\n\n  /**\n   * Hide playback rate controls when they're no playback rate options to select\n   *\n   * @method updateVisibility\n   */\n  updateVisibility() {\n    if (this.playbackRateSupported()) {\n      this.removeClass('vjs-hidden');\n    } else {\n      this.addClass('vjs-hidden');\n    }\n  }\n\n  /**\n   * Update button label when rate changed\n   *\n   * @method updateLabel\n   */\n  updateLabel() {\n    if (this.playbackRateSupported()) {\n      this.labelEl_.innerHTML = this.player().playbackRate() + 'x';\n    }\n  }\n\n}\n\nPlaybackRateMenuButton.prototype.controlText_ = 'Playback Rate';\n\nComponent.registerComponent('PlaybackRateMenuButton', PlaybackRateMenuButton);\nexport default PlaybackRateMenuButton;\n","/**\n * @file playback-rate-menu-item.js\n */\nimport MenuItem from '../../menu/menu-item.js';\nimport Component from '../../component.js';\n\n/**\n * The specific menu item type for selecting a playback rate\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuItem\n * @class PlaybackRateMenuItem\n */\nclass PlaybackRateMenuItem extends MenuItem {\n\n  constructor(player, options){\n    let label = options['rate'];\n    let rate = parseFloat(label, 10);\n\n    // Modify options for parent MenuItem class's init.\n    options['label'] = label;\n    options['selected'] = rate === 1;\n    super(player, options);\n\n    this.label = label;\n    this.rate = rate;\n\n    this.on(player, 'ratechange', this.update);\n  }\n\n  /**\n   * Handle click on menu item\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    super.handleClick();\n    this.player().playbackRate(this.rate);\n  }\n\n  /**\n   * Update playback rate with selected rate\n   *\n   * @method update\n   */\n  update() {\n    this.selected(this.player().playbackRate() === this.rate);\n  }\n\n}\n\nPlaybackRateMenuItem.prototype.contentElType = 'button';\n\nComponent.registerComponent('PlaybackRateMenuItem', PlaybackRateMenuItem);\nexport default PlaybackRateMenuItem;\n","/**\n * @file load-progress-bar.js\n */\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\n\n/**\n * Shows load progress\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class LoadProgressBar\n */\nclass LoadProgressBar extends Component {\n\n  constructor(player, options){\n    super(player, options);\n    this.on(player, 'progress', this.update);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-load-progress',\n      innerHTML: `<span class=\"vjs-control-text\"><span>${this.localize('Loaded')}</span>: 0%</span>`\n    });\n  }\n\n  /**\n   * Update progress bar\n   *\n   * @method update\n   */\n  update() {\n    let buffered = this.player_.buffered();\n    let duration = this.player_.duration();\n    let bufferedEnd = this.player_.bufferedEnd();\n    let children = this.el_.children;\n\n    // get the percent width of a time compared to the total end\n    let percentify = function (time, end){\n      let percent = (time / end) || 0; // no NaN\n      return ((percent >= 1 ? 1 : percent) * 100) + '%';\n    };\n\n    // update the width of the progress bar\n    this.el_.style.width = percentify(bufferedEnd, duration);\n\n    // add child elements to represent the individual buffered time ranges\n    for (let i = 0; i < buffered.length; i++) {\n      let start = buffered.start(i);\n      let end = buffered.end(i);\n      let part = children[i];\n\n      if (!part) {\n        part = this.el_.appendChild(Dom.createEl());\n      }\n\n      // set the percent based on the width of the progress bar (bufferedEnd)\n      part.style.left = percentify(start, bufferedEnd);\n      part.style.width = percentify(end - start, bufferedEnd);\n    }\n\n    // remove unused buffered range elements\n    for (let i = children.length; i > buffered.length; i--) {\n      this.el_.removeChild(children[i-1]);\n    }\n  }\n\n}\n\nComponent.registerComponent('LoadProgressBar', LoadProgressBar);\nexport default LoadProgressBar;\n","/**\n * @file mouse-time-display.js\n */\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\nimport * as Fn from '../../utils/fn.js';\nimport formatTime from '../../utils/format-time.js';\nimport throttle from 'lodash-compat/function/throttle';\n\n/**\n * The Mouse Time Display component shows the time you will seek to\n * when hovering over the progress bar\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class MouseTimeDisplay\n */\nclass MouseTimeDisplay extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n\n    this.update(0, 0);\n\n    player.on('ready', () => {\n      this.on(player.controlBar.progressControl.el(), 'mousemove', throttle(Fn.bind(this, this.handleMouseMove), 25));\n    });\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-mouse-display'\n    });\n  }\n\n  handleMouseMove(event) {\n    let duration = this.player_.duration();\n    let newTime = this.calculateDistance(event) * duration;\n    let position = event.pageX - Dom.findElPosition(this.el().parentNode).left;\n\n    this.update(newTime, position);\n  }\n\n  update(newTime, position) {\n    let time = formatTime(newTime, this.player_.duration());\n\n    this.el().style.left = position + 'px';\n    this.el().setAttribute('data-current-time', time);\n  }\n\n  calculateDistance(event) {\n    return Dom.getPointerPosition(this.el().parentNode, event).x;\n  }\n}\n\nComponent.registerComponent('MouseTimeDisplay', MouseTimeDisplay);\nexport default MouseTimeDisplay;\n","/**\n * @file play-progress-bar.js\n */\nimport Component from '../../component.js';\nimport * as Fn from '../../utils/fn.js';\nimport formatTime from '../../utils/format-time.js';\n\n/**\n * Shows play progress\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class PlayProgressBar\n */\nclass PlayProgressBar extends Component {\n\n  constructor(player, options){\n    super(player, options);\n    this.updateDataAttr();\n    this.on(player, 'timeupdate', this.updateDataAttr);\n    player.ready(Fn.bind(this, this.updateDataAttr));\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-play-progress vjs-slider-bar',\n      innerHTML: `<span class=\"vjs-control-text\"><span>${this.localize('Progress')}</span>: 0%</span>`\n    });\n  }\n\n  updateDataAttr() {\n    let time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();\n    this.el_.setAttribute('data-current-time', formatTime(time, this.player_.duration()));\n  }\n\n}\n\nComponent.registerComponent('PlayProgressBar', PlayProgressBar);\nexport default PlayProgressBar;\n","/**\n * @file progress-control.js\n */\nimport Component from '../../component.js';\nimport SeekBar from './seek-bar.js';\nimport MouseTimeDisplay from './mouse-time-display.js';\n\n/**\n * The Progress Control component contains the seek bar, load progress,\n * and play progress\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class ProgressControl\n */\nclass ProgressControl extends Component {\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-progress-control vjs-control'\n    });\n  }\n}\n\nProgressControl.prototype.options_ = {\n  children: [\n    'seekBar'\n  ]\n};\n\nComponent.registerComponent('ProgressControl', ProgressControl);\nexport default ProgressControl;\n","/**\n * @file seek-bar.js\n */\nimport Slider from '../../slider/slider.js';\nimport Component from '../../component.js';\nimport LoadProgressBar from './load-progress-bar.js';\nimport PlayProgressBar from './play-progress-bar.js';\nimport * as Fn from '../../utils/fn.js';\nimport formatTime from '../../utils/format-time.js';\nimport assign from 'object.assign';\n\n/**\n * Seek Bar and holder for the progress bars\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Slider\n * @class SeekBar\n */\nclass SeekBar extends Slider {\n\n  constructor(player, options){\n    super(player, options);\n    this.on(player, 'timeupdate', this.updateARIAAttributes);\n    player.ready(Fn.bind(this, this.updateARIAAttributes));\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-progress-holder'\n    }, {\n      'aria-label': 'video progress bar'\n    });\n  }\n\n  /**\n   * Update ARIA accessibility attributes\n   *\n   * @method updateARIAAttributes\n   */\n  updateARIAAttributes() {\n      // Allows for smooth scrubbing, when player can't keep up.\n      let time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();\n      this.el_.setAttribute('aria-valuenow', (this.getPercent() * 100).toFixed(2)); // machine readable value of progress bar (percentage complete)\n      this.el_.setAttribute('aria-valuetext', formatTime(time, this.player_.duration())); // human readable value of progress bar (time complete)\n  }\n\n  /**\n   * Get percentage of video played\n   *\n   * @return {Number} Percentage played\n   * @method getPercent\n   */\n  getPercent() {\n    let percent = this.player_.currentTime() / this.player_.duration();\n    return percent >= 1 ? 1 : percent;\n  }\n\n  /**\n   * Handle mouse down on seek bar\n   *\n   * @method handleMouseDown\n   */\n  handleMouseDown(event) {\n    super.handleMouseDown(event);\n\n    this.player_.scrubbing(true);\n\n    this.videoWasPlaying = !this.player_.paused();\n    this.player_.pause();\n  }\n\n  /**\n   * Handle mouse move on seek bar\n   *\n   * @method handleMouseMove\n   */\n  handleMouseMove(event) {\n    let newTime = this.calculateDistance(event) * this.player_.duration();\n\n    // Don't let video end while scrubbing.\n    if (newTime === this.player_.duration()) { newTime = newTime - 0.1; }\n\n    // Set new time (tell player to seek to new time)\n    this.player_.currentTime(newTime);\n  }\n\n  /**\n   * Handle mouse up on seek bar\n   *\n   * @method handleMouseUp\n   */\n  handleMouseUp(event) {\n    super.handleMouseUp(event);\n\n    this.player_.scrubbing(false);\n    if (this.videoWasPlaying) {\n      this.player_.play();\n    }\n  }\n\n  /**\n   * Move more quickly fast forward for keyboard-only users\n   *\n   * @method stepForward\n   */\n  stepForward() {\n    this.player_.currentTime(this.player_.currentTime() + 5); // more quickly fast forward for keyboard-only users\n  }\n\n  /**\n   * Move more quickly rewind for keyboard-only users\n   *\n   * @method stepBack\n   */\n  stepBack() {\n    this.player_.currentTime(this.player_.currentTime() - 5); // more quickly rewind for keyboard-only users\n  }\n\n}\n\nSeekBar.prototype.options_ = {\n  children: [\n    'loadProgressBar',\n    'mouseTimeDisplay',\n    'playProgressBar'\n  ],\n  'barName': 'playProgressBar'\n};\n\nSeekBar.prototype.playerEvent = 'timeupdate';\n\nComponent.registerComponent('SeekBar', SeekBar);\nexport default SeekBar;\n","/**\n * @file custom-control-spacer.js\n */\nimport Spacer from './spacer.js';\nimport Component from '../../component.js';\n\n/**\n * Spacer specifically meant to be used as an insertion point for new plugins, etc.\n *\n * @extends Spacer\n * @class CustomControlSpacer\n */\nclass CustomControlSpacer extends Spacer {\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-custom-control-spacer ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = super.createEl({\n      className: this.buildCSSClass(),\n    });\n\n    // No-flex/table-cell mode requires there be some content\n    // in the cell to fill the remaining space of the table.\n    el.innerHTML = '&nbsp;';\n    return el;\n  }\n}\n\nComponent.registerComponent('CustomControlSpacer', CustomControlSpacer);\nexport default CustomControlSpacer;\n","/**\n * @file spacer.js\n */\nimport Component from '../../component.js';\n\n/**\n * Just an empty spacer element that can be used as an append point for plugins, etc.\n * Also can be used to create space between elements when necessary.\n *\n * @extends Component\n * @class Spacer\n */\nclass Spacer extends Component {\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-spacer ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: this.buildCSSClass()\n    });\n  }\n}\n\nComponent.registerComponent('Spacer', Spacer);\n\nexport default Spacer;\n","/**\n * @file caption-settings-menu-item.js\n */\nimport TextTrackMenuItem from './text-track-menu-item.js';\nimport Component from '../../component.js';\n\n/**\n * The menu item for caption track settings menu\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends TextTrackMenuItem\n * @class CaptionSettingsMenuItem\n */\n class CaptionSettingsMenuItem extends TextTrackMenuItem {\n\n  constructor(player, options) {\n    options['track'] = {\n      'kind': options['kind'],\n      'player': player,\n      'label': options['kind'] + ' settings',\n      'default': false,\n      mode: 'disabled'\n    };\n\n    super(player, options);\n    this.addClass('vjs-texttrack-settings');\n  }\n\n  /**\n   * Handle click on menu item\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    this.player().getChild('textTrackSettings').show();\n  }\n\n}\n\nComponent.registerComponent('CaptionSettingsMenuItem', CaptionSettingsMenuItem);\nexport default CaptionSettingsMenuItem;\n","/**\n * @file captions-button.js\n */\nimport TextTrackButton from './text-track-button.js';\nimport Component from '../../component.js';\nimport CaptionSettingsMenuItem from './caption-settings-menu-item.js';\n\n/**\n * The button component for toggling and selecting captions\n *\n * @param {Object} player  Player object\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends TextTrackButton\n * @class CaptionsButton\n */\nclass CaptionsButton extends TextTrackButton {\n\n  constructor(player, options, ready){\n    super(player, options, ready);\n    this.el_.setAttribute('aria-label','Captions Menu');\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-captions-button ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Update caption menu items\n   *\n   * @method update\n   */\n  update() {\n    let threshold = 2;\n    super.update();\n\n    // if native, then threshold is 1 because no settings button\n    if (this.player().tech_ && this.player().tech_['featuresNativeTextTracks']) {\n      threshold = 1;\n    }\n\n    if (this.items && this.items.length > threshold) {\n      this.show();\n    } else {\n      this.hide();\n    }\n  }\n\n  /**\n   * Create caption menu items\n   *\n   * @return {Array} Array of menu items\n   * @method createItems\n   */\n  createItems() {\n    let items = [];\n\n    if (!(this.player().tech_ && this.player().tech_['featuresNativeTextTracks'])) {\n      items.push(new CaptionSettingsMenuItem(this.player_, { 'kind': this.kind_ }));\n    }\n\n    return super.createItems(items);\n  }\n\n}\n\nCaptionsButton.prototype.kind_ = 'captions';\nCaptionsButton.prototype.controlText_ = 'Captions';\n\nComponent.registerComponent('CaptionsButton', CaptionsButton);\nexport default CaptionsButton;\n","/**\n * @file chapters-button.js\n */\nimport TextTrackButton from './text-track-button.js';\nimport Component from '../../component.js';\nimport TextTrackMenuItem from './text-track-menu-item.js';\nimport ChaptersTrackMenuItem from './chapters-track-menu-item.js';\nimport Menu from '../../menu/menu.js';\nimport * as Dom from '../../utils/dom.js';\nimport * as Fn from '../../utils/fn.js';\nimport toTitleCase from '../../utils/to-title-case.js';\nimport window from 'global/window';\n\n/**\n * The button component for toggling and selecting chapters\n * Chapters act much differently than other text tracks\n * Cues are navigation vs. other tracks of alternative languages\n *\n * @param {Object} player  Player object\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends TextTrackButton\n * @class ChaptersButton\n */\nclass ChaptersButton extends TextTrackButton {\n\n  constructor(player, options, ready){\n    super(player, options, ready);\n    this.el_.setAttribute('aria-label','Chapters Menu');\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-chapters-button ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Create a menu item for each text track\n   *\n   * @return {Array} Array of menu items\n   * @method createItems\n   */\n  createItems() {\n    let items = [];\n\n    let tracks = this.player_.textTracks();\n\n    if (!tracks) {\n      return items;\n    }\n\n    for (let i = 0; i < tracks.length; i++) {\n      let track = tracks[i];\n      if (track['kind'] === this.kind_) {\n        items.push(new TextTrackMenuItem(this.player_, {\n          'track': track\n        }));\n      }\n    }\n\n    return items;\n  }\n\n  /**\n   * Create menu from chapter buttons\n   *\n   * @return {Menu} Menu of chapter buttons\n   * @method createMenu\n   */\n  createMenu() {\n    let tracks = this.player_.textTracks() || [];\n    let chaptersTrack;\n    let items = this.items = [];\n\n    for (let i = 0, l = tracks.length; i < l; i++) {\n      let track = tracks[i];\n      if (track['kind'] === this.kind_) {\n        if (!track.cues) {\n          track['mode'] = 'hidden';\n          /* jshint loopfunc:true */\n          // TODO see if we can figure out a better way of doing this https://github.com/videojs/video.js/issues/1864\n          window.setTimeout(Fn.bind(this, function() {\n            this.createMenu();\n          }), 100);\n          /* jshint loopfunc:false */\n        } else {\n          chaptersTrack = track;\n          break;\n        }\n      }\n    }\n\n    let menu = this.menu;\n    if (menu === undefined) {\n      menu = new Menu(this.player_);\n      menu.contentEl().appendChild(Dom.createEl('li', {\n        className: 'vjs-menu-title',\n        innerHTML: toTitleCase(this.kind_),\n        tabIndex: -1\n      }));\n    }\n\n    if (chaptersTrack) {\n      let cues = chaptersTrack['cues'], cue;\n\n      for (let i = 0, l = cues.length; i < l; i++) {\n        cue = cues[i];\n\n        let mi = new ChaptersTrackMenuItem(this.player_, {\n          'track': chaptersTrack,\n          'cue': cue\n        });\n\n        items.push(mi);\n\n        menu.addChild(mi);\n      }\n      this.addChild(menu);\n    }\n\n    if (this.items.length > 0) {\n      this.show();\n    }\n\n    return menu;\n  }\n\n}\n\nChaptersButton.prototype.kind_ = 'chapters';\nChaptersButton.prototype.controlText_ = 'Chapters';\n\nComponent.registerComponent('ChaptersButton', ChaptersButton);\nexport default ChaptersButton;\n","/**\n * @file chapters-track-menu-item.js\n */\nimport MenuItem from '../../menu/menu-item.js';\nimport Component from '../../component.js';\nimport * as Fn from '../../utils/fn.js';\n\n/**\n * The chapter track menu item\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuItem\n * @class ChaptersTrackMenuItem\n */\nclass ChaptersTrackMenuItem extends MenuItem {\n\n  constructor(player, options){\n    let track = options['track'];\n    let cue = options['cue'];\n    let currentTime = player.currentTime();\n\n    // Modify options for parent MenuItem class's init.\n    options['label'] = cue.text;\n    options['selected'] = (cue['startTime'] <= currentTime && currentTime < cue['endTime']);\n    super(player, options);\n\n    this.track = track;\n    this.cue = cue;\n    track.addEventListener('cuechange', Fn.bind(this, this.update));\n  }\n\n  /**\n   * Handle click on menu item\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    super.handleClick();\n    this.player_.currentTime(this.cue.startTime);\n    this.update(this.cue.startTime);\n  }\n\n  /**\n   * Update chapter menu item\n   *\n   * @method update\n   */\n  update() {\n    let cue = this.cue;\n    let currentTime = this.player_.currentTime();\n\n    // vjs.log(currentTime, cue.startTime);\n    this.selected(cue['startTime'] <= currentTime && currentTime < cue['endTime']);\n  }\n\n}\n\nComponent.registerComponent('ChaptersTrackMenuItem', ChaptersTrackMenuItem);\nexport default ChaptersTrackMenuItem;\n","/**\n * @file off-text-track-menu-item.js\n */\nimport TextTrackMenuItem from './text-track-menu-item.js';\nimport Component from '../../component.js';\n\n/**\n * A special menu item for turning of a specific type of text track\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends TextTrackMenuItem\n * @class OffTextTrackMenuItem\n */\nclass OffTextTrackMenuItem extends TextTrackMenuItem {\n\n  constructor(player, options){\n    // Create pseudo track info\n    // Requires options['kind']\n    options['track'] = {\n      'kind': options['kind'],\n      'player': player,\n      'label': options['kind'] + ' off',\n      'default': false,\n      'mode': 'disabled'\n    };\n\n    super(player, options);\n    this.selected(true);\n  }\n\n  /**\n   * Handle text track change\n   *\n   * @param {Object} event Event object\n   * @method handleTracksChange\n   */\n  handleTracksChange(event){\n    let tracks = this.player().textTracks();\n    let selected = true;\n\n    for (let i = 0, l = tracks.length; i < l; i++) {\n      let track = tracks[i];\n      if (track['kind'] === this.track['kind'] && track['mode'] === 'showing') {\n        selected = false;\n        break;\n      }\n    }\n\n    this.selected(selected);\n  }\n\n}\n\nComponent.registerComponent('OffTextTrackMenuItem', OffTextTrackMenuItem);\nexport default OffTextTrackMenuItem;\n","/**\n * @file subtitles-button.js\n */\nimport TextTrackButton from './text-track-button.js';\nimport Component from '../../component.js';\n\n/**\n * The button component for toggling and selecting subtitles\n *\n * @param {Object} player  Player object\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends TextTrackButton\n * @class SubtitlesButton\n */\nclass SubtitlesButton extends TextTrackButton {\n\n  constructor(player, options, ready){\n    super(player, options, ready);\n    this.el_.setAttribute('aria-label','Subtitles Menu');\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-subtitles-button ${super.buildCSSClass()}`;\n  }\n\n}\n\nSubtitlesButton.prototype.kind_ = 'subtitles';\nSubtitlesButton.prototype.controlText_ = 'Subtitles';\n\nComponent.registerComponent('SubtitlesButton', SubtitlesButton);\nexport default SubtitlesButton;\n","/**\n * @file text-track-button.js\n */\nimport MenuButton from '../../menu/menu-button.js';\nimport Component from '../../component.js';\nimport * as Fn from '../../utils/fn.js';\nimport TextTrackMenuItem from './text-track-menu-item.js';\nimport OffTextTrackMenuItem from './off-text-track-menu-item.js';\n\n/**\n * The base class for buttons that toggle specific text track types (e.g. subtitles)\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuButton\n * @class TextTrackButton\n */\nclass TextTrackButton extends MenuButton {\n\n  constructor(player, options){\n    super(player, options);\n\n    let tracks = this.player_.textTracks();\n\n    if (this.items.length <= 1) {\n      this.hide();\n    }\n\n    if (!tracks) {\n      return;\n    }\n\n    let updateHandler = Fn.bind(this, this.update);\n    tracks.addEventListener('removetrack', updateHandler);\n    tracks.addEventListener('addtrack', updateHandler);\n\n    this.player_.on('dispose', function() {\n      tracks.removeEventListener('removetrack', updateHandler);\n      tracks.removeEventListener('addtrack', updateHandler);\n    });\n  }\n\n  // Create a menu item for each text track\n  createItems(items=[]) {\n    // Add an OFF menu item to turn all tracks off\n    items.push(new OffTextTrackMenuItem(this.player_, { 'kind': this.kind_ }));\n\n    let tracks = this.player_.textTracks();\n\n    if (!tracks) {\n      return items;\n    }\n\n    for (let i = 0; i < tracks.length; i++) {\n      let track = tracks[i];\n\n      // only add tracks that are of the appropriate kind and have a label\n      if (track['kind'] === this.kind_) {\n        items.push(new TextTrackMenuItem(this.player_, {\n          'track': track\n        }));\n      }\n    }\n\n    return items;\n  }\n\n}\n\nComponent.registerComponent('TextTrackButton', TextTrackButton);\nexport default TextTrackButton;\n","/**\n * @file text-track-menu-item.js\n */\nimport MenuItem from '../../menu/menu-item.js';\nimport Component from '../../component.js';\nimport * as Fn from '../../utils/fn.js';\nimport window from 'global/window';\nimport document from 'global/document';\n\n/**\n * The specific menu item type for selecting a language within a text track kind\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuItem\n * @class TextTrackMenuItem\n */\nclass TextTrackMenuItem extends MenuItem {\n\n  constructor(player, options){\n    let track = options['track'];\n    let tracks = player.textTracks();\n\n    // Modify options for parent MenuItem class's init.\n    options['label'] = track['label'] || track['language'] || 'Unknown';\n    options['selected'] = track['default'] || track['mode'] === 'showing';\n    super(player, options);\n\n    this.track = track;\n\n    if (tracks) {\n      let changeHandler = Fn.bind(this, this.handleTracksChange);\n\n      tracks.addEventListener('change', changeHandler);\n      this.on('dispose', function() {\n        tracks.removeEventListener('change', changeHandler);\n      });\n    }\n\n    // iOS7 doesn't dispatch change events to TextTrackLists when an\n    // associated track's mode changes. Without something like\n    // Object.observe() (also not present on iOS7), it's not\n    // possible to detect changes to the mode attribute and polyfill\n    // the change event. As a poor substitute, we manually dispatch\n    // change events whenever the controls modify the mode.\n    if (tracks && tracks.onchange === undefined) {\n      let event;\n\n      this.on(['tap', 'click'], function() {\n        if (typeof window.Event !== 'object') {\n          // Android 2.3 throws an Illegal Constructor error for window.Event\n          try {\n            event = new window.Event('change');\n          } catch(err){}\n        }\n\n        if (!event) {\n          event = document.createEvent('Event');\n          event.initEvent('change', true, true);\n        }\n\n        tracks.dispatchEvent(event);\n      });\n    }\n  }\n\n  /**\n   * Handle click on text track\n   *\n   * @method handleClick\n   */\n  handleClick(event) {\n    let kind = this.track['kind'];\n    let tracks = this.player_.textTracks();\n\n    super.handleClick(event);\n\n    if (!tracks) return;\n\n    for (let i = 0; i < tracks.length; i++) {\n      let track = tracks[i];\n\n      if (track['kind'] !== kind) {\n        continue;\n      }\n\n      if (track === this.track) {\n        track['mode'] = 'showing';\n      } else {\n        track['mode'] = 'disabled';\n      }\n    }\n  }\n\n  /**\n   * Handle text track change\n   *\n   * @method handleTracksChange\n   */\n  handleTracksChange(event){\n    this.selected(this.track['mode'] === 'showing');\n  }\n\n}\n\nComponent.registerComponent('TextTrackMenuItem', TextTrackMenuItem);\nexport default TextTrackMenuItem;\n","/**\n * @file current-time-display.js\n */\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\nimport formatTime from '../../utils/format-time.js';\n\n/**\n * Displays the current time\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class CurrentTimeDisplay\n */\nclass CurrentTimeDisplay extends Component {\n\n  constructor(player, options){\n    super(player, options);\n\n    this.on(player, 'timeupdate', this.updateContent);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = super.createEl('div', {\n      className: 'vjs-current-time vjs-time-control vjs-control'\n    });\n\n    this.contentEl_ = Dom.createEl('div', {\n      className: 'vjs-current-time-display',\n      // label the current time for screen reader users\n      innerHTML: '<span class=\"vjs-control-text\">Current Time </span>' + '0:00',\n    }, {\n      // tell screen readers not to automatically read the time as it changes\n      'aria-live': 'off'\n    });\n\n    el.appendChild(this.contentEl_);\n    return el;\n  }\n\n  /**\n   * Update current time display\n   *\n   * @method updateContent\n   */\n  updateContent() {\n    // Allows for smooth scrubbing, when player can't keep up.\n    let time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();\n    let localizedText = this.localize('Current Time');\n    let formattedTime = formatTime(time, this.player_.duration());\n    this.contentEl_.innerHTML = `<span class=\"vjs-control-text\">${localizedText}</span> ${formattedTime}`;\n  }\n\n}\n\nComponent.registerComponent('CurrentTimeDisplay', CurrentTimeDisplay);\nexport default CurrentTimeDisplay;\n","/**\n * @file duration-display.js\n */\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\nimport formatTime from '../../utils/format-time.js';\n\n/**\n * Displays the duration\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class DurationDisplay\n */\nclass DurationDisplay extends Component {\n\n  constructor(player, options){\n    super(player, options);\n\n    // this might need to be changed to 'durationchange' instead of 'timeupdate' eventually,\n    // however the durationchange event fires before this.player_.duration() is set,\n    // so the value cannot be written out using this method.\n    // Once the order of durationchange and this.player_.duration() being set is figured out,\n    // this can be updated.\n    this.on(player, 'timeupdate', this.updateContent);\n    this.on(player, 'loadedmetadata', this.updateContent);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = super.createEl('div', {\n      className: 'vjs-duration vjs-time-control vjs-control'\n    });\n\n    this.contentEl_ = Dom.createEl('div', {\n      className: 'vjs-duration-display',\n      // label the duration time for screen reader users\n      innerHTML: `<span class=\"vjs-control-text\">${this.localize('Duration Time')}</span> 0:00`\n    }, {\n      // tell screen readers not to automatically read the time as it changes\n      'aria-live': 'off'\n    });\n\n    el.appendChild(this.contentEl_);\n    return el;\n  }\n\n  /**\n   * Update duration time display\n   *\n   * @method updateContent\n   */\n  updateContent() {\n    let duration = this.player_.duration();\n    if (duration) {\n      let localizedText = this.localize('Duration Time');\n      let formattedTime = formatTime(duration);\n      this.contentEl_.innerHTML = `<span class=\"vjs-control-text\">${localizedText}</span> ${formattedTime}`; // label the duration time for screen reader users\n    }\n  }\n\n}\n\nComponent.registerComponent('DurationDisplay', DurationDisplay);\nexport default DurationDisplay;\n","/**\n * @file remaining-time-display.js\n */\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\nimport formatTime from '../../utils/format-time.js';\n\n/**\n * Displays the time left in the video\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class RemainingTimeDisplay\n */\nclass RemainingTimeDisplay extends Component {\n\n  constructor(player, options){\n    super(player, options);\n\n    this.on(player, 'timeupdate', this.updateContent);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = super.createEl('div', {\n      className: 'vjs-remaining-time vjs-time-control vjs-control'\n    });\n\n    this.contentEl_ = Dom.createEl('div', {\n      className: 'vjs-remaining-time-display',\n      // label the remaining time for screen reader users\n      innerHTML: `<span class=\"vjs-control-text\">${this.localize('Remaining Time')}</span> -0:00`,\n    }, {\n      // tell screen readers not to automatically read the time as it changes\n      'aria-live': 'off'\n    });\n\n    el.appendChild(this.contentEl_);\n    return el;\n  }\n\n  /**\n   * Update remaining time display\n   *\n   * @method updateContent\n   */\n  updateContent() {\n    if (this.player_.duration()) {\n      const localizedText = this.localize('Remaining Time');\n      const formattedTime = formatTime(this.player_.remainingTime());\n      this.contentEl_.innerHTML = `<span class=\"vjs-control-text\">${localizedText}</span> -${formattedTime}`;\n    }\n\n    // Allows for smooth scrubbing, when player can't keep up.\n    // var time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();\n    // this.contentEl_.innerHTML = vjs.formatTime(time, this.player_.duration());\n  }\n\n}\n\nComponent.registerComponent('RemainingTimeDisplay', RemainingTimeDisplay);\nexport default RemainingTimeDisplay;\n","/**\n * @file time-divider.js\n */\nimport Component from '../../component.js';\n\n/**\n * The separator between the current time and duration.\n * Can be hidden if it's not needed in the design.\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class TimeDivider\n */\nclass TimeDivider extends Component {\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-time-control vjs-time-divider',\n      innerHTML: '<div><span>/</span></div>'\n    });\n  }\n\n}\n\nComponent.registerComponent('TimeDivider', TimeDivider);\nexport default TimeDivider;\n","/**\n * @file volume-bar.js\n */\nimport Slider from '../../slider/slider.js';\nimport Component from '../../component.js';\nimport * as Fn from '../../utils/fn.js';\n\n// Required children\nimport VolumeLevel from './volume-level.js';\n\n/**\n * The bar that contains the volume level and can be clicked on to adjust the level\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Slider\n * @class VolumeBar\n */\nclass VolumeBar extends Slider {\n\n  constructor(player, options){\n    super(player, options);\n    this.on(player, 'volumechange', this.updateARIAAttributes);\n    player.ready(Fn.bind(this, this.updateARIAAttributes));\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-volume-bar vjs-slider-bar'\n    }, {\n      'aria-label': 'volume level'\n    });\n  }\n\n  /**\n   * Handle mouse move on volume bar\n   *\n   * @method handleMouseMove\n   */\n  handleMouseMove(event) {\n    if (this.player_.muted()) {\n      this.player_.muted(false);\n    }\n\n    this.player_.volume(this.calculateDistance(event));\n  }\n\n  /**\n   * Get percent of volume level\n   *\n   * @retun {Number} Volume level percent\n   * @method getPercent\n   */\n  getPercent() {\n    if (this.player_.muted()) {\n      return 0;\n    } else {\n      return this.player_.volume();\n    }\n  }\n\n  /**\n   * Increase volume level for keyboard users\n   *\n   * @method stepForward\n   */\n  stepForward() {\n    this.player_.volume(this.player_.volume() + 0.1);\n  }\n\n  /**\n   * Decrease volume level for keyboard users\n   *\n   * @method stepBack\n   */\n  stepBack() {\n    this.player_.volume(this.player_.volume() - 0.1);\n  }\n\n  /**\n   * Update ARIA accessibility attributes\n   *\n   * @method updateARIAAttributes\n   */\n  updateARIAAttributes() {\n    // Current value of volume bar as a percentage\n    let volume = (this.player_.volume() * 100).toFixed(2);\n    this.el_.setAttribute('aria-valuenow', volume);\n    this.el_.setAttribute('aria-valuetext', volume + '%');\n  }\n\n}\n\nVolumeBar.prototype.options_ = {\n  children: [\n    'volumeLevel'\n  ],\n  'barName': 'volumeLevel'\n};\n\nVolumeBar.prototype.playerEvent = 'volumechange';\n\nComponent.registerComponent('VolumeBar', VolumeBar);\nexport default VolumeBar;\n","/**\n * @file volume-control.js\n */\nimport Component from '../../component.js';\n\n// Required children\nimport VolumeBar from './volume-bar.js';\n\n/**\n * The component for controlling the volume level\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class VolumeControl\n */\nclass VolumeControl extends Component {\n\n  constructor(player, options){\n    super(player, options);\n\n    // hide volume controls when they're not supported by the current tech\n    if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {\n      this.addClass('vjs-hidden');\n    }\n    this.on(player, 'loadstart', function(){\n      if (player.tech_['featuresVolumeControl'] === false) {\n        this.addClass('vjs-hidden');\n      } else {\n        this.removeClass('vjs-hidden');\n      }\n    });\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-volume-control vjs-control'\n    });\n  }\n\n}\n\nVolumeControl.prototype.options_ = {\n  children: [\n    'volumeBar'\n  ]\n};\n\nComponent.registerComponent('VolumeControl', VolumeControl);\nexport default VolumeControl;\n","/**\n * @file volume-level.js\n */\nimport Component from '../../component.js';\n\n/**\n * Shows volume level\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class VolumeLevel\n */\nclass VolumeLevel extends Component {\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-volume-level',\n      innerHTML: '<span class=\"vjs-control-text\"></span>'\n    });\n  }\n\n}\n\nComponent.registerComponent('VolumeLevel', VolumeLevel);\nexport default VolumeLevel;\n","/**\n * @file volume-menu-button.js\n */\nimport Button from '../button.js';\nimport Component from '../component.js';\nimport Menu from '../menu/menu.js';\nimport MenuButton from '../menu/menu-button.js';\nimport MuteToggle from './mute-toggle.js';\nimport VolumeBar from './volume-control/volume-bar.js';\n\n/**\n * Button for volume menu\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuButton\n * @class VolumeMenuButton\n */\nclass VolumeMenuButton extends MenuButton {\n\n  constructor(player, options={}){\n    // Default to inline\n    if (options.inline === undefined) {\n      options.inline = true;\n    }\n\n    // If the vertical option isn't passed at all, default to true.\n    if (options.vertical === undefined) {\n      // If an inline volumeMenuButton is used, we should default to using\n      // a horizontal slider for obvious reasons.\n      if (options.inline) {\n        options.vertical = false;\n      } else {\n        options.vertical = true;\n      }\n    }\n\n    // The vertical option needs to be set on the volumeBar as well,\n    // since that will need to be passed along to the VolumeBar constructor\n    options.volumeBar = options.volumeBar || {};\n    options.volumeBar.vertical = !!options.vertical;\n\n    super(player, options);\n\n    // Same listeners as MuteToggle\n    this.on(player, 'volumechange', this.volumeUpdate);\n    this.on(player, 'loadstart', this.volumeUpdate);\n\n    // hide mute toggle if the current tech doesn't support volume control\n    function updateVisibility() {\n      if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {\n        this.addClass('vjs-hidden');\n      } else {\n        this.removeClass('vjs-hidden');\n      }\n    }\n\n    updateVisibility.call(this);\n    this.on(player, 'loadstart', updateVisibility);\n\n    this.on(this.volumeBar, ['slideractive', 'focus'], function(){\n      this.addClass('vjs-slider-active');\n    });\n\n    this.on(this.volumeBar, ['sliderinactive', 'blur'], function(){\n      this.removeClass('vjs-slider-active');\n    });\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    let orientationClass = '';\n    if (!!this.options_.vertical) {\n      orientationClass = 'vjs-volume-menu-button-vertical';\n    } else {\n      orientationClass = 'vjs-volume-menu-button-horizontal';\n    }\n\n    return `vjs-volume-menu-button ${super.buildCSSClass()} ${orientationClass}`;\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {Menu} The volume menu button\n   * @method createMenu\n   */\n  createMenu() {\n    let menu = new Menu(this.player_, {\n      contentElType: 'div'\n    });\n\n    let vb = new VolumeBar(this.player_, this.options_.volumeBar);\n\n    menu.addChild(vb);\n\n    this.volumeBar = vb;\n    return menu;\n  }\n\n  /**\n   * Handle click on volume menu and calls super\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    MuteToggle.prototype.handleClick.call(this);\n    super.handleClick();\n  }\n\n}\n\nVolumeMenuButton.prototype.volumeUpdate = MuteToggle.prototype.update;\nVolumeMenuButton.prototype.controlText_ = 'Mute';\n\nComponent.registerComponent('VolumeMenuButton', VolumeMenuButton);\nexport default VolumeMenuButton;\n","/**\n * @file error-display.js\n */\nimport Component from './component';\nimport  * as Dom from './utils/dom.js';\n\n/**\n * Display that an error has occurred making the video unplayable\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @extends Component\n * @class ErrorDisplay\n */\nclass ErrorDisplay extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n\n    this.update();\n    this.on(player, 'error', this.update);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    var el = super.createEl('div', {\n      className: 'vjs-error-display'\n    });\n\n    this.contentEl_ = Dom.createEl('div');\n    el.appendChild(this.contentEl_);\n\n    return el;\n  }\n\n  /**\n   * Update the error message in localized language\n   *\n   * @method update\n   */\n  update() {\n    if (this.player().error()) {\n      this.contentEl_.innerHTML = this.localize(this.player().error().message);\n    }\n  }\n}\n\nComponent.registerComponent('ErrorDisplay', ErrorDisplay);\nexport default ErrorDisplay;\n","/**\n * @file event-target.js\n */\nimport * as Events from './utils/events.js';\n\nvar EventTarget = function() {};\n\nEventTarget.prototype.allowedEvents_ = {};\n\nEventTarget.prototype.on = function(type, fn) {\n  // Remove the addEventListener alias before calling Events.on\n  // so we don't get into an infinite type loop\n  let ael = this.addEventListener;\n  this.addEventListener = Function.prototype;\n  Events.on(this, type, fn);\n  this.addEventListener = ael;\n};\nEventTarget.prototype.addEventListener = EventTarget.prototype.on;\n\nEventTarget.prototype.off = function(type, fn) {\n  Events.off(this, type, fn);\n};\nEventTarget.prototype.removeEventListener = EventTarget.prototype.off;\n\nEventTarget.prototype.one = function(type, fn) {\n  Events.one(this, type, fn);\n};\n\nEventTarget.prototype.trigger = function(event) {\n  let type = event.type || event;\n\n  if (typeof event === 'string') {\n    event = {\n      type: type\n    };\n  }\n  event = Events.fixEvent(event);\n\n  if (this.allowedEvents_[type] && this['on' + type]) {\n    this['on' + type](event);\n  }\n\n  Events.trigger(this, event);\n};\n// The standard DOM EventTarget.dispatchEvent() is aliased to trigger()\nEventTarget.prototype.dispatchEvent = EventTarget.prototype.trigger;\n\nexport default EventTarget;\n","import log from './utils/log';\n\n/*\n * @file extend.js\n *\n * A combination of node inherits and babel's inherits (after transpile).\n * Both work the same but node adds `super_` to the subClass\n * and Bable adds the superClass as __proto__. Both seem useful.\n */\nconst _inherits = function (subClass, superClass) {\n  if (typeof superClass !== 'function' && superClass !== null) {\n    throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n\n  if (superClass) {\n    // node\n    subClass.super_ = superClass;\n  }\n};\n\n/*\n * Function for subclassing using the same inheritance that\n * videojs uses internally\n * ```js\n * var Button = videojs.getComponent('Button');\n * ```\n * ```js\n * var MyButton = videojs.extend(Button, {\n *   constructor: function(player, options) {\n *     Button.call(this, player, options);\n *   },\n *   onClick: function() {\n *     // doSomething\n *   }\n * });\n * ```\n */\nconst extendFn = function(superClass, subClassMethods={}) {\n  let subClass = function() {\n    superClass.apply(this, arguments);\n  };\n  let methods = {};\n\n  if (typeof subClassMethods === 'object') {\n    if (typeof subClassMethods.init === 'function') {\n      log.warn('Constructor logic via init() is deprecated; please use constructor() instead.');\n      subClassMethods.constructor = subClassMethods.init;\n    }\n    if (subClassMethods.constructor !== Object.prototype.constructor) {\n      subClass = subClassMethods.constructor;\n    }\n    methods = subClassMethods;\n  } else if (typeof subClassMethods === 'function') {\n    subClass = subClassMethods;\n  }\n\n  _inherits(subClass, superClass);\n\n  // Extend subObj's prototype with functions and other properties from props\n  for (var name in methods) {\n    if (methods.hasOwnProperty(name)) {\n      subClass.prototype[name] = methods[name];\n    }\n  }\n\n  return subClass;\n};\n\nexport default extendFn;\n","/**\n * @file fullscreen-api.js\n */\nimport document from 'global/document';\n\n/*\n * Store the browser-specific methods for the fullscreen API\n * @type {Object|undefined}\n * @private\n */\nlet FullscreenApi = {};\n\n// browser API methods\n// map approach from Screenful.js - https://github.com/sindresorhus/screenfull.js\nconst apiMap = [\n  // Spec: https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html\n  [\n    'requestFullscreen',\n    'exitFullscreen',\n    'fullscreenElement',\n    'fullscreenEnabled',\n    'fullscreenchange',\n    'fullscreenerror'\n  ],\n  // WebKit\n  [\n    'webkitRequestFullscreen',\n    'webkitExitFullscreen',\n    'webkitFullscreenElement',\n    'webkitFullscreenEnabled',\n    'webkitfullscreenchange',\n    'webkitfullscreenerror'\n  ],\n  // Old WebKit (Safari 5.1)\n  [\n    'webkitRequestFullScreen',\n    'webkitCancelFullScreen',\n    'webkitCurrentFullScreenElement',\n    'webkitCancelFullScreen',\n    'webkitfullscreenchange',\n    'webkitfullscreenerror'\n  ],\n  // Mozilla\n  [\n    'mozRequestFullScreen',\n    'mozCancelFullScreen',\n    'mozFullScreenElement',\n    'mozFullScreenEnabled',\n    'mozfullscreenchange',\n    'mozfullscreenerror'\n  ],\n  // Microsoft\n  [\n    'msRequestFullscreen',\n    'msExitFullscreen',\n    'msFullscreenElement',\n    'msFullscreenEnabled',\n    'MSFullscreenChange',\n    'MSFullscreenError'\n  ]\n];\n\nlet specApi = apiMap[0];\nlet browserApi;\n\n// determine the supported set of functions\nfor (let i = 0; i < apiMap.length; i++) {\n  // check for exitFullscreen function\n  if (apiMap[i][1] in document) {\n    browserApi = apiMap[i];\n    break;\n  }\n}\n\n// map the browser API names to the spec API names\nif (browserApi) {\n  for (let i=0; i<browserApi.length; i++) {\n    FullscreenApi[specApi[i]] = browserApi[i];\n  }\n}\n\nexport default FullscreenApi;\n","/**\n * @file loading-spinner.js\n */\nimport Component from './component';\n\n/* Loading Spinner\n================================================================================ */\n/**\n * Loading spinner for waiting events\n *\n * @extends Component\n * @class LoadingSpinner\n */\nclass LoadingSpinner extends Component {\n\n  /**\n   * Create the component's DOM element\n   *\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-loading-spinner'\n    });\n  }\n}\n\nComponent.registerComponent('LoadingSpinner', LoadingSpinner);\nexport default LoadingSpinner;\n","/**\n * @file media-error.js\n */\nimport assign from 'object.assign';\n\n/*\n * Custom MediaError to mimic the HTML5 MediaError\n *\n * @param {Number} code The media error code\n */\nlet MediaError = function(code){\n  if (typeof code === 'number') {\n    this.code = code;\n  } else if (typeof code === 'string') {\n    // default code is zero, so this is a custom error\n    this.message = code;\n  } else if (typeof code === 'object') { // object\n    assign(this, code);\n  }\n\n  if (!this.message) {\n    this.message = MediaError.defaultMessages[this.code] || '';\n  }\n};\n\n/*\n * The error code that refers two one of the defined\n * MediaError types\n *\n * @type {Number}\n */\nMediaError.prototype.code = 0;\n\n/*\n * An optional message to be shown with the error.\n * Message is not part of the HTML5 video spec\n * but allows for more informative custom errors.\n *\n * @type {String}\n */\nMediaError.prototype.message = '';\n\n/*\n * An optional status code that can be set by plugins\n * to allow even more detail about the error.\n * For example the HLS plugin might provide the specific\n * HTTP status code that was returned when the error\n * occurred, then allowing a custom error overlay\n * to display more information.\n *\n * @type {Array}\n */\nMediaError.prototype.status = null;\n\nMediaError.errorTypes = [\n  'MEDIA_ERR_CUSTOM',            // = 0\n  'MEDIA_ERR_ABORTED',           // = 1\n  'MEDIA_ERR_NETWORK',           // = 2\n  'MEDIA_ERR_DECODE',            // = 3\n  'MEDIA_ERR_SRC_NOT_SUPPORTED', // = 4\n  'MEDIA_ERR_ENCRYPTED'          // = 5\n];\n\nMediaError.defaultMessages = {\n  1: 'You aborted the media playback',\n  2: 'A network error caused the media download to fail part-way.',\n  3: 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.',\n  4: 'The media could not be loaded, either because the server or network failed or because the format is not supported.',\n  5: 'The media is encrypted and we do not have the keys to decrypt it.'\n};\n\n// Add types as properties on MediaError\n// e.g. MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;\nfor (var errNum = 0; errNum < MediaError.errorTypes.length; errNum++) {\n  MediaError[MediaError.errorTypes[errNum]] = errNum;\n  // values should be accessible on both the class and instance\n  MediaError.prototype[MediaError.errorTypes[errNum]] = errNum;\n}\n\nexport default MediaError;\n","/**\n * @file menu-button.js\n */\nimport Button from '../button.js';\nimport Component from '../component.js';\nimport Menu from './menu.js';\nimport * as Dom from '../utils/dom.js';\nimport * as Fn from '../utils/fn.js';\nimport toTitleCase from '../utils/to-title-case.js';\n\n/**\n * A button class with a popup menu\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Button\n * @class MenuButton\n */\nclass MenuButton extends Button {\n\n  constructor(player, options={}){\n    super(player, options);\n\n    this.update();\n\n    this.on('keydown', this.handleKeyPress);\n    this.el_.setAttribute('aria-haspopup', true);\n    this.el_.setAttribute('role', 'button');\n  }\n\n  /**\n   * Update menu\n   *\n   * @method update\n   */\n  update() {\n    let menu = this.createMenu();\n\n    if (this.menu) {\n      this.removeChild(this.menu);\n    }\n\n    this.menu = menu;\n    this.addChild(menu);\n\n    /**\n     * Track the state of the menu button\n     *\n     * @type {Boolean}\n     * @private\n     */\n    this.buttonPressed_ = false;\n\n    if (this.items && this.items.length === 0) {\n      this.hide();\n    } else if (this.items && this.items.length > 1) {\n      this.show();\n    }\n  }\n\n  /**\n   * Create menu\n   *\n   * @return {Menu} The constructed menu\n   * @method createMenu\n   */\n  createMenu() {\n    var menu = new Menu(this.player_);\n\n    // Add a title list item to the top\n    if (this.options_.title) {\n      menu.contentEl().appendChild(Dom.createEl('li', {\n        className: 'vjs-menu-title',\n        innerHTML: toTitleCase(this.options_.title),\n        tabIndex: -1\n      }));\n    }\n\n    this.items = this['createItems']();\n\n    if (this.items) {\n      // Add menu items to the menu\n      for (var i = 0; i < this.items.length; i++) {\n        menu.addItem(this.items[i]);\n      }\n    }\n\n    return menu;\n  }\n\n  /**\n   * Create the list of menu items. Specific to each subclass.\n   *\n   * @method createItems\n   */\n  createItems(){}\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: this.buildCSSClass()\n    });\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    var menuButtonClass = 'vjs-menu-button';\n\n    // If the inline option is passed, we want to use different styles altogether.\n    if (this.options_.inline === true) {\n      menuButtonClass += '-inline';\n    } else {\n      menuButtonClass += '-popup';\n    }\n\n    return `vjs-menu-button ${menuButtonClass} ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Focus - Add keyboard functionality to element\n   * This function is not needed anymore. Instead, the\n   * keyboard functionality is handled by\n   * treating the button as triggering a submenu.\n   * When the button is pressed, the submenu\n   * appears. Pressing the button again makes\n   * the submenu disappear.\n   *\n   * @method handleFocus\n   */\n  handleFocus() {}\n\n  /**\n   * Can't turn off list display that we turned\n   * on with focus, because list would go away.\n   *\n   * @method handleBlur\n   */\n  handleBlur() {}\n\n  /**\n   * When you click the button it adds focus, which\n   * will show the menu indefinitely.\n   * So we'll remove focus when the mouse leaves the button.\n   * Focus is needed for tab navigation.\n   * Allow sub components to stack CSS class names\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    this.one('mouseout', Fn.bind(this, function(){\n      this.menu.unlockShowing();\n      this.el_.blur();\n    }));\n    if (this.buttonPressed_){\n      this.unpressButton();\n    } else {\n      this.pressButton();\n    }\n  }\n\n  /**\n   * Handle key press on menu\n   *\n   * @param {Object} Key press event\n   * @method handleKeyPress\n   */\n  handleKeyPress(event) {\n\n    // Check for space bar (32) or enter (13) keys\n    if (event.which === 32 || event.which === 13) {\n      if (this.buttonPressed_){\n        this.unpressButton();\n      } else {\n        this.pressButton();\n      }\n      event.preventDefault();\n    // Check for escape (27) key\n    } else if (event.which === 27){\n      if (this.buttonPressed_){\n        this.unpressButton();\n      }\n      event.preventDefault();\n    }\n  }\n\n  /**\n   * Makes changes based on button pressed\n   *\n   * @method pressButton\n   */\n  pressButton() {\n    this.buttonPressed_ = true;\n    this.menu.lockShowing();\n    this.el_.setAttribute('aria-pressed', true);\n    if (this.items && this.items.length > 0) {\n      this.items[0].el().focus(); // set the focus to the title of the submenu\n    }\n  }\n\n  /**\n   * Makes changes based on button unpressed\n   *\n   * @method unpressButton\n   */\n  unpressButton() {\n    this.buttonPressed_ = false;\n    this.menu.unlockShowing();\n    this.el_.setAttribute('aria-pressed', false);\n  }\n}\n\nComponent.registerComponent('MenuButton', MenuButton);\nexport default MenuButton;\n","/**\n * @file menu-item.js\n */\nimport Button from '../button.js';\nimport Component from '../component.js';\nimport assign from 'object.assign';\n\n/**\n * The component for a menu item. `<li>`\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Button\n * @class MenuItem\n */\nclass MenuItem extends Button {\n\n  constructor(player, options) {\n    super(player, options);\n    this.selected(options['selected']);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @param {String=} type Desc\n   * @param {Object=} props Desc\n   * @return {Element}\n   * @method createEl\n   */\n  createEl(type, props, attrs) {\n    return super.createEl('li', assign({\n      className: 'vjs-menu-item',\n      innerHTML: this.localize(this.options_['label'])\n    }, props), attrs);\n  }\n\n  /**\n   * Handle a click on the menu item, and set it to selected\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    this.selected(true);\n  }\n\n  /**\n   * Set this menu item as selected or not\n   *\n   * @param  {Boolean} selected\n   * @method selected\n   */\n  selected(selected) {\n    if (selected) {\n      this.addClass('vjs-selected');\n      this.el_.setAttribute('aria-selected',true);\n    } else {\n      this.removeClass('vjs-selected');\n      this.el_.setAttribute('aria-selected',false);\n    }\n  }\n\n}\n\nComponent.registerComponent('MenuItem', MenuItem);\nexport default MenuItem;\n","/**\n * @file menu.js\n */\nimport Component from '../component.js';\nimport * as Dom from '../utils/dom.js';\nimport * as Fn from '../utils/fn.js';\nimport * as Events from '../utils/events.js';\n\n/**\n * The Menu component is used to build pop up menus, including subtitle and\n * captions selection menus.\n *\n * @extends Component\n * @class Menu\n */\nclass Menu extends Component {\n\n  /**\n   * Add a menu item to the menu\n   *\n   * @param {Object|String} component Component or component type to add\n   * @method addItem\n   */\n  addItem(component) {\n    this.addChild(component);\n    component.on('click', Fn.bind(this, function(){\n      this.unlockShowing();\n    }));\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let contentElType = this.options_.contentElType || 'ul';\n    this.contentEl_ = Dom.createEl(contentElType, {\n      className: 'vjs-menu-content'\n    });\n    var el = super.createEl('div', {\n      append: this.contentEl_,\n      className: 'vjs-menu'\n    });\n    el.appendChild(this.contentEl_);\n\n    // Prevent clicks from bubbling up. Needed for Menu Buttons,\n    // where a click on the parent is significant\n    Events.on(el, 'click', function(event){\n      event.preventDefault();\n      event.stopImmediatePropagation();\n    });\n\n    return el;\n  }\n}\n\nComponent.registerComponent('Menu', Menu);\nexport default Menu;\n","/**\n * @file player.js\n */\n // Subclasses Component\nimport Component from './component.js';\n\nimport document from 'global/document';\nimport window from 'global/window';\nimport * as Events from './utils/events.js';\nimport * as Dom from './utils/dom.js';\nimport * as Fn from './utils/fn.js';\nimport * as Guid from './utils/guid.js';\nimport * as browser from './utils/browser.js';\nimport log from './utils/log.js';\nimport toTitleCase from './utils/to-title-case.js';\nimport { createTimeRange } from './utils/time-ranges.js';\nimport { bufferedPercent } from './utils/buffer.js';\nimport * as stylesheet from './utils/stylesheet.js';\nimport FullscreenApi from './fullscreen-api.js';\nimport MediaError from './media-error.js';\nimport safeParseTuple from 'safe-json-parse/tuple';\nimport assign from 'object.assign';\nimport mergeOptions from './utils/merge-options.js';\nimport textTrackConverter from './tracks/text-track-list-converter.js';\n\n// Include required child components (importing also registers them)\nimport MediaLoader from './tech/loader.js';\nimport PosterImage from './poster-image.js';\nimport TextTrackDisplay from './tracks/text-track-display.js';\nimport LoadingSpinner from './loading-spinner.js';\nimport BigPlayButton from './big-play-button.js';\nimport ControlBar from './control-bar/control-bar.js';\nimport ErrorDisplay from './error-display.js';\nimport TextTrackSettings from './tracks/text-track-settings.js';\n\n// Require html5 tech, at least for disposing the original video tag\nimport Html5 from './tech/html5.js';\n\n/**\n * An instance of the `Player` class is created when any of the Video.js setup methods are used to initialize a video.\n * ```js\n * var myPlayer = videojs('example_video_1');\n * ```\n * In the following example, the `data-setup` attribute tells the Video.js library to create a player instance when the library is ready.\n * ```html\n * <video id=\"example_video_1\" data-setup='{}' controls>\n *   <source src=\"my-source.mp4\" type=\"video/mp4\">\n * </video>\n * ```\n * After an instance has been created it can be accessed globally using `Video('example_video_1')`.\n *\n * @param {Element} tag        The original video tag used for configuring options\n * @param {Object=} options    Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends Component\n * @class Player\n */\nclass Player extends Component {\n\n  /**\n   * player's constructor function\n   *\n   * @constructs\n   * @method init\n   * @param {Element} tag        The original video tag used for configuring options\n   * @param {Object=} options    Player options\n   * @param {Function=} ready    Ready callback function\n   */\n  constructor(tag, options, ready){\n    // Make sure tag ID exists\n    tag.id = tag.id || `vjs_video_${Guid.newGUID()}`;\n\n    // Set Options\n    // The options argument overrides options set in the video tag\n    // which overrides globally set options.\n    // This latter part coincides with the load order\n    // (tag must exist before Player)\n    options = assign(Player.getTagSettings(tag), options);\n\n    // Delay the initialization of children because we need to set up\n    // player properties first, and can't use `this` before `super()`\n    options.initChildren = false;\n\n    // Same with creating the element\n    options.createEl = false;\n\n    // we don't want the player to report touch activity on itself\n    // see enableTouchActivity in Component\n    options.reportTouchActivity = false;\n\n    // Run base component initializing with new options\n    super(null, options, ready);\n\n    // if the global option object was accidentally blown away by\n    // someone, bail early with an informative error\n    if (!this.options_ ||\n        !this.options_.techOrder ||\n        !this.options_.techOrder.length) {\n      throw new Error('No techOrder specified. Did you overwrite ' +\n                      'videojs.options instead of just changing the ' +\n                      'properties you want to override?');\n    }\n\n    this.tag = tag; // Store the original tag used to set options\n\n    // Store the tag attributes used to restore html5 element\n    this.tagAttributes = tag && Dom.getElAttributes(tag);\n\n    // Update current language\n    this.language(this.options_.language);\n\n    // Update Supported Languages\n    if (options.languages) {\n      // Normalise player option languages to lowercase\n      let languagesToLower = {};\n\n      Object.getOwnPropertyNames(options.languages).forEach(function(name) {\n        languagesToLower[name.toLowerCase()] = options.languages[name];\n      });\n      this.languages_ = languagesToLower;\n    } else {\n      this.languages_ = Player.prototype.options_.languages;\n    }\n\n    // Cache for video property values.\n    this.cache_ = {};\n\n    // Set poster\n    this.poster_ = options.poster || '';\n\n    // Set controls\n    this.controls_ = !!options.controls;\n\n    // Original tag settings stored in options\n    // now remove immediately so native controls don't flash.\n    // May be turned back on by HTML5 tech if nativeControlsForTouch is true\n    tag.controls = false;\n\n    /*\n     * Store the internal state of scrubbing\n     *\n     * @private\n     * @return {Boolean} True if the user is scrubbing\n     */\n    this.scrubbing_ = false;\n\n    this.el_ = this.createEl();\n\n    // We also want to pass the original player options to each component and plugin\n    // as well so they don't need to reach back into the player for options later.\n    // We also need to do another copy of this.options_ so we don't end up with\n    // an infinite loop.\n    let playerOptionsCopy = mergeOptions(this.options_);\n\n    // Load plugins\n    if (options.plugins) {\n      let plugins = options.plugins;\n\n      Object.getOwnPropertyNames(plugins).forEach(function(name){\n        if (typeof this[name] === 'function') {\n          this[name](plugins[name]);\n        } else {\n          log.error('Unable to find plugin:', name);\n        }\n      }, this);\n    }\n\n    this.options_.playerOptions = playerOptionsCopy;\n\n    this.initChildren();\n\n    // Set isAudio based on whether or not an audio tag was used\n    this.isAudio(tag.nodeName.toLowerCase() === 'audio');\n\n    // Update controls className. Can't do this when the controls are initially\n    // set because the element doesn't exist yet.\n    if (this.controls()) {\n      this.addClass('vjs-controls-enabled');\n    } else {\n      this.addClass('vjs-controls-disabled');\n    }\n\n    if (this.isAudio()) {\n      this.addClass('vjs-audio');\n    }\n\n    if (this.flexNotSupported_()) {\n      this.addClass('vjs-no-flex');\n    }\n\n    // TODO: Make this smarter. Toggle user state between touching/mousing\n    // using events, since devices can have both touch and mouse events.\n    // if (browser.TOUCH_ENABLED) {\n    //   this.addClass('vjs-touch-enabled');\n    // }\n\n    // Make player easily findable by ID\n    Player.players[this.id_] = this;\n\n    // When the player is first initialized, trigger activity so components\n    // like the control bar show themselves if needed\n    this.userActive(true);\n    this.reportUserActivity();\n    this.listenForUserActivity_();\n\n    this.on('fullscreenchange', this.handleFullscreenChange_);\n    this.on('stageclick', this.handleStageClick_);\n  }\n\n  /**\n   * Destroys the video player and does any necessary cleanup\n   * ```js\n   *     myPlayer.dispose();\n   * ```\n   * This is especially helpful if you are dynamically adding and removing videos\n   * to/from the DOM.\n   *\n   * @method dispose\n   */\n  dispose() {\n    this.trigger('dispose');\n    // prevent dispose from being called twice\n    this.off('dispose');\n\n    if (this.styleEl_) {\n      this.styleEl_.parentNode.removeChild(this.styleEl_);\n    }\n\n    // Kill reference to this player\n    Player.players[this.id_] = null;\n    if (this.tag && this.tag.player) { this.tag.player = null; }\n    if (this.el_ && this.el_.player) { this.el_.player = null; }\n\n    if (this.tech_) { this.tech_.dispose(); }\n\n    super.dispose();\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = this.el_ = super.createEl('div');\n    let tag = this.tag;\n\n    // Remove width/height attrs from tag so CSS can make it 100% width/height\n    tag.removeAttribute('width');\n    tag.removeAttribute('height');\n\n    // Copy over all the attributes from the tag, including ID and class\n    // ID will now reference player box, not the video tag\n    const attrs = Dom.getElAttributes(tag);\n\n    Object.getOwnPropertyNames(attrs).forEach(function(attr){\n      // workaround so we don't totally break IE7\n      // http://stackoverflow.com/questions/3653444/css-styles-not-applied-on-dynamic-elements-in-internet-explorer-7\n      if (attr === 'class') {\n        el.className = attrs[attr];\n      } else {\n        el.setAttribute(attr, attrs[attr]);\n      }\n    });\n\n    // Update tag id/class for use as HTML5 playback tech\n    // Might think we should do this after embedding in container so .vjs-tech class\n    // doesn't flash 100% width/height, but class only applies with .video-js parent\n    tag.id += '_html5_api';\n    tag.className = 'vjs-tech';\n\n    // Make player findable on elements\n    tag.player = el.player = this;\n    // Default state of video is paused\n    this.addClass('vjs-paused');\n\n    // Add a style element in the player that we'll use to set the width/height\n    // of the player in a way that's still overrideable by CSS, just like the\n    // video element\n    this.styleEl_ = stylesheet.createStyleElement('vjs-styles-dimensions');\n    let defaultsStyleEl = document.querySelector('.vjs-styles-defaults');\n    let head = document.querySelector('head');\n    head.insertBefore(this.styleEl_, defaultsStyleEl ? defaultsStyleEl.nextSibling : head.firstChild);\n\n    // Pass in the width/height/aspectRatio options which will update the style el\n    this.width(this.options_.width);\n    this.height(this.options_.height);\n    this.fluid(this.options_.fluid);\n    this.aspectRatio(this.options_.aspectRatio);\n\n    // insertElFirst seems to cause the networkState to flicker from 3 to 2, so\n    // keep track of the original for later so we can know if the source originally failed\n    tag.initNetworkState_ = tag.networkState;\n\n    // Wrap video tag in div (el/box) container\n    if (tag.parentNode) {\n      tag.parentNode.insertBefore(el, tag);\n    }\n    Dom.insertElFirst(tag, el); // Breaks iPhone, fixed in HTML5 setup.\n\n    this.el_ = el;\n\n    return el;\n  }\n\n  /**\n   * Get/set player width\n   *\n   * @param {Number=} value Value for width\n   * @return {Number} Width when getting\n   * @method width\n   */\n  width(value) {\n    return this.dimension('width', value);\n  }\n\n  /**\n   * Get/set player height\n   *\n   * @param {Number=} value Value for height\n   * @return {Number} Height when getting\n   * @method height\n   */\n  height(value) {\n    return this.dimension('height', value);\n  }\n\n  /**\n   * Get/set dimension for player\n   *\n   * @param {String} dimension Either width or height\n   * @param {Number=} value Value for dimension\n   * @return {Component}\n   * @method dimension\n   */\n  dimension(dimension, value) {\n    let privDimension = dimension + '_';\n\n    if (value === undefined) {\n      return this[privDimension] || 0;\n    }\n\n    if (value === '') {\n      // If an empty string is given, reset the dimension to be automatic\n      this[privDimension] = undefined;\n    } else {\n      let parsedVal = parseFloat(value);\n\n      if (isNaN(parsedVal)) {\n        log.error(`Improper value \"${value}\" supplied for for ${dimension}`);\n        return this;\n      }\n\n      this[privDimension] = parsedVal;\n    }\n\n    this.updateStyleEl_();\n    return this;\n  }\n\n  /**\n   * Add/remove the vjs-fluid class\n   *\n   * @param {Boolean} bool Value of true adds the class, value of false removes the class\n   * @method fluid\n   */\n  fluid(bool) {\n    if (bool === undefined) {\n      return !!this.fluid_;\n    }\n\n    this.fluid_ = !!bool;\n\n    if (bool) {\n      this.addClass('vjs-fluid');\n    } else {\n      this.removeClass('vjs-fluid');\n    }\n  }\n\n  /**\n   * Get/Set the aspect ratio\n   *\n   * @param {String=} ratio Aspect ratio for player\n   * @return aspectRatio\n   * @method aspectRatio\n   */\n  aspectRatio(ratio) {\n    if (ratio === undefined) {\n      return this.aspectRatio_;\n    }\n\n    // Check for width:height format\n    if (!/^\\d+\\:\\d+$/.test(ratio)) {\n      throw new Error('Improper value supplied for aspect ratio. The format should be width:height, for example 16:9.');\n    }\n    this.aspectRatio_ = ratio;\n\n    // We're assuming if you set an aspect ratio you want fluid mode,\n    // because in fixed mode you could calculate width and height yourself.\n    this.fluid(true);\n\n    this.updateStyleEl_();\n  }\n\n  /**\n   * Update styles of the player element (height, width and aspect ratio)\n   *\n   * @method updateStyleEl_\n   */\n  updateStyleEl_() {\n    let width;\n    let height;\n    let aspectRatio;\n\n    // The aspect ratio is either used directly or to calculate width and height.\n    if (this.aspectRatio_ !== undefined && this.aspectRatio_ !== 'auto') {\n      // Use any aspectRatio that's been specifically set\n      aspectRatio = this.aspectRatio_;\n    } else if (this.videoWidth()) {\n      // Otherwise try to get the aspect ratio from the video metadata\n      aspectRatio = this.videoWidth() + ':' + this.videoHeight();\n    } else {\n      // Or use a default. The video element's is 2:1, but 16:9 is more common.\n      aspectRatio = '16:9';\n    }\n\n    // Get the ratio as a decimal we can use to calculate dimensions\n    let ratioParts = aspectRatio.split(':');\n    let ratioMultiplier = ratioParts[1] / ratioParts[0];\n\n    if (this.width_ !== undefined) {\n      // Use any width that's been specifically set\n      width = this.width_;\n    } else if (this.height_ !== undefined) {\n      // Or calulate the width from the aspect ratio if a height has been set\n      width = this.height_ / ratioMultiplier;\n    } else {\n      // Or use the video's metadata, or use the video el's default of 300\n      width = this.videoWidth() || 300;\n    }\n\n    if (this.height_ !== undefined) {\n      // Use any height that's been specifically set\n      height = this.height_;\n    } else {\n      // Otherwise calculate the height from the ratio and the width\n      height = width  * ratioMultiplier;\n    }\n\n    let idClass = this.id()+'-dimensions';\n\n    // Ensure the right class is still on the player for the style element\n    this.addClass(idClass);\n\n    stylesheet.setTextContent(this.styleEl_, `\n      .${idClass} {\n        width: ${width}px;\n        height: ${height}px;\n      }\n\n      .${idClass}.vjs-fluid {\n        padding-top: ${ratioMultiplier * 100}%;\n      }\n    `);\n  }\n\n  /**\n   * Load the Media Playback Technology (tech)\n   * Load/Create an instance of playback technology including element and API methods\n   * And append playback element in player div.\n   *\n   * @param {String} techName Name of the playback technology\n   * @param {String} source Video source\n   * @method loadTech_\n   * @private\n   */\n  loadTech_(techName, source) {\n\n    // Pause and remove current playback technology\n    if (this.tech_) {\n      this.unloadTech_();\n    }\n\n    // get rid of the HTML5 video tag as soon as we are using another tech\n    if (techName !== 'Html5' && this.tag) {\n      Component.getComponent('Html5').disposeMediaElement(this.tag);\n      this.tag.player = null;\n      this.tag = null;\n    }\n\n    this.techName_ = techName;\n\n    // Turn off API access because we're loading a new tech that might load asynchronously\n    this.isReady_ = false;\n\n    // Grab tech-specific options from player options and add source and parent element to use.\n    var techOptions = assign({\n      'nativeControlsForTouch': this.options_.nativeControlsForTouch,\n      'source': source,\n      'playerId': this.id(),\n      'techId': `${this.id()}_${techName}_api`,\n      'textTracks': this.textTracks_,\n      'autoplay': this.options_.autoplay,\n      'preload': this.options_.preload,\n      'loop': this.options_.loop,\n      'muted': this.options_.muted,\n      'poster': this.poster(),\n      'language': this.language(),\n      'vtt.js': this.options_['vtt.js']\n    }, this.options_[techName.toLowerCase()]);\n\n    if (this.tag) {\n      techOptions.tag = this.tag;\n    }\n\n    if (source) {\n      this.currentType_ = source.type;\n      if (source.src === this.cache_.src && this.cache_.currentTime > 0) {\n        techOptions.startTime = this.cache_.currentTime;\n      }\n\n      this.cache_.src = source.src;\n    }\n\n    // Initialize tech instance\n    let techComponent = Component.getComponent(techName);\n    this.tech_ = new techComponent(techOptions);\n\n    // player.triggerReady is always async, so don't need this to be async\n    this.tech_.ready(Fn.bind(this, this.handleTechReady_), true);\n\n    textTrackConverter.jsonToTextTracks(this.textTracksJson_ || [], this.tech_);\n\n    // Listen to all HTML5-defined events and trigger them on the player\n    this.on(this.tech_, 'loadstart', this.handleTechLoadStart_);\n    this.on(this.tech_, 'waiting', this.handleTechWaiting_);\n    this.on(this.tech_, 'canplay', this.handleTechCanPlay_);\n    this.on(this.tech_, 'canplaythrough', this.handleTechCanPlayThrough_);\n    this.on(this.tech_, 'playing', this.handleTechPlaying_);\n    this.on(this.tech_, 'ended', this.handleTechEnded_);\n    this.on(this.tech_, 'seeking', this.handleTechSeeking_);\n    this.on(this.tech_, 'seeked', this.handleTechSeeked_);\n    this.on(this.tech_, 'play', this.handleTechPlay_);\n    this.on(this.tech_, 'firstplay', this.handleTechFirstPlay_);\n    this.on(this.tech_, 'pause', this.handleTechPause_);\n    this.on(this.tech_, 'progress', this.handleTechProgress_);\n    this.on(this.tech_, 'durationchange', this.handleTechDurationChange_);\n    this.on(this.tech_, 'fullscreenchange', this.handleTechFullscreenChange_);\n    this.on(this.tech_, 'error', this.handleTechError_);\n    this.on(this.tech_, 'suspend', this.handleTechSuspend_);\n    this.on(this.tech_, 'abort', this.handleTechAbort_);\n    this.on(this.tech_, 'emptied', this.handleTechEmptied_);\n    this.on(this.tech_, 'stalled', this.handleTechStalled_);\n    this.on(this.tech_, 'loadedmetadata', this.handleTechLoadedMetaData_);\n    this.on(this.tech_, 'loadeddata', this.handleTechLoadedData_);\n    this.on(this.tech_, 'timeupdate', this.handleTechTimeUpdate_);\n    this.on(this.tech_, 'ratechange', this.handleTechRateChange_);\n    this.on(this.tech_, 'volumechange', this.handleTechVolumeChange_);\n    this.on(this.tech_, 'texttrackchange', this.handleTechTextTrackChange_);\n    this.on(this.tech_, 'loadedmetadata', this.updateStyleEl_);\n    this.on(this.tech_, 'posterchange', this.handleTechPosterChange_);\n\n    this.usingNativeControls(this.techGet_('controls'));\n\n    if (this.controls() && !this.usingNativeControls()) {\n      this.addTechControlsListeners_();\n    }\n\n    // Add the tech element in the DOM if it was not already there\n    // Make sure to not insert the original video element if using Html5\n    if (this.tech_.el().parentNode !== this.el() && (techName !== 'Html5' || !this.tag)) {\n      Dom.insertElFirst(this.tech_.el(), this.el());\n    }\n\n    // Get rid of the original video tag reference after the first tech is loaded\n    if (this.tag) {\n      this.tag.player = null;\n      this.tag = null;\n    }\n  }\n\n  /**\n   * Unload playback technology\n   *\n   * @method unloadTech_\n   * @private\n   */\n  unloadTech_() {\n    // Save the current text tracks so that we can reuse the same text tracks with the next tech\n    this.textTracks_ = this.textTracks();\n    this.textTracksJson_ = textTrackConverter.textTracksToJson(this);\n\n    this.isReady_ = false;\n\n    this.tech_.dispose();\n\n    this.tech_ = false;\n  }\n\n  /**\n   * Set up click and touch listeners for the playback element\n   *\n   * On desktops, a click on the video itself will toggle playback,\n   * on a mobile device a click on the video toggles controls.\n   * (toggling controls is done by toggling the user state between active and\n   * inactive)\n   * A tap can signal that a user has become active, or has become inactive\n   * e.g. a quick tap on an iPhone movie should reveal the controls. Another\n   * quick tap should hide them again (signaling the user is in an inactive\n   * viewing state)\n   * In addition to this, we still want the user to be considered inactive after\n   * a few seconds of inactivity.\n   * Note: the only part of iOS interaction we can't mimic with this setup\n   * is a touch and hold on the video element counting as activity in order to\n   * keep the controls showing, but that shouldn't be an issue. A touch and hold\n   * on any controls will still keep the user active\n   *\n   * @private\n   * @method addTechControlsListeners_\n   */\n  addTechControlsListeners_() {\n    // Make sure to remove all the previous listeners in case we are called multiple times.\n    this.removeTechControlsListeners_();\n\n    // Some browsers (Chrome & IE) don't trigger a click on a flash swf, but do\n    // trigger mousedown/up.\n    // http://stackoverflow.com/questions/1444562/javascript-onclick-event-over-flash-object\n    // Any touch events are set to block the mousedown event from happening\n    this.on(this.tech_, 'mousedown', this.handleTechClick_);\n\n    // If the controls were hidden we don't want that to change without a tap event\n    // so we'll check if the controls were already showing before reporting user\n    // activity\n    this.on(this.tech_, 'touchstart', this.handleTechTouchStart_);\n    this.on(this.tech_, 'touchmove', this.handleTechTouchMove_);\n    this.on(this.tech_, 'touchend', this.handleTechTouchEnd_);\n\n    // The tap listener needs to come after the touchend listener because the tap\n    // listener cancels out any reportedUserActivity when setting userActive(false)\n    this.on(this.tech_, 'tap', this.handleTechTap_);\n  }\n\n  /**\n   * Remove the listeners used for click and tap controls. This is needed for\n   * toggling to controls disabled, where a tap/touch should do nothing.\n   *\n   * @method removeTechControlsListeners_\n   * @private\n   */\n  removeTechControlsListeners_() {\n    // We don't want to just use `this.off()` because there might be other needed\n    // listeners added by techs that extend this.\n    this.off(this.tech_, 'tap', this.handleTechTap_);\n    this.off(this.tech_, 'touchstart', this.handleTechTouchStart_);\n    this.off(this.tech_, 'touchmove', this.handleTechTouchMove_);\n    this.off(this.tech_, 'touchend', this.handleTechTouchEnd_);\n    this.off(this.tech_, 'mousedown', this.handleTechClick_);\n  }\n\n  /**\n   * Player waits for the tech to be ready\n   *\n   * @method handleTechReady_\n   * @private\n   */\n  handleTechReady_() {\n    this.triggerReady();\n\n    // Keep the same volume as before\n    if (this.cache_.volume) {\n      this.techCall_('setVolume', this.cache_.volume);\n    }\n\n    // Look if the tech found a higher resolution poster while loading\n    this.handleTechPosterChange_();\n\n    // Update the duration if available\n    this.handleTechDurationChange_();\n\n    // Chrome and Safari both have issues with autoplay.\n    // In Safari (5.1.1), when we move the video element into the container div, autoplay doesn't work.\n    // In Chrome (15), if you have autoplay + a poster + no controls, the video gets hidden (but audio plays)\n    // This fixes both issues. Need to wait for API, so it updates displays correctly\n    if (this.tag && this.options_.autoplay && this.paused()) {\n      delete this.tag.poster; // Chrome Fix. Fixed in Chrome v16.\n      this.play();\n    }\n  }\n\n  /**\n   * Fired when the user agent begins looking for media data\n   *\n   * @private\n   * @method handleTechLoadStart_\n   */\n  handleTechLoadStart_() {\n    // TODO: Update to use `emptied` event instead. See #1277.\n\n    this.removeClass('vjs-ended');\n\n    // reset the error state\n    this.error(null);\n\n    // If it's already playing we want to trigger a firstplay event now.\n    // The firstplay event relies on both the play and loadstart events\n    // which can happen in any order for a new source\n    if (!this.paused()) {\n      this.trigger('loadstart');\n      this.trigger('firstplay');\n    } else {\n      // reset the hasStarted state\n      this.hasStarted(false);\n      this.trigger('loadstart');\n    }\n  }\n\n  /**\n   * Add/remove the vjs-has-started class\n   *\n   * @param {Boolean} hasStarted The value of true adds the class the value of false remove the class\n   * @return {Boolean} Boolean value if has started\n   * @private\n   * @method hasStarted\n   */\n  hasStarted(hasStarted) {\n    if (hasStarted !== undefined) {\n      // only update if this is a new value\n      if (this.hasStarted_ !== hasStarted) {\n        this.hasStarted_ = hasStarted;\n        if (hasStarted) {\n          this.addClass('vjs-has-started');\n          // trigger the firstplay event if this newly has played\n          this.trigger('firstplay');\n        } else {\n          this.removeClass('vjs-has-started');\n        }\n      }\n      return this;\n    }\n    return !!this.hasStarted_;\n  }\n\n  /**\n   * Fired whenever the media begins or resumes playback\n   *\n   * @private\n   * @method handleTechPlay_\n   */\n  handleTechPlay_() {\n    this.removeClass('vjs-ended');\n    this.removeClass('vjs-paused');\n    this.addClass('vjs-playing');\n\n    // hide the poster when the user hits play\n    // https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-play\n    this.hasStarted(true);\n\n    this.trigger('play');\n  }\n\n  /**\n   * Fired whenever the media begins waiting\n   *\n   * @private\n   * @method handleTechWaiting_\n   */\n  handleTechWaiting_() {\n    this.addClass('vjs-waiting');\n    this.trigger('waiting');\n  }\n\n  /**\n   * A handler for events that signal that waiting has ended\n   * which is not consistent between browsers. See #1351\n   *\n   * @private\n   * @method handleTechCanPlay_\n   */\n  handleTechCanPlay_() {\n    this.removeClass('vjs-waiting');\n    this.trigger('canplay');\n  }\n\n  /**\n   * A handler for events that signal that waiting has ended\n   * which is not consistent between browsers. See #1351\n   *\n   * @private\n   * @method handleTechCanPlayThrough_\n   */\n  handleTechCanPlayThrough_() {\n    this.removeClass('vjs-waiting');\n    this.trigger('canplaythrough');\n  }\n\n  /**\n   * A handler for events that signal that waiting has ended\n   * which is not consistent between browsers. See #1351\n   *\n   * @private\n   * @method handleTechPlaying_\n   */\n  handleTechPlaying_() {\n    this.removeClass('vjs-waiting');\n    this.trigger('playing');\n  }\n\n  /**\n   * Fired whenever the player is jumping to a new time\n   *\n   * @private\n   * @method handleTechSeeking_\n   */\n  handleTechSeeking_() {\n    this.addClass('vjs-seeking');\n    this.trigger('seeking');\n  }\n\n  /**\n   * Fired when the player has finished jumping to a new time\n   *\n   * @private\n   * @method handleTechSeeked_\n   */\n  handleTechSeeked_() {\n    this.removeClass('vjs-seeking');\n    this.trigger('seeked');\n  }\n\n  /**\n   * Fired the first time a video is played\n   * Not part of the HLS spec, and we're not sure if this is the best\n   * implementation yet, so use sparingly. If you don't have a reason to\n   * prevent playback, use `myPlayer.one('play');` instead.\n   *\n   * @private\n   * @method handleTechFirstPlay_\n   */\n  handleTechFirstPlay_() {\n    //If the first starttime attribute is specified\n    //then we will start at the given offset in seconds\n    if(this.options_.starttime){\n      this.currentTime(this.options_.starttime);\n    }\n\n    this.addClass('vjs-has-started');\n    this.trigger('firstplay');\n  }\n\n  /**\n   * Fired whenever the media has been paused\n   *\n   * @private\n   * @method handleTechPause_\n   */\n  handleTechPause_() {\n    this.removeClass('vjs-playing');\n    this.addClass('vjs-paused');\n    this.trigger('pause');\n  }\n\n  /**\n   * Fired while the user agent is downloading media data\n   *\n   * @private\n   * @method handleTechProgress_\n   */\n  handleTechProgress_() {\n    this.trigger('progress');\n  }\n\n  /**\n   * Fired when the end of the media resource is reached (currentTime == duration)\n   *\n   * @private\n   * @method handleTechEnded_\n   */\n  handleTechEnded_() {\n    this.addClass('vjs-ended');\n    if (this.options_.loop) {\n      this.currentTime(0);\n      this.play();\n    } else if (!this.paused()) {\n      this.pause();\n    }\n\n    this.trigger('ended');\n  }\n\n  /**\n   * Fired when the duration of the media resource is first known or changed\n   *\n   * @private\n   * @method handleTechDurationChange_\n   */\n  handleTechDurationChange_() {\n    this.duration(this.techGet_('duration'));\n  }\n\n  /**\n   * Handle a click on the media element to play/pause\n   *\n   * @param {Object=} event Event object\n   * @private\n   * @method handleTechClick_\n   */\n  handleTechClick_(event) {\n    // We're using mousedown to detect clicks thanks to Flash, but mousedown\n    // will also be triggered with right-clicks, so we need to prevent that\n    if (event.button !== 0) return;\n\n    // When controls are disabled a click should not toggle playback because\n    // the click is considered a control\n    if (this.controls()) {\n      if (this.paused()) {\n        this.play();\n      } else {\n        this.pause();\n      }\n    }\n  }\n\n  /**\n   * Handle a tap on the media element. It will toggle the user\n   * activity state, which hides and shows the controls.\n   *\n   * @private\n   * @method handleTechTap_\n   */\n  handleTechTap_() {\n    this.userActive(!this.userActive());\n  }\n\n  /**\n   * Handle touch to start\n   *\n   * @private\n   * @method handleTechTouchStart_\n   */\n  handleTechTouchStart_() {\n    this.userWasActive = this.userActive();\n  }\n\n  /**\n   * Handle touch to move\n   *\n   * @private\n   * @method handleTechTouchMove_\n   */\n  handleTechTouchMove_() {\n    if (this.userWasActive){\n      this.reportUserActivity();\n    }\n  }\n\n  /**\n   * Handle touch to end\n   *\n   * @private\n   * @method handleTechTouchEnd_\n   */\n  handleTechTouchEnd_(event) {\n    // Stop the mouse events from also happening\n    event.preventDefault();\n  }\n\n  /**\n   * Fired when the player switches in or out of fullscreen mode\n   *\n   * @private\n   * @method handleFullscreenChange_\n   */\n  handleFullscreenChange_() {\n    if (this.isFullscreen()) {\n      this.addClass('vjs-fullscreen');\n    } else {\n      this.removeClass('vjs-fullscreen');\n    }\n  }\n\n  /**\n   * native click events on the SWF aren't triggered on IE11, Win8.1RT\n   * use stageclick events triggered from inside the SWF instead\n   *\n   * @private\n   * @method handleStageClick_\n   */\n  handleStageClick_() {\n    this.reportUserActivity();\n  }\n\n  /**\n   * Handle Tech Fullscreen Change\n   *\n   * @private\n   * @method handleTechFullscreenChange_\n   */\n  handleTechFullscreenChange_(event, data) {\n    if (data) {\n      this.isFullscreen(data.isFullscreen);\n    }\n    this.trigger('fullscreenchange');\n  }\n\n  /**\n   * Fires when an error occurred during the loading of an audio/video\n   *\n   * @private\n   * @method handleTechError_\n   */\n  handleTechError_() {\n    let error = this.tech_.error();\n    this.error(error && error.code);\n  }\n\n  /**\n   * Fires when the browser is intentionally not getting media data\n   *\n   * @private\n   * @method handleTechSuspend_\n   */\n  handleTechSuspend_() {\n    this.trigger('suspend');\n  }\n\n  /**\n   * Fires when the loading of an audio/video is aborted\n   *\n   * @private\n   * @method handleTechAbort_\n   */\n  handleTechAbort_() {\n    this.trigger('abort');\n  }\n\n  /**\n   * Fires when the current playlist is empty\n   *\n   * @private\n   * @method handleTechEmptied_\n   */\n  handleTechEmptied_() {\n    this.trigger('emptied');\n  }\n\n  /**\n   * Fires when the browser is trying to get media data, but data is not available\n   *\n   * @private\n   * @method handleTechStalled_\n   */\n  handleTechStalled_() {\n    this.trigger('stalled');\n  }\n\n  /**\n   * Fires when the browser has loaded meta data for the audio/video\n   *\n   * @private\n   * @method handleTechLoadedMetaData_\n   */\n  handleTechLoadedMetaData_() {\n    this.trigger('loadedmetadata');\n  }\n\n  /**\n   * Fires when the browser has loaded the current frame of the audio/video\n   *\n   * @private\n   * @method handleTechLoadedData_\n   */\n  handleTechLoadedData_() {\n    this.trigger('loadeddata');\n  }\n\n  /**\n   * Fires when the current playback position has changed\n   *\n   * @private\n   * @method handleTechTimeUpdate_\n   */\n  handleTechTimeUpdate_() {\n    this.trigger('timeupdate');\n  }\n\n  /**\n   * Fires when the playing speed of the audio/video is changed\n   *\n   * @private\n   * @method handleTechRateChange_\n   */\n  handleTechRateChange_() {\n    this.trigger('ratechange');\n  }\n\n  /**\n   * Fires when the volume has been changed\n   *\n   * @private\n   * @method handleTechVolumeChange_\n   */\n  handleTechVolumeChange_() {\n    this.trigger('volumechange');\n  }\n\n  /**\n   * Fires when the text track has been changed\n   *\n   * @private\n   * @method handleTechTextTrackChange_\n   */\n  handleTechTextTrackChange_() {\n    this.trigger('texttrackchange');\n  }\n\n  /**\n   * Get object for cached values.\n   *\n   * @return {Object}\n   * @method getCache\n   */\n  getCache() {\n    return this.cache_;\n  }\n\n  /**\n   * Pass values to the playback tech\n   *\n   * @param {String=} method Method\n   * @param {Object=} arg Argument\n   * @private\n   * @method techCall_\n   */\n  techCall_(method, arg) {\n    // If it's not ready yet, call method when it is\n    if (this.tech_ && !this.tech_.isReady_) {\n      this.tech_.ready(function(){\n        this[method](arg);\n      }, true);\n\n    // Otherwise call method now\n    } else {\n      try {\n        this.tech_[method](arg);\n      } catch(e) {\n        log(e);\n        throw e;\n      }\n    }\n  }\n\n  /**\n   * Get calls can't wait for the tech, and sometimes don't need to.\n   *\n   * @param {String} method Tech method\n   * @return {Method}\n   * @private\n   * @method techGet_\n   */\n  techGet_(method) {\n    if (this.tech_ && this.tech_.isReady_) {\n\n      // Flash likes to die and reload when you hide or reposition it.\n      // In these cases the object methods go away and we get errors.\n      // When that happens we'll catch the errors and inform tech that it's not ready any more.\n      try {\n        return this.tech_[method]();\n      } catch(e) {\n        // When building additional tech libs, an expected method may not be defined yet\n        if (this.tech_[method] === undefined) {\n          log(`Video.js: ${method} method not defined for ${this.techName_} playback technology.`, e);\n        } else {\n          // When a method isn't available on the object it throws a TypeError\n          if (e.name === 'TypeError') {\n            log(`Video.js: ${method} unavailable on ${this.techName_} playback technology element.`, e);\n            this.tech_.isReady_ = false;\n          } else {\n            log(e);\n          }\n        }\n        throw e;\n      }\n    }\n\n    return;\n  }\n\n  /**\n   * start media playback\n   * ```js\n   *     myPlayer.play();\n   * ```\n   *\n   * @return {Player} self\n   * @method play\n   */\n  play() {\n    this.techCall_('play');\n    return this;\n  }\n\n  /**\n   * Pause the video playback\n   * ```js\n   *     myPlayer.pause();\n   * ```\n   *\n   * @return {Player} self\n   * @method pause\n   */\n  pause() {\n    this.techCall_('pause');\n    return this;\n  }\n\n  /**\n   * Check if the player is paused\n   * ```js\n   *     var isPaused = myPlayer.paused();\n   *     var isPlaying = !myPlayer.paused();\n   * ```\n   *\n   * @return {Boolean} false if the media is currently playing, or true otherwise\n   * @method paused\n   */\n  paused() {\n    // The initial state of paused should be true (in Safari it's actually false)\n    return (this.techGet_('paused') === false) ? false : true;\n  }\n\n  /**\n   * Returns whether or not the user is \"scrubbing\". Scrubbing is when the user\n   * has clicked the progress bar handle and is dragging it along the progress bar.\n   *\n   * @param  {Boolean} isScrubbing   True/false the user is scrubbing\n   * @return {Boolean}               The scrubbing status when getting\n   * @return {Object}                The player when setting\n   * @method scrubbing\n   */\n  scrubbing(isScrubbing) {\n    if (isScrubbing !== undefined) {\n      this.scrubbing_ = !!isScrubbing;\n\n      if (isScrubbing) {\n        this.addClass('vjs-scrubbing');\n      } else {\n        this.removeClass('vjs-scrubbing');\n      }\n\n      return this;\n    }\n\n    return this.scrubbing_;\n  }\n\n  /**\n   * Get or set the current time (in seconds)\n   * ```js\n   *     // get\n   *     var whereYouAt = myPlayer.currentTime();\n   *     // set\n   *     myPlayer.currentTime(120); // 2 minutes into the video\n   * ```\n   *\n   * @param  {Number|String=} seconds The time to seek to\n   * @return {Number}        The time in seconds, when not setting\n   * @return {Player}    self, when the current time is set\n   * @method currentTime\n   */\n  currentTime(seconds) {\n    if (seconds !== undefined) {\n\n      this.techCall_('setCurrentTime', seconds);\n\n      return this;\n    }\n\n    // cache last currentTime and return. default to 0 seconds\n    //\n    // Caching the currentTime is meant to prevent a massive amount of reads on the tech's\n    // currentTime when scrubbing, but may not provide much performance benefit afterall.\n    // Should be tested. Also something has to read the actual current time or the cache will\n    // never get updated.\n    return this.cache_.currentTime = (this.techGet_('currentTime') || 0);\n  }\n\n  /**\n   * Get the length in time of the video in seconds\n   * ```js\n   *     var lengthOfVideo = myPlayer.duration();\n   * ```\n   * **NOTE**: The video must have started loading before the duration can be\n   * known, and in the case of Flash, may not be known until the video starts\n   * playing.\n   *\n   * @param {Number} seconds Duration when setting\n   * @return {Number} The duration of the video in seconds when getting\n   * @method duration\n   */\n  duration(seconds) {\n    if (seconds === undefined) {\n      return this.cache_.duration || 0;\n    }\n\n    seconds = parseFloat(seconds) || 0;\n\n    // Standardize on Inifity for signaling video is live\n    if (seconds < 0) {\n      seconds = Infinity;\n    }\n\n    if (seconds !== this.cache_.duration) {\n      // Cache the last set value for optimized scrubbing (esp. Flash)\n      this.cache_.duration = seconds;\n\n      if (seconds === Infinity) {\n        this.addClass('vjs-live');\n      } else {\n        this.removeClass('vjs-live');\n      }\n\n      this.trigger('durationchange');\n    }\n\n    return this;\n  }\n\n  /**\n   * Calculates how much time is left.\n   * ```js\n   *     var timeLeft = myPlayer.remainingTime();\n   * ```\n   * Not a native video element function, but useful\n   *\n   * @return {Number} The time remaining in seconds\n   * @method remainingTime\n   */\n  remainingTime() {\n    return this.duration() - this.currentTime();\n  }\n\n  // http://dev.w3.org/html5/spec/video.html#dom-media-buffered\n  // Buffered returns a timerange object.\n  // Kind of like an array of portions of the video that have been downloaded.\n\n  /**\n   * Get a TimeRange object with the times of the video that have been downloaded\n   * If you just want the percent of the video that's been downloaded,\n   * use bufferedPercent.\n   * ```js\n   *     // Number of different ranges of time have been buffered. Usually 1.\n   *     numberOfRanges = bufferedTimeRange.length,\n   *     // Time in seconds when the first range starts. Usually 0.\n   *     firstRangeStart = bufferedTimeRange.start(0),\n   *     // Time in seconds when the first range ends\n   *     firstRangeEnd = bufferedTimeRange.end(0),\n   *     // Length in seconds of the first time range\n   *     firstRangeLength = firstRangeEnd - firstRangeStart;\n   * ```\n   *\n   * @return {Object} A mock TimeRange object (following HTML spec)\n   * @method buffered\n   */\n  buffered() {\n    var buffered = this.techGet_('buffered');\n\n    if (!buffered || !buffered.length) {\n      buffered = createTimeRange(0,0);\n    }\n\n    return buffered;\n  }\n\n  /**\n   * Get the percent (as a decimal) of the video that's been downloaded\n   * ```js\n   *     var howMuchIsDownloaded = myPlayer.bufferedPercent();\n   * ```\n   * 0 means none, 1 means all.\n   * (This method isn't in the HTML5 spec, but it's very convenient)\n   *\n   * @return {Number} A decimal between 0 and 1 representing the percent\n   * @method bufferedPercent\n   */\n  bufferedPercent() {\n    return bufferedPercent(this.buffered(), this.duration());\n  }\n\n  /**\n   * Get the ending time of the last buffered time range\n   * This is used in the progress bar to encapsulate all time ranges.\n   *\n   * @return {Number} The end of the last buffered time range\n   * @method bufferedEnd\n   */\n  bufferedEnd() {\n    var buffered = this.buffered(),\n        duration = this.duration(),\n        end = buffered.end(buffered.length-1);\n\n    if (end > duration) {\n      end = duration;\n    }\n\n    return end;\n  }\n\n  /**\n   * Get or set the current volume of the media\n   * ```js\n   *     // get\n   *     var howLoudIsIt = myPlayer.volume();\n   *     // set\n   *     myPlayer.volume(0.5); // Set volume to half\n   * ```\n   * 0 is off (muted), 1.0 is all the way up, 0.5 is half way.\n   *\n   * @param  {Number} percentAsDecimal The new volume as a decimal percent\n   * @return {Number}              The current volume when getting\n   * @return {Player}              self when setting\n   * @method volume\n   */\n  volume(percentAsDecimal) {\n    let vol;\n\n    if (percentAsDecimal !== undefined) {\n      vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal))); // Force value to between 0 and 1\n      this.cache_.volume = vol;\n      this.techCall_('setVolume', vol);\n\n      return this;\n    }\n\n    // Default to 1 when returning current volume.\n    vol = parseFloat(this.techGet_('volume'));\n    return (isNaN(vol)) ? 1 : vol;\n  }\n\n\n  /**\n   * Get the current muted state, or turn mute on or off\n   * ```js\n   *     // get\n   *     var isVolumeMuted = myPlayer.muted();\n   *     // set\n   *     myPlayer.muted(true); // mute the volume\n   * ```\n   *\n   * @param  {Boolean=} muted True to mute, false to unmute\n   * @return {Boolean} True if mute is on, false if not when getting\n   * @return {Player} self when setting mute\n   * @method muted\n   */\n  muted(muted) {\n    if (muted !== undefined) {\n      this.techCall_('setMuted', muted);\n      return this;\n    }\n    return this.techGet_('muted') || false; // Default to false\n  }\n\n  // Check if current tech can support native fullscreen\n  // (e.g. with built in controls like iOS, so not our flash swf)\n  /**\n   * Check to see if fullscreen is supported\n   *\n   * @return {Boolean}\n   * @method supportsFullScreen\n   */\n  supportsFullScreen() {\n    return this.techGet_('supportsFullScreen') || false;\n  }\n\n  /**\n   * Check if the player is in fullscreen mode\n   * ```js\n   *     // get\n   *     var fullscreenOrNot = myPlayer.isFullscreen();\n   *     // set\n   *     myPlayer.isFullscreen(true); // tell the player it's in fullscreen\n   * ```\n   * NOTE: As of the latest HTML5 spec, isFullscreen is no longer an official\n   * property and instead document.fullscreenElement is used. But isFullscreen is\n   * still a valuable property for internal player workings.\n   *\n   * @param  {Boolean=} isFS Update the player's fullscreen state\n   * @return {Boolean} true if fullscreen false if not when getting\n   * @return {Player} self when setting\n   * @method isFullscreen\n   */\n  isFullscreen(isFS) {\n    if (isFS !== undefined) {\n      this.isFullscreen_ = !!isFS;\n      return this;\n    }\n    return !!this.isFullscreen_;\n  }\n\n  /**\n   * Increase the size of the video to full screen\n   * ```js\n   *     myPlayer.requestFullscreen();\n   * ```\n   * In some browsers, full screen is not supported natively, so it enters\n   * \"full window mode\", where the video fills the browser window.\n   * In browsers and devices that support native full screen, sometimes the\n   * browser's default controls will be shown, and not the Video.js custom skin.\n   * This includes most mobile devices (iOS, Android) and older versions of\n   * Safari.\n   *\n   * @return {Player} self\n   * @method requestFullscreen\n   */\n  requestFullscreen() {\n    var fsApi = FullscreenApi;\n\n    this.isFullscreen(true);\n\n    if (fsApi.requestFullscreen) {\n      // the browser supports going fullscreen at the element level so we can\n      // take the controls fullscreen as well as the video\n\n      // Trigger fullscreenchange event after change\n      // We have to specifically add this each time, and remove\n      // when canceling fullscreen. Otherwise if there's multiple\n      // players on a page, they would all be reacting to the same fullscreen\n      // events\n      Events.on(document, fsApi.fullscreenchange, Fn.bind(this, function documentFullscreenChange(e){\n        this.isFullscreen(document[fsApi.fullscreenElement]);\n\n        // If cancelling fullscreen, remove event listener.\n        if (this.isFullscreen() === false) {\n          Events.off(document, fsApi.fullscreenchange, documentFullscreenChange);\n        }\n\n        this.trigger('fullscreenchange');\n      }));\n\n      this.el_[fsApi.requestFullscreen]();\n\n    } else if (this.tech_.supportsFullScreen()) {\n      // we can't take the video.js controls fullscreen but we can go fullscreen\n      // with native controls\n      this.techCall_('enterFullScreen');\n    } else {\n      // fullscreen isn't supported so we'll just stretch the video element to\n      // fill the viewport\n      this.enterFullWindow();\n      this.trigger('fullscreenchange');\n    }\n\n    return this;\n  }\n\n  /**\n   * Return the video to its normal size after having been in full screen mode\n   * ```js\n   *     myPlayer.exitFullscreen();\n   * ```\n   *\n   * @return {Player} self\n   * @method exitFullscreen\n   */\n  exitFullscreen() {\n    var fsApi = FullscreenApi;\n    this.isFullscreen(false);\n\n    // Check for browser element fullscreen support\n    if (fsApi.requestFullscreen) {\n      document[fsApi.exitFullscreen]();\n    } else if (this.tech_.supportsFullScreen()) {\n     this.techCall_('exitFullScreen');\n    } else {\n     this.exitFullWindow();\n     this.trigger('fullscreenchange');\n    }\n\n    return this;\n  }\n\n  /**\n   * When fullscreen isn't supported we can stretch the video container to as wide as the browser will let us.\n   *\n   * @method enterFullWindow\n   */\n  enterFullWindow() {\n    this.isFullWindow = true;\n\n    // Storing original doc overflow value to return to when fullscreen is off\n    this.docOrigOverflow = document.documentElement.style.overflow;\n\n    // Add listener for esc key to exit fullscreen\n    Events.on(document, 'keydown', Fn.bind(this, this.fullWindowOnEscKey));\n\n    // Hide any scroll bars\n    document.documentElement.style.overflow = 'hidden';\n\n    // Apply fullscreen styles\n    Dom.addElClass(document.body, 'vjs-full-window');\n\n    this.trigger('enterFullWindow');\n  }\n\n  /**\n   * Check for call to either exit full window or full screen on ESC key\n   *\n   * @param {String} event Event to check for key press\n   * @method fullWindowOnEscKey\n   */\n  fullWindowOnEscKey(event) {\n    if (event.keyCode === 27) {\n      if (this.isFullscreen() === true) {\n        this.exitFullscreen();\n      } else {\n        this.exitFullWindow();\n      }\n    }\n  }\n\n  /**\n   * Exit full window\n   *\n   * @method exitFullWindow\n   */\n  exitFullWindow() {\n    this.isFullWindow = false;\n    Events.off(document, 'keydown', this.fullWindowOnEscKey);\n\n    // Unhide scroll bars.\n    document.documentElement.style.overflow = this.docOrigOverflow;\n\n    // Remove fullscreen styles\n    Dom.removeElClass(document.body, 'vjs-full-window');\n\n    // Resize the box, controller, and poster to original sizes\n    // this.positionAll();\n    this.trigger('exitFullWindow');\n  }\n\n  /**\n   * Select source based on tech order\n   *\n   * @param {Array} sources The sources for a media asset\n   * @return {Object|Boolean} Object of source and tech order, otherwise false\n   * @method selectSource\n   */\n  selectSource(sources) {\n    // Loop through each playback technology in the options order\n    for (var i=0,j=this.options_.techOrder;i<j.length;i++) {\n      let techName = toTitleCase(j[i]);\n      let tech = Component.getComponent(techName);\n\n      // Check if the current tech is defined before continuing\n      if (!tech) {\n        log.error(`The \"${techName}\" tech is undefined. Skipped browser support check for that tech.`);\n        continue;\n      }\n\n      // Check if the browser supports this technology\n      if (tech.isSupported()) {\n        // Loop through each source object\n        for (var a=0,b=sources;a<b.length;a++) {\n          var source = b[a];\n\n          // Check if source can be played with this technology\n          if (tech.canPlaySource(source)) {\n            return { source: source, tech: techName };\n          }\n        }\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * The source function updates the video source\n   * There are three types of variables you can pass as the argument.\n   * **URL String**: A URL to the the video file. Use this method if you are sure\n   * the current playback technology (HTML5/Flash) can support the source you\n   * provide. Currently only MP4 files can be used in both HTML5 and Flash.\n   * ```js\n   *     myPlayer.src(\"http://www.example.com/path/to/video.mp4\");\n   * ```\n   * **Source Object (or element):* * A javascript object containing information\n   * about the source file. Use this method if you want the player to determine if\n   * it can support the file using the type information.\n   * ```js\n   *     myPlayer.src({ type: \"video/mp4\", src: \"http://www.example.com/path/to/video.mp4\" });\n   * ```\n   * **Array of Source Objects:* * To provide multiple versions of the source so\n   * that it can be played using HTML5 across browsers you can use an array of\n   * source objects. Video.js will detect which version is supported and load that\n   * file.\n   * ```js\n   *     myPlayer.src([\n   *       { type: \"video/mp4\", src: \"http://www.example.com/path/to/video.mp4\" },\n   *       { type: \"video/webm\", src: \"http://www.example.com/path/to/video.webm\" },\n   *       { type: \"video/ogg\", src: \"http://www.example.com/path/to/video.ogv\" }\n   *     ]);\n   * ```\n   *\n   * @param  {String|Object|Array=} source The source URL, object, or array of sources\n   * @return {String} The current video source when getting\n   * @return {String} The player when setting\n   * @method src\n   */\n  src(source) {\n    if (source === undefined) {\n      return this.techGet_('src');\n    }\n\n    let currentTech = Component.getComponent(this.techName_);\n\n    // case: Array of source objects to choose from and pick the best to play\n    if (Array.isArray(source)) {\n      this.sourceList_(source);\n\n    // case: URL String (http://myvideo...)\n    } else if (typeof source === 'string') {\n      // create a source object from the string\n      this.src({ src: source });\n\n    // case: Source object { src: '', type: '' ... }\n    } else if (source instanceof Object) {\n      // check if the source has a type and the loaded tech cannot play the source\n      // if there's no type we'll just try the current tech\n      if (source.type && !currentTech.canPlaySource(source)) {\n        // create a source list with the current source and send through\n        // the tech loop to check for a compatible technology\n        this.sourceList_([source]);\n      } else {\n        this.cache_.src = source.src;\n        this.currentType_ = source.type || '';\n\n        // wait until the tech is ready to set the source\n        this.ready(function(){\n\n          // The setSource tech method was added with source handlers\n          // so older techs won't support it\n          // We need to check the direct prototype for the case where subclasses\n          // of the tech do not support source handlers\n          if (currentTech.prototype.hasOwnProperty('setSource')) {\n            this.techCall_('setSource', source);\n          } else {\n            this.techCall_('src', source.src);\n          }\n\n          if (this.options_.preload === 'auto') {\n            this.load();\n          }\n\n          if (this.options_.autoplay) {\n            this.play();\n          }\n\n        // Set the source synchronously if possible (#2326)\n        }, true);\n      }\n    }\n\n    return this;\n  }\n\n  /**\n   * Handle an array of source objects\n   *\n   * @param  {Array} sources Array of source objects\n   * @private\n   * @method sourceList_\n   */\n  sourceList_(sources) {\n    var sourceTech = this.selectSource(sources);\n\n    if (sourceTech) {\n      if (sourceTech.tech === this.techName_) {\n        // if this technology is already loaded, set the source\n        this.src(sourceTech.source);\n      } else {\n        // load this technology with the chosen source\n        this.loadTech_(sourceTech.tech, sourceTech.source);\n      }\n    } else {\n      // We need to wrap this in a timeout to give folks a chance to add error event handlers\n      this.setTimeout( function() {\n        this.error({ code: 4, message: this.localize(this.options_.notSupportedMessage) });\n      }, 0);\n\n      // we could not find an appropriate tech, but let's still notify the delegate that this is it\n      // this needs a better comment about why this is needed\n      this.triggerReady();\n    }\n  }\n\n  /**\n   * Begin loading the src data.\n   *\n   * @return {Player} Returns the player\n   * @method load\n   */\n  load() {\n    this.techCall_('load');\n    return this;\n  }\n\n  /**\n   * Returns the fully qualified URL of the current source value e.g. http://mysite.com/video.mp4\n   * Can be used in conjuction with `currentType` to assist in rebuilding the current source object.\n   *\n   * @return {String} The current source\n   * @method currentSrc\n   */\n  currentSrc() {\n    return this.techGet_('currentSrc') || this.cache_.src || '';\n  }\n\n  /**\n   * Get the current source type e.g. video/mp4\n   * This can allow you rebuild the current source object so that you could load the same\n   * source and tech later\n   *\n   * @return {String} The source MIME type\n   * @method currentType\n   */\n  currentType() {\n    return this.currentType_ || '';\n  }\n\n  /**\n   * Get or set the preload attribute\n   *\n   * @param {Boolean} value Boolean to determine if preload should be used\n   * @return {String} The preload attribute value when getting\n   * @return {Player} Returns the player when setting\n   * @method preload\n   */\n  preload(value) {\n    if (value !== undefined) {\n      this.techCall_('setPreload', value);\n      this.options_.preload = value;\n      return this;\n    }\n    return this.techGet_('preload');\n  }\n\n  /**\n   * Get or set the autoplay attribute.\n   *\n   * @param {Boolean} value Boolean to determine if preload should be used\n   * @return {String} The autoplay attribute value when getting\n   * @return {Player} Returns the player when setting\n   * @method autoplay\n   */\n  autoplay(value) {\n    if (value !== undefined) {\n      this.techCall_('setAutoplay', value);\n      this.options_.autoplay = value;\n      return this;\n    }\n    return this.techGet_('autoplay', value);\n  }\n\n  /**\n   * Get or set the loop attribute on the video element.\n   *\n   * @param {Boolean} value Boolean to determine if preload should be used\n   * @return {String} The loop attribute value when getting\n   * @return {Player} Returns the player when setting\n   * @method loop\n   */\n  loop(value) {\n    if (value !== undefined) {\n      this.techCall_('setLoop', value);\n      this.options_['loop'] = value;\n      return this;\n    }\n    return this.techGet_('loop');\n  }\n\n  /**\n   * Get or set the poster image source url\n   *\n   * ##### EXAMPLE:\n   * ```js\n   *     // get\n   *     var currentPoster = myPlayer.poster();\n   *     // set\n   *     myPlayer.poster('http://example.com/myImage.jpg');\n   * ```\n   *\n   * @param  {String=} src Poster image source URL\n   * @return {String} poster URL when getting\n   * @return {Player} self when setting\n   * @method poster\n   */\n  poster(src) {\n    if (src === undefined) {\n      return this.poster_;\n    }\n\n    // The correct way to remove a poster is to set as an empty string\n    // other falsey values will throw errors\n    if (!src) {\n      src = '';\n    }\n\n    // update the internal poster variable\n    this.poster_ = src;\n\n    // update the tech's poster\n    this.techCall_('setPoster', src);\n\n    // alert components that the poster has been set\n    this.trigger('posterchange');\n\n    return this;\n  }\n\n  /**\n   * Some techs (e.g. YouTube) can provide a poster source in an\n   * asynchronous way. We want the poster component to use this\n   * poster source so that it covers up the tech's controls.\n   * (YouTube's play button). However we only want to use this\n   * soruce if the player user hasn't set a poster through\n   * the normal APIs.\n   *\n   * @private\n   * @method handleTechPosterChange_\n   */\n  handleTechPosterChange_() {\n    if (!this.poster_ && this.tech_ && this.tech_.poster) {\n      this.poster_ = this.tech_.poster() || '';\n\n      // Let components know the poster has changed\n      this.trigger('posterchange');\n    }\n  }\n\n  /**\n   * Get or set whether or not the controls are showing.\n   *\n   * @param  {Boolean} bool Set controls to showing or not\n   * @return {Boolean}    Controls are showing\n   * @method controls\n   */\n  controls(bool) {\n    if (bool !== undefined) {\n      bool = !!bool; // force boolean\n      // Don't trigger a change event unless it actually changed\n      if (this.controls_ !== bool) {\n        this.controls_ = bool;\n\n        if (this.usingNativeControls()) {\n          this.techCall_('setControls', bool);\n        }\n\n        if (bool) {\n          this.removeClass('vjs-controls-disabled');\n          this.addClass('vjs-controls-enabled');\n          this.trigger('controlsenabled');\n\n          if (!this.usingNativeControls()) {\n            this.addTechControlsListeners_();\n          }\n        } else {\n          this.removeClass('vjs-controls-enabled');\n          this.addClass('vjs-controls-disabled');\n          this.trigger('controlsdisabled');\n\n          if (!this.usingNativeControls()) {\n            this.removeTechControlsListeners_();\n          }\n        }\n      }\n      return this;\n    }\n    return !!this.controls_;\n  }\n\n  /**\n   * Toggle native controls on/off. Native controls are the controls built into\n   * devices (e.g. default iPhone controls), Flash, or other techs\n   * (e.g. Vimeo Controls)\n   * **This should only be set by the current tech, because only the tech knows\n   * if it can support native controls**\n   *\n   * @param  {Boolean} bool    True signals that native controls are on\n   * @return {Player}      Returns the player\n   * @private\n   * @method usingNativeControls\n   */\n  usingNativeControls(bool) {\n    if (bool !== undefined) {\n      bool = !!bool; // force boolean\n      // Don't trigger a change event unless it actually changed\n      if (this.usingNativeControls_ !== bool) {\n        this.usingNativeControls_ = bool;\n        if (bool) {\n          this.addClass('vjs-using-native-controls');\n\n          /**\n            * player is using the native device controls\n           *\n            * @event usingnativecontrols\n            * @memberof Player\n            * @instance\n            * @private\n            */\n          this.trigger('usingnativecontrols');\n        } else {\n          this.removeClass('vjs-using-native-controls');\n\n          /**\n            * player is using the custom HTML controls\n           *\n            * @event usingcustomcontrols\n            * @memberof Player\n            * @instance\n            * @private\n            */\n          this.trigger('usingcustomcontrols');\n        }\n      }\n      return this;\n    }\n    return !!this.usingNativeControls_;\n  }\n\n  /**\n   * Set or get the current MediaError\n   *\n   * @param  {*} err A MediaError or a String/Number to be turned into a MediaError\n   * @return {MediaError|null}     when getting\n   * @return {Player}              when setting\n   * @method error\n   */\n  error(err) {\n    if (err === undefined) {\n      return this.error_ || null;\n    }\n\n    // restoring to default\n    if (err === null) {\n      this.error_ = err;\n      this.removeClass('vjs-error');\n      return this;\n    }\n\n    // error instance\n    if (err instanceof MediaError) {\n      this.error_ = err;\n    } else {\n      this.error_ = new MediaError(err);\n    }\n\n    // fire an error event on the player\n    this.trigger('error');\n\n    // add the vjs-error classname to the player\n    this.addClass('vjs-error');\n\n    // log the name of the error type and any message\n    // ie8 just logs \"[object object]\" if you just log the error object\n    log.error(`(CODE:${this.error_.code} ${MediaError.errorTypes[this.error_.code]})`, this.error_.message, this.error_);\n\n    return this;\n  }\n\n  /**\n   * Returns whether or not the player is in the \"ended\" state.\n   *\n   * @return {Boolean} True if the player is in the ended state, false if not.\n   * @method ended\n   */\n  ended() { return this.techGet_('ended'); }\n\n  /**\n   * Returns whether or not the player is in the \"seeking\" state.\n   *\n   * @return {Boolean} True if the player is in the seeking state, false if not.\n   * @method seeking\n   */\n  seeking() { return this.techGet_('seeking'); }\n\n  /**\n   * Returns the TimeRanges of the media that are currently available\n   * for seeking to.\n   *\n   * @return {TimeRanges} the seekable intervals of the media timeline\n   * @method seekable\n   */\n  seekable() { return this.techGet_('seekable'); }\n\n  /**\n   * Report user activity\n   *\n   * @param {Object} event Event object\n   * @method reportUserActivity\n   */\n  reportUserActivity(event) {\n    this.userActivity_ = true;\n  }\n\n  /**\n   * Get/set if user is active\n   *\n   * @param {Boolean} bool Value when setting\n   * @return {Boolean} Value if user is active user when getting\n   * @method userActive\n   */\n  userActive(bool) {\n    if (bool !== undefined) {\n      bool = !!bool;\n      if (bool !== this.userActive_) {\n        this.userActive_ = bool;\n        if (bool) {\n          // If the user was inactive and is now active we want to reset the\n          // inactivity timer\n          this.userActivity_ = true;\n          this.removeClass('vjs-user-inactive');\n          this.addClass('vjs-user-active');\n          this.trigger('useractive');\n        } else {\n          // We're switching the state to inactive manually, so erase any other\n          // activity\n          this.userActivity_ = false;\n\n          // Chrome/Safari/IE have bugs where when you change the cursor it can\n          // trigger a mousemove event. This causes an issue when you're hiding\n          // the cursor when the user is inactive, and a mousemove signals user\n          // activity. Making it impossible to go into inactive mode. Specifically\n          // this happens in fullscreen when we really need to hide the cursor.\n          //\n          // When this gets resolved in ALL browsers it can be removed\n          // https://code.google.com/p/chromium/issues/detail?id=103041\n          if(this.tech_) {\n            this.tech_.one('mousemove', function(e){\n              e.stopPropagation();\n              e.preventDefault();\n            });\n          }\n\n          this.removeClass('vjs-user-active');\n          this.addClass('vjs-user-inactive');\n          this.trigger('userinactive');\n        }\n      }\n      return this;\n    }\n    return this.userActive_;\n  }\n\n  /**\n   * Listen for user activity based on timeout value\n   *\n   * @private\n   * @method listenForUserActivity_\n   */\n  listenForUserActivity_() {\n    let mouseInProgress, lastMoveX, lastMoveY;\n\n    let handleActivity = Fn.bind(this, this.reportUserActivity);\n\n    let handleMouseMove = function(e) {\n      // #1068 - Prevent mousemove spamming\n      // Chrome Bug: https://code.google.com/p/chromium/issues/detail?id=366970\n      if(e.screenX !== lastMoveX || e.screenY !== lastMoveY) {\n        lastMoveX = e.screenX;\n        lastMoveY = e.screenY;\n        handleActivity();\n      }\n    };\n\n    let handleMouseDown = function() {\n      handleActivity();\n      // For as long as the they are touching the device or have their mouse down,\n      // we consider them active even if they're not moving their finger or mouse.\n      // So we want to continue to update that they are active\n      this.clearInterval(mouseInProgress);\n      // Setting userActivity=true now and setting the interval to the same time\n      // as the activityCheck interval (250) should ensure we never miss the\n      // next activityCheck\n      mouseInProgress = this.setInterval(handleActivity, 250);\n    };\n\n    let handleMouseUp = function(event) {\n      handleActivity();\n      // Stop the interval that maintains activity if the mouse/touch is down\n      this.clearInterval(mouseInProgress);\n    };\n\n    // Any mouse movement will be considered user activity\n    this.on('mousedown', handleMouseDown);\n    this.on('mousemove', handleMouseMove);\n    this.on('mouseup', handleMouseUp);\n\n    // Listen for keyboard navigation\n    // Shouldn't need to use inProgress interval because of key repeat\n    this.on('keydown', handleActivity);\n    this.on('keyup', handleActivity);\n\n    // Run an interval every 250 milliseconds instead of stuffing everything into\n    // the mousemove/touchmove function itself, to prevent performance degradation.\n    // `this.reportUserActivity` simply sets this.userActivity_ to true, which\n    // then gets picked up by this loop\n    // http://ejohn.org/blog/learning-from-twitter/\n    let inactivityTimeout;\n    let activityCheck = this.setInterval(function() {\n      // Check to see if mouse/touch activity has happened\n      if (this.userActivity_) {\n        // Reset the activity tracker\n        this.userActivity_ = false;\n\n        // If the user state was inactive, set the state to active\n        this.userActive(true);\n\n        // Clear any existing inactivity timeout to start the timer over\n        this.clearTimeout(inactivityTimeout);\n\n        var timeout = this.options_['inactivityTimeout'];\n        if (timeout > 0) {\n          // In <timeout> milliseconds, if no more activity has occurred the\n          // user will be considered inactive\n          inactivityTimeout = this.setTimeout(function () {\n            // Protect against the case where the inactivityTimeout can trigger just\n            // before the next user activity is picked up by the activityCheck loop\n            // causing a flicker\n            if (!this.userActivity_) {\n                this.userActive(false);\n            }\n          }, timeout);\n        }\n      }\n    }, 250);\n  }\n\n  /**\n   * Gets or sets the current playback rate.  A playback rate of\n   * 1.0 represents normal speed and 0.5 would indicate half-speed\n   * playback, for instance.\n   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-playbackrate\n   *\n   * @param  {Number} rate    New playback rate to set.\n   * @return {Number}         Returns the new playback rate when setting\n   * @return {Number}         Returns the current playback rate when getting\n   * @method playbackRate\n   */\n  playbackRate(rate) {\n    if (rate !== undefined) {\n      this.techCall_('setPlaybackRate', rate);\n      return this;\n    }\n\n    if (this.tech_ && this.tech_['featuresPlaybackRate']) {\n      return this.techGet_('playbackRate');\n    } else {\n      return 1.0;\n    }\n  }\n\n  /**\n   * Gets or sets the audio flag\n   *\n   * @param  {Boolean} bool    True signals that this is an audio player.\n   * @return {Boolean}         Returns true if player is audio, false if not when getting\n   * @return {Player}      Returns the player if setting\n   * @private\n   * @method isAudio\n   */\n  isAudio(bool) {\n    if (bool !== undefined) {\n      this.isAudio_ = !!bool;\n      return this;\n    }\n\n    return !!this.isAudio_;\n  }\n\n  /**\n   * Returns the current state of network activity for the element, from\n   * the codes in the list below.\n   * - NETWORK_EMPTY (numeric value 0)\n   *   The element has not yet been initialised. All attributes are in\n   *   their initial states.\n   * - NETWORK_IDLE (numeric value 1)\n   *   The element's resource selection algorithm is active and has\n   *   selected a resource, but it is not actually using the network at\n   *   this time.\n   * - NETWORK_LOADING (numeric value 2)\n   *   The user agent is actively trying to download data.\n   * - NETWORK_NO_SOURCE (numeric value 3)\n   *   The element's resource selection algorithm is active, but it has\n   *   not yet found a resource to use.\n   *\n   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#network-states\n   * @return {Number} the current network activity state\n   * @method networkState\n   */\n  networkState() {\n    return this.techGet_('networkState');\n  }\n\n  /**\n   * Returns a value that expresses the current state of the element\n   * with respect to rendering the current playback position, from the\n   * codes in the list below.\n   * - HAVE_NOTHING (numeric value 0)\n   *   No information regarding the media resource is available.\n   * - HAVE_METADATA (numeric value 1)\n   *   Enough of the resource has been obtained that the duration of the\n   *   resource is available.\n   * - HAVE_CURRENT_DATA (numeric value 2)\n   *   Data for the immediate current playback position is available.\n   * - HAVE_FUTURE_DATA (numeric value 3)\n   *   Data for the immediate current playback position is available, as\n   *   well as enough data for the user agent to advance the current\n   *   playback position in the direction of playback.\n   * - HAVE_ENOUGH_DATA (numeric value 4)\n   *   The user agent estimates that enough data is available for\n   *   playback to proceed uninterrupted.\n   *\n   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-readystate\n   * @return {Number} the current playback rendering state\n   * @method readyState\n   */\n  readyState() {\n    return this.techGet_('readyState');\n  }\n\n  /*\n    * Text tracks are tracks of timed text events.\n    * Captions - text displayed over the video for the hearing impaired\n    * Subtitles - text displayed over the video for those who don't understand language in the video\n    * Chapters - text displayed in a menu allowing the user to jump to particular points (chapters) in the video\n    * Descriptions (not supported yet) - audio descriptions that are read back to the user by a screen reading device\n    */\n\n  /**\n   * Get an array of associated text tracks. captions, subtitles, chapters, descriptions\n   * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-texttracks\n   *\n   * @return {Array}           Array of track objects\n   * @method textTracks\n   */\n  textTracks() {\n    // cannot use techGet_ directly because it checks to see whether the tech is ready.\n    // Flash is unlikely to be ready in time but textTracks should still work.\n    return this.tech_ && this.tech_['textTracks']();\n  }\n\n  /**\n   * Get an array of remote text tracks\n   *\n   * @return {Array}\n   * @method remoteTextTracks\n   */\n  remoteTextTracks() {\n    return this.tech_ && this.tech_['remoteTextTracks']();\n  }\n\n  /**\n   * Add a text track\n   * In addition to the W3C settings we allow adding additional info through options.\n   * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-addtexttrack\n   *\n   * @param {String}  kind        Captions, subtitles, chapters, descriptions, or metadata\n   * @param {String=} label       Optional label\n   * @param {String=} language    Optional language\n   * @method addTextTrack\n   */\n  addTextTrack(kind, label, language) {\n    return this.tech_ && this.tech_['addTextTrack'](kind, label, language);\n  }\n\n  /**\n   * Add a remote text track\n   *\n   * @param {Object} options    Options for remote text track\n   * @method addRemoteTextTrack\n   */\n  addRemoteTextTrack(options) {\n    return this.tech_ && this.tech_['addRemoteTextTrack'](options);\n  }\n\n  /**\n   * Remove a remote text track\n   *\n   * @param {Object} track    Remote text track to remove\n   * @method removeRemoteTextTrack\n   */\n  removeRemoteTextTrack(track) {\n    this.tech_ && this.tech_['removeRemoteTextTrack'](track);\n  }\n\n  /**\n   * Get video width\n   *\n   * @return {Number} Video width\n   * @method videoWidth\n   */\n  videoWidth() {\n    return this.tech_ && this.tech_.videoWidth && this.tech_.videoWidth() || 0;\n  }\n\n  /**\n   * Get video height\n   *\n   * @return {Number} Video height\n   * @method videoHeight\n   */\n  videoHeight() {\n    return this.tech_ && this.tech_.videoHeight && this.tech_.videoHeight() || 0;\n  }\n\n  // Methods to add support for\n  // initialTime: function(){ return this.techCall_('initialTime'); },\n  // startOffsetTime: function(){ return this.techCall_('startOffsetTime'); },\n  // played: function(){ return this.techCall_('played'); },\n  // videoTracks: function(){ return this.techCall_('videoTracks'); },\n  // audioTracks: function(){ return this.techCall_('audioTracks'); },\n  // defaultPlaybackRate: function(){ return this.techCall_('defaultPlaybackRate'); },\n  // defaultMuted: function(){ return this.techCall_('defaultMuted'); }\n\n  /**\n   * The player's language code\n   * NOTE: The language should be set in the player options if you want the\n   * the controls to be built with a specific language. Changing the lanugage\n   * later will not update controls text.\n   *\n   * @param {String} code  The locale string\n   * @return {String}      The locale string when getting\n   * @return {Player}      self when setting\n   * @method language\n   */\n  language(code) {\n    if (code === undefined) {\n      return this.language_;\n    }\n\n    this.language_ = (''+code).toLowerCase();\n    return this;\n  }\n\n  /**\n   * Get the player's language dictionary\n   * Merge every time, because a newly added plugin might call videojs.addLanguage() at any time\n   * Languages specified directly in the player options have precedence\n   *\n   * @return {Array} Array of languages\n   * @method languages\n   */\n  languages() {\n    return  mergeOptions(Player.prototype.options_.languages, this.languages_);\n  }\n\n  /**\n   * Converts track info to JSON\n   *\n   * @return {Object} JSON object of options\n   * @method toJSON\n   */\n  toJSON() {\n    let options = mergeOptions(this.options_);\n    let tracks = options.tracks;\n\n    options.tracks = [];\n\n    for (let i = 0; i < tracks.length; i++) {\n      let track = tracks[i];\n\n      // deep merge tracks and null out player so no circular references\n      track = mergeOptions(track);\n      track.player = undefined;\n      options.tracks[i] = track;\n    }\n\n    return options;\n  }\n\n  /**\n   * Gets tag settings\n   *\n   * @param {Element} tag The player tag\n   * @return {Array} An array of sources and track objects\n   * @static\n   * @method getTagSettings\n   */\n  static getTagSettings(tag) {\n    let baseOptions = {\n      'sources': [],\n      'tracks': []\n    };\n\n    const tagOptions = Dom.getElAttributes(tag);\n    const dataSetup = tagOptions['data-setup'];\n\n    // Check if data-setup attr exists.\n    if (dataSetup !== null){\n      // Parse options JSON\n      // If empty string, make it a parsable json object.\n      const [err, data] = safeParseTuple(dataSetup || '{}');\n      if (err) {\n        log.error(err);\n      }\n      assign(tagOptions, data);\n    }\n\n    assign(baseOptions, tagOptions);\n\n    // Get tag children settings\n    if (tag.hasChildNodes()) {\n      const children = tag.childNodes;\n\n      for (let i=0, j=children.length; i<j; i++) {\n        const child = children[i];\n        // Change case needed: http://ejohn.org/blog/nodename-case-sensitivity/\n        const childName = child.nodeName.toLowerCase();\n        if (childName === 'source') {\n          baseOptions.sources.push(Dom.getElAttributes(child));\n        } else if (childName === 'track') {\n          baseOptions.tracks.push(Dom.getElAttributes(child));\n        }\n      }\n    }\n\n    return baseOptions;\n  }\n\n}\n\n/*\n * Global player list\n *\n * @type {Object}\n */\nPlayer.players = {};\n\nlet navigator = window.navigator;\n/*\n * Player instance options, surfaced using options\n * options = Player.prototype.options_\n * Make changes in options, not here.\n *\n * @type {Object}\n * @private\n */\nPlayer.prototype.options_ = {\n  // Default order of fallback technology\n  techOrder: ['html5','flash'],\n  // techOrder: ['flash','html5'],\n\n  html5: {},\n  flash: {},\n\n  // defaultVolume: 0.85,\n  defaultVolume: 0.00, // The freakin seaguls are driving me crazy!\n\n  // default inactivity timeout\n  inactivityTimeout: 2000,\n\n  // default playback rates\n  playbackRates: [],\n  // Add playback rate selection by adding rates\n  // 'playbackRates': [0.5, 1, 1.5, 2],\n\n  // Included control sets\n  children: [\n    'mediaLoader',\n    'posterImage',\n    'textTrackDisplay',\n    'loadingSpinner',\n    'bigPlayButton',\n    'controlBar',\n    'errorDisplay',\n    'textTrackSettings'\n  ],\n\n  language: document.getElementsByTagName('html')[0].getAttribute('lang') || navigator.languages && navigator.languages[0] || navigator.userLanguage || navigator.language || 'en',\n\n  // locales and their language translations\n  languages: {},\n\n  // Default message to show when a video cannot be played.\n  notSupportedMessage: 'No compatible source was found for this video.'\n};\n\n/**\n * Fired when the player has initial duration and dimension information\n *\n * @event loadedmetadata\n */\nPlayer.prototype.handleLoadedMetaData_;\n\n/**\n * Fired when the player has downloaded data at the current playback position\n *\n * @event loadeddata\n */\nPlayer.prototype.handleLoadedData_;\n\n/**\n * Fired when the user is active, e.g. moves the mouse over the player\n *\n * @event useractive\n */\nPlayer.prototype.handleUserActive_;\n\n/**\n * Fired when the user is inactive, e.g. a short delay after the last mouse move or control interaction\n *\n * @event userinactive\n */\nPlayer.prototype.handleUserInactive_;\n\n/**\n * Fired when the current playback position has changed *\n * During playback this is fired every 15-250 milliseconds, depending on the\n * playback technology in use.\n *\n * @event timeupdate\n */\nPlayer.prototype.handleTimeUpdate_;\n\n/**\n * Fired when the volume changes\n *\n * @event volumechange\n */\nPlayer.prototype.handleVolumeChange_;\n\n/**\n * Fired when an error occurs\n *\n * @event error\n */\nPlayer.prototype.handleError_;\n\nPlayer.prototype.flexNotSupported_ = function() {\n  var elem = document.createElement('i');\n\n  // Note: We don't actually use flexBasis (or flexOrder), but it's one of the more\n  // common flex features that we can rely on when checking for flex support.\n  return !('flexBasis' in elem.style ||\n          'webkitFlexBasis' in elem.style ||\n          'mozFlexBasis' in elem.style ||\n          'msFlexBasis' in elem.style ||\n          'msFlexOrder' in elem.style /* IE10-specific (2012 flex spec)  */);\n};\n\nComponent.registerComponent('Player', Player);\nexport default Player;\n","/**\n * @file plugins.js\n */\nimport Player from './player.js';\n\n/**\n * The method for registering a video.js plugin\n *\n * @param  {String} name The name of the plugin\n * @param  {Function} init The function that is run when the player inits\n * @method plugin\n */\nvar plugin = function(name, init){\n  Player.prototype[name] = init;\n};\n\nexport default plugin;\n","/**\n * @file poster-image.js\n */\nimport Button from './button.js';\nimport Component from './component.js';\nimport * as Fn from './utils/fn.js';\nimport * as Dom from './utils/dom.js';\nimport * as browser from './utils/browser.js';\n\n/**\n * The component that handles showing the poster image.\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Button\n * @class PosterImage\n */\nclass PosterImage extends Button {\n\n  constructor(player, options){\n    super(player, options);\n\n    this.update();\n    player.on('posterchange', Fn.bind(this, this.update));\n  }\n\n  /**\n   * Clean up the poster image\n   *\n   * @method dispose\n   */\n  dispose() {\n    this.player().off('posterchange', this.update);\n    super.dispose();\n  }\n\n  /**\n   * Create the poster's image element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = Dom.createEl('div', {\n      className: 'vjs-poster',\n\n      // Don't want poster to be tabbable.\n      tabIndex: -1\n    });\n\n    // To ensure the poster image resizes while maintaining its original aspect\n    // ratio, use a div with `background-size` when available. For browsers that\n    // do not support `background-size` (e.g. IE8), fall back on using a regular\n    // img element.\n    if (!browser.BACKGROUND_SIZE_SUPPORTED) {\n      this.fallbackImg_ = Dom.createEl('img');\n      el.appendChild(this.fallbackImg_);\n    }\n\n    return el;\n  }\n\n  /**\n   * Event handler for updates to the player's poster source\n   *\n   * @method update\n   */\n  update() {\n    let url = this.player().poster();\n\n    this.setSrc(url);\n\n    // If there's no poster source we should display:none on this component\n    // so it's not still clickable or right-clickable\n    if (url) {\n      this.show();\n    } else {\n      this.hide();\n    }\n  }\n\n  /**\n   * Set the poster source depending on the display method\n   *\n   * @param {String} url The URL to the poster source\n   * @method setSrc\n   */\n  setSrc(url) {\n    if (this.fallbackImg_) {\n      this.fallbackImg_.src = url;\n    } else {\n      let backgroundImage = '';\n      // Any falsey values should stay as an empty string, otherwise\n      // this will throw an extra error\n      if (url) {\n        backgroundImage = `url(\"${url}\")`;\n      }\n\n      this.el_.style.backgroundImage = backgroundImage;\n    }\n  }\n\n  /**\n   * Event handler for clicks on the poster image\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    // We don't want a click to trigger playback when controls are disabled\n    // but CSS should be hiding the poster to prevent that from happening\n    if (this.player_.paused()) {\n      this.player_.play();\n    } else {\n      this.player_.pause();\n    }\n  }\n\n}\n\nComponent.registerComponent('PosterImage', PosterImage);\nexport default PosterImage;\n","/**\n * @file setup.js\n *\n * Functions for automatically setting up a player\n * based on the data-setup attribute of the video tag\n */\nimport * as Events from './utils/events.js';\nimport document from 'global/document';\nimport window from 'global/window';\n\nlet _windowLoaded = false;\nlet videojs;\n\n\n// Automatically set up any tags that have a data-setup attribute\nvar autoSetup = function(){\n  // One day, when we stop supporting IE8, go back to this, but in the meantime...*hack hack hack*\n  // var vids = Array.prototype.slice.call(document.getElementsByTagName('video'));\n  // var audios = Array.prototype.slice.call(document.getElementsByTagName('audio'));\n  // var mediaEls = vids.concat(audios);\n\n  // Because IE8 doesn't support calling slice on a node list, we need to loop through each list of elements\n  // to build up a new, combined list of elements.\n  var vids = document.getElementsByTagName('video');\n  var audios = document.getElementsByTagName('audio');\n  var mediaEls = [];\n  if (vids && vids.length > 0) {\n    for(let i=0, e=vids.length; i<e; i++) {\n      mediaEls.push(vids[i]);\n    }\n  }\n  if (audios && audios.length > 0) {\n    for(let i=0, e=audios.length; i<e; i++) {\n      mediaEls.push(audios[i]);\n    }\n  }\n\n  // Check if any media elements exist\n  if (mediaEls && mediaEls.length > 0) {\n\n    for (let i=0, e=mediaEls.length; i<e; i++) {\n      let mediaEl = mediaEls[i];\n\n      // Check if element exists, has getAttribute func.\n      // IE seems to consider typeof el.getAttribute == 'object' instead of 'function' like expected, at least when loading the player immediately.\n      if (mediaEl && mediaEl.getAttribute) {\n\n        // Make sure this player hasn't already been set up.\n        if (mediaEl['player'] === undefined) {\n          let options = mediaEl.getAttribute('data-setup');\n\n          // Check if data-setup attr exists.\n          // We only auto-setup if they've added the data-setup attr.\n          if (options !== null) {\n            // Create new video.js instance.\n            let player = videojs(mediaEl);\n          }\n        }\n\n      // If getAttribute isn't defined, we need to wait for the DOM.\n      } else {\n        autoSetupTimeout(1);\n        break;\n      }\n    }\n\n  // No videos were found, so keep looping unless page is finished loading.\n  } else if (!_windowLoaded) {\n    autoSetupTimeout(1);\n  }\n};\n\n// Pause to let the DOM keep processing\nvar autoSetupTimeout = function(wait, vjs){\n  videojs = vjs;\n  setTimeout(autoSetup, wait);\n};\n\nif (document.readyState === 'complete') {\n  _windowLoaded = true;\n} else {\n  Events.one(window, 'load', function(){\n    _windowLoaded = true;\n  });\n}\n\nvar hasLoaded = function() {\n  return _windowLoaded;\n};\n\nexport { autoSetup, autoSetupTimeout, hasLoaded };\n","/**\n * @file slider.js\n */\nimport Component from '../component.js';\nimport * as Dom from '../utils/dom.js';\nimport document from 'global/document';\nimport assign from 'object.assign';\n\n/**\n * The base functionality for sliders like the volume bar and seek bar\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class Slider\n */\nclass Slider extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n\n    // Set property names to bar to match with the child Slider class is looking for\n    this.bar = this.getChild(this.options_.barName);\n\n    // Set a horizontal or vertical class on the slider depending on the slider type\n    this.vertical(!!this.options_.vertical);\n\n    this.on('mousedown', this.handleMouseDown);\n    this.on('touchstart', this.handleMouseDown);\n    this.on('focus', this.handleFocus);\n    this.on('blur', this.handleBlur);\n    this.on('click', this.handleClick);\n\n    this.on(player, 'controlsvisible', this.update);\n    this.on(player, this.playerEvent, this.update);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @param {String} type Type of element to create\n   * @param {Object=} props List of properties in Object form\n   * @return {Element}\n   * @method createEl\n   */\n  createEl(type, props={}, attributes={}) {\n    // Add the slider element class to all sub classes\n    props.className = props.className + ' vjs-slider';\n    props = assign({\n      tabIndex: 0\n    }, props);\n\n    attributes = assign({\n      'role': 'slider',\n      'aria-valuenow': 0,\n      'aria-valuemin': 0,\n      'aria-valuemax': 100,\n      tabIndex: 0\n    }, attributes);\n\n    return super.createEl(type, props, attributes);\n  }\n\n  /**\n   * Handle mouse down on slider\n   *\n   * @param {Object} event Mouse down event object\n   * @method handleMouseDown\n   */\n  handleMouseDown(event) {\n    event.preventDefault();\n    Dom.blockTextSelection();\n\n    this.addClass('vjs-sliding');\n    this.trigger('slideractive');\n\n    this.on(document, 'mousemove', this.handleMouseMove);\n    this.on(document, 'mouseup', this.handleMouseUp);\n    this.on(document, 'touchmove', this.handleMouseMove);\n    this.on(document, 'touchend', this.handleMouseUp);\n\n    this.handleMouseMove(event);\n  }\n\n  /**\n   * To be overridden by a subclass\n   *\n   * @method handleMouseMove\n   */\n  handleMouseMove() {}\n\n  /**\n   * Handle mouse up on Slider\n   *\n   * @method handleMouseUp\n   */\n  handleMouseUp() {\n    Dom.unblockTextSelection();\n\n    this.removeClass('vjs-sliding');\n    this.trigger('sliderinactive');\n\n    this.off(document, 'mousemove', this.handleMouseMove);\n    this.off(document, 'mouseup', this.handleMouseUp);\n    this.off(document, 'touchmove', this.handleMouseMove);\n    this.off(document, 'touchend', this.handleMouseUp);\n\n    this.update();\n  }\n\n  /**\n   * Update slider\n   *\n   * @method update\n   */\n  update() {\n    // In VolumeBar init we have a setTimeout for update that pops and update to the end of the\n    // execution stack. The player is destroyed before then update will cause an error\n    if (!this.el_) return;\n\n    // If scrubbing, we could use a cached value to make the handle keep up with the user's mouse.\n    // On HTML5 browsers scrubbing is really smooth, but some flash players are slow, so we might want to utilize this later.\n    // var progress =  (this.player_.scrubbing()) ? this.player_.getCache().currentTime / this.player_.duration() : this.player_.currentTime() / this.player_.duration();\n    let progress = this.getPercent();\n    let bar = this.bar;\n\n    // If there's no bar...\n    if (!bar) return;\n\n    // Protect against no duration and other division issues\n    if (typeof progress !== 'number' ||\n        progress !== progress ||\n        progress < 0 ||\n        progress === Infinity) {\n          progress = 0;\n    }\n\n    // Convert to a percentage for setting\n    let percentage = (progress * 100).toFixed(2) + '%';\n\n    // Set the new bar width or height\n    if (this.vertical()) {\n      bar.el().style.height = percentage;\n    } else {\n      bar.el().style.width = percentage;\n    }\n  }\n\n  /**\n   * Calculate distance for slider\n   *\n   * @param {Object} event Event object\n   * @method calculateDistance\n   */\n  calculateDistance(event){\n    let position = Dom.getPointerPosition(this.el_, event);\n    if (this.vertical()) {\n      return position.y;\n    }\n    return position.x;\n  }\n\n  /**\n   * Handle on focus for slider\n   *\n   * @method handleFocus\n   */\n  handleFocus() {\n    this.on(document, 'keydown', this.handleKeyPress);\n  }\n\n  /**\n   * Handle key press for slider\n   *\n   * @param {Object} event Event object\n   * @method handleKeyPress\n   */\n  handleKeyPress(event) {\n    if (event.which === 37 || event.which === 40) { // Left and Down Arrows\n      event.preventDefault();\n      this.stepBack();\n    } else if (event.which === 38 || event.which === 39) { // Up and Right Arrows\n      event.preventDefault();\n      this.stepForward();\n    }\n  }\n\n  /**\n   * Handle on blur for slider\n   *\n   * @method handleBlur\n   */\n  handleBlur() {\n    this.off(document, 'keydown', this.handleKeyPress);\n  }\n\n  /**\n   * Listener for click events on slider, used to prevent clicks\n   *   from bubbling up to parent elements like button menus.\n   *\n   * @param {Object} event Event object\n   * @method handleClick\n   */\n  handleClick(event) {\n    event.stopImmediatePropagation();\n    event.preventDefault();\n  }\n\n  /**\n   * Get/set if slider is horizontal for vertical\n   *\n   * @param {Boolean} bool True if slider is vertical, false is horizontal\n   * @return {Boolean} True if slider is vertical, false is horizontal\n   * @method vertical\n   */\n  vertical(bool) {\n    if (bool === undefined) {\n      return this.vertical_ || false;\n    }\n\n    this.vertical_ = !!bool;\n\n    if (this.vertical_) {\n      this.addClass('vjs-slider-vertical');\n    } else {\n      this.addClass('vjs-slider-horizontal');\n    }\n\n    return this;\n  }\n\n}\n\nComponent.registerComponent('Slider', Slider);\nexport default Slider;\n","/**\n * @file flash-rtmp.js\n */\nfunction FlashRtmpDecorator(Flash) {\n  Flash.streamingFormats = {\n    'rtmp/mp4': 'MP4',\n    'rtmp/flv': 'FLV'\n  };\n\n  Flash.streamFromParts = function(connection, stream) {\n    return connection + '&' + stream;\n  };\n\n  Flash.streamToParts = function(src) {\n    let parts = {\n      connection: '',\n      stream: ''\n    };\n\n    if (!src) return parts;\n\n    // Look for the normal URL separator we expect, '&'.\n    // If found, we split the URL into two pieces around the\n    // first '&'.\n    let connEnd = src.indexOf('&');\n    let streamBegin;\n    if (connEnd !== -1) {\n      streamBegin = connEnd + 1;\n    }\n    else {\n      // If there's not a '&', we use the last '/' as the delimiter.\n      connEnd = streamBegin = src.lastIndexOf('/') + 1;\n      if (connEnd === 0) {\n        // really, there's not a '/'?\n        connEnd = streamBegin = src.length;\n      }\n    }\n    parts.connection = src.substring(0, connEnd);\n    parts.stream = src.substring(streamBegin, src.length);\n\n    return parts;\n  };\n\n  Flash.isStreamingType = function(srcType) {\n    return srcType in Flash.streamingFormats;\n  };\n\n  // RTMP has four variations, any string starting\n  // with one of these protocols should be valid\n  Flash.RTMP_RE = /^rtmp[set]?:\\/\\//i;\n\n  Flash.isStreamingSrc = function(src) {\n    return Flash.RTMP_RE.test(src);\n  };\n\n  /**\n   * A source handler for RTMP urls\n   * @type {Object}\n   */\n  Flash.rtmpSourceHandler = {};\n\n  /**\n   * Check Flash can handle the source natively\n   * @param  {Object} source  The source object\n   * @return {String}         'probably', 'maybe', or '' (empty string)\n   */\n  Flash.rtmpSourceHandler.canHandleSource = function(source){\n    if (Flash.isStreamingType(source.type) || Flash.isStreamingSrc(source.src)) {\n      return 'maybe';\n    }\n\n    return '';\n  };\n\n  /**\n   * Pass the source to the flash object\n   * Adaptive source handlers will have more complicated workflows before passing\n   * video data to the video element\n   * @param  {Object} source    The source object\n   * @param  {Flash} tech   The instance of the Flash tech\n   */\n  Flash.rtmpSourceHandler.handleSource = function(source, tech){\n    let srcParts = Flash.streamToParts(source.src);\n\n    tech['setRtmpConnection'](srcParts.connection);\n    tech['setRtmpStream'](srcParts.stream);\n  };\n\n  // Register the native source handler\n  Flash.registerSourceHandler(Flash.rtmpSourceHandler);\n\n  return Flash;\n}\n\nexport default FlashRtmpDecorator;\n","/**\n * @file flash.js\n * VideoJS-SWF - Custom Flash Player with HTML5-ish API\n * https://github.com/zencoder/video-js-swf\n * Not using setupTriggers. Using global onEvent func to distribute events\n */\n\nimport Tech from './tech';\nimport * as Dom from '../utils/dom.js';\nimport * as Url from '../utils/url.js';\nimport { createTimeRange } from '../utils/time-ranges.js';\nimport FlashRtmpDecorator from './flash-rtmp';\nimport Component from '../component';\nimport window from 'global/window';\nimport assign from 'object.assign';\n\nlet navigator = window.navigator;\n/**\n * Flash Media Controller - Wrapper for fallback SWF API\n *\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready Ready callback function\n * @extends Tech\n * @class Flash\n */\nclass Flash extends Tech {\n\n  constructor(options, ready){\n    super(options, ready);\n\n    // Set the source when ready\n    if (options.source) {\n      this.ready(function(){\n        this.setSource(options.source);\n      }, true);\n    }\n\n    // Having issues with Flash reloading on certain page actions (hide/resize/fullscreen) in certain browsers\n    // This allows resetting the playhead when we catch the reload\n    if (options.startTime) {\n      this.ready(function(){\n        this.load();\n        this.play();\n        this.currentTime(options.startTime);\n      }, true);\n    }\n\n    // Add global window functions that the swf expects\n    // A 4.x workflow we weren't able to solve for in 5.0\n    // because of the need to hard code these functions\n    // into the swf for security reasons\n    window.videojs = window.videojs || {};\n    window.videojs.Flash = window.videojs.Flash || {};\n    window.videojs.Flash.onReady = Flash.onReady;\n    window.videojs.Flash.onEvent = Flash.onEvent;\n    window.videojs.Flash.onError = Flash.onError;\n\n    this.on('seeked', function() {\n      this.lastSeekTarget_ = undefined;\n    });\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let options = this.options_;\n\n    // If video.js is hosted locally you should also set the location\n    // for the hosted swf, which should be relative to the page (not video.js)\n    // Otherwise this adds a CDN url.\n    // The CDN also auto-adds a swf URL for that specific version.\n    if (!options.swf) {\n      options.swf = '//vjs.zencdn.net/swf/__SWF_VERSION__/video-js.swf';\n    }\n\n    // Generate ID for swf object\n    let objId = options.techId;\n\n    // Merge default flashvars with ones passed in to init\n    let flashVars = assign({\n\n      // SWF Callback Functions\n      'readyFunction': 'videojs.Flash.onReady',\n      'eventProxyFunction': 'videojs.Flash.onEvent',\n      'errorEventProxyFunction': 'videojs.Flash.onError',\n\n      // Player Settings\n      'autoplay': options.autoplay,\n      'preload': options.preload,\n      'loop': options.loop,\n      'muted': options.muted\n\n    }, options.flashVars);\n\n    // Merge default parames with ones passed in\n    let params = assign({\n      'wmode': 'opaque', // Opaque is needed to overlay controls, but can affect playback performance\n      'bgcolor': '#000000' // Using bgcolor prevents a white flash when the object is loading\n    }, options.params);\n\n    // Merge default attributes with ones passed in\n    let attributes = assign({\n      'id': objId,\n      'name': objId, // Both ID and Name needed or swf to identify itself\n      'class': 'vjs-tech'\n    }, options.attributes);\n\n    this.el_ = Flash.embed(options.swf, flashVars, params, attributes);\n    this.el_.tech = this;\n\n    return this.el_;\n  }\n\n  /**\n   * Play for flash tech\n   *\n   * @method play\n   */\n  play() {\n    if (this.ended()) {\n      this.setCurrentTime(0);\n    }\n    this.el_.vjs_play();\n  }\n\n  /**\n   * Pause for flash tech\n   *\n   * @method pause\n   */\n  pause() {\n    this.el_.vjs_pause();\n  }\n\n  /**\n   * Get/set video\n   *\n   * @param {Object=} src Source object\n   * @return {Object}\n   * @method src\n   */\n  src(src) {\n    if (src === undefined) {\n      return this.currentSrc();\n    }\n\n    // Setting src through `src` not `setSrc` will be deprecated\n    return this.setSrc(src);\n  }\n\n  /**\n   * Set video\n   *\n   * @param {Object=} src Source object\n   * @deprecated\n   * @method setSrc\n   */\n  setSrc(src) {\n    // Make sure source URL is absolute.\n    src = Url.getAbsoluteURL(src);\n    this.el_.vjs_src(src);\n\n    // Currently the SWF doesn't autoplay if you load a source later.\n    // e.g. Load player w/ no source, wait 2s, set src.\n    if (this.autoplay()) {\n      var tech = this;\n      this.setTimeout(function(){ tech.play(); }, 0);\n    }\n  }\n\n  /**\n   * Returns true if the tech is currently seeking.\n   * @return {boolean} true if seeking\n   */\n  seeking() {\n    return this.lastSeekTarget_ !== undefined;\n  }\n\n  /**\n   * Set current time\n   *\n   * @param {Number} time Current time of video\n   * @method setCurrentTime\n   */\n  setCurrentTime(time) {\n    let seekable = this.seekable();\n    if (seekable.length) {\n      // clamp to the current seekable range\n      time = time > seekable.start(0) ? time : seekable.start(0);\n      time = time < seekable.end(seekable.length - 1) ? time : seekable.end(seekable.length - 1);\n\n      this.lastSeekTarget_ = time;\n      this.trigger('seeking');\n      this.el_.vjs_setProperty('currentTime', time);\n      super.setCurrentTime();\n    }\n  }\n\n  /**\n   * Get current time\n   *\n   * @param {Number=} time Current time of video\n   * @return {Number} Current time\n   * @method currentTime\n   */\n  currentTime(time) {\n    // when seeking make the reported time keep up with the requested time\n    // by reading the time we're seeking to\n    if (this.seeking()) {\n      return this.lastSeekTarget_ || 0;\n    }\n    return this.el_.vjs_getProperty('currentTime');\n  }\n\n  /**\n   * Get current source\n   *\n   * @method currentSrc\n   */\n  currentSrc() {\n    if (this.currentSource_) {\n      return this.currentSource_.src;\n    } else {\n      return this.el_.vjs_getProperty('currentSrc');\n    }\n  }\n\n  /**\n   * Load media into player\n   *\n   * @method load\n   */\n  load() {\n    this.el_.vjs_load();\n  }\n\n  /**\n   * Get poster\n   *\n   * @method poster\n   */\n  poster() {\n    this.el_.vjs_getProperty('poster');\n  }\n\n  /**\n   * Poster images are not handled by the Flash tech so make this a no-op\n   *\n   * @method setPoster\n   */\n  setPoster() {}\n\n  /**\n   * Determine if can seek in media\n   *\n   * @return {TimeRangeObject}\n   * @method seekable\n   */\n  seekable() {\n    const duration = this.duration();\n    if (duration === 0) {\n      return createTimeRange();\n    }\n    return createTimeRange(0, duration);\n  }\n\n  /**\n   * Get buffered time range\n   *\n   * @return {TimeRangeObject}\n   * @method buffered\n   */\n  buffered() {\n    let ranges = this.el_.vjs_getProperty('buffered');\n    if (ranges.length === 0) {\n      return createTimeRange();\n    }\n    return createTimeRange(ranges[0][0], ranges[0][1]);\n  }\n\n  /**\n   * Get fullscreen support -\n   * Flash does not allow fullscreen through javascript\n   * so always returns false\n   *\n   * @return {Boolean} false\n   * @method supportsFullScreen\n   */\n  supportsFullScreen() {\n    return false; // Flash does not allow fullscreen through javascript\n  }\n\n  /**\n   * Request to enter fullscreen\n   * Flash does not allow fullscreen through javascript\n   * so always returns false\n   *\n   * @return {Boolean} false\n   * @method enterFullScreen\n   */\n  enterFullScreen() {\n    return false;\n  }\n\n}\n\n\n// Create setters and getters for attributes\nconst _api = Flash.prototype;\nconst _readWrite = 'rtmpConnection,rtmpStream,preload,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted'.split(',');\nconst _readOnly = 'networkState,readyState,initialTime,duration,startOffsetTime,paused,ended,videoTracks,audioTracks,videoWidth,videoHeight'.split(',');\n\nfunction _createSetter(attr){\n  var attrUpper = attr.charAt(0).toUpperCase() + attr.slice(1);\n  _api['set'+attrUpper] = function(val){ return this.el_.vjs_setProperty(attr, val); };\n}\nfunction _createGetter(attr) {\n  _api[attr] = function(){ return this.el_.vjs_getProperty(attr); };\n}\n\n// Create getter and setters for all read/write attributes\nfor (let i = 0; i < _readWrite.length; i++) {\n  _createGetter(_readWrite[i]);\n  _createSetter(_readWrite[i]);\n}\n\n// Create getters for read-only attributes\nfor (let i = 0; i < _readOnly.length; i++) {\n  _createGetter(_readOnly[i]);\n}\n\n/* Flash Support Testing -------------------------------------------------------- */\n\nFlash.isSupported = function(){\n  return Flash.version()[0] >= 10;\n  // return swfobject.hasFlashPlayerVersion('10');\n};\n\n// Add Source Handler pattern functions to this tech\nTech.withSourceHandlers(Flash);\n\n/*\n * The default native source handler.\n * This simply passes the source to the video element. Nothing fancy.\n *\n * @param  {Object} source   The source object\n * @param  {Flash} tech  The instance of the Flash tech\n */\nFlash.nativeSourceHandler = {};\n\n/*\n * Check Flash can handle the source natively\n *\n * @param  {Object} source  The source object\n * @return {String}         'probably', 'maybe', or '' (empty string)\n */\nFlash.nativeSourceHandler.canHandleSource = function(source){\n  var type;\n\n  function guessMimeType(src) {\n    var ext = Url.getFileExtension(src);\n    if (ext) {\n      return `video/${ext}`;\n    }\n    return '';\n  }\n\n  if (!source.type) {\n    type = guessMimeType(source.src);\n  } else {\n    // Strip code information from the type because we don't get that specific\n    type = source.type.replace(/;.*/, '').toLowerCase();\n  }\n\n  if (type in Flash.formats) {\n    return 'maybe';\n  }\n\n  return '';\n};\n\n/*\n * Pass the source to the flash object\n * Adaptive source handlers will have more complicated workflows before passing\n * video data to the video element\n *\n * @param  {Object} source    The source object\n * @param  {Flash} tech   The instance of the Flash tech\n */\nFlash.nativeSourceHandler.handleSource = function(source, tech){\n  tech.setSrc(source.src);\n};\n\n/*\n * Clean up the source handler when disposing the player or switching sources..\n * (no cleanup is needed when supporting the format natively)\n */\nFlash.nativeSourceHandler.dispose = function(){};\n\n// Register the native source handler\nFlash.registerSourceHandler(Flash.nativeSourceHandler);\n\nFlash.formats = {\n  'video/flv': 'FLV',\n  'video/x-flv': 'FLV',\n  'video/mp4': 'MP4',\n  'video/m4v': 'MP4'\n};\n\nFlash.onReady = function(currSwf){\n  let el = Dom.getEl(currSwf);\n  let tech = el && el.tech;\n\n  // if there is no el then the tech has been disposed\n  // and the tech element was removed from the player div\n  if (tech && tech.el()) {\n    // check that the flash object is really ready\n    Flash.checkReady(tech);\n  }\n};\n\n// The SWF isn't always ready when it says it is. Sometimes the API functions still need to be added to the object.\n// If it's not ready, we set a timeout to check again shortly.\nFlash.checkReady = function(tech){\n  // stop worrying if the tech has been disposed\n  if (!tech.el()) {\n    return;\n  }\n\n  // check if API property exists\n  if (tech.el().vjs_getProperty) {\n    // tell tech it's ready\n    tech.triggerReady();\n  } else {\n    // wait longer\n    this.setTimeout(function(){\n      Flash['checkReady'](tech);\n    }, 50);\n  }\n};\n\n// Trigger events from the swf on the player\nFlash.onEvent = function(swfID, eventName){\n  let tech = Dom.getEl(swfID).tech;\n  tech.trigger(eventName);\n};\n\n// Log errors from the swf\nFlash.onError = function(swfID, err){\n  const tech = Dom.getEl(swfID).tech;\n\n  // trigger MEDIA_ERR_SRC_NOT_SUPPORTED\n  if (err === 'srcnotfound') {\n    return tech.error(4);\n  }\n\n  // trigger a custom error\n  tech.error('FLASH: ' + err);\n};\n\n// Flash Version Check\nFlash.version = function(){\n  let version = '0,0,0';\n\n  // IE\n  try {\n    version = new window.ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\\D+/g, ',').match(/^,?(.+),?$/)[1];\n\n  // other browsers\n  } catch(e) {\n    try {\n      if (navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin){\n        version = (navigator.plugins['Shockwave Flash 2.0'] || navigator.plugins['Shockwave Flash']).description.replace(/\\D+/g, ',').match(/^,?(.+),?$/)[1];\n      }\n    } catch(err) {}\n  }\n  return version.split(',');\n};\n\n// Flash embedding method. Only used in non-iframe mode\nFlash.embed = function(swf, flashVars, params, attributes){\n  const code = Flash.getEmbedCode(swf, flashVars, params, attributes);\n\n  // Get element by embedding code and retrieving created element\n  const obj = Dom.createEl('div', { innerHTML: code }).childNodes[0];\n\n  return obj;\n};\n\nFlash.getEmbedCode = function(swf, flashVars, params, attributes){\n  const objTag = '<object type=\"application/x-shockwave-flash\" ';\n  let flashVarsString = '';\n  let paramsString = '';\n  let attrsString = '';\n\n  // Convert flash vars to string\n  if (flashVars) {\n    Object.getOwnPropertyNames(flashVars).forEach(function(key){\n      flashVarsString += `${key}=${flashVars[key]}&amp;`;\n    });\n  }\n\n  // Add swf, flashVars, and other default params\n  params = assign({\n    'movie': swf,\n    'flashvars': flashVarsString,\n    'allowScriptAccess': 'always', // Required to talk to swf\n    'allowNetworking': 'all' // All should be default, but having security issues.\n  }, params);\n\n  // Create param tags string\n  Object.getOwnPropertyNames(params).forEach(function(key){\n    paramsString += `<param name=\"${key}\" value=\"${params[key]}\" />`;\n  });\n\n  attributes = assign({\n    // Add swf to attributes (need both for IE and Others to work)\n    'data': swf,\n\n    // Default to 100% width/height\n    'width': '100%',\n    'height': '100%'\n\n  }, attributes);\n\n  // Create Attributes string\n  Object.getOwnPropertyNames(attributes).forEach(function(key){\n    attrsString += `${key}=\"${attributes[key]}\" `;\n  });\n\n  return `${objTag}${attrsString}>${paramsString}</object>`;\n};\n\n// Run Flash through the RTMP decorator\nFlashRtmpDecorator(Flash);\n\nComponent.registerComponent('Flash', Flash);\nexport default Flash;\n","/**\n * @file html5.js\n * HTML5 Media Controller - Wrapper for HTML5 Media API\n */\n\nimport Tech from './tech.js';\nimport Component from '../component';\nimport * as Dom from '../utils/dom.js';\nimport * as Url from '../utils/url.js';\nimport * as Fn from '../utils/fn.js';\nimport log from '../utils/log.js';\nimport * as browser from '../utils/browser.js';\nimport document from 'global/document';\nimport window from 'global/window';\nimport assign from 'object.assign';\nimport mergeOptions from '../utils/merge-options.js';\n\n/**\n * HTML5 Media Controller - Wrapper for HTML5 Media API\n *\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready Ready callback function\n * @extends Tech\n * @class Html5\n */\nclass Html5 extends Tech {\n\n  constructor(options, ready){\n    super(options, ready);\n\n    const source = options.source;\n\n    // Set the source if one is provided\n    // 1) Check if the source is new (if not, we want to keep the original so playback isn't interrupted)\n    // 2) Check to see if the network state of the tag was failed at init, and if so, reset the source\n    // anyway so the error gets fired.\n    if (source && (this.el_.currentSrc !== source.src || (options.tag && options.tag.initNetworkState_ === 3))) {\n      this.setSource(source);\n    } else {\n      this.handleLateInit_(this.el_);\n    }\n\n    if (this.el_.hasChildNodes()) {\n\n      let nodes = this.el_.childNodes;\n      let nodesLength = nodes.length;\n      let removeNodes = [];\n\n      while (nodesLength--) {\n        let node = nodes[nodesLength];\n        let nodeName = node.nodeName.toLowerCase();\n        if (nodeName === 'track') {\n          if (!this.featuresNativeTextTracks) {\n            // Empty video tag tracks so the built-in player doesn't use them also.\n            // This may not be fast enough to stop HTML5 browsers from reading the tags\n            // so we'll need to turn off any default tracks if we're manually doing\n            // captions and subtitles. videoElement.textTracks\n            removeNodes.push(node);\n          } else {\n            this.remoteTextTracks().addTrack_(node.track);\n          }\n        }\n      }\n\n      for (let i=0; i<removeNodes.length; i++) {\n        this.el_.removeChild(removeNodes[i]);\n      }\n    }\n\n    if (this.featuresNativeTextTracks) {\n      this.handleTextTrackChange_ = Fn.bind(this, this.handleTextTrackChange);\n      this.handleTextTrackAdd_ = Fn.bind(this, this.handleTextTrackAdd);\n      this.handleTextTrackRemove_ = Fn.bind(this, this.handleTextTrackRemove);\n      this.proxyNativeTextTracks_();\n    }\n\n    // Determine if native controls should be used\n    // Our goal should be to get the custom controls on mobile solid everywhere\n    // so we can remove this all together. Right now this will block custom\n    // controls on touch enabled laptops like the Chrome Pixel\n    if (browser.TOUCH_ENABLED && options.nativeControlsForTouch === true ||\n        browser.IS_IPHONE ||\n        browser.IS_NATIVE_ANDROID) {\n      this.setControls(true);\n    }\n\n    this.triggerReady();\n  }\n\n  /**\n   * Dispose of html5 media element\n   *\n   * @method dispose\n   */\n  dispose() {\n    let tt = this.el().textTracks;\n    let emulatedTt = this.textTracks();\n\n    // remove native event listeners\n    if (tt && tt.removeEventListener) {\n      tt.removeEventListener('change', this.handleTextTrackChange_);\n      tt.removeEventListener('addtrack', this.handleTextTrackAdd_);\n      tt.removeEventListener('removetrack', this.handleTextTrackRemove_);\n    }\n\n    // clearout the emulated text track list.\n    let i = emulatedTt.length;\n\n    while (i--) {\n      emulatedTt.removeTrack_(emulatedTt[i]);\n    }\n\n\n    Html5.disposeMediaElement(this.el_);\n    super.dispose();\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = this.options_.tag;\n\n    // Check if this browser supports moving the element into the box.\n    // On the iPhone video will break if you move the element,\n    // So we have to create a brand new element.\n    if (!el || this['movingMediaElementInDOM'] === false) {\n\n      // If the original tag is still there, clone and remove it.\n      if (el) {\n        const clone = el.cloneNode(true);\n        el.parentNode.insertBefore(clone, el);\n        Html5.disposeMediaElement(el);\n        el = clone;\n      } else {\n        el = document.createElement('video');\n\n        // determine if native controls should be used\n        let tagAttributes = this.options_.tag && Dom.getElAttributes(this.options_.tag);\n        let attributes = mergeOptions({}, tagAttributes);\n        if (!browser.TOUCH_ENABLED || this.options_.nativeControlsForTouch !== true) {\n          delete attributes.controls;\n        }\n\n        Dom.setElAttributes(el,\n          assign(attributes, {\n            id: this.options_.techId,\n            class: 'vjs-tech'\n          })\n        );\n      }\n    }\n\n    // Update specific tag settings, in case they were overridden\n    let settingsAttrs = ['autoplay','preload','loop','muted'];\n    for (let i = settingsAttrs.length - 1; i >= 0; i--) {\n      const attr = settingsAttrs[i];\n      let overwriteAttrs = {};\n      if (typeof this.options_[attr] !== 'undefined') {\n        overwriteAttrs[attr] = this.options_[attr];\n      }\n      Dom.setElAttributes(el, overwriteAttrs);\n    }\n\n    return el;\n    // jenniisawesome = true;\n  }\n\n  // If we're loading the playback object after it has started loading\n  // or playing the video (often with autoplay on) then the loadstart event\n  // has already fired and we need to fire it manually because many things\n  // rely on it.\n  handleLateInit_(el) {\n    if (el.networkState === 0 || el.networkState === 3) {\n      // The video element hasn't started loading the source yet\n      // or didn't find a source\n      return;\n    }\n\n    if (el.readyState === 0) {\n      // NetworkState is set synchronously BUT loadstart is fired at the\n      // end of the current stack, usually before setInterval(fn, 0).\n      // So at this point we know loadstart may have already fired or is\n      // about to fire, and either way the player hasn't seen it yet.\n      // We don't want to fire loadstart prematurely here and cause a\n      // double loadstart so we'll wait and see if it happens between now\n      // and the next loop, and fire it if not.\n      // HOWEVER, we also want to make sure it fires before loadedmetadata\n      // which could also happen between now and the next loop, so we'll\n      // watch for that also.\n      let loadstartFired = false;\n      let setLoadstartFired = function() {\n        loadstartFired = true;\n      };\n      this.on('loadstart', setLoadstartFired);\n\n      let triggerLoadstart = function() {\n        // We did miss the original loadstart. Make sure the player\n        // sees loadstart before loadedmetadata\n        if (!loadstartFired) {\n          this.trigger('loadstart');\n        }\n      };\n      this.on('loadedmetadata', triggerLoadstart);\n\n      this.ready(function(){\n        this.off('loadstart', setLoadstartFired);\n        this.off('loadedmetadata', triggerLoadstart);\n\n        if (!loadstartFired) {\n          // We did miss the original native loadstart. Fire it now.\n          this.trigger('loadstart');\n        }\n      });\n\n      return;\n    }\n\n    // From here on we know that loadstart already fired and we missed it.\n    // The other readyState events aren't as much of a problem if we double\n    // them, so not going to go to as much trouble as loadstart to prevent\n    // that unless we find reason to.\n    let eventsToTrigger = ['loadstart'];\n\n    // loadedmetadata: newly equal to HAVE_METADATA (1) or greater\n    eventsToTrigger.push('loadedmetadata');\n\n    // loadeddata: newly increased to HAVE_CURRENT_DATA (2) or greater\n    if (el.readyState >= 2) {\n      eventsToTrigger.push('loadeddata');\n    }\n\n    // canplay: newly increased to HAVE_FUTURE_DATA (3) or greater\n    if (el.readyState >= 3) {\n      eventsToTrigger.push('canplay');\n    }\n\n    // canplaythrough: newly equal to HAVE_ENOUGH_DATA (4)\n    if (el.readyState >= 4) {\n      eventsToTrigger.push('canplaythrough');\n    }\n\n    // We still need to give the player time to add event listeners\n    this.ready(function(){\n      eventsToTrigger.forEach(function(type){\n        this.trigger(type);\n      }, this);\n    });\n  }\n\n  proxyNativeTextTracks_() {\n    let tt = this.el().textTracks;\n\n    if (tt && tt.addEventListener) {\n      tt.addEventListener('change', this.handleTextTrackChange_);\n      tt.addEventListener('addtrack', this.handleTextTrackAdd_);\n      tt.addEventListener('removetrack', this.handleTextTrackRemove_);\n    }\n  }\n\n  handleTextTrackChange(e) {\n    let tt = this.textTracks();\n    this.textTracks().trigger({\n      type: 'change',\n      target: tt,\n      currentTarget: tt,\n      srcElement: tt\n    });\n  }\n\n  handleTextTrackAdd(e) {\n    this.textTracks().addTrack_(e.track);\n  }\n\n  handleTextTrackRemove(e) {\n    this.textTracks().removeTrack_(e.track);\n  }\n\n  /**\n   * Play for html5 tech\n   *\n   * @method play\n   */\n  play() { this.el_.play(); }\n\n  /**\n   * Pause for html5 tech\n   *\n   * @method pause\n   */\n  pause() { this.el_.pause(); }\n\n  /**\n   * Paused for html5 tech\n   *\n   * @return {Boolean}\n   * @method paused\n   */\n  paused() { return this.el_.paused; }\n\n  /**\n   * Get current time\n   *\n   * @return {Number}\n   * @method currentTime\n   */\n  currentTime() { return this.el_.currentTime; }\n\n  /**\n   * Set current time\n   *\n   * @param {Number} seconds Current time of video\n   * @method setCurrentTime\n   */\n  setCurrentTime(seconds) {\n    try {\n      this.el_.currentTime = seconds;\n    } catch(e) {\n      log(e, 'Video is not ready. (Video.js)');\n      // this.warning(VideoJS.warnings.videoNotReady);\n    }\n  }\n\n  /**\n   * Get duration\n   *\n   * @return {Number}\n   * @method duration\n   */\n  duration() { return this.el_.duration || 0; }\n\n  /**\n   * Get a TimeRange object that represents the intersection\n   * of the time ranges for which the user agent has all\n   * relevant media\n   *\n   * @return {TimeRangeObject}\n   * @method buffered\n   */\n  buffered() { return this.el_.buffered; }\n\n  /**\n   * Get volume level\n   *\n   * @return {Number}\n   * @method volume\n   */\n  volume() { return this.el_.volume; }\n\n  /**\n   * Set volume level\n   *\n   * @param {Number} percentAsDecimal Volume percent as a decimal\n   * @method setVolume\n   */\n  setVolume(percentAsDecimal) { this.el_.volume = percentAsDecimal; }\n\n  /**\n   * Get if muted\n   *\n   * @return {Boolean}\n   * @method muted\n   */\n  muted() { return this.el_.muted; }\n\n  /**\n   * Set muted\n   *\n   * @param {Boolean} If player is to be muted or note\n   * @method setMuted\n   */\n  setMuted(muted) { this.el_.muted = muted; }\n\n  /**\n   * Get player width\n   *\n   * @return {Number}\n   * @method width\n   */\n  width() { return this.el_.offsetWidth; }\n\n  /**\n   * Get player height\n   *\n   * @return {Number}\n   * @method height\n   */\n  height() {  return this.el_.offsetHeight; }\n\n  /**\n   * Get if there is fullscreen support\n   *\n   * @return {Boolean}\n   * @method supportsFullScreen\n   */\n  supportsFullScreen() {\n    if (typeof this.el_.webkitEnterFullScreen === 'function') {\n      let userAgent = window.navigator.userAgent;\n      // Seems to be broken in Chromium/Chrome && Safari in Leopard\n      if (/Android/.test(userAgent) || !/Chrome|Mac OS X 10.5/.test(userAgent)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Request to enter fullscreen\n   *\n   * @method enterFullScreen\n   */\n  enterFullScreen() {\n    var video = this.el_;\n\n    if ('webkitDisplayingFullscreen' in video) {\n      this.one('webkitbeginfullscreen', function() {\n        this.one('webkitendfullscreen', function() {\n          this.trigger('fullscreenchange', { isFullscreen: false });\n        });\n\n        this.trigger('fullscreenchange', { isFullscreen: true });\n      });\n    }\n\n    if (video.paused && video.networkState <= video.HAVE_METADATA) {\n      // attempt to prime the video element for programmatic access\n      // this isn't necessary on the desktop but shouldn't hurt\n      this.el_.play();\n\n      // playing and pausing synchronously during the transition to fullscreen\n      // can get iOS ~6.1 devices into a play/pause loop\n      this.setTimeout(function(){\n        video.pause();\n        video.webkitEnterFullScreen();\n      }, 0);\n    } else {\n      video.webkitEnterFullScreen();\n    }\n  }\n\n  /**\n   * Request to exit fullscreen\n   *\n   * @method exitFullScreen\n   */\n  exitFullScreen() {\n    this.el_.webkitExitFullScreen();\n  }\n\n  /**\n   * Get/set video\n   *\n   * @param {Object=} src Source object\n   * @return {Object}\n   * @method src\n   */\n  src(src) {\n    if (src === undefined) {\n      return this.el_.src;\n    } else {\n      // Setting src through `src` instead of `setSrc` will be deprecated\n      this.setSrc(src);\n    }\n  }\n\n  /**\n   * Set video\n   *\n   * @param {Object} src Source object\n   * @deprecated\n   * @method setSrc\n   */\n  setSrc(src) {\n    this.el_.src = src;\n  }\n\n  /**\n   * Load media into player\n   *\n   * @method load\n   */\n  load(){\n    this.el_.load();\n  }\n\n  /**\n   * Get current source\n   *\n   * @return {Object}\n   * @method currentSrc\n   */\n  currentSrc() { return this.el_.currentSrc; }\n\n  /**\n   * Get poster\n   *\n   * @return {String}\n   * @method poster\n   */\n  poster() { return this.el_.poster; }\n\n  /**\n   * Set poster\n   *\n   * @param {String} val URL to poster image\n   * @method\n   */\n  setPoster(val) { this.el_.poster = val; }\n\n  /**\n   * Get preload attribute\n   *\n   * @return {String}\n   * @method preload\n   */\n  preload() { return this.el_.preload; }\n\n  /**\n   * Set preload attribute\n   *\n   * @param {String} val Value for preload attribute\n   * @method setPreload\n   */\n  setPreload(val) { this.el_.preload = val; }\n\n  /**\n   * Get autoplay attribute\n   *\n   * @return {String}\n   * @method autoplay\n   */\n  autoplay() { return this.el_.autoplay; }\n\n  /**\n   * Set autoplay attribute\n   *\n   * @param {String} val Value for preload attribute\n   * @method setAutoplay\n   */\n  setAutoplay(val) { this.el_.autoplay = val; }\n\n  /**\n   * Get controls attribute\n   *\n   * @return {String}\n   * @method controls\n   */\n  controls() { return this.el_.controls; }\n\n  /**\n   * Set controls attribute\n   *\n   * @param {String} val Value for controls attribute\n   * @method setControls\n   */\n  setControls(val) { this.el_.controls = !!val; }\n\n  /**\n   * Get loop attribute\n   *\n   * @return {String}\n   * @method loop\n   */\n  loop() { return this.el_.loop; }\n\n  /**\n   * Set loop attribute\n   *\n   * @param {String} val Value for loop attribute\n   * @method setLoop\n   */\n  setLoop(val) { this.el_.loop = val; }\n\n  /**\n   * Get error value\n   *\n   * @return {String}\n   * @method error\n   */\n  error() { return this.el_.error; }\n\n  /**\n   * Get whether or not the player is in the \"seeking\" state\n   *\n   * @return {Boolean}\n   * @method seeking\n   */\n  seeking() { return this.el_.seeking; }\n\n  /**\n   * Get a TimeRanges object that represents the\n   * ranges of the media resource to which it is possible\n   * for the user agent to seek.\n   *\n   * @return {TimeRangeObject}\n   * @method seekable\n   */\n  seekable() { return this.el_.seekable; }\n\n  /**\n   * Get if video ended\n   *\n   * @return {Boolean}\n   * @method ended\n   */\n  ended() { return this.el_.ended; }\n\n  /**\n   * Get the value of the muted content attribute\n   * This attribute has no dynamic effect, it only\n   * controls the default state of the element\n   *\n   * @return {Boolean}\n   * @method defaultMuted\n   */\n  defaultMuted() { return this.el_.defaultMuted; }\n\n  /**\n   * Get desired speed at which the media resource is to play\n   *\n   * @return {Number}\n   * @method playbackRate\n   */\n  playbackRate() { return this.el_.playbackRate; }\n\n  /**\n   * Returns a TimeRanges object that represents the ranges of the\n   * media resource that the user agent has played.\n   * @return {TimeRangeObject} the range of points on the media\n   * timeline that has been reached through normal playback\n   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-played\n   */\n  played() { return this.el_.played; }\n\n  /**\n   * Set desired speed at which the media resource is to play\n   *\n   * @param {Number} val Speed at which the media resource is to play\n   * @method setPlaybackRate\n   */\n  setPlaybackRate(val) { this.el_.playbackRate = val; }\n\n  /**\n   * Get the current state of network activity for the element, from\n   * the list below\n   * NETWORK_EMPTY (numeric value 0)\n   * NETWORK_IDLE (numeric value 1)\n   * NETWORK_LOADING (numeric value 2)\n   * NETWORK_NO_SOURCE (numeric value 3)\n   *\n   * @return {Number}\n   * @method networkState\n   */\n  networkState() { return this.el_.networkState; }\n\n  /**\n   * Get a value that expresses the current state of the element\n   * with respect to rendering the current playback position, from\n   * the codes in the list below\n   * HAVE_NOTHING (numeric value 0)\n   * HAVE_METADATA (numeric value 1)\n   * HAVE_CURRENT_DATA (numeric value 2)\n   * HAVE_FUTURE_DATA (numeric value 3)\n   * HAVE_ENOUGH_DATA (numeric value 4)\n   *\n   * @return {Number}\n   * @method readyState\n   */\n  readyState() { return this.el_.readyState; }\n\n  /**\n   * Get width of video\n   *\n   * @return {Number}\n   * @method videoWidth\n   */\n  videoWidth() { return this.el_.videoWidth; }\n\n  /**\n   * Get height of video\n   *\n   * @return {Number}\n   * @method videoHeight\n   */\n  videoHeight() { return this.el_.videoHeight; }\n\n  /**\n   * Get text tracks\n   *\n   * @return {TextTrackList}\n   * @method textTracks\n   */\n  textTracks() {\n    return super.textTracks();\n  }\n\n  /**\n   * Creates and returns a text track object\n   *\n   * @param {String} kind Text track kind (subtitles, captions, descriptions\n   *                                       chapters and metadata)\n   * @param {String=} label Label to identify the text track\n   * @param {String=} language Two letter language abbreviation\n   * @return {TextTrackObject}\n   * @method addTextTrack\n   */\n  addTextTrack(kind, label, language) {\n    if (!this['featuresNativeTextTracks']) {\n      return super.addTextTrack(kind, label, language);\n    }\n\n    return this.el_.addTextTrack(kind, label, language);\n  }\n\n  /**\n   * Creates and returns a remote text track object\n   *\n   * @param {Object} options The object should contain values for\n   * kind, language, label and src (location of the WebVTT file)\n   * @return {TextTrackObject}\n   * @method addRemoteTextTrack\n   */\n  addRemoteTextTrack(options={}) {\n    if (!this['featuresNativeTextTracks']) {\n      return super.addRemoteTextTrack(options);\n    }\n\n    var track = document.createElement('track');\n\n    if (options['kind']) {\n      track['kind'] = options['kind'];\n    }\n    if (options['label']) {\n      track['label'] = options['label'];\n    }\n    if (options['language'] || options['srclang']) {\n      track['srclang'] = options['language'] || options['srclang'];\n    }\n    if (options['default']) {\n      track['default'] = options['default'];\n    }\n    if (options['id']) {\n      track['id'] = options['id'];\n    }\n    if (options['src']) {\n      track['src'] = options['src'];\n    }\n\n    this.el().appendChild(track);\n\n    this.remoteTextTracks().addTrack_(track.track);\n\n    return track;\n  }\n\n  /**\n   * Remove remote text track from TextTrackList object\n   *\n   * @param {TextTrackObject} track Texttrack object to remove\n   * @method removeRemoteTextTrack\n   */\n  removeRemoteTextTrack(track) {\n    if (!this['featuresNativeTextTracks']) {\n      return super.removeRemoteTextTrack(track);\n    }\n\n    var tracks, i;\n\n    this.remoteTextTracks().removeTrack_(track);\n\n    tracks = this.el().querySelectorAll('track');\n\n    i = tracks.length;\n    while (i--) {\n      if (track === tracks[i] || track === tracks[i].track) {\n        this.el().removeChild(tracks[i]);\n      }\n    }\n  }\n\n}\n\n\n/* HTML5 Support Testing ---------------------------------------------------- */\n\n/*\n* Element for testing browser HTML5 video capabilities\n*\n* @type {Element}\n* @constant\n* @private\n*/\nHtml5.TEST_VID = document.createElement('video');\nlet track = document.createElement('track');\ntrack.kind = 'captions';\ntrack.srclang = 'en';\ntrack.label = 'English';\nHtml5.TEST_VID.appendChild(track);\n\n/*\n * Check if HTML5 video is supported by this browser/device\n *\n * @return {Boolean}\n */\nHtml5.isSupported = function(){\n  // IE9 with no Media Player is a LIAR! (#984)\n  try {\n    Html5.TEST_VID['volume'] = 0.5;\n  } catch (e) {\n    return false;\n  }\n\n  return !!Html5.TEST_VID.canPlayType;\n};\n\n// Add Source Handler pattern functions to this tech\nTech.withSourceHandlers(Html5);\n\n/*\n * The default native source handler.\n * This simply passes the source to the video element. Nothing fancy.\n *\n * @param  {Object} source   The source object\n * @param  {Html5} tech  The instance of the HTML5 tech\n */\nHtml5.nativeSourceHandler = {};\n\n/*\n * Check if the video element can handle the source natively\n *\n * @param  {Object} source  The source object\n * @return {String}         'probably', 'maybe', or '' (empty string)\n */\nHtml5.nativeSourceHandler.canHandleSource = function(source){\n  var match, ext;\n\n  function canPlayType(type){\n    // IE9 on Windows 7 without MediaPlayer throws an error here\n    // https://github.com/videojs/video.js/issues/519\n    try {\n      return Html5.TEST_VID.canPlayType(type);\n    } catch(e) {\n      return '';\n    }\n  }\n\n  // If a type was provided we should rely on that\n  if (source.type) {\n    return canPlayType(source.type);\n  } else if (source.src) {\n    // If no type, fall back to checking 'video/[EXTENSION]'\n    ext = Url.getFileExtension(source.src);\n\n    return canPlayType(`video/${ext}`);\n  }\n\n  return '';\n};\n\n/*\n * Pass the source to the video element\n * Adaptive source handlers will have more complicated workflows before passing\n * video data to the video element\n *\n * @param  {Object} source    The source object\n * @param  {Html5} tech   The instance of the Html5 tech\n */\nHtml5.nativeSourceHandler.handleSource = function(source, tech){\n  tech.setSrc(source.src);\n};\n\n/*\n* Clean up the source handler when disposing the player or switching sources..\n* (no cleanup is needed when supporting the format natively)\n*/\nHtml5.nativeSourceHandler.dispose = function(){};\n\n// Register the native source handler\nHtml5.registerSourceHandler(Html5.nativeSourceHandler);\n\n/*\n * Check if the volume can be changed in this browser/device.\n * Volume cannot be changed in a lot of mobile devices.\n * Specifically, it can't be changed from 1 on iOS.\n *\n * @return {Boolean}\n */\nHtml5.canControlVolume = function(){\n  var volume =  Html5.TEST_VID.volume;\n  Html5.TEST_VID.volume = (volume / 2) + 0.1;\n  return volume !== Html5.TEST_VID.volume;\n};\n\n/*\n * Check if playbackRate is supported in this browser/device.\n *\n * @return {Number} [description]\n */\nHtml5.canControlPlaybackRate = function(){\n  var playbackRate = Html5.TEST_VID.playbackRate;\n  Html5.TEST_VID.playbackRate = (playbackRate / 2) + 0.1;\n  return playbackRate !== Html5.TEST_VID.playbackRate;\n};\n\n/*\n * Check to see if native text tracks are supported by this browser/device\n *\n * @return {Boolean}\n */\nHtml5.supportsNativeTextTracks = function() {\n  var supportsTextTracks;\n\n  // Figure out native text track support\n  // If mode is a number, we cannot change it because it'll disappear from view.\n  // Browsers with numeric modes include IE10 and older (<=2013) samsung android models.\n  // Firefox isn't playing nice either with modifying the mode\n  // TODO: Investigate firefox: https://github.com/videojs/video.js/issues/1862\n  supportsTextTracks = !!Html5.TEST_VID.textTracks;\n  if (supportsTextTracks && Html5.TEST_VID.textTracks.length > 0) {\n    supportsTextTracks = typeof Html5.TEST_VID.textTracks[0]['mode'] !== 'number';\n  }\n  if (supportsTextTracks && browser.IS_FIREFOX) {\n    supportsTextTracks = false;\n  }\n  if (supportsTextTracks && !('onremovetrack' in Html5.TEST_VID.textTracks)) {\n    supportsTextTracks = false;\n  }\n\n  return supportsTextTracks;\n};\n\n/**\n * An array of events available on the Html5 tech.\n *\n * @private\n * @type {Array}\n */\nHtml5.Events = [\n  'loadstart',\n  'suspend',\n  'abort',\n  'error',\n  'emptied',\n  'stalled',\n  'loadedmetadata',\n  'loadeddata',\n  'canplay',\n  'canplaythrough',\n  'playing',\n  'waiting',\n  'seeking',\n  'seeked',\n  'ended',\n  'durationchange',\n  'timeupdate',\n  'progress',\n  'play',\n  'pause',\n  'ratechange',\n  'volumechange'\n];\n\n/*\n * Set the tech's volume control support status\n *\n * @type {Boolean}\n */\nHtml5.prototype['featuresVolumeControl'] = Html5.canControlVolume();\n\n/*\n * Set the tech's playbackRate support status\n *\n * @type {Boolean}\n */\nHtml5.prototype['featuresPlaybackRate'] = Html5.canControlPlaybackRate();\n\n/*\n * Set the tech's status on moving the video element.\n * In iOS, if you move a video element in the DOM, it breaks video playback.\n *\n * @type {Boolean}\n */\nHtml5.prototype['movingMediaElementInDOM'] = !browser.IS_IOS;\n\n/*\n * Set the the tech's fullscreen resize support status.\n * HTML video is able to automatically resize when going to fullscreen.\n * (No longer appears to be used. Can probably be removed.)\n */\nHtml5.prototype['featuresFullscreenResize'] = true;\n\n/*\n * Set the tech's progress event support status\n * (this disables the manual progress events of the Tech)\n */\nHtml5.prototype['featuresProgressEvents'] = true;\n\n/*\n * Sets the tech's status on native text track support\n *\n * @type {Boolean}\n */\nHtml5.prototype['featuresNativeTextTracks'] = Html5.supportsNativeTextTracks();\n\n// HTML5 Feature detection and Device Fixes --------------------------------- //\nlet canPlayType;\nconst mpegurlRE = /^application\\/(?:x-|vnd\\.apple\\.)mpegurl/i;\nconst mp4RE = /^video\\/mp4/i;\n\nHtml5.patchCanPlayType = function() {\n  // Android 4.0 and above can play HLS to some extent but it reports being unable to do so\n  if (browser.ANDROID_VERSION >= 4.0) {\n    if (!canPlayType) {\n      canPlayType = Html5.TEST_VID.constructor.prototype.canPlayType;\n    }\n\n    Html5.TEST_VID.constructor.prototype.canPlayType = function(type) {\n      if (type && mpegurlRE.test(type)) {\n        return 'maybe';\n      }\n      return canPlayType.call(this, type);\n    };\n  }\n\n  // Override Android 2.2 and less canPlayType method which is broken\n  if (browser.IS_OLD_ANDROID) {\n    if (!canPlayType) {\n      canPlayType = Html5.TEST_VID.constructor.prototype.canPlayType;\n    }\n\n    Html5.TEST_VID.constructor.prototype.canPlayType = function(type){\n      if (type && mp4RE.test(type)) {\n        return 'maybe';\n      }\n      return canPlayType.call(this, type);\n    };\n  }\n};\n\nHtml5.unpatchCanPlayType = function() {\n  var r = Html5.TEST_VID.constructor.prototype.canPlayType;\n  Html5.TEST_VID.constructor.prototype.canPlayType = canPlayType;\n  canPlayType = null;\n  return r;\n};\n\n// by default, patch the video element\nHtml5.patchCanPlayType();\n\nHtml5.disposeMediaElement = function(el){\n  if (!el) { return; }\n\n  if (el.parentNode) {\n    el.parentNode.removeChild(el);\n  }\n\n  // remove any child track or source nodes to prevent their loading\n  while(el.hasChildNodes()) {\n    el.removeChild(el.firstChild);\n  }\n\n  // remove any src reference. not setting `src=''` because that causes a warning\n  // in firefox\n  el.removeAttribute('src');\n\n  // force the media element to update its loading state by calling load()\n  // however IE on Windows 7N has a bug that throws an error so need a try/catch (#793)\n  if (typeof el.load === 'function') {\n    // wrapping in an iife so it's not deoptimized (#1060#discussion_r10324473)\n    (function() {\n      try {\n        el.load();\n      } catch (e) {\n        // not supported\n      }\n    })();\n  }\n};\n\nComponent.registerComponent('Html5', Html5);\nexport default Html5;\n","/**\n * @file loader.js\n */\nimport Component from '../component';\nimport window from 'global/window';\nimport toTitleCase from '../utils/to-title-case.js';\n\n/**\n * The Media Loader is the component that decides which playback technology to load\n * when the player is initialized.\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends Component\n * @class MediaLoader\n */\nclass MediaLoader extends Component {\n\n  constructor(player, options, ready){\n    super(player, options, ready);\n\n    // If there are no sources when the player is initialized,\n    // load the first supported playback technology.\n\n    if (!options.playerOptions['sources'] || options.playerOptions['sources'].length === 0) {\n      for (let i=0, j=options.playerOptions['techOrder']; i<j.length; i++) {\n        let techName = toTitleCase(j[i]);\n        let tech = Component.getComponent(techName);\n\n        // Check if the browser supports this technology\n        if (tech && tech.isSupported()) {\n          player.loadTech_(techName);\n          break;\n        }\n      }\n    } else {\n      // // Loop through playback technologies (HTML5, Flash) and check for support.\n      // // Then load the best source.\n      // // A few assumptions here:\n      // //   All playback technologies respect preload false.\n      player.src(options.playerOptions['sources']);\n    }\n  }\n}\n\nComponent.registerComponent('MediaLoader', MediaLoader);\nexport default MediaLoader;\n","/**\n * @file tech.js\n * Media Technology Controller - Base class for media playback\n * technology controllers like Flash and HTML5\n */\n\nimport Component from '../component';\nimport TextTrack from '../tracks/text-track';\nimport TextTrackList from '../tracks/text-track-list';\nimport * as Fn from '../utils/fn.js';\nimport log from '../utils/log.js';\nimport { createTimeRange } from '../utils/time-ranges.js';\nimport { bufferedPercent } from '../utils/buffer.js';\nimport MediaError from '../media-error.js';\nimport window from 'global/window';\nimport document from 'global/document';\n\n/**\n * Base class for media (HTML5 Video, Flash) controllers\n *\n * @param {Object=} options Options object\n * @param {Function=} ready Ready callback function\n * @extends Component\n * @class Tech\n */\nclass Tech extends Component {\n\n  constructor(options={}, ready=function(){}){\n    // we don't want the tech to report user activity automatically.\n    // This is done manually in addControlsListeners\n    options.reportTouchActivity = false;\n    super(null, options, ready);\n\n    // keep track of whether the current source has played at all to\n    // implement a very limited played()\n    this.hasStarted_ = false;\n    this.on('playing', function() {\n      this.hasStarted_ = true;\n    });\n    this.on('loadstart', function() {\n      this.hasStarted_ = false;\n    });\n\n    this.textTracks_ = options.textTracks;\n\n    // Manually track progress in cases where the browser/flash player doesn't report it.\n    if (!this.featuresProgressEvents) {\n      this.manualProgressOn();\n    }\n\n    // Manually track timeupdates in cases where the browser/flash player doesn't report it.\n    if (!this.featuresTimeupdateEvents) {\n      this.manualTimeUpdatesOn();\n    }\n\n    if (options.nativeCaptions === false || options.nativeTextTracks === false) {\n      this.featuresNativeTextTracks = false;\n    }\n\n    if (!this.featuresNativeTextTracks) {\n      this.emulateTextTracks();\n    }\n\n    this.initTextTrackListeners();\n\n    // Turn on component tap events\n    this.emitTapEvents();\n  }\n\n  /* Fallbacks for unsupported event types\n  ================================================================================ */\n  // Manually trigger progress events based on changes to the buffered amount\n  // Many flash players and older HTML5 browsers don't send progress or progress-like events\n  /**\n   * Turn on progress events\n   *\n   * @method manualProgressOn\n   */\n  manualProgressOn() {\n    this.on('durationchange', this.onDurationChange);\n\n    this.manualProgress = true;\n\n    // Trigger progress watching when a source begins loading\n    this.one('ready', this.trackProgress);\n  }\n\n  /**\n   * Turn off progress events\n   *\n   * @method manualProgressOff\n   */\n  manualProgressOff() {\n    this.manualProgress = false;\n    this.stopTrackingProgress();\n\n    this.off('durationchange', this.onDurationChange);\n  }\n\n  /**\n   * Track progress\n   *\n   * @method trackProgress\n   */\n  trackProgress() {\n    this.stopTrackingProgress();\n    this.progressInterval = this.setInterval(Fn.bind(this, function(){\n      // Don't trigger unless buffered amount is greater than last time\n\n      let numBufferedPercent = this.bufferedPercent();\n\n      if (this.bufferedPercent_ !== numBufferedPercent) {\n        this.trigger('progress');\n      }\n\n      this.bufferedPercent_ = numBufferedPercent;\n\n      if (numBufferedPercent === 1) {\n        this.stopTrackingProgress();\n      }\n    }), 500);\n  }\n\n  /**\n   * Update duration\n   *\n   * @method onDurationChange\n   */\n  onDurationChange() {\n    this.duration_ = this.duration();\n  }\n\n  /**\n   * Create and get TimeRange object for buffering\n   *\n   * @return {TimeRangeObject}\n   * @method buffered\n   */\n  buffered() {\n    return createTimeRange(0, 0);\n  }\n\n  /**\n   * Get buffered percent\n   *\n   * @return {Number}\n   * @method bufferedPercent\n   */\n  bufferedPercent() {\n    return bufferedPercent(this.buffered(), this.duration_);\n  }\n\n  /**\n   * Stops tracking progress by clearing progress interval\n   *\n   * @method stopTrackingProgress\n   */\n  stopTrackingProgress() {\n    this.clearInterval(this.progressInterval);\n  }\n\n  /*! Time Tracking -------------------------------------------------------------- */\n  /**\n   * Set event listeners for on play and pause and tracking current time\n   *\n   * @method manualTimeUpdatesOn\n   */\n  manualTimeUpdatesOn() {\n    this.manualTimeUpdates = true;\n\n    this.on('play', this.trackCurrentTime);\n    this.on('pause', this.stopTrackingCurrentTime);\n  }\n\n  /**\n   * Remove event listeners for on play and pause and tracking current time\n   *\n   * @method manualTimeUpdatesOff\n   */\n  manualTimeUpdatesOff() {\n    this.manualTimeUpdates = false;\n    this.stopTrackingCurrentTime();\n    this.off('play', this.trackCurrentTime);\n    this.off('pause', this.stopTrackingCurrentTime);\n  }\n\n  /**\n   * Tracks current time\n   *\n   * @method trackCurrentTime\n   */\n  trackCurrentTime() {\n    if (this.currentTimeInterval) { this.stopTrackingCurrentTime(); }\n    this.currentTimeInterval = this.setInterval(function(){\n      this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n    }, 250); // 42 = 24 fps // 250 is what Webkit uses // FF uses 15\n  }\n\n  /**\n   * Turn off play progress tracking (when paused or dragging)\n   *\n   * @method stopTrackingCurrentTime\n   */\n  stopTrackingCurrentTime() {\n    this.clearInterval(this.currentTimeInterval);\n\n    // #1002 - if the video ends right before the next timeupdate would happen,\n    // the progress bar won't make it all the way to the end\n    this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n  }\n\n  /**\n   * Turn off any manual progress or timeupdate tracking\n   *\n   * @method dispose\n   */\n  dispose() {\n    // clear out text tracks because we can't reuse them between techs\n    let textTracks = this.textTracks();\n\n    if (textTracks) {\n      let i = textTracks.length;\n      while(i--) {\n        this.removeRemoteTextTrack(textTracks[i]);\n      }\n    }\n\n    // Turn off any manual progress or timeupdate tracking\n    if (this.manualProgress) { this.manualProgressOff(); }\n\n    if (this.manualTimeUpdates) { this.manualTimeUpdatesOff(); }\n\n    super.dispose();\n  }\n\n  /**\n   * When invoked without an argument, returns a MediaError object\n   * representing the current error state of the player or null if\n   * there is no error. When invoked with an argument, set the current\n   * error state of the player.\n   * @param {MediaError=} err    Optional an error object\n   * @return {MediaError}        the current error object or null\n   * @method error\n   */\n  error(err) {\n    if (err !== undefined) {\n      if (err instanceof MediaError) {\n        this.error_ = err;\n      } else {\n        this.error_ = new MediaError(err);\n      }\n      this.trigger('error');\n    }\n    return this.error_;\n  }\n\n  /**\n   * Return the time ranges that have been played through for the\n   * current source. This implementation is incomplete. It does not\n   * track the played time ranges, only whether the source has played\n   * at all or not.\n   * @return {TimeRangeObject} a single time range if this video has\n   * played or an empty set of ranges if not.\n   * @method played\n   */\n  played() {\n    if (this.hasStarted_) {\n      return createTimeRange(0, 0);\n    }\n    return createTimeRange();\n  }\n\n  /**\n   * Set current time\n   *\n   * @method setCurrentTime\n   */\n  setCurrentTime() {\n    // improve the accuracy of manual timeupdates\n    if (this.manualTimeUpdates) { this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true }); }\n  }\n\n  /**\n   * Initialize texttrack listeners\n   *\n   * @method initTextTrackListeners\n   */\n  initTextTrackListeners() {\n    let textTrackListChanges = Fn.bind(this, function() {\n      this.trigger('texttrackchange');\n    });\n\n    let tracks = this.textTracks();\n\n    if (!tracks) return;\n\n    tracks.addEventListener('removetrack', textTrackListChanges);\n    tracks.addEventListener('addtrack', textTrackListChanges);\n\n    this.on('dispose', Fn.bind(this, function() {\n      tracks.removeEventListener('removetrack', textTrackListChanges);\n      tracks.removeEventListener('addtrack', textTrackListChanges);\n    }));\n  }\n\n  /**\n   * Emulate texttracks\n   *\n   * @method emulateTextTracks\n   */\n  emulateTextTracks() {\n    if (!window['WebVTT'] && this.el().parentNode != null) {\n      let script = document.createElement('script');\n      script.src = this.options_['vtt.js'] || '../node_modules/vtt.js/dist/vtt.js';\n      this.el().parentNode.appendChild(script);\n      window['WebVTT'] = true;\n    }\n\n    let tracks = this.textTracks();\n    if (!tracks) {\n      return;\n    }\n\n    let textTracksChanges = Fn.bind(this, function() {\n      let updateDisplay = () => this.trigger('texttrackchange');\n\n      updateDisplay();\n\n      for (let i = 0; i < tracks.length; i++) {\n        let track = tracks[i];\n        track.removeEventListener('cuechange', updateDisplay);\n        if (track.mode === 'showing') {\n          track.addEventListener('cuechange', updateDisplay);\n        }\n      }\n    });\n\n    tracks.addEventListener('change', textTracksChanges);\n\n    this.on('dispose', function() {\n      tracks.removeEventListener('change', textTracksChanges);\n    });\n  }\n\n  /*\n   * Provide default methods for text tracks.\n   *\n   * Html5 tech overrides these.\n   */\n\n  /**\n   * Get texttracks\n   *\n   * @returns {TextTrackList}\n   * @method textTracks\n   */\n  textTracks() {\n    this.textTracks_ = this.textTracks_ || new TextTrackList();\n    return this.textTracks_;\n  }\n\n  /**\n   * Get remote texttracks\n   *\n   * @returns {TextTrackList}\n   * @method remoteTextTracks\n   */\n  remoteTextTracks() {\n    this.remoteTextTracks_ = this.remoteTextTracks_ || new TextTrackList();\n    return this.remoteTextTracks_;\n  }\n\n  /**\n   * Creates and returns a remote text track object\n   *\n   * @param {String} kind Text track kind (subtitles, captions, descriptions\n   *                                       chapters and metadata)\n   * @param {String=} label Label to identify the text track\n   * @param {String=} language Two letter language abbreviation\n   * @return {TextTrackObject}\n   * @method addTextTrack\n   */\n  addTextTrack(kind, label, language) {\n    if (!kind) {\n      throw new Error('TextTrack kind is required but was not provided');\n    }\n\n    return createTrackHelper(this, kind, label, language);\n  }\n\n  /**\n   * Creates and returns a remote text track object\n   *\n   * @param {Object} options The object should contain values for\n   * kind, language, label and src (location of the WebVTT file)\n   * @return {TextTrackObject}\n   * @method addRemoteTextTrack\n   */\n  addRemoteTextTrack(options) {\n    let track = createTrackHelper(this, options.kind, options.label, options.language, options);\n    this.remoteTextTracks().addTrack_(track);\n    return {\n      track: track\n    };\n  }\n\n  /**\n   * Remove remote texttrack\n   *\n   * @param {TextTrackObject} track Texttrack to remove\n   * @method removeRemoteTextTrack\n   */\n  removeRemoteTextTrack(track) {\n    this.textTracks().removeTrack_(track);\n    this.remoteTextTracks().removeTrack_(track);\n  }\n\n  /**\n   * Provide a default setPoster method for techs\n   * Poster support for techs should be optional, so we don't want techs to\n   * break if they don't have a way to set a poster.\n   *\n   * @method setPoster\n   */\n  setPoster() {}\n\n}\n\n/*\n * List of associated text tracks\n *\n * @type {Array}\n * @private\n */\nTech.prototype.textTracks_;\n\nvar createTrackHelper = function(self, kind, label, language, options={}) {\n  let tracks = self.textTracks();\n\n  options.kind = kind;\n\n  if (label) {\n    options.label = label;\n  }\n  if (language) {\n    options.language = language;\n  }\n  options.tech = self;\n\n  let track = new TextTrack(options);\n  tracks.addTrack_(track);\n\n  return track;\n};\n\nTech.prototype.featuresVolumeControl = true;\n\n// Resizing plugins using request fullscreen reloads the plugin\nTech.prototype.featuresFullscreenResize = false;\nTech.prototype.featuresPlaybackRate = false;\n\n// Optional events that we can manually mimic with timers\n// currently not triggered by video-js-swf\nTech.prototype.featuresProgressEvents = false;\nTech.prototype.featuresTimeupdateEvents = false;\n\nTech.prototype.featuresNativeTextTracks = false;\n\n/*\n * A functional mixin for techs that want to use the Source Handler pattern.\n *\n * ##### EXAMPLE:\n *\n *   Tech.withSourceHandlers.call(MyTech);\n *\n */\nTech.withSourceHandlers = function(_Tech){\n   /*\n    * Register a source handler\n    * Source handlers are scripts for handling specific formats.\n    * The source handler pattern is used for adaptive formats (HLS, DASH) that\n    * manually load video data and feed it into a Source Buffer (Media Source Extensions)\n    * @param  {Function} handler  The source handler\n    * @param  {Boolean}  first    Register it before any existing handlers\n    */\n   _Tech.registerSourceHandler = function(handler, index){\n    let handlers = _Tech.sourceHandlers;\n\n    if (!handlers) {\n      handlers = _Tech.sourceHandlers = [];\n    }\n\n    if (index === undefined) {\n      // add to the end of the list\n      index = handlers.length;\n    }\n\n    handlers.splice(index, 0, handler);\n  };\n\n   /*\n    * Return the first source handler that supports the source\n    * TODO: Answer question: should 'probably' be prioritized over 'maybe'\n    * @param  {Object} source The source object\n    * @returns {Object}       The first source handler that supports the source\n    * @returns {null}         Null if no source handler is found\n    */\n   _Tech.selectSourceHandler = function(source){\n    let handlers = _Tech.sourceHandlers || [];\n    let can;\n\n    for (let i = 0; i < handlers.length; i++) {\n      can = handlers[i].canHandleSource(source);\n\n      if (can) {\n        return handlers[i];\n      }\n    }\n\n    return null;\n  };\n\n  /*\n   * Check if the tech can support the given source\n   * @param  {Object} srcObj  The source object\n   * @return {String}         'probably', 'maybe', or '' (empty string)\n   */\n  _Tech.canPlaySource = function(srcObj){\n    let sh = _Tech.selectSourceHandler(srcObj);\n\n    if (sh) {\n      return sh.canHandleSource(srcObj);\n    }\n\n    return '';\n  };\n\n  let originalSeekable = _Tech.prototype.seekable;\n\n  // when a source handler is registered, prefer its implementation of\n  // seekable when present.\n  _Tech.prototype.seekable = function() {\n    if (this.sourceHandler_ && this.sourceHandler_.seekable) {\n      return this.sourceHandler_.seekable();\n    }\n    return originalSeekable.call(this);\n  };\n\n   /*\n    * Create a function for setting the source using a source object\n    * and source handlers.\n    * Should never be called unless a source handler was found.\n    * @param {Object} source  A source object with src and type keys\n    * @return {Tech} self\n    */\n   _Tech.prototype.setSource = function(source){\n    let sh = _Tech.selectSourceHandler(source);\n\n    if (!sh) {\n      // Fall back to a native source hander when unsupported sources are\n      // deliberately set\n      if (_Tech.nativeSourceHandler) {\n        sh = _Tech.nativeSourceHandler;\n      } else {\n        log.error('No source hander found for the current source.');\n      }\n    }\n\n    // Dispose any existing source handler\n    this.disposeSourceHandler();\n    this.off('dispose', this.disposeSourceHandler);\n\n    this.currentSource_ = source;\n    this.sourceHandler_ = sh.handleSource(source, this);\n    this.on('dispose', this.disposeSourceHandler);\n\n    return this;\n  };\n\n   /*\n    * Clean up any existing source handler\n    */\n   _Tech.prototype.disposeSourceHandler = function(){\n    if (this.sourceHandler_ && this.sourceHandler_.dispose) {\n      this.sourceHandler_.dispose();\n    }\n  };\n\n};\n\nComponent.registerComponent('Tech', Tech);\n// Old name for Tech\nComponent.registerComponent('MediaTechController', Tech);\nexport default Tech;\n","/**\n * @file text-track-cue-list.js\n */\nimport * as browser from '../utils/browser.js';\nimport document from 'global/document';\n\n/*\n * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcuelist\n *\n * interface TextTrackCueList {\n *   readonly attribute unsigned long length;\n *   getter TextTrackCue (unsigned long index);\n *   TextTrackCue? getCueById(DOMString id);\n * };\n */\n\nlet TextTrackCueList = function(cues) {\n  let list = this;\n\n  if (browser.IS_IE8) {\n    list = document.createElement('custom');\n\n    for (let prop in TextTrackCueList.prototype) {\n      list[prop] = TextTrackCueList.prototype[prop];\n    }\n  }\n\n  TextTrackCueList.prototype.setCues_.call(list, cues);\n\n  Object.defineProperty(list, 'length', {\n    get: function() {\n      return this.length_;\n    }\n  });\n\n  if (browser.IS_IE8) {\n    return list;\n  }\n};\n\nTextTrackCueList.prototype.setCues_ = function(cues) {\n  let oldLength = this.length || 0;\n  let i = 0;\n  let l = cues.length;\n\n  this.cues_ = cues;\n  this.length_ = cues.length;\n\n  let defineProp = function(i) {\n    if (!(''+i in this)) {\n      Object.defineProperty(this, '' + i, {\n        get: function() {\n          return this.cues_[i];\n        }\n      });\n    }\n  };\n\n  if (oldLength < l) {\n    i = oldLength;\n\n    for(; i < l; i++) {\n      defineProp.call(this, i);\n    }\n  }\n};\n\nTextTrackCueList.prototype.getCueById = function(id) {\n  let result = null;\n  for (let i = 0, l = this.length; i < l; i++) {\n    let cue = this[i];\n    if (cue.id === id) {\n      result = cue;\n      break;\n    }\n  }\n\n  return result;\n};\n\nexport default TextTrackCueList;\n","/**\n * @file text-track-display.js\n */\nimport Component from '../component';\nimport Menu from '../menu/menu.js';\nimport MenuItem from '../menu/menu-item.js';\nimport MenuButton from '../menu/menu-button.js';\nimport * as Fn from '../utils/fn.js';\nimport document from 'global/document';\nimport window from 'global/window';\n\nconst darkGray = '#222';\nconst lightGray = '#ccc';\nconst fontMap = {\n  monospace:             'monospace',\n  sansSerif:             'sans-serif',\n  serif:                 'serif',\n  monospaceSansSerif:    '\"Andale Mono\", \"Lucida Console\", monospace',\n  monospaceSerif:        '\"Courier New\", monospace',\n  proportionalSansSerif: 'sans-serif',\n  proportionalSerif:     'serif',\n  casual:                '\"Comic Sans MS\", Impact, fantasy',\n  script:                '\"Monotype Corsiva\", cursive',\n  smallcaps:             '\"Andale Mono\", \"Lucida Console\", monospace, sans-serif'\n};\n\n/**\n * The component for displaying text track cues\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends Component\n * @class TextTrackDisplay\n */\nclass TextTrackDisplay extends Component {\n\n  constructor(player, options, ready){\n    super(player, options, ready);\n\n    player.on('loadstart', Fn.bind(this, this.toggleDisplay));\n    player.on('texttrackchange', Fn.bind(this, this.updateDisplay));\n\n    // This used to be called during player init, but was causing an error\n    // if a track should show by default and the display hadn't loaded yet.\n    // Should probably be moved to an external track loader when we support\n    // tracks that don't need a display.\n    player.ready(Fn.bind(this, function() {\n      if (player.tech_ && player.tech_['featuresNativeTextTracks']) {\n        this.hide();\n        return;\n      }\n\n      player.on('fullscreenchange', Fn.bind(this, this.updateDisplay));\n\n      let tracks = this.options_.playerOptions['tracks'] || [];\n      for (let i = 0; i < tracks.length; i++) {\n        let track = tracks[i];\n        this.player_.addRemoteTextTrack(track);\n      }\n    }));\n  }\n\n  /**\n   * Toggle display texttracks\n   *\n   * @method toggleDisplay\n   */\n  toggleDisplay() {\n    if (this.player_.tech_ && this.player_.tech_['featuresNativeTextTracks']) {\n      this.hide();\n    } else {\n      this.show();\n    }\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-text-track-display'\n    });\n  }\n\n  /**\n   * Clear display texttracks\n   *\n   * @method clearDisplay\n   */\n  clearDisplay() {\n    if (typeof window['WebVTT'] === 'function') {\n      window['WebVTT']['processCues'](window, [], this.el_);\n    }\n  }\n\n  /**\n   * Update display texttracks\n   *\n   * @method updateDisplay\n   */\n  updateDisplay() {\n    var tracks = this.player_.textTracks();\n\n    this.clearDisplay();\n\n    if (!tracks) {\n      return;\n    }\n\n    for (let i=0; i < tracks.length; i++) {\n      let track = tracks[i];\n      if (track['mode'] === 'showing') {\n        this.updateForTrack(track);\n      }\n    }\n  }\n\n  /**\n   * Add texttrack to texttrack list\n   *\n   * @param {TextTrackObject} track Texttrack object to be added to list\n   * @method updateForTrack\n   */\n  updateForTrack(track) {\n    if (typeof window['WebVTT'] !== 'function' || !track['activeCues']) {\n      return;\n    }\n\n    let overrides = this.player_['textTrackSettings'].getValues();\n\n    let cues = [];\n    for (let i = 0; i < track['activeCues'].length; i++) {\n      cues.push(track['activeCues'][i]);\n    }\n\n    window['WebVTT']['processCues'](window, track['activeCues'], this.el_);\n\n    let i = cues.length;\n    while (i--) {\n      let cueDiv = cues[i].displayState;\n      if (overrides.color) {\n        cueDiv.firstChild.style.color = overrides.color;\n      }\n      if (overrides.textOpacity) {\n        tryUpdateStyle(cueDiv.firstChild,\n                       'color',\n                       constructColor(overrides.color || '#fff',\n                                      overrides.textOpacity));\n      }\n      if (overrides.backgroundColor) {\n        cueDiv.firstChild.style.backgroundColor = overrides.backgroundColor;\n      }\n      if (overrides.backgroundOpacity) {\n        tryUpdateStyle(cueDiv.firstChild,\n                       'backgroundColor',\n                       constructColor(overrides.backgroundColor || '#000',\n                                      overrides.backgroundOpacity));\n      }\n      if (overrides.windowColor) {\n        if (overrides.windowOpacity) {\n          tryUpdateStyle(cueDiv,\n                         'backgroundColor',\n                         constructColor(overrides.windowColor, overrides.windowOpacity));\n        } else {\n          cueDiv.style.backgroundColor = overrides.windowColor;\n        }\n      }\n      if (overrides.edgeStyle) {\n        if (overrides.edgeStyle === 'dropshadow') {\n          cueDiv.firstChild.style.textShadow = `2px 2px 3px ${darkGray}, 2px 2px 4px ${darkGray}, 2px 2px 5px ${darkGray}`;\n        } else if (overrides.edgeStyle === 'raised') {\n          cueDiv.firstChild.style.textShadow = `1px 1px ${darkGray}, 2px 2px ${darkGray}, 3px 3px ${darkGray}`;\n        } else if (overrides.edgeStyle === 'depressed') {\n          cueDiv.firstChild.style.textShadow = `1px 1px ${lightGray}, 0 1px ${lightGray}, -1px -1px ${darkGray}, 0 -1px ${darkGray}`;\n        } else if (overrides.edgeStyle === 'uniform') {\n          cueDiv.firstChild.style.textShadow = `0 0 4px ${darkGray}, 0 0 4px ${darkGray}, 0 0 4px ${darkGray}, 0 0 4px ${darkGray}`;\n        }\n      }\n      if (overrides.fontPercent && overrides.fontPercent !== 1) {\n        const fontSize = window.parseFloat(cueDiv.style.fontSize);\n        cueDiv.style.fontSize = (fontSize * overrides.fontPercent) + 'px';\n        cueDiv.style.height = 'auto';\n        cueDiv.style.top = 'auto';\n        cueDiv.style.bottom = '2px';\n      }\n      if (overrides.fontFamily && overrides.fontFamily !== 'default') {\n        if (overrides.fontFamily === 'small-caps') {\n          cueDiv.firstChild.style.fontVariant = 'small-caps';\n        } else {\n          cueDiv.firstChild.style.fontFamily = fontMap[overrides.fontFamily];\n        }\n      }\n    }\n  }\n\n}\n\n/**\n* Add cue HTML to display\n*\n* @param {Number} color Hex number for color, like #f0e\n* @param {Number} opacity Value for opacity,0.0 - 1.0\n* @return {RGBAColor} In the form 'rgba(255, 0, 0, 0.3)'\n* @method constructColor\n*/\nfunction constructColor(color, opacity) {\n  return 'rgba(' +\n    // color looks like \"#f0e\"\n    parseInt(color[1] + color[1], 16) + ',' +\n    parseInt(color[2] + color[2], 16) + ',' +\n    parseInt(color[3] + color[3], 16) + ',' +\n    opacity + ')';\n}\n\n/**\n * Try to update style\n * Some style changes will throw an error, particularly in IE8. Those should be noops.\n *\n * @param {Element} el The element to be styles\n * @param {CSSProperty} style The CSS property to be styled\n * @param {CSSStyle} rule The actual style to be applied to the property\n * @method tryUpdateStyle\n */\nfunction tryUpdateStyle(el, style, rule) {\n  //\n  try {\n    el.style[style] = rule;\n  } catch (e) {}\n}\n\nComponent.registerComponent('TextTrackDisplay', TextTrackDisplay);\nexport default TextTrackDisplay;\n","/**\n * @file text-track-enums.js\n *\n * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackmode\n *\n * enum TextTrackMode { \"disabled\",  \"hidden\",  \"showing\" };\n */\nvar TextTrackMode = {\n  'disabled': 'disabled',\n  'hidden': 'hidden',\n  'showing': 'showing'\n};\n\n/*\n * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackkind\n *\n * enum TextTrackKind { \"subtitles\",  \"captions\",  \"descriptions\",  \"chapters\",  \"metadata\" };\n */\nvar TextTrackKind = {\n  'subtitles': 'subtitles',\n  'captions': 'captions',\n  'descriptions': 'descriptions',\n  'chapters': 'chapters',\n  'metadata': 'metadata'\n};\n\nexport { TextTrackMode, TextTrackKind };\n","/**\n * Utilities for capturing text track state and re-creating tracks\n * based on a capture.\n *\n * @file text-track-list-converter.js\n */\n\n/**\n * Examine a single text track and return a JSON-compatible javascript\n * object that represents the text track's state.\n * @param track {TextTrackObject} the text track to query\n * @return {Object} a serializable javascript representation of the\n * @private\n */\nlet trackToJson_ = function(track) {\n  return {\n    kind: track.kind,\n    label: track.label,\n    language: track.language,\n    id: track.id,\n    inBandMetadataTrackDispatchType: track.inBandMetadataTrackDispatchType,\n    mode: track.mode,\n    cues: track.cues && Array.prototype.map.call(track.cues, function(cue) {\n      return {\n        startTime: cue.startTime,\n        endTime: cue.endTime,\n        text: cue.text,\n        id: cue.id\n      };\n    }),\n    src: track.src\n  };\n};\n\n/**\n * Examine a tech and return a JSON-compatible javascript array that\n * represents the state of all text tracks currently configured. The\n * return array is compatible with `jsonToTextTracks`.\n * @param tech {tech} the tech object to query\n * @return {Array} a serializable javascript representation of the\n * @function textTracksToJson\n */\nlet textTracksToJson = function(tech) {\n  let trackEls = tech.el().querySelectorAll('track');\n\n  let trackObjs = Array.prototype.map.call(trackEls, (t) => t.track);\n  let tracks = Array.prototype.map.call(trackEls, function(trackEl) {\n    let json = trackToJson_(trackEl.track);\n    json.src = trackEl.src;\n    return json;\n  });\n\n  return tracks.concat(Array.prototype.filter.call(tech.textTracks(), function(track) {\n    return trackObjs.indexOf(track) === -1;\n  }).map(trackToJson_));\n};\n\n/**\n * Creates a set of remote text tracks on a tech based on an array of\n * javascript text track representations.\n * @param json {Array} an array of text track representation objects,\n * like those that would be produced by `textTracksToJson`\n * @param tech {tech} the tech to create text tracks on\n * @function jsonToTextTracks\n */\nlet jsonToTextTracks = function(json, tech) {\n  json.forEach(function(track) {\n    let addedTrack = tech.addRemoteTextTrack(track).track;\n    if (!track.src && track.cues) {\n      track.cues.forEach((cue) => addedTrack.addCue(cue));\n    }\n  });\n\n  return tech.textTracks();\n};\n\nexport default {textTracksToJson, jsonToTextTracks, trackToJson_};\n","/**\n * @file text-track-list.js\n */\nimport EventTarget from '../event-target';\nimport * as Fn from '../utils/fn.js';\nimport * as browser from '../utils/browser.js';\nimport document from 'global/document';\n\n/*\n * https://html.spec.whatwg.org/multipage/embedded-content.html#texttracklist\n *\n * interface TextTrackList : EventTarget {\n *   readonly attribute unsigned long length;\n *   getter TextTrack (unsigned long index);\n *   TextTrack? getTrackById(DOMString id);\n *\n *   attribute EventHandler onchange;\n *   attribute EventHandler onaddtrack;\n *   attribute EventHandler onremovetrack;\n * };\n */\nlet TextTrackList = function(tracks) {\n  let list = this;\n\n  if (browser.IS_IE8) {\n    list = document.createElement('custom');\n\n    for (let prop in TextTrackList.prototype) {\n      list[prop] = TextTrackList.prototype[prop];\n    }\n  }\n\n  tracks = tracks || [];\n  list.tracks_ = [];\n\n  Object.defineProperty(list, 'length', {\n    get: function() {\n      return this.tracks_.length;\n    }\n  });\n\n  for (let i = 0; i < tracks.length; i++) {\n    list.addTrack_(tracks[i]);\n  }\n\n  if (browser.IS_IE8) {\n    return list;\n  }\n};\n\nTextTrackList.prototype = Object.create(EventTarget.prototype);\nTextTrackList.prototype.constructor = TextTrackList;\n\n/*\n * change - One or more tracks in the track list have been enabled or disabled.\n * addtrack - A track has been added to the track list.\n * removetrack - A track has been removed from the track list.\n */\nTextTrackList.prototype.allowedEvents_ = {\n  'change': 'change',\n  'addtrack': 'addtrack',\n  'removetrack': 'removetrack'\n};\n\n// emulate attribute EventHandler support to allow for feature detection\nfor (let event in TextTrackList.prototype.allowedEvents_) {\n  TextTrackList.prototype['on' + event] = null;\n}\n\nTextTrackList.prototype.addTrack_ = function(track) {\n  let index = this.tracks_.length;\n  if (!(''+index in this)) {\n    Object.defineProperty(this, index, {\n      get: function() {\n        return this.tracks_[index];\n      }\n    });\n  }\n\n  track.addEventListener('modechange', Fn.bind(this, function() {\n    this.trigger('change');\n  }));\n  this.tracks_.push(track);\n\n  this.trigger({\n    type: 'addtrack',\n    track: track\n  });\n};\n\nTextTrackList.prototype.removeTrack_ = function(rtrack) {\n  let result = null;\n  let track;\n\n  for (let i = 0, l = this.length; i < l; i++) {\n    track = this[i];\n    if (track === rtrack) {\n      this.tracks_.splice(i, 1);\n      break;\n    }\n  }\n\n  this.trigger({\n    type: 'removetrack',\n    track: track\n  });\n};\n\nTextTrackList.prototype.getTrackById = function(id) {\n  let result = null;\n\n  for (let i = 0, l = this.length; i < l; i++) {\n    let track = this[i];\n    if (track.id === id) {\n      result = track;\n      break;\n    }\n  }\n\n  return result;\n};\n\nexport default TextTrackList;\n","/**\n * @file text-track-settings.js\n */\nimport Component from '../component';\nimport * as Events from '../utils/events.js';\nimport * as Fn from '../utils/fn.js';\nimport log from '../utils/log.js';\nimport safeParseTuple from 'safe-json-parse/tuple';\nimport window from 'global/window';\n\n/**\n * Manipulate settings of texttracks\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @extends Component\n * @class TextTrackSettings\n */\nclass TextTrackSettings extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n    this.hide();\n\n    // Grab `persistTextTrackSettings` from the player options if not passed in child options\n    if (options.persistTextTrackSettings === undefined) {\n      this.options_.persistTextTrackSettings = this.options_.playerOptions.persistTextTrackSettings;\n    }\n\n    Events.on(this.el().querySelector('.vjs-done-button'), 'click', Fn.bind(this, function() {\n      this.saveSettings();\n      this.hide();\n    }));\n\n    Events.on(this.el().querySelector('.vjs-default-button'), 'click', Fn.bind(this, function() {\n      this.el().querySelector('.vjs-fg-color > select').selectedIndex = 0;\n      this.el().querySelector('.vjs-bg-color > select').selectedIndex = 0;\n      this.el().querySelector('.window-color > select').selectedIndex = 0;\n      this.el().querySelector('.vjs-text-opacity > select').selectedIndex = 0;\n      this.el().querySelector('.vjs-bg-opacity > select').selectedIndex = 0;\n      this.el().querySelector('.vjs-window-opacity > select').selectedIndex = 0;\n      this.el().querySelector('.vjs-edge-style select').selectedIndex = 0;\n      this.el().querySelector('.vjs-font-family select').selectedIndex = 0;\n      this.el().querySelector('.vjs-font-percent select').selectedIndex = 2;\n      this.updateDisplay();\n    }));\n\n    Events.on(this.el().querySelector('.vjs-fg-color > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-bg-color > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.window-color > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-text-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-bg-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-window-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-font-percent select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-edge-style select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-font-family select'), 'change', Fn.bind(this, this.updateDisplay));\n\n    if (this.options_.persistTextTrackSettings) {\n      this.restoreSettings();\n    }\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-caption-settings vjs-modal-overlay',\n      innerHTML: captionOptionsMenuTemplate()\n    });\n  }\n\n  /**\n   * Get texttrack settings \n   * Settings are\n   * .vjs-edge-style\n   * .vjs-font-family\n   * .vjs-fg-color\n   * .vjs-text-opacity\n   * .vjs-bg-color\n   * .vjs-bg-opacity\n   * .window-color\n   * .vjs-window-opacity \n   *\n   * @return {Object} \n   * @method getValues\n   */\n  getValues() {\n    const el = this.el();\n\n    const textEdge = getSelectedOptionValue(el.querySelector('.vjs-edge-style select'));\n    const fontFamily = getSelectedOptionValue(el.querySelector('.vjs-font-family select'));\n    const fgColor = getSelectedOptionValue(el.querySelector('.vjs-fg-color > select'));\n    const textOpacity = getSelectedOptionValue(el.querySelector('.vjs-text-opacity > select'));\n    const bgColor = getSelectedOptionValue(el.querySelector('.vjs-bg-color > select'));\n    const bgOpacity = getSelectedOptionValue(el.querySelector('.vjs-bg-opacity > select'));\n    const windowColor = getSelectedOptionValue(el.querySelector('.window-color > select'));\n    const windowOpacity = getSelectedOptionValue(el.querySelector('.vjs-window-opacity > select'));\n    const fontPercent = window['parseFloat'](getSelectedOptionValue(el.querySelector('.vjs-font-percent > select')));\n\n    let result = {\n      'backgroundOpacity': bgOpacity,\n      'textOpacity': textOpacity,\n      'windowOpacity': windowOpacity,\n      'edgeStyle': textEdge,\n      'fontFamily': fontFamily,\n      'color': fgColor,\n      'backgroundColor': bgColor,\n      'windowColor': windowColor,\n      'fontPercent': fontPercent\n    };\n    for (let name in result) {\n      if (result[name] === '' || result[name] === 'none' || (name === 'fontPercent' && result[name] === 1.00)) {\n        delete result[name];\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Set texttrack settings \n   * Settings are\n   * .vjs-edge-style\n   * .vjs-font-family\n   * .vjs-fg-color\n   * .vjs-text-opacity\n   * .vjs-bg-color\n   * .vjs-bg-opacity\n   * .window-color\n   * .vjs-window-opacity \n   *\n   * @param {Object} values Object with texttrack setting values\n   * @method setValues\n   */\n  setValues(values) {\n    const el = this.el();\n\n    setSelectedOption(el.querySelector('.vjs-edge-style select'), values.edgeStyle);\n    setSelectedOption(el.querySelector('.vjs-font-family select'), values.fontFamily);\n    setSelectedOption(el.querySelector('.vjs-fg-color > select'), values.color);\n    setSelectedOption(el.querySelector('.vjs-text-opacity > select'), values.textOpacity);\n    setSelectedOption(el.querySelector('.vjs-bg-color > select'), values.backgroundColor);\n    setSelectedOption(el.querySelector('.vjs-bg-opacity > select'), values.backgroundOpacity);\n    setSelectedOption(el.querySelector('.window-color > select'), values.windowColor);\n    setSelectedOption(el.querySelector('.vjs-window-opacity > select'), values.windowOpacity);\n\n    let fontPercent = values.fontPercent;\n\n    if (fontPercent) {\n      fontPercent = fontPercent.toFixed(2);\n    }\n\n    setSelectedOption(el.querySelector('.vjs-font-percent > select'), fontPercent);\n  }\n\n  /**\n   * Restore texttrack settings \n   *\n   * @method restoreSettings\n   */\n  restoreSettings() {\n    let [err, values] = safeParseTuple(window.localStorage.getItem('vjs-text-track-settings'));\n\n    if (err) {\n      log.error(err);\n    }\n\n    if (values) {\n      this.setValues(values);\n    }\n  }\n\n  /**\n   * Save texttrack settings to local storage \n   *\n   * @method saveSettings\n   */\n  saveSettings() {\n    if (!this.options_.persistTextTrackSettings) {\n      return;\n    }\n\n    let values = this.getValues();\n    try {\n      if (Object.getOwnPropertyNames(values).length > 0) {\n        window.localStorage.setItem('vjs-text-track-settings', JSON.stringify(values));\n      } else {\n        window.localStorage.removeItem('vjs-text-track-settings');\n      }\n    } catch (e) {}\n  }\n\n  /**\n   * Update display of texttrack settings  \n   *\n   * @method updateDisplay\n   */\n  updateDisplay() {\n    let ttDisplay = this.player_.getChild('textTrackDisplay');\n    if (ttDisplay) {\n      ttDisplay.updateDisplay();\n    }\n  }\n\n}\n\nComponent.registerComponent('TextTrackSettings', TextTrackSettings);\n\nfunction getSelectedOptionValue(target) {\n  let selectedOption;\n  // not all browsers support selectedOptions, so, fallback to options\n  if (target.selectedOptions) {\n    selectedOption = target.selectedOptions[0];\n  } else if (target.options) {\n    selectedOption = target.options[target.options.selectedIndex];\n  }\n\n  return selectedOption.value;\n}\n\nfunction setSelectedOption(target, value) {\n  if (!value) {\n    return;\n  }\n\n  let i;\n  for (i = 0; i < target.options.length; i++) {\n    const option = target.options[i];\n    if (option.value === value) {\n      break;\n    }\n  }\n\n  target.selectedIndex = i;\n}\n\nfunction captionOptionsMenuTemplate() {\n  let template = `<div class=\"vjs-tracksettings\">\n      <div class=\"vjs-tracksettings-colors\">\n        <div class=\"vjs-fg-color vjs-tracksetting\">\n            <label class=\"vjs-label\">Foreground</label>\n            <select>\n              <option value=\"\">---</option>\n              <option value=\"#FFF\">White</option>\n              <option value=\"#000\">Black</option>\n              <option value=\"#F00\">Red</option>\n              <option value=\"#0F0\">Green</option>\n              <option value=\"#00F\">Blue</option>\n              <option value=\"#FF0\">Yellow</option>\n              <option value=\"#F0F\">Magenta</option>\n              <option value=\"#0FF\">Cyan</option>\n            </select>\n            <span class=\"vjs-text-opacity vjs-opacity\">\n              <select>\n                <option value=\"\">---</option>\n                <option value=\"1\">Opaque</option>\n                <option value=\"0.5\">Semi-Opaque</option>\n              </select>\n            </span>\n        </div> <!-- vjs-fg-color -->\n        <div class=\"vjs-bg-color vjs-tracksetting\">\n            <label class=\"vjs-label\">Background</label>\n            <select>\n              <option value=\"\">---</option>\n              <option value=\"#FFF\">White</option>\n              <option value=\"#000\">Black</option>\n              <option value=\"#F00\">Red</option>\n              <option value=\"#0F0\">Green</option>\n              <option value=\"#00F\">Blue</option>\n              <option value=\"#FF0\">Yellow</option>\n              <option value=\"#F0F\">Magenta</option>\n              <option value=\"#0FF\">Cyan</option>\n            </select>\n            <span class=\"vjs-bg-opacity vjs-opacity\">\n                <select>\n                  <option value=\"\">---</option>\n                  <option value=\"1\">Opaque</option>\n                  <option value=\"0.5\">Semi-Transparent</option>\n                  <option value=\"0\">Transparent</option>\n                </select>\n            </span>\n        </div> <!-- vjs-bg-color -->\n        <div class=\"window-color vjs-tracksetting\">\n            <label class=\"vjs-label\">Window</label>\n            <select>\n              <option value=\"\">---</option>\n              <option value=\"#FFF\">White</option>\n              <option value=\"#000\">Black</option>\n              <option value=\"#F00\">Red</option>\n              <option value=\"#0F0\">Green</option>\n              <option value=\"#00F\">Blue</option>\n              <option value=\"#FF0\">Yellow</option>\n              <option value=\"#F0F\">Magenta</option>\n              <option value=\"#0FF\">Cyan</option>\n            </select>\n            <span class=\"vjs-window-opacity vjs-opacity\">\n                <select>\n                  <option value=\"\">---</option>\n                  <option value=\"1\">Opaque</option>\n                  <option value=\"0.5\">Semi-Transparent</option>\n                  <option value=\"0\">Transparent</option>\n                </select>\n            </span>\n        </div> <!-- vjs-window-color -->\n      </div> <!-- vjs-tracksettings -->\n      <div class=\"vjs-tracksettings-font\">\n        <div class=\"vjs-font-percent vjs-tracksetting\">\n          <label class=\"vjs-label\">Font Size</label>\n          <select>\n            <option value=\"0.50\">50%</option>\n            <option value=\"0.75\">75%</option>\n            <option value=\"1.00\" selected>100%</option>\n            <option value=\"1.25\">125%</option>\n            <option value=\"1.50\">150%</option>\n            <option value=\"1.75\">175%</option>\n            <option value=\"2.00\">200%</option>\n            <option value=\"3.00\">300%</option>\n            <option value=\"4.00\">400%</option>\n          </select>\n        </div> <!-- vjs-font-percent -->\n        <div class=\"vjs-edge-style vjs-tracksetting\">\n          <label class=\"vjs-label\">Text Edge Style</label>\n          <select>\n            <option value=\"none\">None</option>\n            <option value=\"raised\">Raised</option>\n            <option value=\"depressed\">Depressed</option>\n            <option value=\"uniform\">Uniform</option>\n            <option value=\"dropshadow\">Dropshadow</option>\n          </select>\n        </div> <!-- vjs-edge-style -->\n        <div class=\"vjs-font-family vjs-tracksetting\">\n          <label class=\"vjs-label\">Font Family</label>\n          <select>\n            <option value=\"\">Default</option>\n            <option value=\"monospaceSerif\">Monospace Serif</option>\n            <option value=\"proportionalSerif\">Proportional Serif</option>\n            <option value=\"monospaceSansSerif\">Monospace Sans-Serif</option>\n            <option value=\"proportionalSansSerif\">Proportional Sans-Serif</option>\n            <option value=\"casual\">Casual</option>\n            <option value=\"script\">Script</option>\n            <option value=\"small-caps\">Small Caps</option>\n          </select>\n        </div> <!-- vjs-font-family -->\n      </div>\n    </div>\n    <div class=\"vjs-tracksettings-controls\">\n      <button class=\"vjs-default-button\">Defaults</button>\n      <button class=\"vjs-done-button\">Done</button>\n    </div>`;\n\n    return template;\n}\n\nexport default TextTrackSettings;\n","/**\n * @file text-track.js\n */\nimport TextTrackCueList from './text-track-cue-list';\nimport * as Fn from '../utils/fn.js';\nimport * as Guid from '../utils/guid.js';\nimport * as browser from '../utils/browser.js';\nimport * as TextTrackEnum from './text-track-enums';\nimport log from '../utils/log.js';\nimport EventTarget from '../event-target';\nimport document from 'global/document';\nimport window from 'global/window';\nimport { isCrossOrigin } from '../utils/url.js';\nimport XHR from 'xhr';\n\n/*\n * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrack\n *\n * interface TextTrack : EventTarget {\n *   readonly attribute TextTrackKind kind;\n *   readonly attribute DOMString label;\n *   readonly attribute DOMString language;\n *\n *   readonly attribute DOMString id;\n *   readonly attribute DOMString inBandMetadataTrackDispatchType;\n *\n *   attribute TextTrackMode mode;\n *\n *   readonly attribute TextTrackCueList? cues;\n *   readonly attribute TextTrackCueList? activeCues;\n *\n *   void addCue(TextTrackCue cue);\n *   void removeCue(TextTrackCue cue);\n *\n *   attribute EventHandler oncuechange;\n * };\n */\nlet TextTrack = function(options={}) {\n  if (!options.tech) {\n    throw new Error('A tech was not provided.');\n  }\n\n  let tt = this;\n  if (browser.IS_IE8) {\n    tt = document.createElement('custom');\n\n    for (let prop in TextTrack.prototype) {\n      tt[prop] = TextTrack.prototype[prop];\n    }\n  }\n\n  tt.tech_ = options.tech;\n\n  let mode = TextTrackEnum.TextTrackMode[options['mode']] || 'disabled';\n  let kind = TextTrackEnum.TextTrackKind[options['kind']] || 'subtitles';\n  let label = options['label'] || '';\n  let language = options['language'] || options['srclang'] || '';\n  let id = options['id'] || 'vjs_text_track_' + Guid.newGUID();\n\n  if (kind === 'metadata' || kind === 'chapters') {\n    mode = 'hidden';\n  }\n\n  tt.cues_ = [];\n  tt.activeCues_ = [];\n\n  let cues = new TextTrackCueList(tt.cues_);\n  let activeCues = new TextTrackCueList(tt.activeCues_);\n\n  let changed = false;\n  let timeupdateHandler = Fn.bind(tt, function() {\n    this['activeCues'];\n    if (changed) {\n      this['trigger']('cuechange');\n      changed = false;\n    }\n  });\n  if (mode !== 'disabled') {\n    tt.tech_.on('timeupdate', timeupdateHandler);\n  }\n\n  Object.defineProperty(tt, 'kind', {\n    get: function() {\n      return kind;\n    },\n    set: Function.prototype\n  });\n\n  Object.defineProperty(tt, 'label', {\n    get: function() {\n      return label;\n    },\n    set: Function.prototype\n  });\n\n  Object.defineProperty(tt, 'language', {\n    get: function() {\n      return language;\n    },\n    set: Function.prototype\n  });\n\n  Object.defineProperty(tt, 'id', {\n    get: function() {\n      return id;\n    },\n    set: Function.prototype\n  });\n\n  Object.defineProperty(tt, 'mode', {\n    get: function() {\n      return mode;\n    },\n    set: function(newMode) {\n      if (!TextTrackEnum.TextTrackMode[newMode]) {\n        return;\n      }\n      mode = newMode;\n      if (mode === 'showing') {\n        this.tech_.on('timeupdate', timeupdateHandler);\n      }\n      this.trigger('modechange');\n    }\n  });\n\n  Object.defineProperty(tt, 'cues', {\n    get: function() {\n      if (!this.loaded_) {\n        return null;\n      }\n\n      return cues;\n    },\n    set: Function.prototype\n  });\n\n  Object.defineProperty(tt, 'activeCues', {\n    get: function() {\n      if (!this.loaded_) {\n        return null;\n      }\n\n      if (this['cues'].length === 0) {\n        return activeCues; // nothing to do\n      }\n\n      let ct = this.tech_.currentTime();\n      let active = [];\n\n      for (let i = 0, l = this['cues'].length; i < l; i++) {\n        let cue = this['cues'][i];\n        if (cue['startTime'] <= ct && cue['endTime'] >= ct) {\n          active.push(cue);\n        } else if (cue['startTime'] === cue['endTime'] && cue['startTime'] <= ct && cue['startTime'] + 0.5 >= ct) {\n          active.push(cue);\n        }\n      }\n\n      changed = false;\n\n      if (active.length !== this.activeCues_.length) {\n        changed = true;\n      } else {\n        for (let i = 0; i < active.length; i++) {\n          if (indexOf.call(this.activeCues_, active[i]) === -1) {\n            changed = true;\n          }\n        }\n      }\n\n      this.activeCues_ = active;\n      activeCues.setCues_(this.activeCues_);\n\n      return activeCues;\n    },\n    set: Function.prototype\n  });\n\n  if (options.src) {\n    tt.src = options.src;\n    loadTrack(options.src, tt);\n  } else {\n    tt.loaded_ = true;\n  }\n\n  if (browser.IS_IE8) {\n    return tt;\n  }\n};\n\nTextTrack.prototype = Object.create(EventTarget.prototype);\nTextTrack.prototype.constructor = TextTrack;\n\n/*\n * cuechange - One or more cues in the track have become active or stopped being active.\n */\nTextTrack.prototype.allowedEvents_ = {\n  'cuechange': 'cuechange'\n};\n\nTextTrack.prototype.addCue = function(cue) {\n  let tracks = this.tech_.textTracks();\n\n  if (tracks) {\n    for (let i = 0; i < tracks.length; i++) {\n      if (tracks[i] !== this) {\n        tracks[i].removeCue(cue);\n      }\n    }\n  }\n\n  this.cues_.push(cue);\n  this['cues'].setCues_(this.cues_);\n};\n\nTextTrack.prototype.removeCue = function(removeCue) {\n  let removed = false;\n\n  for (let i = 0, l = this.cues_.length; i < l; i++) {\n    let cue = this.cues_[i];\n    if (cue === removeCue) {\n      this.cues_.splice(i, 1);\n      removed = true;\n    }\n  }\n\n  if (removed) {\n    this.cues.setCues_(this.cues_);\n  }\n};\n\n/*\n* Downloading stuff happens below this point\n*/\nvar parseCues = function(srcContent, track) {\n  if (typeof window['WebVTT'] !== 'function') {\n    //try again a bit later\n    return window.setTimeout(function() {\n      parseCues(srcContent, track);\n    }, 25);\n  }\n\n  let parser = new window['WebVTT']['Parser'](window, window['vttjs'], window['WebVTT']['StringDecoder']());\n\n  parser['oncue'] = function(cue) {\n    track.addCue(cue);\n  };\n  parser['onparsingerror'] = function(error) {\n    log.error(error);\n  };\n\n  parser['parse'](srcContent);\n  parser['flush']();\n};\n\nvar loadTrack = function(src, track) {\n  let opts = {\n    uri: src\n  };\n\n  let crossOrigin = isCrossOrigin(src);\n  if (crossOrigin) {\n    opts.cors = crossOrigin;\n  }\n\n  XHR(opts, Fn.bind(this, function(err, response, responseBody){\n    if (err) {\n      return log.error(err, response);\n    }\n\n    track.loaded_ = true;\n    parseCues(responseBody, track);\n  }));\n};\n\nvar indexOf = function(searchElement, fromIndex) {\n  if (this == null) {\n    throw new TypeError('\"this\" is null or not defined');\n  }\n\n  let O = Object(this);\n\n  let len = O.length >>> 0;\n\n  if (len === 0) {\n    return -1;\n  }\n\n  let n = +fromIndex || 0;\n\n  if (Math.abs(n) === Infinity) {\n    n = 0;\n  }\n\n  if (n >= len) {\n    return -1;\n  }\n\n  let k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n\n  while (k < len) {\n    if (k in O && O[k] === searchElement) {\n      return k;\n    }\n    k++;\n  }\n  return -1;\n};\n\nexport default TextTrack;\n","/**\n * @file browser.js\n */\nimport document from 'global/document';\nimport window from 'global/window';\n\nconst USER_AGENT = window.navigator.userAgent;\nconst webkitVersionMap = (/AppleWebKit\\/([\\d.]+)/i).exec(USER_AGENT);\nconst appleWebkitVersion = webkitVersionMap ? parseFloat(webkitVersionMap.pop()) : null;\n\n/*\n * Device is an iPhone\n *\n * @type {Boolean}\n * @constant\n * @private\n */\nexport const IS_IPHONE = (/iPhone/i).test(USER_AGENT);\nexport const IS_IPAD = (/iPad/i).test(USER_AGENT);\nexport const IS_IPOD = (/iPod/i).test(USER_AGENT);\nexport const IS_IOS = IS_IPHONE || IS_IPAD || IS_IPOD;\n\nexport const IOS_VERSION = (function(){\n  var match = USER_AGENT.match(/OS (\\d+)_/i);\n  if (match && match[1]) { return match[1]; }\n})();\n\nexport const IS_ANDROID = (/Android/i).test(USER_AGENT);\nexport const ANDROID_VERSION = (function() {\n  // This matches Android Major.Minor.Patch versions\n  // ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned\n  var match = USER_AGENT.match(/Android (\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))*/i),\n    major,\n    minor;\n\n  if (!match) {\n    return null;\n  }\n\n  major = match[1] && parseFloat(match[1]);\n  minor = match[2] && parseFloat(match[2]);\n\n  if (major && minor) {\n    return parseFloat(match[1] + '.' + match[2]);\n  } else if (major) {\n    return major;\n  } else {\n    return null;\n  }\n})();\n// Old Android is defined as Version older than 2.3, and requiring a webkit version of the android browser\nexport const IS_OLD_ANDROID = IS_ANDROID && (/webkit/i).test(USER_AGENT) && ANDROID_VERSION < 2.3;\nexport const IS_NATIVE_ANDROID = IS_ANDROID && ANDROID_VERSION < 5 && appleWebkitVersion < 537;\n\nexport const IS_FIREFOX = (/Firefox/i).test(USER_AGENT);\nexport const IS_CHROME = (/Chrome/i).test(USER_AGENT);\nexport const IS_IE8 = (/MSIE\\s8\\.0/).test(USER_AGENT);\n\nexport const TOUCH_ENABLED = !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch);\nexport const BACKGROUND_SIZE_SUPPORTED = 'backgroundSize' in document.createElement('video').style;\n","/**\n * @file buffer.js\n */\nimport { createTimeRange } from './time-ranges.js';\n\n/**\n * Compute how much your video has been buffered\n *\n * @param  {Object} Buffered object\n * @param  {Number} Total duration\n * @return {Number} Percent buffered of the total duration\n * @private\n * @function bufferedPercent\n */\nexport function bufferedPercent(buffered, duration) {\n  var bufferedDuration = 0,\n      start, end;\n\n  if (!duration) {\n    return 0;\n  }\n\n  if (!buffered || !buffered.length) {\n    buffered = createTimeRange(0, 0);\n  }\n\n  for (let i = 0; i < buffered.length; i++){\n    start = buffered.start(i);\n    end   = buffered.end(i);\n\n    // buffered end can be bigger than duration by a very small fraction\n    if (end > duration) {\n      end = duration;\n    }\n\n    bufferedDuration += end - start;\n  }\n\n  return bufferedDuration / duration;\n}\n","import log from './log.js';\n\n/**\n * Object containing the default behaviors for available handler methods.\n *\n * @private\n * @type {Object}\n */\nconst defaultBehaviors = {\n  get(obj, key) {\n    return obj[key];\n  },\n  set(obj, key, value) {\n    obj[key] = value;\n    return true;\n  }\n};\n\n/**\n * Expose private objects publicly using a Proxy to log deprecation warnings.\n *\n * Browsers that do not support Proxy objects will simply return the `target`\n * object, so it can be directly exposed.\n *\n * @param {Object} target The target object.\n * @param {Object} messages Messages to display from a Proxy. Only operations\n *                          with an associated message will be proxied.\n * @param {String} [messages.get]\n * @param {String} [messages.set]\n * @return {Object} A Proxy if supported or the `target` argument.\n */\nexport default (target, messages={}) => {\n  if (typeof Proxy === 'function') {\n    let handler = {};\n\n    // Build a handler object based on those keys that have both messages\n    // and default behaviors.\n    Object.keys(messages).forEach(key => {\n      if (defaultBehaviors.hasOwnProperty(key)) {\n        handler[key] = function() {\n          log.warn(messages[key]);\n          return defaultBehaviors[key].apply(this, arguments);\n        };\n      }\n    });\n\n    return new Proxy(target, handler);\n  }\n  return target;\n};\n","/**\n * @file dom.js\n */\nimport document from 'global/document';\nimport window from 'global/window';\nimport  * as Guid from './guid.js';\nimport log from './log.js';\nimport tsml from 'tsml';\n\n/**\n * Shorthand for document.getElementById()\n * Also allows for CSS (jQuery) ID syntax. But nothing other than IDs.\n *\n * @param  {String} id  Element ID\n * @return {Element}    Element with supplied ID\n * @function getEl\n */\nexport function getEl(id){\n  if (id.indexOf('#') === 0) {\n    id = id.slice(1);\n  }\n\n  return document.getElementById(id);\n}\n\n/**\n * Creates an element and applies properties.\n *\n * @param  {String=} tagName    Name of tag to be created.\n * @param  {Object=} properties Element properties to be applied.\n * @return {Element}\n * @function createEl\n */\nexport function createEl(tagName='div', properties={}, attributes={}){\n  let el = document.createElement(tagName);\n\n  Object.getOwnPropertyNames(properties).forEach(function(propName){\n    let val = properties[propName];\n\n    // See #2176\n    // We originally were accepting both properties and attributes in the\n    // same object, but that doesn't work so well.\n    if (propName.indexOf('aria-') !== -1 || propName === 'role' || propName === 'type') {\n      log.warn(tsml`Setting attributes in the second argument of createEl()\n                has been deprecated. Use the third argument instead.\n                createEl(type, properties, attributes). Attempting to set ${propName} to ${val}.`);\n      el.setAttribute(propName, val);\n    } else {\n      el[propName] = val;\n    }\n  });\n\n  Object.getOwnPropertyNames(attributes).forEach(function(attrName){\n    let val = attributes[attrName];\n    el.setAttribute(attrName, attributes[attrName]);\n  });\n\n  return el;\n}\n\n/**\n * Insert an element as the first child node of another\n *\n * @param  {Element} child   Element to insert\n * @param  {Element} parent Element to insert child into\n * @private\n * @function insertElFirst\n */\nexport function insertElFirst(child, parent){\n  if (parent.firstChild) {\n    parent.insertBefore(child, parent.firstChild);\n  } else {\n    parent.appendChild(child);\n  }\n}\n\n/**\n * Element Data Store. Allows for binding data to an element without putting it directly on the element.\n * Ex. Event listeners are stored here.\n * (also from jsninja.com, slightly modified and updated for closure compiler)\n *\n * @type {Object}\n * @private\n */\nconst elData = {};\n\n/*\n * Unique attribute name to store an element's guid in\n *\n * @type {String}\n * @constant\n * @private\n */\nconst elIdAttr = 'vdata' + (new Date()).getTime();\n\n/**\n * Returns the cache object where data for an element is stored\n *\n * @param  {Element} el Element to store data for.\n * @return {Object}\n * @function getElData\n */\nexport function getElData(el) {\n  let id = el[elIdAttr];\n\n  if (!id) {\n    id = el[elIdAttr] = Guid.newGUID();\n  }\n\n  if (!elData[id]) {\n    elData[id] = {};\n  }\n\n  return elData[id];\n}\n\n/**\n * Returns whether or not an element has cached data\n *\n * @param  {Element} el A dom element\n * @return {Boolean}\n * @private\n * @function hasElData\n */\nexport function hasElData(el) {\n  const id = el[elIdAttr];\n\n  if (!id) {\n    return false;\n  }\n\n  return !!Object.getOwnPropertyNames(elData[id]).length;\n}\n\n/**\n * Delete data for the element from the cache and the guid attr from getElementById\n *\n * @param  {Element} el Remove data for an element\n * @private\n * @function removeElData\n */\nexport function removeElData(el) {\n  let id = el[elIdAttr];\n\n  if (!id) {\n    return;\n  }\n\n  // Remove all stored data\n  delete elData[id];\n\n  // Remove the elIdAttr property from the DOM node\n  try {\n    delete el[elIdAttr];\n  } catch(e) {\n    if (el.removeAttribute) {\n      el.removeAttribute(elIdAttr);\n    } else {\n      // IE doesn't appear to support removeAttribute on the document element\n      el[elIdAttr] = null;\n    }\n  }\n}\n\n/**\n * Check if an element has a CSS class\n *\n * @param {Element} element Element to check\n * @param {String} classToCheck Classname to check\n * @function hasElClass\n */\nexport function hasElClass(element, classToCheck) {\n  return ((' ' + element.className + ' ').indexOf(' ' + classToCheck + ' ') !== -1);\n}\n\n/**\n * Add a CSS class name to an element\n *\n * @param {Element} element    Element to add class name to\n * @param {String} classToAdd Classname to add\n * @function addElClass\n */\nexport function addElClass(element, classToAdd) {\n  if (!hasElClass(element, classToAdd)) {\n    element.className = element.className === '' ? classToAdd : element.className + ' ' + classToAdd;\n  }\n}\n\n/**\n * Remove a CSS class name from an element\n *\n * @param {Element} element    Element to remove from class name\n * @param {String} classToRemove Classname to remove\n * @function removeElClass\n */\nexport function removeElClass(element, classToRemove) {\n  if (!hasElClass(element, classToRemove)) {return;}\n\n  let classNames = element.className.split(' ');\n\n  // no arr.indexOf in ie8, and we don't want to add a big shim\n  for (let i = classNames.length - 1; i >= 0; i--) {\n    if (classNames[i] === classToRemove) {\n      classNames.splice(i,1);\n    }\n  }\n\n  element.className = classNames.join(' ');\n}\n\n/**\n * Apply attributes to an HTML element.\n *\n * @param  {Element} el         Target element.\n * @param  {Object=} attributes Element attributes to be applied.\n * @private\n * @function setElAttributes\n */\nexport function setElAttributes(el, attributes) {\n  Object.getOwnPropertyNames(attributes).forEach(function(attrName){\n    let attrValue = attributes[attrName];\n\n    if (attrValue === null || typeof attrValue === 'undefined' || attrValue === false) {\n      el.removeAttribute(attrName);\n    } else {\n      el.setAttribute(attrName, (attrValue === true ? '' : attrValue));\n    }\n  });\n}\n\n/**\n * Get an element's attribute values, as defined on the HTML tag\n * Attributes are not the same as properties. They're defined on the tag\n * or with setAttribute (which shouldn't be used with HTML)\n * This will return true or false for boolean attributes.\n *\n * @param  {Element} tag Element from which to get tag attributes\n * @return {Object}\n * @private\n * @function getElAttributes\n */\nexport function getElAttributes(tag) {\n  var obj, knownBooleans, attrs, attrName, attrVal;\n\n  obj = {};\n\n  // known boolean attributes\n  // we can check for matching boolean properties, but older browsers\n  // won't know about HTML5 boolean attributes that we still read from\n  knownBooleans = ','+'autoplay,controls,loop,muted,default'+',';\n\n  if (tag && tag.attributes && tag.attributes.length > 0) {\n    attrs = tag.attributes;\n\n    for (var i = attrs.length - 1; i >= 0; i--) {\n      attrName = attrs[i].name;\n      attrVal = attrs[i].value;\n\n      // check for known booleans\n      // the matching element property will return a value for typeof\n      if (typeof tag[attrName] === 'boolean' || knownBooleans.indexOf(','+attrName+',') !== -1) {\n        // the value of an included boolean attribute is typically an empty\n        // string ('') which would equal false if we just check for a false value.\n        // we also don't want support bad code like autoplay='false'\n        attrVal = (attrVal !== null) ? true : false;\n      }\n\n      obj[attrName] = attrVal;\n    }\n  }\n\n  return obj;\n}\n\n/**\n * Attempt to block the ability to select text while dragging controls\n *\n * @return {Boolean}\n * @method blockTextSelection\n */\nexport function blockTextSelection() {\n  document.body.focus();\n  document.onselectstart = function() {\n    return false;\n  };\n}\n\n/**\n * Turn off text selection blocking\n *\n * @return {Boolean}\n * @method unblockTextSelection\n */\nexport function unblockTextSelection() {\n  document.onselectstart = function() {\n    return true;\n  };\n}\n\n/**\n * Offset Left\n * getBoundingClientRect technique from\n * John Resig http://ejohn.org/blog/getboundingclientrect-is-awesome/\n *\n * @param {Element} el Element from which to get offset\n * @return {Object=}\n * @method findElPosition\n */\nexport function findElPosition(el) {\n  let box;\n\n  if (el.getBoundingClientRect && el.parentNode) {\n    box = el.getBoundingClientRect();\n  }\n\n  if (!box) {\n    return {\n      left: 0,\n      top: 0\n    };\n  }\n\n  const docEl = document.documentElement;\n  const body = document.body;\n\n  const clientLeft = docEl.clientLeft || body.clientLeft || 0;\n  const scrollLeft = window.pageXOffset || body.scrollLeft;\n  const left = box.left + scrollLeft - clientLeft;\n\n  const clientTop = docEl.clientTop || body.clientTop || 0;\n  const scrollTop = window.pageYOffset || body.scrollTop;\n  const top = box.top + scrollTop - clientTop;\n\n  // Android sometimes returns slightly off decimal values, so need to round\n  return {\n    left: Math.round(left),\n    top: Math.round(top)\n  };\n}\n\n/**\n * Get pointer position in element\n * Returns an object with x and y coordinates.\n * The base on the coordinates are the bottom left of the element.\n *\n * @param {Element} el Element on which to get the pointer position on\n * @param {Event} event Event object\n * @return {Object=} position This object will have x and y coordinates corresponding to the mouse position\n * @metho getPointerPosition\n */\nexport function getPointerPosition(el, event) {\n  let position = {};\n  let box = findElPosition(el);\n  let boxW = el.offsetWidth;\n  let boxH = el.offsetHeight;\n\n  let boxY = box.top;\n  let boxX = box.left;\n  let pageY = event.pageY;\n  let pageX = event.pageX;\n\n  if (event.changedTouches) {\n    pageX = event.changedTouches[0].pageX;\n    pageY = event.changedTouches[0].pageY;\n  }\n\n  position.y = Math.max(0, Math.min(1, ((boxY - pageY) + boxH) / boxH));\n  position.x = Math.max(0, Math.min(1, (pageX - boxX) / boxW));\n\n  return position;\n}\n","/**\n * @file events.js\n *\n * Event System (John Resig - Secrets of a JS Ninja http://jsninja.com/)\n * (Original book version wasn't completely usable, so fixed some things and made Closure Compiler compatible)\n * This should work very similarly to jQuery's events, however it's based off the book version which isn't as\n * robust as jquery's, so there's probably some differences.\n */\n\nimport  * as Dom from './dom.js';\nimport  * as Guid from './guid.js';\nimport window from 'global/window';\nimport document from 'global/document';\n\n/**\n * Add an event listener to element\n * It stores the handler function in a separate cache object\n * and adds a generic handler to the element's event,\n * along with a unique id (guid) to the element.\n *\n * @param  {Element|Object}   elem Element or object to bind listeners to\n * @param  {String|Array}   type Type of event to bind to.\n * @param  {Function} fn   Event listener.\n * @method on\n */\nexport function on(elem, type, fn){\n  if (Array.isArray(type)) {\n    return _handleMultipleEvents(on, elem, type, fn);\n  }\n\n  let data = Dom.getElData(elem);\n\n  // We need a place to store all our handler data\n  if (!data.handlers) data.handlers = {};\n\n  if (!data.handlers[type]) data.handlers[type] = [];\n\n  if (!fn.guid) fn.guid = Guid.newGUID();\n\n  data.handlers[type].push(fn);\n\n  if (!data.dispatcher) {\n    data.disabled = false;\n\n    data.dispatcher = function (event, hash){\n\n      if (data.disabled) return;\n      event = fixEvent(event);\n\n      var handlers = data.handlers[event.type];\n\n      if (handlers) {\n        // Copy handlers so if handlers are added/removed during the process it doesn't throw everything off.\n        var handlersCopy = handlers.slice(0);\n\n        for (var m = 0, n = handlersCopy.length; m < n; m++) {\n          if (event.isImmediatePropagationStopped()) {\n            break;\n          } else {\n            handlersCopy[m].call(elem, event, hash);\n          }\n        }\n      }\n    };\n  }\n\n  if (data.handlers[type].length === 1) {\n    if (elem.addEventListener) {\n      elem.addEventListener(type, data.dispatcher, false);\n    } else if (elem.attachEvent) {\n      elem.attachEvent('on' + type, data.dispatcher);\n    }\n  }\n}\n\n/**\n * Removes event listeners from an element\n *\n * @param  {Element|Object}   elem Object to remove listeners from\n * @param  {String|Array=}   type Type of listener to remove. Don't include to remove all events from element.\n * @param  {Function} fn   Specific listener to remove. Don't include to remove listeners for an event type.\n * @method off\n */\nexport function off(elem, type, fn) {\n  // Don't want to add a cache object through getElData if not needed\n  if (!Dom.hasElData(elem)) return;\n\n  let data = Dom.getElData(elem);\n\n  // If no events exist, nothing to unbind\n  if (!data.handlers) { return; }\n\n  if (Array.isArray(type)) {\n    return _handleMultipleEvents(off, elem, type, fn);\n  }\n\n  // Utility function\n  var removeType = function(t){\n     data.handlers[t] = [];\n     _cleanUpEvents(elem,t);\n  };\n\n  // Are we removing all bound events?\n  if (!type) {\n    for (let t in data.handlers) removeType(t);\n    return;\n  }\n\n  var handlers = data.handlers[type];\n\n  // If no handlers exist, nothing to unbind\n  if (!handlers) return;\n\n  // If no listener was provided, remove all listeners for type\n  if (!fn) {\n    removeType(type);\n    return;\n  }\n\n  // We're only removing a single handler\n  if (fn.guid) {\n    for (let n = 0; n < handlers.length; n++) {\n      if (handlers[n].guid === fn.guid) {\n        handlers.splice(n--, 1);\n      }\n    }\n  }\n\n  _cleanUpEvents(elem, type);\n}\n\n/**\n * Trigger an event for an element\n *\n * @param  {Element|Object}      elem  Element to trigger an event on\n * @param  {Event|Object|String} event A string (the type) or an event object with a type attribute\n * @param  {Object} [hash] data hash to pass along with the event\n * @return {Boolean=} Returned only if default was prevented\n * @method trigger\n */\nexport function trigger(elem, event, hash) {\n  // Fetches element data and a reference to the parent (for bubbling).\n  // Don't want to add a data object to cache for every parent,\n  // so checking hasElData first.\n  var elemData = (Dom.hasElData(elem)) ? Dom.getElData(elem) : {};\n  var parent = elem.parentNode || elem.ownerDocument;\n      // type = event.type || event,\n      // handler;\n\n  // If an event name was passed as a string, creates an event out of it\n  if (typeof event === 'string') {\n    event = { type:event, target:elem };\n  }\n  // Normalizes the event properties.\n  event = fixEvent(event);\n\n  // If the passed element has a dispatcher, executes the established handlers.\n  if (elemData.dispatcher) {\n    elemData.dispatcher.call(elem, event, hash);\n  }\n\n  // Unless explicitly stopped or the event does not bubble (e.g. media events)\n    // recursively calls this function to bubble the event up the DOM.\n    if (parent && !event.isPropagationStopped() && event.bubbles === true) {\n      trigger.call(null, parent, event, hash);\n\n  // If at the top of the DOM, triggers the default action unless disabled.\n  } else if (!parent && !event.defaultPrevented) {\n    var targetData = Dom.getElData(event.target);\n\n    // Checks if the target has a default action for this event.\n    if (event.target[event.type]) {\n      // Temporarily disables event dispatching on the target as we have already executed the handler.\n      targetData.disabled = true;\n      // Executes the default action.\n      if (typeof event.target[event.type] === 'function') {\n        event.target[event.type]();\n      }\n      // Re-enables event dispatching.\n      targetData.disabled = false;\n    }\n  }\n\n  // Inform the triggerer if the default was prevented by returning false\n  return !event.defaultPrevented;\n}\n\n/**\n * Trigger a listener only once for an event\n *\n * @param  {Element|Object}   elem Element or object to\n * @param  {String|Array}   type Name/type of event\n * @param  {Function} fn Event handler function\n * @method one\n */\nexport function one(elem, type, fn) {\n  if (Array.isArray(type)) {\n    return _handleMultipleEvents(one, elem, type, fn);\n  }\n  var func = function(){\n    off(elem, type, func);\n    fn.apply(this, arguments);\n  };\n  // copy the guid to the new function so it can removed using the original function's ID\n  func.guid = fn.guid = fn.guid || Guid.newGUID();\n  on(elem, type, func);\n}\n\n/**\n * Fix a native event to have standard property values\n *\n * @param  {Object} event Event object to fix\n * @return {Object}\n * @private\n * @method fixEvent\n */\nexport function fixEvent(event) {\n\n  function returnTrue() { return true; }\n  function returnFalse() { return false; }\n\n  // Test if fixing up is needed\n  // Used to check if !event.stopPropagation instead of isPropagationStopped\n  // But native events return true for stopPropagation, but don't have\n  // other expected methods like isPropagationStopped. Seems to be a problem\n  // with the Javascript Ninja code. So we're just overriding all events now.\n  if (!event || !event.isPropagationStopped) {\n    var old = event || window.event;\n\n    event = {};\n    // Clone the old object so that we can modify the values event = {};\n    // IE8 Doesn't like when you mess with native event properties\n    // Firefox returns false for event.hasOwnProperty('type') and other props\n    //  which makes copying more difficult.\n    // TODO: Probably best to create a whitelist of event props\n    for (var key in old) {\n      // Safari 6.0.3 warns you if you try to copy deprecated layerX/Y\n      // Chrome warns you if you try to copy deprecated keyboardEvent.keyLocation\n      // and webkitMovementX/Y\n      if (key !== 'layerX' && key !== 'layerY' && key !== 'keyLocation' &&\n          key !== 'webkitMovementX' && key !== 'webkitMovementY') {\n        // Chrome 32+ warns if you try to copy deprecated returnValue, but\n        // we still want to if preventDefault isn't supported (IE8).\n        if (!(key === 'returnValue' && old.preventDefault)) {\n          event[key] = old[key];\n        }\n      }\n    }\n\n    // The event occurred on this element\n    if (!event.target) {\n      event.target = event.srcElement || document;\n    }\n\n    // Handle which other element the event is related to\n    if (!event.relatedTarget) {\n      event.relatedTarget = event.fromElement === event.target ?\n        event.toElement :\n        event.fromElement;\n    }\n\n    // Stop the default browser action\n    event.preventDefault = function () {\n      if (old.preventDefault) {\n        old.preventDefault();\n      }\n      event.returnValue = false;\n      old.returnValue = false;\n      event.defaultPrevented = true;\n    };\n\n    event.defaultPrevented = false;\n\n    // Stop the event from bubbling\n    event.stopPropagation = function () {\n      if (old.stopPropagation) {\n        old.stopPropagation();\n      }\n      event.cancelBubble = true;\n      old.cancelBubble = true;\n      event.isPropagationStopped = returnTrue;\n    };\n\n    event.isPropagationStopped = returnFalse;\n\n    // Stop the event from bubbling and executing other handlers\n    event.stopImmediatePropagation = function () {\n      if (old.stopImmediatePropagation) {\n        old.stopImmediatePropagation();\n      }\n      event.isImmediatePropagationStopped = returnTrue;\n      event.stopPropagation();\n    };\n\n    event.isImmediatePropagationStopped = returnFalse;\n\n    // Handle mouse position\n    if (event.clientX != null) {\n      var doc = document.documentElement, body = document.body;\n\n      event.pageX = event.clientX +\n        (doc && doc.scrollLeft || body && body.scrollLeft || 0) -\n        (doc && doc.clientLeft || body && body.clientLeft || 0);\n      event.pageY = event.clientY +\n        (doc && doc.scrollTop || body && body.scrollTop || 0) -\n        (doc && doc.clientTop || body && body.clientTop || 0);\n    }\n\n    // Handle key presses\n    event.which = event.charCode || event.keyCode;\n\n    // Fix button for mouse clicks:\n    // 0 == left; 1 == middle; 2 == right\n    if (event.button != null) {\n      event.button = (event.button & 1 ? 0 :\n        (event.button & 4 ? 1 :\n          (event.button & 2 ? 2 : 0)));\n    }\n  }\n\n  // Returns fixed-up instance\n  return event;\n}\n\n/**\n * Clean up the listener cache and dispatchers\n*\n * @param  {Element|Object} elem Element to clean up\n * @param  {String} type Type of event to clean up\n * @private\n * @method _cleanUpEvents\n */\nfunction _cleanUpEvents(elem, type) {\n  var data = Dom.getElData(elem);\n\n  // Remove the events of a particular type if there are none left\n  if (data.handlers[type].length === 0) {\n    delete data.handlers[type];\n    // data.handlers[type] = null;\n    // Setting to null was causing an error with data.handlers\n\n    // Remove the meta-handler from the element\n    if (elem.removeEventListener) {\n      elem.removeEventListener(type, data.dispatcher, false);\n    } else if (elem.detachEvent) {\n      elem.detachEvent('on' + type, data.dispatcher);\n    }\n  }\n\n  // Remove the events object if there are no types left\n  if (Object.getOwnPropertyNames(data.handlers).length <= 0) {\n    delete data.handlers;\n    delete data.dispatcher;\n    delete data.disabled;\n  }\n\n  // Finally remove the element data if there is no data left\n  if (Object.getOwnPropertyNames(data).length === 0) {\n    Dom.removeElData(elem);\n  }\n}\n\n/**\n * Loops through an array of event types and calls the requested method for each type.\n *\n * @param  {Function} fn   The event method we want to use.\n * @param  {Element|Object} elem Element or object to bind listeners to\n * @param  {String}   type Type of event to bind to.\n * @param  {Function} callback   Event listener.\n * @private\n * @function _handleMultipleEvents\n */\nfunction _handleMultipleEvents(fn, elem, types, callback) {\n  types.forEach(function(type) {\n    //Call the event method for each one of the types\n    fn(elem, type, callback);\n  });\n}\n","/**\n * @file fn.js\n */\nimport { newGUID } from './guid.js';\n\n/**\n * Bind (a.k.a proxy or Context). A simple method for changing the context of a function\n * It also stores a unique id on the function so it can be easily removed from events\n *\n * @param  {*}   context The object to bind as scope\n * @param  {Function} fn      The function to be bound to a scope\n * @param  {Number=}   uid     An optional unique ID for the function to be set\n * @return {Function}\n * @private\n * @method bind\n */\nexport const bind = function(context, fn, uid) {\n  // Make sure the function has a unique ID\n  if (!fn.guid) { fn.guid = newGUID(); }\n\n  // Create the new function that changes the context\n  let ret = function() {\n    return fn.apply(context, arguments);\n  };\n\n  // Allow for the ability to individualize this function\n  // Needed in the case where multiple objects might share the same prototype\n  // IF both items add an event listener with the same function, then you try to remove just one\n  // it will remove both because they both have the same guid.\n  // when using this, you need to use the bind method when you remove the listener as well.\n  // currently used in text tracks\n  ret.guid = (uid) ? uid + '_' + fn.guid : fn.guid;\n\n  return ret;\n};\n","/**\n * @file format-time.js\n *\n * Format seconds as a time string, H:MM:SS or M:SS\n * Supplying a guide (in seconds) will force a number of leading zeros\n * to cover the length of the guide\n *\n * @param  {Number} seconds Number of seconds to be turned into a string\n * @param  {Number} guide   Number (in seconds) to model the string after\n * @return {String}         Time formatted as H:MM:SS or M:SS\n * @private\n * @function formatTime\n */\nfunction formatTime(seconds, guide=seconds) {\n  let s = Math.floor(seconds % 60);\n  let m = Math.floor(seconds / 60 % 60);\n  let h = Math.floor(seconds / 3600);\n  const gm = Math.floor(guide / 60 % 60);\n  const gh = Math.floor(guide / 3600);\n\n  // handle invalid times\n  if (isNaN(seconds) || seconds === Infinity) {\n    // '-' is false for all relational operators (e.g. <, >=) so this setting\n    // will add the minimum number of fields specified by the guide\n    h = m = s = '-';\n  }\n\n  // Check if we need to show hours\n  h = (h > 0 || gh > 0) ? h + ':' : '';\n\n  // If hours are showing, we may need to add a leading zero.\n  // Always show at least one digit of minutes.\n  m = (((h || gm >= 10) && m < 10) ? '0' + m : m) + ':';\n\n  // Check if leading zero is need for seconds\n  s = (s < 10) ? '0' + s : s;\n\n  return h + m + s;\n}\n\nexport default formatTime;\n","/**\n * @file guid.js\n *\n * Unique ID for an element or function\n * @type {Number}\n * @private\n */\nlet _guid = 1;\n\n/**\n * Get the next unique ID\n *\n * @return {String} \n * @function newGUID\n */\nexport function newGUID() {\n  return _guid++;\n}\n","/**\n * @file log.js\n */\nimport window from 'global/window';\n\n/**\n * Log plain debug messages\n */\nconst log = function(){\n  _logType(null, arguments);\n};\n\n/**\n * Keep a history of log messages\n * @type {Array}\n */\nlog.history = [];\n\n/**\n * Log error messages\n */\nlog.error = function(){\n  _logType('error', arguments);\n};\n\n/**\n * Log warning messages\n */\nlog.warn = function(){\n  _logType('warn', arguments);\n};\n\n/**\n * Log messages to the console and history based on the type of message\n *\n * @param  {String} type The type of message, or `null` for `log`\n * @param  {Object} args The args to be passed to the log\n * @private\n * @method _logType\n */\nfunction _logType(type, args){\n  // convert args to an array to get array functions\n  let argsArray = Array.prototype.slice.call(args);\n  // if there's no console then don't try to output messages\n  // they will still be stored in log.history\n  // Was setting these once outside of this function, but containing them\n  // in the function makes it easier to test cases where console doesn't exist\n  let noop = function(){};\n\n  let console = window['console'] || {\n    'log': noop,\n    'warn': noop,\n    'error': noop\n  };\n\n  if (type) {\n    // add the type to the front of the message\n    argsArray.unshift(type.toUpperCase()+':');\n  } else {\n    // default to log with no prefix\n    type = 'log';\n  }\n\n  // add to history\n  log.history.push(argsArray);\n\n  // add console prefix after adding to history\n  argsArray.unshift('VIDEOJS:');\n\n  // call appropriate log function\n  if (console[type].apply) {\n    console[type].apply(console, argsArray);\n  } else {\n    // ie8 doesn't allow error.apply, but it will just join() the array anyway\n    console[type](argsArray.join(' '));\n  }\n}\n\nexport default log;\n","/**\n * @file merge-options.js\n */\nimport merge from 'lodash-compat/object/merge';\n\nfunction isPlain(obj) {\n  return !!obj\n    && typeof obj === 'object'\n    && obj.toString() === '[object Object]'\n    && obj.constructor === Object;\n}\n\n/**\n * Merge customizer. video.js simply overwrites non-simple objects\n * (like arrays) instead of attempting to overlay them.\n * @see https://lodash.com/docs#merge\n */\nconst customizer = function(destination, source) {\n  // If we're not working with a plain object, copy the value as is\n  // If source is an array, for instance, it will replace destination\n  if (!isPlain(source)) {\n    return source;\n  }\n\n  // If the new value is a plain object but the first object value is not\n  // we need to create a new object for the first object to merge with.\n  // This makes it consistent with how merge() works by default\n  // and also protects from later changes the to first object affecting\n  // the second object's values.\n  if (!isPlain(destination)) {\n    return mergeOptions(source);\n  }\n};\n\n/**\n * Merge one or more options objects, recursively merging **only**\n * plain object properties.  Previously `deepMerge`.\n *\n * @param  {...Object} source One or more objects to merge\n * @returns {Object}          a new object that is the union of all\n * provided objects\n * @function mergeOptions\n */\nexport default function mergeOptions() {\n  // contruct the call dynamically to handle the variable number of\n  // objects to merge\n  let args = Array.prototype.slice.call(arguments);\n\n  // unshift an empty object into the front of the call as the target\n  // of the merge\n  args.unshift({});\n\n  // customize conflict resolution to match our historical merge behavior\n  args.push(customizer);\n\n  merge.apply(null, args);\n\n  // return the mutated result object\n  return args[0];\n}\n","import document from 'global/document';\n\nexport let createStyleElement = function(className) {\n  let style = document.createElement('style');\n  style.className = className;\n\n  return style;\n};\n\nexport let setTextContent = function(el, content) {\n  if (el.styleSheet) {\n    el.styleSheet.cssText = content;\n  } else {\n    el.textContent = content;\n  }\n};\n","import log from './log.js';\n\n/**\n * @file time-ranges.js\n *\n * Should create a fake TimeRange object\n * Mimics an HTML5 time range instance, which has functions that\n * return the start and end times for a range\n * TimeRanges are returned by the buffered() method\n *\n * @param  {(Number|Array)} Start of a single range or an array of ranges\n * @param  {Number} End of a single range\n * @private\n * @method createTimeRanges\n */\nexport function createTimeRanges(start, end){\n  if (Array.isArray(start)) {\n    return createTimeRangesObj(start);\n  } else if (start === undefined || end === undefined) {\n    return createTimeRangesObj();\n  }\n  return createTimeRangesObj([[start, end]]);\n}\n\nexport { createTimeRanges as createTimeRange };\n\nfunction createTimeRangesObj(ranges){\n  if (ranges === undefined || ranges.length === 0) {\n    return {\n      length: 0,\n      start: function() {\n        throw new Error('This TimeRanges object is empty');\n      },\n      end: function() {\n        throw new Error('This TimeRanges object is empty');\n      }\n    };\n  }\n  return {\n    length: ranges.length,\n    start: getRange.bind(null, 'start', 0, ranges),\n    end: getRange.bind(null, 'end', 1, ranges)\n  };\n}\n\nfunction getRange(fnName, valueIndex, ranges, rangeIndex){\n  if (rangeIndex === undefined) {\n    log.warn(`DEPRECATED: Function '${fnName}' on 'TimeRanges' called without an index argument.`);\n    rangeIndex = 0;\n  }\n  rangeCheck(fnName, rangeIndex, ranges.length - 1);\n  return ranges[rangeIndex][valueIndex];\n}\n\nfunction rangeCheck(fnName, index, maxIndex){\n  if (index < 0 || index > maxIndex) {\n    throw new Error(`Failed to execute '${fnName}' on 'TimeRanges': The index provided (${index}) is greater than or equal to the maximum bound (${maxIndex}).`);\n  }\n}\n","/**\n * @file to-title-case.js\n *\n * Uppercase the first letter of a string\n *\n * @param  {String} string String to be uppercased\n * @return {String}\n * @private\n * @method toTitleCase\n */\nfunction toTitleCase(string){\n  return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nexport default toTitleCase;\n","/**\n * @file url.js\n */\nimport document from 'global/document';\nimport window from 'global/window';\n\n/**\n * Resolve and parse the elements of a URL\n *\n * @param  {String} url The url to parse\n * @return {Object}     An object of url details\n * @method parseUrl\n */\nexport const parseUrl = function(url) {\n  const props = ['protocol', 'hostname', 'port', 'pathname', 'search', 'hash', 'host'];\n\n  // add the url to an anchor and let the browser parse the URL\n  let a = document.createElement('a');\n  a.href = url;\n\n  // IE8 (and 9?) Fix\n  // ie8 doesn't parse the URL correctly until the anchor is actually\n  // added to the body, and an innerHTML is needed to trigger the parsing\n  let addToBody = (a.host === '' && a.protocol !== 'file:');\n  let div;\n  if (addToBody) {\n    div = document.createElement('div');\n    div.innerHTML = `<a href=\"${url}\"></a>`;\n    a = div.firstChild;\n    // prevent the div from affecting layout\n    div.setAttribute('style', 'display:none; position:absolute;');\n    document.body.appendChild(div);\n  }\n\n  // Copy the specific URL properties to a new object\n  // This is also needed for IE8 because the anchor loses its\n  // properties when it's removed from the dom\n  let details = {};\n  for (var i = 0; i < props.length; i++) {\n    details[props[i]] = a[props[i]];\n  }\n\n  // IE9 adds the port to the host property unlike everyone else. If\n  // a port identifier is added for standard ports, strip it.\n  if (details.protocol === 'http:') {\n    details.host = details.host.replace(/:80$/, '');\n  }\n  if (details.protocol === 'https:') {\n    details.host = details.host.replace(/:443$/, '');\n  }\n\n  if (addToBody) {\n    document.body.removeChild(div);\n  }\n\n  return details;\n};\n\n/**\n * Get absolute version of relative URL. Used to tell flash correct URL.\n * http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue\n *\n * @param  {String} url URL to make absolute\n * @return {String}     Absolute URL\n * @private\n * @method getAbsoluteURL\n */\nexport const getAbsoluteURL = function(url){\n  // Check if absolute URL\n  if (!url.match(/^https?:\\/\\//)) {\n    // Convert to absolute URL. Flash hosted off-site needs an absolute URL.\n    let div = document.createElement('div');\n    div.innerHTML = `<a href=\"${url}\">x</a>`;\n    url = div.firstChild.href;\n  }\n\n  return url;\n};\n\n/**\n * Returns the extension of the passed file name. It will return an empty string if you pass an invalid path\n *\n * @param {String}    path    The fileName path like '/path/to/file.mp4'\n * @returns {String}          The extension in lower case or an empty string if no extension could be found.\n * @method getFileExtension\n */\nexport const getFileExtension = function(path) {\n  if(typeof path === 'string'){\n    let splitPathRe = /^(\\/?)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?)(\\.([^\\.\\/\\?]+)))(?:[\\/]*|[\\?].*)$/i;\n    let pathParts = splitPathRe.exec(path);\n\n    if (pathParts) {\n      return pathParts.pop().toLowerCase();\n    }\n  }\n\n  return '';\n};\n\n/**\n * Returns whether the url passed is a cross domain request or not.\n *\n * @param {String} url The url to check\n * @return {Boolean}   Whether it is a cross domain request or not\n * @method isCrossOrigin\n */\nexport const isCrossOrigin = function(url) {\n  let urlInfo = parseUrl(url);\n  let winLoc = window.location;\n\n  // IE8 protocol relative urls will return ':' for protocol\n  let srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol;\n\n  // Check if url is for another domain/origin\n  // IE8 doesn't know location.origin, so we won't rely on it here\n  let crossOrigin = (srcProtocol + urlInfo.host) !== (winLoc.protocol + winLoc.host);\n\n  return crossOrigin;\n};\n","/**\n * @file video.js\n */\nimport document from 'global/document';\nimport * as setup from './setup';\nimport * as stylesheet from './utils/stylesheet.js';\nimport Component from './component';\nimport EventTarget from './event-target';\nimport * as Events from './utils/events.js';\nimport Player from './player';\nimport plugin from './plugins.js';\nimport mergeOptions from '../../src/js/utils/merge-options.js';\nimport * as Fn from './utils/fn.js';\nimport TextTrack from './tracks/text-track.js';\n\nimport assign from 'object.assign';\nimport { createTimeRanges } from './utils/time-ranges.js';\nimport formatTime from './utils/format-time.js';\nimport log from './utils/log.js';\nimport * as Dom from './utils/dom.js';\nimport * as browser from './utils/browser.js';\nimport * as Url from './utils/url.js';\nimport extendFn from './extend.js';\nimport merge from 'lodash-compat/object/merge';\nimport createDeprecationProxy from './utils/create-deprecation-proxy.js';\nimport xhr from 'xhr';\n\n// Include the built-in techs\nimport Html5 from './tech/html5.js';\nimport Flash from './tech/flash.js';\n\n// HTML5 Element Shim for IE8\nif (typeof HTMLVideoElement === 'undefined') {\n  document.createElement('video');\n  document.createElement('audio');\n  document.createElement('track');\n}\n\n/**\n * Doubles as the main function for users to create a player instance and also\n * the main library object.\n * The `videojs` function can be used to initialize or retrieve a player.\n * ```js\n *     var myPlayer = videojs('my_video_id');\n * ```\n *\n * @param  {String|Element} id      Video element or video element ID\n * @param  {Object=} options        Optional options object for config/settings\n * @param  {Function=} ready        Optional ready callback\n * @return {Player}                 A player instance\n * @mixes videojs\n * @method videojs\n */\nvar videojs = function(id, options, ready){\n  var tag; // Element of ID\n\n  // Allow for element or ID to be passed in\n  // String ID\n  if (typeof id === 'string') {\n\n    // Adjust for jQuery ID syntax\n    if (id.indexOf('#') === 0) {\n      id = id.slice(1);\n    }\n\n    // If a player instance has already been created for this ID return it.\n    if (videojs.getPlayers()[id]) {\n\n      // If options or ready funtion are passed, warn\n      if (options) {\n        log.warn(`Player \"${id}\" is already initialised. Options will not be applied.`);\n      }\n\n      if (ready) {\n        videojs.getPlayers()[id].ready(ready);\n      }\n\n      return videojs.getPlayers()[id];\n\n    // Otherwise get element for ID\n    } else {\n      tag = Dom.getEl(id);\n    }\n\n  // ID is a media element\n  } else {\n    tag = id;\n  }\n\n  // Check for a useable element\n  if (!tag || !tag.nodeName) { // re: nodeName, could be a box div also\n    throw new TypeError('The element or ID supplied is not valid. (videojs)'); // Returns\n  }\n\n  // Element may have a player attr referring to an already created player instance.\n  // If not, set up a new player and return the instance.\n  return tag['player'] || new Player(tag, options, ready);\n};\n\n// Add default styles\nlet style = document.querySelector('.vjs-styles-defaults');\nif (!style) {\n  style = stylesheet.createStyleElement('vjs-styles-defaults');\n  let head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n  stylesheet.setTextContent(style, `\n    .video-js {\n      width: 300px;\n      height: 150px;\n    }\n\n    .vjs-fluid {\n      padding-top: 56.25%\n    }\n  `);\n}\n\n// Run Auto-load players\n// You have to wait at least once in case this script is loaded after your video in the DOM (weird behavior only with minified version)\nsetup.autoSetupTimeout(1, videojs);\n\n/*\n * Current software version (semver)\n *\n * @type {String}\n */\nvideojs.VERSION = '__VERSION__';\n\n/**\n * The global options object. These are the settings that take effect\n * if no overrides are specified when the player is created.\n *\n * ```js\n *     videojs.options.autoplay = true\n *     // -> all players will autoplay by default\n * ```\n *\n * @type {Object}\n */\nvideojs.options = Player.prototype.options_;\n\n/**\n * Get an object with the currently created players, keyed by player ID\n *\n * @return {Object} The created players\n * @mixes videojs\n * @method getPlayers\n */\nvideojs.getPlayers = function() {\n  return Player.players;\n};\n\n/**\n * For backward compatibility, expose players object.\n *\n * @deprecated\n * @memberOf videojs\n * @property {Object|Proxy} players\n */\nvideojs.players = createDeprecationProxy(Player.players, {\n  get: 'Access to videojs.players is deprecated; use videojs.getPlayers instead',\n  set: 'Modification of videojs.players is deprecated'\n});\n\n/**\n * Get a component class object by name\n * ```js\n *     var VjsButton = videojs.getComponent('Button');\n *     // Create a new instance of the component\n *     var myButton = new VjsButton(myPlayer);\n * ```\n *\n * @return {Component} Component identified by name\n * @mixes videojs\n * @method getComponent\n */\nvideojs.getComponent = Component.getComponent;\n\n/**\n * Register a component so it can referred to by name\n * Used when adding to other\n * components, either through addChild\n * `component.addChild('myComponent')`\n * or through default children options\n * `{ children: ['myComponent'] }`.\n * ```js\n *     // Get a component to subclass\n *     var VjsButton = videojs.getComponent('Button');\n *     // Subclass the component (see 'extend' doc for more info)\n *     var MySpecialButton = videojs.extend(VjsButton, {});\n *     // Register the new component\n *     VjsButton.registerComponent('MySepcialButton', MySepcialButton);\n *     // (optionally) add the new component as a default player child\n *     myPlayer.addChild('MySepcialButton');\n * ```\n * NOTE: You could also just initialize the component before adding.\n * `component.addChild(new MyComponent());`\n *\n * @param {String} The class name of the component\n * @param {Component} The component class\n * @return {Component} The newly registered component\n * @mixes videojs\n * @method registerComponent\n */\nvideojs.registerComponent = Component.registerComponent;\n\n/**\n * A suite of browser and device tests\n *\n * @type {Object}\n * @private\n */\nvideojs.browser = browser;\n\n/**\n * Whether or not the browser supports touch events. Included for backward\n * compatibility with 4.x, but deprecated. Use `videojs.browser.TOUCH_ENABLED`\n * instead going forward.\n *\n * @deprecated\n * @type {Boolean}\n */\nvideojs.TOUCH_ENABLED = browser.TOUCH_ENABLED;\n\n/**\n * Subclass an existing class\n * Mimics ES6 subclassing with the `extend` keyword\n * ```js\n *     // Create a basic javascript 'class'\n *     function MyClass(name){\n *       // Set a property at initialization\n *       this.myName = name;\n *     }\n *     // Create an instance method\n *     MyClass.prototype.sayMyName = function(){\n *       alert(this.myName);\n *     };\n *     // Subclass the exisitng class and change the name\n *     // when initializing\n *     var MySubClass = videojs.extend(MyClass, {\n *       constructor: function(name) {\n *         // Call the super class constructor for the subclass\n *         MyClass.call(this, name)\n *       }\n *     });\n *     // Create an instance of the new sub class\n *     var myInstance = new MySubClass('John');\n *     myInstance.sayMyName(); // -> should alert \"John\"\n * ```\n *\n * @param {Function} The Class to subclass\n * @param {Object} An object including instace methods for the new class\n *                   Optionally including a `constructor` function\n * @return {Function} The newly created subclass\n * @mixes videojs\n * @method extend\n */\nvideojs.extend = extendFn;\n\n/**\n * Merge two options objects recursively\n * Performs a deep merge like lodash.merge but **only merges plain objects**\n * (not arrays, elements, anything else)\n * Other values will be copied directly from the second object.\n * ```js\n *     var defaultOptions = {\n *       foo: true,\n *       bar: {\n *         a: true,\n *         b: [1,2,3]\n *       }\n *     };\n *     var newOptions = {\n *       foo: false,\n *       bar: {\n *         b: [4,5,6]\n *       }\n *     };\n *     var result = videojs.mergeOptions(defaultOptions, newOptions);\n *     // result.foo = false;\n *     // result.bar.a = true;\n *     // result.bar.b = [4,5,6];\n * ```\n *\n * @param {Object} The options object whose values will be overriden\n * @param {Object} The options object with values to override the first\n * @param {Object} Any number of additional options objects\n *\n * @return {Object} a new object with the merged values\n * @mixes videojs\n * @method mergeOptions\n */\nvideojs.mergeOptions = mergeOptions;\n\n/**\n * Change the context (this) of a function\n *\n *     videojs.bind(newContext, function(){\n *       this === newContext\n *     });\n *\n * NOTE: as of v5.0 we require an ES5 shim, so you should use the native\n * `function(){}.bind(newContext);` instead of this.\n *\n * @param  {*}        context The object to bind as scope\n * @param  {Function} fn      The function to be bound to a scope\n * @param  {Number=}  uid     An optional unique ID for the function to be set\n * @return {Function}\n */\nvideojs.bind = Fn.bind;\n\n/**\n * Create a Video.js player plugin\n * Plugins are only initialized when options for the plugin are included\n * in the player options, or the plugin function on the player instance is\n * called.\n * **See the plugin guide in the docs for a more detailed example**\n * ```js\n *     // Make a plugin that alerts when the player plays\n *     videojs.plugin('myPlugin', function(myPluginOptions) {\n *       myPluginOptions = myPluginOptions || {};\n *\n *       var player = this;\n *       var alertText = myPluginOptions.text || 'Player is playing!'\n *\n *       player.on('play', function(){\n *         alert(alertText);\n *       });\n *     });\n *     // USAGE EXAMPLES\n *     // EXAMPLE 1: New player with plugin options, call plugin immediately\n *     var player1 = videojs('idOne', {\n *       myPlugin: {\n *         text: 'Custom text!'\n *       }\n *     });\n *     // Click play\n *     // --> Should alert 'Custom text!'\n *     // EXAMPLE 3: New player, initialize plugin later\n *     var player3 = videojs('idThree');\n *     // Click play\n *     // --> NO ALERT\n *     // Click pause\n *     // Initialize plugin using the plugin function on the player instance\n *     player3.myPlugin({\n *       text: 'Plugin added later!'\n *     });\n *     // Click play\n *     // --> Should alert 'Plugin added later!'\n * ```\n *\n * @param {String} The plugin name\n * @param {Function} The plugin function that will be called with options\n * @mixes videojs\n * @method plugin\n */\nvideojs.plugin = plugin;\n\n/**\n * Adding languages so that they're available to all players.\n * ```js\n *     videojs.addLanguage('es', { 'Hello': 'Hola' });\n * ```\n *\n * @param  {String} code The language code or dictionary property\n * @param  {Object} data The data values to be translated\n * @return {Object} The resulting language dictionary object\n * @mixes videojs\n * @method addLanguage\n */\nvideojs.addLanguage = function(code, data){\n  code = ('' + code).toLowerCase();\n  return merge(videojs.options.languages, { [code]: data })[code];\n};\n\n/**\n * Log debug messages.\n *\n * @param {...Object} messages One or more messages to log\n */\nvideojs.log = log;\n\n/**\n * Creates an emulated TimeRange object.\n *\n * @param  {Number|Array} start Start time in seconds or an array of ranges\n * @param  {Number} end   End time in seconds\n * @return {Object}       Fake TimeRange object\n * @method createTimeRange\n */\nvideojs.createTimeRange = videojs.createTimeRanges = createTimeRanges;\n\n/**\n * Format seconds as a time string, H:MM:SS or M:SS\n * Supplying a guide (in seconds) will force a number of leading zeros\n * to cover the length of the guide\n *\n * @param  {Number} seconds Number of seconds to be turned into a string\n * @param  {Number} guide   Number (in seconds) to model the string after\n * @return {String}         Time formatted as H:MM:SS or M:SS\n * @method formatTime\n */\nvideojs.formatTime = formatTime;\n\n/**\n * Resolve and parse the elements of a URL\n *\n * @param  {String} url The url to parse\n * @return {Object}     An object of url details\n * @method parseUrl\n */\nvideojs.parseUrl = Url.parseUrl;\n\n/**\n * Returns whether the url passed is a cross domain request or not.\n *\n * @param {String} url The url to check\n * @return {Boolean}   Whether it is a cross domain request or not\n * @method isCrossOrigin\n */\nvideojs.isCrossOrigin = Url.isCrossOrigin;\n\n/**\n * Event target class.\n *\n * @type {Function}\n */\nvideojs.EventTarget = EventTarget;\n\n/**\n * Add an event listener to element\n * It stores the handler function in a separate cache object\n * and adds a generic handler to the element's event,\n * along with a unique id (guid) to the element.\n *\n * @param  {Element|Object}   elem Element or object to bind listeners to\n * @param  {String|Array}   type Type of event to bind to.\n * @param  {Function} fn   Event listener.\n * @method on\n */\nvideojs.on = Events.on;\n\n/**\n * Trigger a listener only once for an event\n *\n * @param  {Element|Object}   elem Element or object to\n * @param  {String|Array}   type Name/type of event\n * @param  {Function} fn Event handler function\n * @method one\n */\nvideojs.one = Events.one;\n\n/**\n * Removes event listeners from an element\n *\n * @param  {Element|Object}   elem Object to remove listeners from\n * @param  {String|Array=}   type Type of listener to remove. Don't include to remove all events from element.\n * @param  {Function} fn   Specific listener to remove. Don't include to remove listeners for an event type.\n * @method off\n */\nvideojs.off = Events.off;\n\n/**\n * Trigger an event for an element\n *\n * @param  {Element|Object}      elem  Element to trigger an event on\n * @param  {Event|Object|String} event A string (the type) or an event object with a type attribute\n * @param  {Object} [hash] data hash to pass along with the event\n * @return {Boolean=} Returned only if default was prevented\n * @method trigger\n */\nvideojs.trigger = Events.trigger;\n\n/**\n * A cross-browser XMLHttpRequest wrapper. Here's a simple example:\n *\n *     videojs.xhr({\n *       body: someJSONString,\n *       uri: \"/foo\",\n *       headers: {\n *         \"Content-Type\": \"application/json\"\n *       }\n *     }, function (err, resp, body) {\n *       // check resp.statusCode\n *     });\n *\n * Check out the [full\n * documentation](https://github.com/Raynos/xhr/blob/v2.1.0/README.md)\n * for more options.\n *\n * @param {Object} options settings for the request.\n * @return {XMLHttpRequest|XDomainRequest} the request object.\n * @see https://github.com/Raynos/xhr\n */\nvideojs.xhr = xhr;\n\n/**\n * TextTrack class\n *\n * @type {Function}\n */\nvideojs.TextTrack = TextTrack;\n\n// REMOVING: We probably should add this to the migration plugin\n// // Expose but deprecate the window[componentName] method for accessing components\n// Object.getOwnPropertyNames(Component.components).forEach(function(name){\n//   let component = Component.components[name];\n//\n//   // A deprecation warning as the constuctor\n//   module.exports[name] = function(player, options, ready){\n//     log.warn('Using videojs.'+name+' to access the '+name+' component has been deprecated. Please use videojs.getComponent(\"componentName\")');\n//\n//     return new Component(player, options, ready);\n//   };\n//\n//   // Allow the prototype and class methods to be accessible still this way\n//   // Though anything that attempts to override class methods will no longer work\n//   assign(module.exports[name], component);\n// });\n\n/*\n * Custom Universal Module Definition (UMD)\n *\n * Video.js will never be a non-browser lib so we can simplify UMD a bunch and\n * still support requirejs and browserify. This also needs to be closure\n * compiler compatible, so string keys are used.\n */\nif (typeof define === 'function' && define['amd']) {\n  define('videojs', [], function(){ return videojs; });\n\n// checking that module is an object too because of umdjs/umd#35\n} else if (typeof exports === 'object' && typeof module === 'object') {\n  module['exports'] = videojs;\n}\n\nexport default videojs;\n"]}
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/examples/shared/example-captions.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 

	
 
00:00.700 --> 00:04.110
 
Captions describe all relevant audio for the hearing impaired.
 
[ Heroic music playing for a seagull ]
 

	
 
00:04.500 --> 00:05.000
 
[ Splash!!! ]
 

	
 
00:05.100 --> 00:06.000
 
[ Sploosh!!! ]
 

	
 
00:08.000 --> 00:09.225
 
[ Splash...splash...splash splash splash ]
 

	
 
00:10.525 --> 00:11.255
 
[ Splash, Sploosh again ]
 

	
 
00:13.500 --> 00:14.984
 
Dolphin: eeeEEEEEeeee!
 

	
 
00:14.984 --> 00:16.984
 
Dolphin: Squawk! eeeEEE?
 

	
 
00:25.000 --> 00:28.284
 
[ A whole ton of splashes ]
 

	
 
00:29.500 --> 00:31.000
 
Mine. Mine. Mine.
 

	
 
00:34.300 --> 00:36.000
 
Shark: Chomp
 

	
 
00:36.800 --> 00:37.900
 
Shark: CHOMP!!!
 

	
 
00:37.861 --> 00:41.193
 
EEEEEEOOOOOOOOOOWHALENOISE
 

	
 
00:42.593 --> 00:45.611
 
[ BIG SPLASH ]
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/examples/simple-embed/index.html
Show inline comments
 
new file 100644
 
<!DOCTYPE html>
 
<html>
 
<head>
 
  <title>Video.js | HTML5 Video Player</title>
 

	
 
  <!-- Chang URLs to wherever Video.js files will be hosted -->
 
  <!-- Default URLs assume the examples folder is included alongside video.js -->
 
  <link href="../../video-js.min.css" rel="stylesheet" type="text/css">
 

	
 
  <!-- Include ES5 shim, sham and html5 shiv for ie8 support  -->
 
  <!-- Exclude this if you don't need ie8 support -->
 
  <script src="../../ie8/videojs-ie8.min.js"></script>
 

	
 
  <!-- video.js must be in the <head> for older IEs to work. -->
 
  <script src="../../video.min.js"></script>
 

	
 
  <!-- Unless using the CDN hosted version, update the URL to the Flash SWF -->
 
  <script>
 
    videojs.options.flash.swf = "../../video-js.swf";
 
  </script>
 

	
 
</head>
 
<body>
 

	
 
  <video id="example_video_1" class="video-js vjs-default-skin" controls preload="none" width="640" height="264"
 
      poster="http://video-js.zencoder.com/oceans-clip.png"
 
      data-setup="{}">
 
    <source src="http://video-js.zencoder.com/oceans-clip.mp4" type='video/mp4' />
 
    <source src="http://video-js.zencoder.com/oceans-clip.webm" type='video/webm' />
 
    <source src="http://video-js.zencoder.com/oceans-clip.ogv" type='video/ogg' />
 
    <track kind="captions" src="../shared/example-captions.vtt" srclang="en" label="English"></track><!-- Tracks need an ending tag thanks to IE9 -->
 
    <track kind="subtitles" src="../shared/example-captions.vtt" srclang="en" label="English"></track><!-- Tracks need an ending tag thanks to IE9 -->
 
    <p class="vjs-no-js">To view this video please enable JavaScript, and consider upgrading to a web browser that <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a></p>
 
  </video>
 

	
 
</body>
 
</html>
ennstatus/static/js/video.js/dist/font/VideoJS.eot
Show inline comments
 
new file 100644
 
binary diff not shown
ennstatus/static/js/video.js/dist/font/VideoJS.ttf
Show inline comments
 
new file 100644
 
binary diff not shown
ennstatus/static/js/video.js/dist/font/VideoJS.woff
Show inline comments
 
new file 100644
 
binary diff not shown
ennstatus/static/js/video.js/dist/ie8/videojs-ie8.js
Show inline comments
 
new file 100644
 
/**
 
 * HTML5 Element Shim for IE8
 
 *
 
 * **THIS CODE MUST BE LOADED IN THE <HEAD> OF THE DOCUMENT**
 
 *
 
 * Video.js uses the video tag as an embed code, even in IE8 which
 
 * doesn't have support for HTML5 video. The following code is needed
 
 * to make it possible to use the video tag. Otherwise IE8 ignores everything
 
 * inside the video tag.
 
 */
 
if (typeof window.HTMLVideoElement === 'undefined') {
 
  document.createElement('video');
 
  document.createElement('audio');
 
  document.createElement('track');
 
}
 

	
 
/*!
 
 * https://github.com/es-shims/es5-shim
 
 * @license es5-shim Copyright 2009-2015 by contributors, MIT License
 
 * see https://github.com/es-shims/es5-shim/blob/master/LICENSE
 
 */
 

	
 
// vim: ts=4 sts=4 sw=4 expandtab
 

	
 
// Add semicolon to prevent IIFE from being passed as argument to concatenated code.
 
;
 

	
 
// UMD (Universal Module Definition)
 
// see https://github.com/umdjs/umd/blob/master/returnExports.js
 
(function (root, factory) {
 
    'use strict';
 

	
 
    /*global define, exports, module */
 
    if (typeof define === 'function' && define.amd) {
 
        // AMD. Register as an anonymous module.
 
        define(factory);
 
    } else if (typeof exports === 'object') {
 
        // Node. Does not work with strict CommonJS, but
 
        // only CommonJS-like enviroments that support module.exports,
 
        // like Node.
 
        module.exports = factory();
 
    } else {
 
        // Browser globals (root is window)
 
        root.returnExports = factory();
 
    }
 
}(this, function () {
 

	
 
/**
 
 * Brings an environment as close to ECMAScript 5 compliance
 
 * as is possible with the facilities of erstwhile engines.
 
 *
 
 * Annotated ES5: http://es5.github.com/ (specific links below)
 
 * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
 
 * Required reading: http://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-natives/
 
 */
 

	
 
// Shortcut to an often accessed properties, in order to avoid multiple
 
// dereference that costs universally.
 
var ArrayPrototype = Array.prototype;
 
var ObjectPrototype = Object.prototype;
 
var FunctionPrototype = Function.prototype;
 
var StringPrototype = String.prototype;
 
var NumberPrototype = Number.prototype;
 
var array_slice = ArrayPrototype.slice;
 
var array_splice = ArrayPrototype.splice;
 
var array_push = ArrayPrototype.push;
 
var array_unshift = ArrayPrototype.unshift;
 
var array_concat = ArrayPrototype.concat;
 
var call = FunctionPrototype.call;
 

	
 
// Having a toString local variable name breaks in Opera so use to_string.
 
var to_string = ObjectPrototype.toString;
 

	
 
var isArray = Array.isArray || function isArray(obj) {
 
    return to_string.call(obj) === '[object Array]';
 
};
 

	
 
var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
 
var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, tryFunctionObject = function tryFunctionObject(value) { try { fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]'; isCallable = function isCallable(value) { if (typeof value !== 'function') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; };
 
var isRegex; /* inlined from https://npmjs.com/is-regex */ var regexExec = RegExp.prototype.exec, tryRegexExec = function tryRegexExec(value) { try { regexExec.call(value); return true; } catch (e) { return false; } }, regexClass = '[object RegExp]'; isRegex = function isRegex(value) { if (typeof value !== 'object') { return false; } return hasToStringTag ? tryRegexExec(value) : to_string.call(value) === regexClass; };
 
var isString; /* inlined from https://npmjs.com/is-string */ var strValue = String.prototype.valueOf, tryStringObject = function tryStringObject(value) { try { strValue.call(value); return true; } catch (e) { return false; } }, stringClass = '[object String]'; isString = function isString(value) { if (typeof value === 'string') { return true; } if (typeof value !== 'object') { return false; } return hasToStringTag ? tryStringObject(value) : to_string.call(value) === stringClass; };
 

	
 
var isArguments = function isArguments(value) {
 
    var str = to_string.call(value);
 
    var isArgs = str === '[object Arguments]';
 
    if (!isArgs) {
 
        isArgs = !isArray(value) &&
 
          value !== null &&
 
          typeof value === 'object' &&
 
          typeof value.length === 'number' &&
 
          value.length >= 0 &&
 
          isCallable(value.callee);
 
    }
 
    return isArgs;
 
};
 

	
 
/* inlined from http://npmjs.com/define-properties */
 
var defineProperties = (function (has) {
 
  var supportsDescriptors = Object.defineProperty && (function () {
 
      try {
 
          var obj = {};
 
          Object.defineProperty(obj, 'x', { enumerable: false, value: obj });
 
          for (var _ in obj) { return false; }
 
          return obj.x === obj;
 
      } catch (e) { /* this is ES3 */
 
          return false;
 
      }
 
  }());
 

	
 
  // Define configurable, writable and non-enumerable props
 
  // if they don't exist.
 
  var defineProperty;
 
  if (supportsDescriptors) {
 
      defineProperty = function (object, name, method, forceAssign) {
 
          if (!forceAssign && (name in object)) { return; }
 
          Object.defineProperty(object, name, {
 
              configurable: true,
 
              enumerable: false,
 
              writable: true,
 
              value: method
 
          });
 
      };
 
  } else {
 
      defineProperty = function (object, name, method, forceAssign) {
 
          if (!forceAssign && (name in object)) { return; }
 
          object[name] = method;
 
      };
 
  }
 
  return function defineProperties(object, map, forceAssign) {
 
      for (var name in map) {
 
          if (has.call(map, name)) {
 
            defineProperty(object, name, map[name], forceAssign);
 
          }
 
      }
 
  };
 
}(ObjectPrototype.hasOwnProperty));
 

	
 
//
 
// Util
 
// ======
 
//
 

	
 
/* replaceable with https://npmjs.com/package/es-abstract /helpers/isPrimitive */
 
var isPrimitive = function isPrimitive(input) {
 
    var type = typeof input;
 
    return input === null || (type !== 'object' && type !== 'function');
 
};
 

	
 
var ES = {
 
    // ES5 9.4
 
    // http://es5.github.com/#x9.4
 
    // http://jsperf.com/to-integer
 
    /* replaceable with https://npmjs.com/package/es-abstract ES5.ToInteger */
 
    ToInteger: function ToInteger(num) {
 
        var n = +num;
 
        if (n !== n) { // isNaN
 
            n = 0;
 
        } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
 
            n = (n > 0 || -1) * Math.floor(Math.abs(n));
 
        }
 
        return n;
 
    },
 

	
 
    /* replaceable with https://npmjs.com/package/es-abstract ES5.ToPrimitive */
 
    ToPrimitive: function ToPrimitive(input) {
 
        var val, valueOf, toStr;
 
        if (isPrimitive(input)) {
 
            return input;
 
        }
 
        valueOf = input.valueOf;
 
        if (isCallable(valueOf)) {
 
            val = valueOf.call(input);
 
            if (isPrimitive(val)) {
 
                return val;
 
            }
 
        }
 
        toStr = input.toString;
 
        if (isCallable(toStr)) {
 
            val = toStr.call(input);
 
            if (isPrimitive(val)) {
 
                return val;
 
            }
 
        }
 
        throw new TypeError();
 
    },
 

	
 
    // ES5 9.9
 
    // http://es5.github.com/#x9.9
 
    /* replaceable with https://npmjs.com/package/es-abstract ES5.ToObject */
 
    ToObject: function (o) {
 
        /*jshint eqnull: true */
 
        if (o == null) { // this matches both null and undefined
 
            throw new TypeError("can't convert " + o + ' to object');
 
        }
 
        return Object(o);
 
    },
 

	
 
    /* replaceable with https://npmjs.com/package/es-abstract ES5.ToUint32 */
 
    ToUint32: function ToUint32(x) {
 
        return x >>> 0;
 
    }
 
};
 

	
 
//
 
// Function
 
// ========
 
//
 

	
 
// ES-5 15.3.4.5
 
// http://es5.github.com/#x15.3.4.5
 

	
 
var Empty = function Empty() {};
 

	
 
defineProperties(FunctionPrototype, {
 
    bind: function bind(that) { // .length is 1
 
        // 1. Let Target be the this value.
 
        var target = this;
 
        // 2. If IsCallable(Target) is false, throw a TypeError exception.
 
        if (!isCallable(target)) {
 
            throw new TypeError('Function.prototype.bind called on incompatible ' + target);
 
        }
 
        // 3. Let A be a new (possibly empty) internal list of all of the
 
        //   argument values provided after thisArg (arg1, arg2 etc), in order.
 
        // XXX slicedArgs will stand in for "A" if used
 
        var args = array_slice.call(arguments, 1); // for normal call
 
        // 4. Let F be a new native ECMAScript object.
 
        // 11. Set the [[Prototype]] internal property of F to the standard
 
        //   built-in Function prototype object as specified in 15.3.3.1.
 
        // 12. Set the [[Call]] internal property of F as described in
 
        //   15.3.4.5.1.
 
        // 13. Set the [[Construct]] internal property of F as described in
 
        //   15.3.4.5.2.
 
        // 14. Set the [[HasInstance]] internal property of F as described in
 
        //   15.3.4.5.3.
 
        var bound;
 
        var binder = function () {
 

	
 
            if (this instanceof bound) {
 
                // 15.3.4.5.2 [[Construct]]
 
                // When the [[Construct]] internal method of a function object,
 
                // F that was created using the bind function is called with a
 
                // list of arguments ExtraArgs, the following steps are taken:
 
                // 1. Let target be the value of F's [[TargetFunction]]
 
                //   internal property.
 
                // 2. If target has no [[Construct]] internal method, a
 
                //   TypeError exception is thrown.
 
                // 3. Let boundArgs be the value of F's [[BoundArgs]] internal
 
                //   property.
 
                // 4. Let args be a new list containing the same values as the
 
                //   list boundArgs in the same order followed by the same
 
                //   values as the list ExtraArgs in the same order.
 
                // 5. Return the result of calling the [[Construct]] internal
 
                //   method of target providing args as the arguments.
 

	
 
                var result = target.apply(
 
                    this,
 
                    array_concat.call(args, array_slice.call(arguments))
 
                );
 
                if (Object(result) === result) {
 
                    return result;
 
                }
 
                return this;
 

	
 
            } else {
 
                // 15.3.4.5.1 [[Call]]
 
                // When the [[Call]] internal method of a function object, F,
 
                // which was created using the bind function is called with a
 
                // this value and a list of arguments ExtraArgs, the following
 
                // steps are taken:
 
                // 1. Let boundArgs be the value of F's [[BoundArgs]] internal
 
                //   property.
 
                // 2. Let boundThis be the value of F's [[BoundThis]] internal
 
                //   property.
 
                // 3. Let target be the value of F's [[TargetFunction]] internal
 
                //   property.
 
                // 4. Let args be a new list containing the same values as the
 
                //   list boundArgs in the same order followed by the same
 
                //   values as the list ExtraArgs in the same order.
 
                // 5. Return the result of calling the [[Call]] internal method
 
                //   of target providing boundThis as the this value and
 
                //   providing args as the arguments.
 

	
 
                // equiv: target.call(this, ...boundArgs, ...args)
 
                return target.apply(
 
                    that,
 
                    array_concat.call(args, array_slice.call(arguments))
 
                );
 

	
 
            }
 

	
 
        };
 

	
 
        // 15. If the [[Class]] internal property of Target is "Function", then
 
        //     a. Let L be the length property of Target minus the length of A.
 
        //     b. Set the length own property of F to either 0 or L, whichever is
 
        //       larger.
 
        // 16. Else set the length own property of F to 0.
 

	
 
        var boundLength = Math.max(0, target.length - args.length);
 

	
 
        // 17. Set the attributes of the length own property of F to the values
 
        //   specified in 15.3.5.1.
 
        var boundArgs = [];
 
        for (var i = 0; i < boundLength; i++) {
 
            boundArgs.push('$' + i);
 
        }
 

	
 
        // XXX Build a dynamic function with desired amount of arguments is the only
 
        // way to set the length property of a function.
 
        // In environments where Content Security Policies enabled (Chrome extensions,
 
        // for ex.) all use of eval or Function costructor throws an exception.
 
        // However in all of these environments Function.prototype.bind exists
 
        // and so this code will never be executed.
 
        bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this, arguments); }')(binder);
 

	
 
        if (target.prototype) {
 
            Empty.prototype = target.prototype;
 
            bound.prototype = new Empty();
 
            // Clean up dangling references.
 
            Empty.prototype = null;
 
        }
 

	
 
        // TODO
 
        // 18. Set the [[Extensible]] internal property of F to true.
 

	
 
        // TODO
 
        // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).
 
        // 20. Call the [[DefineOwnProperty]] internal method of F with
 
        //   arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]:
 
        //   thrower, [[Enumerable]]: false, [[Configurable]]: false}, and
 
        //   false.
 
        // 21. Call the [[DefineOwnProperty]] internal method of F with
 
        //   arguments "arguments", PropertyDescriptor {[[Get]]: thrower,
 
        //   [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},
 
        //   and false.
 

	
 
        // TODO
 
        // NOTE Function objects created using Function.prototype.bind do not
 
        // have a prototype property or the [[Code]], [[FormalParameters]], and
 
        // [[Scope]] internal properties.
 
        // XXX can't delete prototype in pure-js.
 

	
 
        // 22. Return F.
 
        return bound;
 
    }
 
});
 

	
 
// _Please note: Shortcuts are defined after `Function.prototype.bind` as we
 
// us it in defining shortcuts.
 
var owns = call.bind(ObjectPrototype.hasOwnProperty);
 

	
 
//
 
// Array
 
// =====
 
//
 

	
 
// ES5 15.4.4.12
 
// http://es5.github.com/#x15.4.4.12
 
var spliceNoopReturnsEmptyArray = (function () {
 
    var a = [1, 2];
 
    var result = a.splice();
 
    return a.length === 2 && isArray(result) && result.length === 0;
 
}());
 
defineProperties(ArrayPrototype, {
 
    // Safari 5.0 bug where .splice() returns undefined
 
    splice: function splice(start, deleteCount) {
 
        if (arguments.length === 0) {
 
            return [];
 
        } else {
 
            return array_splice.apply(this, arguments);
 
        }
 
    }
 
}, !spliceNoopReturnsEmptyArray);
 

	
 
var spliceWorksWithEmptyObject = (function () {
 
    var obj = {};
 
    ArrayPrototype.splice.call(obj, 0, 0, 1);
 
    return obj.length === 1;
 
}());
 
defineProperties(ArrayPrototype, {
 
    splice: function splice(start, deleteCount) {
 
        if (arguments.length === 0) { return []; }
 
        var args = arguments;
 
        this.length = Math.max(ES.ToInteger(this.length), 0);
 
        if (arguments.length > 0 && typeof deleteCount !== 'number') {
 
            args = array_slice.call(arguments);
 
            if (args.length < 2) {
 
                args.push(this.length - start);
 
            } else {
 
                args[1] = ES.ToInteger(deleteCount);
 
            }
 
        }
 
        return array_splice.apply(this, args);
 
    }
 
}, !spliceWorksWithEmptyObject);
 

	
 
// ES5 15.4.4.12
 
// http://es5.github.com/#x15.4.4.13
 
// Return len+argCount.
 
// [bugfix, ielt8]
 
// IE < 8 bug: [].unshift(0) === undefined but should be "1"
 
var hasUnshiftReturnValueBug = [].unshift(0) !== 1;
 
defineProperties(ArrayPrototype, {
 
    unshift: function () {
 
        array_unshift.apply(this, arguments);
 
        return this.length;
 
    }
 
}, hasUnshiftReturnValueBug);
 

	
 
// ES5 15.4.3.2
 
// http://es5.github.com/#x15.4.3.2
 
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray
 
defineProperties(Array, { isArray: isArray });
 

	
 
// The IsCallable() check in the Array functions
 
// has been replaced with a strict check on the
 
// internal class of the object to trap cases where
 
// the provided function was actually a regular
 
// expression literal, which in V8 and
 
// JavaScriptCore is a typeof "function".  Only in
 
// V8 are regular expression literals permitted as
 
// reduce parameters, so it is desirable in the
 
// general case for the shim to match the more
 
// strict and common behavior of rejecting regular
 
// expressions.
 

	
 
// ES5 15.4.4.18
 
// http://es5.github.com/#x15.4.4.18
 
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach
 

	
 
// Check failure of by-index access of string characters (IE < 9)
 
// and failure of `0 in boxedString` (Rhino)
 
var boxedString = Object('a');
 
var splitString = boxedString[0] !== 'a' || !(0 in boxedString);
 

	
 
var properlyBoxesContext = function properlyBoxed(method) {
 
    // Check node 0.6.21 bug where third parameter is not boxed
 
    var properlyBoxesNonStrict = true;
 
    var properlyBoxesStrict = true;
 
    if (method) {
 
        method.call('foo', function (_, __, context) {
 
            if (typeof context !== 'object') { properlyBoxesNonStrict = false; }
 
        });
 

	
 
        method.call([1], function () {
 
            'use strict';
 

	
 
            properlyBoxesStrict = typeof this === 'string';
 
        }, 'x');
 
    }
 
    return !!method && properlyBoxesNonStrict && properlyBoxesStrict;
 
};
 

	
 
defineProperties(ArrayPrototype, {
 
    forEach: function forEach(callbackfn /*, thisArg*/) {
 
        var object = ES.ToObject(this);
 
        var self = splitString && isString(this) ? this.split('') : object;
 
        var i = -1;
 
        var length = self.length >>> 0;
 
        var T;
 
        if (arguments.length > 1) {
 
          T = arguments[1];
 
        }
 

	
 
        // If no callback function or if callback is not a callable function
 
        if (!isCallable(callbackfn)) {
 
            throw new TypeError('Array.prototype.forEach callback must be a function');
 
        }
 

	
 
        while (++i < length) {
 
            if (i in self) {
 
                // Invoke the callback function with call, passing arguments:
 
                // context, property value, property key, thisArg object
 
                if (typeof T !== 'undefined') {
 
                    callbackfn.call(T, self[i], i, object);
 
                } else {
 
                    callbackfn(self[i], i, object);
 
                }
 
            }
 
        }
 
    }
 
}, !properlyBoxesContext(ArrayPrototype.forEach));
 

	
 
// ES5 15.4.4.19
 
// http://es5.github.com/#x15.4.4.19
 
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map
 
defineProperties(ArrayPrototype, {
 
    map: function map(callbackfn/*, thisArg*/) {
 
        var object = ES.ToObject(this);
 
        var self = splitString && isString(this) ? this.split('') : object;
 
        var length = self.length >>> 0;
 
        var result = Array(length);
 
        var T;
 
        if (arguments.length > 1) {
 
            T = arguments[1];
 
        }
 

	
 
        // If no callback function or if callback is not a callable function
 
        if (!isCallable(callbackfn)) {
 
            throw new TypeError('Array.prototype.map callback must be a function');
 
        }
 

	
 
        for (var i = 0; i < length; i++) {
 
            if (i in self) {
 
                if (typeof T !== 'undefined') {
 
                    result[i] = callbackfn.call(T, self[i], i, object);
 
                } else {
 
                    result[i] = callbackfn(self[i], i, object);
 
                }
 
            }
 
        }
 
        return result;
 
    }
 
}, !properlyBoxesContext(ArrayPrototype.map));
 

	
 
// ES5 15.4.4.20
 
// http://es5.github.com/#x15.4.4.20
 
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter
 
defineProperties(ArrayPrototype, {
 
    filter: function filter(callbackfn /*, thisArg*/) {
 
        var object = ES.ToObject(this);
 
        var self = splitString && isString(this) ? this.split('') : object;
 
        var length = self.length >>> 0;
 
        var result = [];
 
        var value;
 
        var T;
 
        if (arguments.length > 1) {
 
            T = arguments[1];
 
        }
 

	
 
        // If no callback function or if callback is not a callable function
 
        if (!isCallable(callbackfn)) {
 
            throw new TypeError('Array.prototype.filter callback must be a function');
 
        }
 

	
 
        for (var i = 0; i < length; i++) {
 
            if (i in self) {
 
                value = self[i];
 
                if (typeof T === 'undefined' ? callbackfn(value, i, object) : callbackfn.call(T, value, i, object)) {
 
                    result.push(value);
 
                }
 
            }
 
        }
 
        return result;
 
    }
 
}, !properlyBoxesContext(ArrayPrototype.filter));
 

	
 
// ES5 15.4.4.16
 
// http://es5.github.com/#x15.4.4.16
 
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every
 
defineProperties(ArrayPrototype, {
 
    every: function every(callbackfn /*, thisArg*/) {
 
        var object = ES.ToObject(this);
 
        var self = splitString && isString(this) ? this.split('') : object;
 
        var length = self.length >>> 0;
 
        var T;
 
        if (arguments.length > 1) {
 
            T = arguments[1];
 
        }
 

	
 
        // If no callback function or if callback is not a callable function
 
        if (!isCallable(callbackfn)) {
 
            throw new TypeError('Array.prototype.every callback must be a function');
 
        }
 

	
 
        for (var i = 0; i < length; i++) {
 
            if (i in self && !(typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {
 
                return false;
 
            }
 
        }
 
        return true;
 
    }
 
}, !properlyBoxesContext(ArrayPrototype.every));
 

	
 
// ES5 15.4.4.17
 
// http://es5.github.com/#x15.4.4.17
 
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some
 
defineProperties(ArrayPrototype, {
 
    some: function some(callbackfn/*, thisArg */) {
 
        var object = ES.ToObject(this);
 
        var self = splitString && isString(this) ? this.split('') : object;
 
        var length = self.length >>> 0;
 
        var T;
 
        if (arguments.length > 1) {
 
            T = arguments[1];
 
        }
 

	
 
        // If no callback function or if callback is not a callable function
 
        if (!isCallable(callbackfn)) {
 
            throw new TypeError('Array.prototype.some callback must be a function');
 
        }
 

	
 
        for (var i = 0; i < length; i++) {
 
            if (i in self && (typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {
 
                return true;
 
            }
 
        }
 
        return false;
 
    }
 
}, !properlyBoxesContext(ArrayPrototype.some));
 

	
 
// ES5 15.4.4.21
 
// http://es5.github.com/#x15.4.4.21
 
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce
 
var reduceCoercesToObject = false;
 
if (ArrayPrototype.reduce) {
 
    reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_, __, ___, list) { return list; }) === 'object';
 
}
 
defineProperties(ArrayPrototype, {
 
    reduce: function reduce(callbackfn /*, initialValue*/) {
 
        var object = ES.ToObject(this);
 
        var self = splitString && isString(this) ? this.split('') : object;
 
        var length = self.length >>> 0;
 

	
 
        // If no callback function or if callback is not a callable function
 
        if (!isCallable(callbackfn)) {
 
            throw new TypeError('Array.prototype.reduce callback must be a function');
 
        }
 

	
 
        // no value to return if no initial value and an empty array
 
        if (length === 0 && arguments.length === 1) {
 
            throw new TypeError('reduce of empty array with no initial value');
 
        }
 

	
 
        var i = 0;
 
        var result;
 
        if (arguments.length >= 2) {
 
            result = arguments[1];
 
        } else {
 
            do {
 
                if (i in self) {
 
                    result = self[i++];
 
                    break;
 
                }
 

	
 
                // if array contains no values, no initial value to return
 
                if (++i >= length) {
 
                    throw new TypeError('reduce of empty array with no initial value');
 
                }
 
            } while (true);
 
        }
 

	
 
        for (; i < length; i++) {
 
            if (i in self) {
 
                result = callbackfn(result, self[i], i, object);
 
            }
 
        }
 

	
 
        return result;
 
    }
 
}, !reduceCoercesToObject);
 

	
 
// ES5 15.4.4.22
 
// http://es5.github.com/#x15.4.4.22
 
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight
 
var reduceRightCoercesToObject = false;
 
if (ArrayPrototype.reduceRight) {
 
    reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5', function (_, __, ___, list) { return list; }) === 'object';
 
}
 
defineProperties(ArrayPrototype, {
 
    reduceRight: function reduceRight(callbackfn/*, initial*/) {
 
        var object = ES.ToObject(this);
 
        var self = splitString && isString(this) ? this.split('') : object;
 
        var length = self.length >>> 0;
 

	
 
        // If no callback function or if callback is not a callable function
 
        if (!isCallable(callbackfn)) {
 
            throw new TypeError('Array.prototype.reduceRight callback must be a function');
 
        }
 

	
 
        // no value to return if no initial value, empty array
 
        if (length === 0 && arguments.length === 1) {
 
            throw new TypeError('reduceRight of empty array with no initial value');
 
        }
 

	
 
        var result;
 
        var i = length - 1;
 
        if (arguments.length >= 2) {
 
            result = arguments[1];
 
        } else {
 
            do {
 
                if (i in self) {
 
                    result = self[i--];
 
                    break;
 
                }
 

	
 
                // if array contains no values, no initial value to return
 
                if (--i < 0) {
 
                    throw new TypeError('reduceRight of empty array with no initial value');
 
                }
 
            } while (true);
 
        }
 

	
 
        if (i < 0) {
 
            return result;
 
        }
 

	
 
        do {
 
            if (i in self) {
 
                result = callbackfn(result, self[i], i, object);
 
            }
 
        } while (i--);
 

	
 
        return result;
 
    }
 
}, !reduceRightCoercesToObject);
 

	
 
// ES5 15.4.4.14
 
// http://es5.github.com/#x15.4.4.14
 
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf
 
var hasFirefox2IndexOfBug = Array.prototype.indexOf && [0, 1].indexOf(1, 2) !== -1;
 
defineProperties(ArrayPrototype, {
 
    indexOf: function indexOf(searchElement /*, fromIndex */) {
 
        var self = splitString && isString(this) ? this.split('') : ES.ToObject(this);
 
        var length = self.length >>> 0;
 

	
 
        if (length === 0) {
 
            return -1;
 
        }
 

	
 
        var i = 0;
 
        if (arguments.length > 1) {
 
            i = ES.ToInteger(arguments[1]);
 
        }
 

	
 
        // handle negative indices
 
        i = i >= 0 ? i : Math.max(0, length + i);
 
        for (; i < length; i++) {
 
            if (i in self && self[i] === searchElement) {
 
                return i;
 
            }
 
        }
 
        return -1;
 
    }
 
}, hasFirefox2IndexOfBug);
 

	
 
// ES5 15.4.4.15
 
// http://es5.github.com/#x15.4.4.15
 
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf
 
var hasFirefox2LastIndexOfBug = Array.prototype.lastIndexOf && [0, 1].lastIndexOf(0, -3) !== -1;
 
defineProperties(ArrayPrototype, {
 
    lastIndexOf: function lastIndexOf(searchElement /*, fromIndex */) {
 
        var self = splitString && isString(this) ? this.split('') : ES.ToObject(this);
 
        var length = self.length >>> 0;
 

	
 
        if (length === 0) {
 
            return -1;
 
        }
 
        var i = length - 1;
 
        if (arguments.length > 1) {
 
            i = Math.min(i, ES.ToInteger(arguments[1]));
 
        }
 
        // handle negative indices
 
        i = i >= 0 ? i : length - Math.abs(i);
 
        for (; i >= 0; i--) {
 
            if (i in self && searchElement === self[i]) {
 
                return i;
 
            }
 
        }
 
        return -1;
 
    }
 
}, hasFirefox2LastIndexOfBug);
 

	
 
//
 
// Object
 
// ======
 
//
 

	
 
// ES5 15.2.3.14
 
// http://es5.github.com/#x15.2.3.14
 

	
 
// http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation
 
var hasDontEnumBug = !({'toString': null}).propertyIsEnumerable('toString'),
 
    hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype'),
 
    hasStringEnumBug = !owns('x', '0'),
 
    dontEnums = [
 
        'toString',
 
        'toLocaleString',
 
        'valueOf',
 
        'hasOwnProperty',
 
        'isPrototypeOf',
 
        'propertyIsEnumerable',
 
        'constructor'
 
    ],
 
    dontEnumsLength = dontEnums.length;
 

	
 
defineProperties(Object, {
 
    keys: function keys(object) {
 
        var isFn = isCallable(object),
 
            isArgs = isArguments(object),
 
            isObject = object !== null && typeof object === 'object',
 
            isStr = isObject && isString(object);
 

	
 
        if (!isObject && !isFn && !isArgs) {
 
            throw new TypeError('Object.keys called on a non-object');
 
        }
 

	
 
        var theKeys = [];
 
        var skipProto = hasProtoEnumBug && isFn;
 
        if ((isStr && hasStringEnumBug) || isArgs) {
 
            for (var i = 0; i < object.length; ++i) {
 
                theKeys.push(String(i));
 
            }
 
        }
 

	
 
        if (!isArgs) {
 
            for (var name in object) {
 
                if (!(skipProto && name === 'prototype') && owns(object, name)) {
 
                    theKeys.push(String(name));
 
                }
 
            }
 
        }
 

	
 
        if (hasDontEnumBug) {
 
            var ctor = object.constructor,
 
                skipConstructor = ctor && ctor.prototype === object;
 
            for (var j = 0; j < dontEnumsLength; j++) {
 
                var dontEnum = dontEnums[j];
 
                if (!(skipConstructor && dontEnum === 'constructor') && owns(object, dontEnum)) {
 
                    theKeys.push(dontEnum);
 
                }
 
            }
 
        }
 
        return theKeys;
 
    }
 
});
 

	
 
var keysWorksWithArguments = Object.keys && (function () {
 
    // Safari 5.0 bug
 
    return Object.keys(arguments).length === 2;
 
}(1, 2));
 
var originalKeys = Object.keys;
 
defineProperties(Object, {
 
    keys: function keys(object) {
 
        if (isArguments(object)) {
 
            return originalKeys(ArrayPrototype.slice.call(object));
 
        } else {
 
            return originalKeys(object);
 
        }
 
    }
 
}, !keysWorksWithArguments);
 

	
 
//
 
// Date
 
// ====
 
//
 

	
 
// ES5 15.9.5.43
 
// http://es5.github.com/#x15.9.5.43
 
// This function returns a String value represent the instance in time
 
// represented by this Date object. The format of the String is the Date Time
 
// string format defined in 15.9.1.15. All fields are present in the String.
 
// The time zone is always UTC, denoted by the suffix Z. If the time value of
 
// this object is not a finite Number a RangeError exception is thrown.
 
var negativeDate = -62198755200000;
 
var negativeYearString = '-000001';
 
var hasNegativeDateBug = Date.prototype.toISOString && new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1;
 

	
 
defineProperties(Date.prototype, {
 
    toISOString: function toISOString() {
 
        var result, length, value, year, month;
 
        if (!isFinite(this)) {
 
            throw new RangeError('Date.prototype.toISOString called on non-finite value.');
 
        }
 

	
 
        year = this.getUTCFullYear();
 

	
 
        month = this.getUTCMonth();
 
        // see https://github.com/es-shims/es5-shim/issues/111
 
        year += Math.floor(month / 12);
 
        month = (month % 12 + 12) % 12;
 

	
 
        // the date time string format is specified in 15.9.1.15.
 
        result = [month + 1, this.getUTCDate(), this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()];
 
        year = (
 
            (year < 0 ? '-' : (year > 9999 ? '+' : '')) +
 
            ('00000' + Math.abs(year)).slice((0 <= year && year <= 9999) ? -4 : -6)
 
        );
 

	
 
        length = result.length;
 
        while (length--) {
 
            value = result[length];
 
            // pad months, days, hours, minutes, and seconds to have two
 
            // digits.
 
            if (value < 10) {
 
                result[length] = '0' + value;
 
            }
 
        }
 
        // pad milliseconds to have three digits.
 
        return (
 
            year + '-' + result.slice(0, 2).join('-') +
 
            'T' + result.slice(2).join(':') + '.' +
 
            ('000' + this.getUTCMilliseconds()).slice(-3) + 'Z'
 
        );
 
    }
 
}, hasNegativeDateBug);
 

	
 
// ES5 15.9.5.44
 
// http://es5.github.com/#x15.9.5.44
 
// This function provides a String representation of a Date object for use by
 
// JSON.stringify (15.12.3).
 
var dateToJSONIsSupported = (function () {
 
    try {
 
        return Date.prototype.toJSON &&
 
            new Date(NaN).toJSON() === null &&
 
            new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1 &&
 
            Date.prototype.toJSON.call({ // generic
 
                toISOString: function () { return true; }
 
            });
 
    } catch (e) {
 
        return false;
 
    }
 
}());
 
if (!dateToJSONIsSupported) {
 
    Date.prototype.toJSON = function toJSON(key) {
 
        // When the toJSON method is called with argument key, the following
 
        // steps are taken:
 

	
 
        // 1.  Let O be the result of calling ToObject, giving it the this
 
        // value as its argument.
 
        // 2. Let tv be ES.ToPrimitive(O, hint Number).
 
        var O = Object(this);
 
        var tv = ES.ToPrimitive(O);
 
        // 3. If tv is a Number and is not finite, return null.
 
        if (typeof tv === 'number' && !isFinite(tv)) {
 
            return null;
 
        }
 
        // 4. Let toISO be the result of calling the [[Get]] internal method of
 
        // O with argument "toISOString".
 
        var toISO = O.toISOString;
 
        // 5. If IsCallable(toISO) is false, throw a TypeError exception.
 
        if (!isCallable(toISO)) {
 
            throw new TypeError('toISOString property is not callable');
 
        }
 
        // 6. Return the result of calling the [[Call]] internal method of
 
        //  toISO with O as the this value and an empty argument list.
 
        return toISO.call(O);
 

	
 
        // NOTE 1 The argument is ignored.
 

	
 
        // NOTE 2 The toJSON function is intentionally generic; it does not
 
        // require that its this value be a Date object. Therefore, it can be
 
        // transferred to other kinds of objects for use as a method. However,
 
        // it does require that any such object have a toISOString method. An
 
        // object is free to use the argument key to filter its
 
        // stringification.
 
    };
 
}
 

	
 
// ES5 15.9.4.2
 
// http://es5.github.com/#x15.9.4.2
 
// based on work shared by Daniel Friesen (dantman)
 
// http://gist.github.com/303249
 
var supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15;
 
var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) || !isNaN(Date.parse('2012-11-31T23:59:59.000Z'));
 
var doesNotParseY2KNewYear = isNaN(Date.parse('2000-01-01T00:00:00.000Z'));
 
if (!Date.parse || doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExtendedYears) {
 
    // XXX global assignment won't work in embeddings that use
 
    // an alternate object for the context.
 
    /*global Date: true */
 
    /*eslint-disable no-undef*/
 
    Date = (function (NativeDate) {
 
    /*eslint-enable no-undef*/
 
        // Date.length === 7
 
        var DateShim = function Date(Y, M, D, h, m, s, ms) {
 
            var length = arguments.length;
 
            var date;
 
            if (this instanceof NativeDate) {
 
                date = length === 1 && String(Y) === Y ? // isString(Y)
 
                    // We explicitly pass it through parse:
 
                    new NativeDate(DateShim.parse(Y)) :
 
                    // We have to manually make calls depending on argument
 
                    // length here
 
                    length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) :
 
                    length >= 6 ? new NativeDate(Y, M, D, h, m, s) :
 
                    length >= 5 ? new NativeDate(Y, M, D, h, m) :
 
                    length >= 4 ? new NativeDate(Y, M, D, h) :
 
                    length >= 3 ? new NativeDate(Y, M, D) :
 
                    length >= 2 ? new NativeDate(Y, M) :
 
                    length >= 1 ? new NativeDate(Y) :
 
                                  new NativeDate();
 
            } else {
 
                date = NativeDate.apply(this, arguments);
 
            }
 
            // Prevent mixups with unfixed Date object
 
            defineProperties(date, { constructor: DateShim }, true);
 
            return date;
 
        };
 

	
 
        // 15.9.1.15 Date Time String Format.
 
        var isoDateExpression = new RegExp('^' +
 
            '(\\d{4}|[+-]\\d{6})' + // four-digit year capture or sign +
 
                                      // 6-digit extended year
 
            '(?:-(\\d{2})' + // optional month capture
 
            '(?:-(\\d{2})' + // optional day capture
 
            '(?:' + // capture hours:minutes:seconds.milliseconds
 
                'T(\\d{2})' + // hours capture
 
                ':(\\d{2})' + // minutes capture
 
                '(?:' + // optional :seconds.milliseconds
 
                    ':(\\d{2})' + // seconds capture
 
                    '(?:(\\.\\d{1,}))?' + // milliseconds capture
 
                ')?' +
 
            '(' + // capture UTC offset component
 
                'Z|' + // UTC capture
 
                '(?:' + // offset specifier +/-hours:minutes
 
                    '([-+])' + // sign capture
 
                    '(\\d{2})' + // hours offset capture
 
                    ':(\\d{2})' + // minutes offset capture
 
                ')' +
 
            ')?)?)?)?' +
 
        '$');
 

	
 
        var months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365];
 

	
 
        var dayFromMonth = function dayFromMonth(year, month) {
 
            var t = month > 1 ? 1 : 0;
 
            return (
 
                months[month] +
 
                Math.floor((year - 1969 + t) / 4) -
 
                Math.floor((year - 1901 + t) / 100) +
 
                Math.floor((year - 1601 + t) / 400) +
 
                365 * (year - 1970)
 
            );
 
        };
 

	
 
        var toUTC = function toUTC(t) {
 
            return Number(new NativeDate(1970, 0, 1, 0, 0, 0, t));
 
        };
 

	
 
        // Copy any custom methods a 3rd party library may have added
 
        for (var key in NativeDate) {
 
            if (owns(NativeDate, key)) {
 
                DateShim[key] = NativeDate[key];
 
            }
 
        }
 

	
 
        // Copy "native" methods explicitly; they may be non-enumerable
 
        defineProperties(DateShim, {
 
            now: NativeDate.now,
 
            UTC: NativeDate.UTC
 
        }, true);
 
        DateShim.prototype = NativeDate.prototype;
 
        defineProperties(DateShim.prototype, {
 
            constructor: DateShim
 
        }, true);
 

	
 
        // Upgrade Date.parse to handle simplified ISO 8601 strings
 
        DateShim.parse = function parse(string) {
 
            var match = isoDateExpression.exec(string);
 
            if (match) {
 
                // parse months, days, hours, minutes, seconds, and milliseconds
 
                // provide default values if necessary
 
                // parse the UTC offset component
 
                var year = Number(match[1]),
 
                    month = Number(match[2] || 1) - 1,
 
                    day = Number(match[3] || 1) - 1,
 
                    hour = Number(match[4] || 0),
 
                    minute = Number(match[5] || 0),
 
                    second = Number(match[6] || 0),
 
                    millisecond = Math.floor(Number(match[7] || 0) * 1000),
 
                    // When time zone is missed, local offset should be used
 
                    // (ES 5.1 bug)
 
                    // see https://bugs.ecmascript.org/show_bug.cgi?id=112
 
                    isLocalTime = Boolean(match[4] && !match[8]),
 
                    signOffset = match[9] === '-' ? 1 : -1,
 
                    hourOffset = Number(match[10] || 0),
 
                    minuteOffset = Number(match[11] || 0),
 
                    result;
 
                if (
 
                    hour < (
 
                        minute > 0 || second > 0 || millisecond > 0 ?
 
                        24 : 25
 
                    ) &&
 
                    minute < 60 && second < 60 && millisecond < 1000 &&
 
                    month > -1 && month < 12 && hourOffset < 24 &&
 
                    minuteOffset < 60 && // detect invalid offsets
 
                    day > -1 &&
 
                    day < (
 
                        dayFromMonth(year, month + 1) -
 
                        dayFromMonth(year, month)
 
                    )
 
                ) {
 
                    result = (
 
                        (dayFromMonth(year, month) + day) * 24 +
 
                        hour +
 
                        hourOffset * signOffset
 
                    ) * 60;
 
                    result = (
 
                        (result + minute + minuteOffset * signOffset) * 60 +
 
                        second
 
                    ) * 1000 + millisecond;
 
                    if (isLocalTime) {
 
                        result = toUTC(result);
 
                    }
 
                    if (-8.64e15 <= result && result <= 8.64e15) {
 
                        return result;
 
                    }
 
                }
 
                return NaN;
 
            }
 
            return NativeDate.parse.apply(this, arguments);
 
        };
 

	
 
        return DateShim;
 
    }(Date));
 
    /*global Date: false */
 
}
 

	
 
// ES5 15.9.4.4
 
// http://es5.github.com/#x15.9.4.4
 
if (!Date.now) {
 
    Date.now = function now() {
 
        return new Date().getTime();
 
    };
 
}
 

	
 
//
 
// Number
 
// ======
 
//
 

	
 
// ES5.1 15.7.4.5
 
// http://es5.github.com/#x15.7.4.5
 
var hasToFixedBugs = NumberPrototype.toFixed && (
 
  (0.00008).toFixed(3) !== '0.000' ||
 
  (0.9).toFixed(0) !== '1' ||
 
  (1.255).toFixed(2) !== '1.25' ||
 
  (1000000000000000128).toFixed(0) !== '1000000000000000128'
 
);
 

	
 
var toFixedHelpers = {
 
  base: 1e7,
 
  size: 6,
 
  data: [0, 0, 0, 0, 0, 0],
 
  multiply: function multiply(n, c) {
 
      var i = -1;
 
      var c2 = c;
 
      while (++i < toFixedHelpers.size) {
 
          c2 += n * toFixedHelpers.data[i];
 
          toFixedHelpers.data[i] = c2 % toFixedHelpers.base;
 
          c2 = Math.floor(c2 / toFixedHelpers.base);
 
      }
 
  },
 
  divide: function divide(n) {
 
      var i = toFixedHelpers.size, c = 0;
 
      while (--i >= 0) {
 
          c += toFixedHelpers.data[i];
 
          toFixedHelpers.data[i] = Math.floor(c / n);
 
          c = (c % n) * toFixedHelpers.base;
 
      }
 
  },
 
  numToString: function numToString() {
 
      var i = toFixedHelpers.size;
 
      var s = '';
 
      while (--i >= 0) {
 
          if (s !== '' || i === 0 || toFixedHelpers.data[i] !== 0) {
 
              var t = String(toFixedHelpers.data[i]);
 
              if (s === '') {
 
                  s = t;
 
              } else {
 
                  s += '0000000'.slice(0, 7 - t.length) + t;
 
              }
 
          }
 
      }
 
      return s;
 
  },
 
  pow: function pow(x, n, acc) {
 
      return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc)));
 
  },
 
  log: function log(x) {
 
      var n = 0;
 
      var x2 = x;
 
      while (x2 >= 4096) {
 
          n += 12;
 
          x2 /= 4096;
 
      }
 
      while (x2 >= 2) {
 
          n += 1;
 
          x2 /= 2;
 
      }
 
      return n;
 
  }
 
};
 

	
 
defineProperties(NumberPrototype, {
 
    toFixed: function toFixed(fractionDigits) {
 
        var f, x, s, m, e, z, j, k;
 

	
 
        // Test for NaN and round fractionDigits down
 
        f = Number(fractionDigits);
 
        f = f !== f ? 0 : Math.floor(f);
 

	
 
        if (f < 0 || f > 20) {
 
            throw new RangeError('Number.toFixed called with invalid number of decimals');
 
        }
 

	
 
        x = Number(this);
 

	
 
        // Test for NaN
 
        if (x !== x) {
 
            return 'NaN';
 
        }
 

	
 
        // If it is too big or small, return the string value of the number
 
        if (x <= -1e21 || x >= 1e21) {
 
            return String(x);
 
        }
 

	
 
        s = '';
 

	
 
        if (x < 0) {
 
            s = '-';
 
            x = -x;
 
        }
 

	
 
        m = '0';
 

	
 
        if (x > 1e-21) {
 
            // 1e-21 < x < 1e21
 
            // -70 < log2(x) < 70
 
            e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69;
 
            z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2, e, 1));
 
            z *= 0x10000000000000; // Math.pow(2, 52);
 
            e = 52 - e;
 

	
 
            // -18 < e < 122
 
            // x = z / 2 ^ e
 
            if (e > 0) {
 
                toFixedHelpers.multiply(0, z);
 
                j = f;
 

	
 
                while (j >= 7) {
 
                    toFixedHelpers.multiply(1e7, 0);
 
                    j -= 7;
 
                }
 

	
 
                toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0);
 
                j = e - 1;
 

	
 
                while (j >= 23) {
 
                    toFixedHelpers.divide(1 << 23);
 
                    j -= 23;
 
                }
 

	
 
                toFixedHelpers.divide(1 << j);
 
                toFixedHelpers.multiply(1, 1);
 
                toFixedHelpers.divide(2);
 
                m = toFixedHelpers.numToString();
 
            } else {
 
                toFixedHelpers.multiply(0, z);
 
                toFixedHelpers.multiply(1 << (-e), 0);
 
                m = toFixedHelpers.numToString() + '0.00000000000000000000'.slice(2, 2 + f);
 
            }
 
        }
 

	
 
        if (f > 0) {
 
            k = m.length;
 

	
 
            if (k <= f) {
 
                m = s + '0.0000000000000000000'.slice(0, f - k + 2) + m;
 
            } else {
 
                m = s + m.slice(0, k - f) + '.' + m.slice(k - f);
 
            }
 
        } else {
 
            m = s + m;
 
        }
 

	
 
        return m;
 
    }
 
}, hasToFixedBugs);
 

	
 
//
 
// String
 
// ======
 
//
 

	
 
// ES5 15.5.4.14
 
// http://es5.github.com/#x15.5.4.14
 

	
 
// [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers]
 
// Many browsers do not split properly with regular expressions or they
 
// do not perform the split correctly under obscure conditions.
 
// See http://blog.stevenlevithan.com/archives/cross-browser-split
 
// I've tested in many browsers and this seems to cover the deviant ones:
 
//    'ab'.split(/(?:ab)*/) should be ["", ""], not [""]
 
//    '.'.split(/(.?)(.?)/) should be ["", ".", "", ""], not ["", ""]
 
//    'tesst'.split(/(s)*/) should be ["t", undefined, "e", "s", "t"], not
 
//       [undefined, "t", undefined, "e", ...]
 
//    ''.split(/.?/) should be [], not [""]
 
//    '.'.split(/()()/) should be ["."], not ["", "", "."]
 

	
 
var string_split = StringPrototype.split;
 
if (
 
    'ab'.split(/(?:ab)*/).length !== 2 ||
 
    '.'.split(/(.?)(.?)/).length !== 4 ||
 
    'tesst'.split(/(s)*/)[1] === 't' ||
 
    'test'.split(/(?:)/, -1).length !== 4 ||
 
    ''.split(/.?/).length ||
 
    '.'.split(/()()/).length > 1
 
) {
 
    (function () {
 
        var compliantExecNpcg = typeof (/()??/).exec('')[1] === 'undefined'; // NPCG: nonparticipating capturing group
 

	
 
        StringPrototype.split = function (separator, limit) {
 
            var string = this;
 
            if (typeof separator === 'undefined' && limit === 0) {
 
                return [];
 
            }
 

	
 
            // If `separator` is not a regex, use native split
 
            if (!isRegex(separator)) {
 
                return string_split.call(this, separator, limit);
 
            }
 

	
 
            var output = [];
 
            var flags = (separator.ignoreCase ? 'i' : '') +
 
                        (separator.multiline ? 'm' : '') +
 
                        (separator.extended ? 'x' : '') + // Proposed for ES6
 
                        (separator.sticky ? 'y' : ''), // Firefox 3+
 
                lastLastIndex = 0,
 
                // Make `global` and avoid `lastIndex` issues by working with a copy
 
                separator2, match, lastIndex, lastLength;
 
            var separatorCopy = new RegExp(separator.source, flags + 'g');
 
            string += ''; // Type-convert
 
            if (!compliantExecNpcg) {
 
                // Doesn't need flags gy, but they don't hurt
 
                separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags);
 
            }
 
            /* Values for `limit`, per the spec:
 
             * If undefined: 4294967295 // Math.pow(2, 32) - 1
 
             * If 0, Infinity, or NaN: 0
 
             * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;
 
             * If negative number: 4294967296 - Math.floor(Math.abs(limit))
 
             * If other: Type-convert, then use the above rules
 
             */
 
            var splitLimit = typeof limit === 'undefined' ?
 
                -1 >>> 0 : // Math.pow(2, 32) - 1
 
                ES.ToUint32(limit);
 
            match = separatorCopy.exec(string);
 
            while (match) {
 
                // `separatorCopy.lastIndex` is not reliable cross-browser
 
                lastIndex = match.index + match[0].length;
 
                if (lastIndex > lastLastIndex) {
 
                    output.push(string.slice(lastLastIndex, match.index));
 
                    // Fix browsers whose `exec` methods don't consistently return `undefined` for
 
                    // nonparticipating capturing groups
 
                    if (!compliantExecNpcg && match.length > 1) {
 
                        /*eslint-disable no-loop-func */
 
                        match[0].replace(separator2, function () {
 
                            for (var i = 1; i < arguments.length - 2; i++) {
 
                                if (typeof arguments[i] === 'undefined') {
 
                                    match[i] = void 0;
 
                                }
 
                            }
 
                        });
 
                        /*eslint-enable no-loop-func */
 
                    }
 
                    if (match.length > 1 && match.index < string.length) {
 
                        array_push.apply(output, match.slice(1));
 
                    }
 
                    lastLength = match[0].length;
 
                    lastLastIndex = lastIndex;
 
                    if (output.length >= splitLimit) {
 
                        break;
 
                    }
 
                }
 
                if (separatorCopy.lastIndex === match.index) {
 
                    separatorCopy.lastIndex++; // Avoid an infinite loop
 
                }
 
                match = separatorCopy.exec(string);
 
            }
 
            if (lastLastIndex === string.length) {
 
                if (lastLength || !separatorCopy.test('')) {
 
                    output.push('');
 
                }
 
            } else {
 
                output.push(string.slice(lastLastIndex));
 
            }
 
            return output.length > splitLimit ? output.slice(0, splitLimit) : output;
 
        };
 
    }());
 

	
 
// [bugfix, chrome]
 
// If separator is undefined, then the result array contains just one String,
 
// which is the this value (converted to a String). If limit is not undefined,
 
// then the output array is truncated so that it contains no more than limit
 
// elements.
 
// "0".split(undefined, 0) -> []
 
} else if ('0'.split(void 0, 0).length) {
 
    StringPrototype.split = function split(separator, limit) {
 
        if (typeof separator === 'undefined' && limit === 0) { return []; }
 
        return string_split.call(this, separator, limit);
 
    };
 
}
 

	
 
var str_replace = StringPrototype.replace;
 
var replaceReportsGroupsCorrectly = (function () {
 
    var groups = [];
 
    'x'.replace(/x(.)?/g, function (match, group) {
 
        groups.push(group);
 
    });
 
    return groups.length === 1 && typeof groups[0] === 'undefined';
 
}());
 

	
 
if (!replaceReportsGroupsCorrectly) {
 
    StringPrototype.replace = function replace(searchValue, replaceValue) {
 
        var isFn = isCallable(replaceValue);
 
        var hasCapturingGroups = isRegex(searchValue) && (/\)[*?]/).test(searchValue.source);
 
        if (!isFn || !hasCapturingGroups) {
 
            return str_replace.call(this, searchValue, replaceValue);
 
        } else {
 
            var wrappedReplaceValue = function (match) {
 
                var length = arguments.length;
 
                var originalLastIndex = searchValue.lastIndex;
 
                searchValue.lastIndex = 0;
 
                var args = searchValue.exec(match) || [];
 
                searchValue.lastIndex = originalLastIndex;
 
                args.push(arguments[length - 2], arguments[length - 1]);
 
                return replaceValue.apply(this, args);
 
            };
 
            return str_replace.call(this, searchValue, wrappedReplaceValue);
 
        }
 
    };
 
}
 

	
 
// ECMA-262, 3rd B.2.3
 
// Not an ECMAScript standard, although ECMAScript 3rd Edition has a
 
// non-normative section suggesting uniform semantics and it should be
 
// normalized across all browsers
 
// [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE
 
var string_substr = StringPrototype.substr;
 
var hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !== 'b';
 
defineProperties(StringPrototype, {
 
    substr: function substr(start, length) {
 
        var normalizedStart = start;
 
        if (start < 0) {
 
            normalizedStart = Math.max(this.length + start, 0);
 
        }
 
        return string_substr.call(this, normalizedStart, length);
 
    }
 
}, hasNegativeSubstrBug);
 

	
 
// ES5 15.5.4.20
 
// whitespace from: http://es5.github.io/#x15.5.4.20
 
var ws = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' +
 
    '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' +
 
    '\u2029\uFEFF';
 
var zeroWidth = '\u200b';
 
var wsRegexChars = '[' + ws + ']';
 
var trimBeginRegexp = new RegExp('^' + wsRegexChars + wsRegexChars + '*');
 
var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + '*$');
 
var hasTrimWhitespaceBug = StringPrototype.trim && (ws.trim() || !zeroWidth.trim());
 
defineProperties(StringPrototype, {
 
    // http://blog.stevenlevithan.com/archives/faster-trim-javascript
 
    // http://perfectionkills.com/whitespace-deviations/
 
    trim: function trim() {
 
        if (typeof this === 'undefined' || this === null) {
 
            throw new TypeError("can't convert " + this + ' to object');
 
        }
 
        return String(this).replace(trimBeginRegexp, '').replace(trimEndRegexp, '');
 
    }
 
}, hasTrimWhitespaceBug);
 

	
 
// ES-5 15.1.2.2
 
if (parseInt(ws + '08') !== 8 || parseInt(ws + '0x16') !== 22) {
 
    /*global parseInt: true */
 
    parseInt = (function (origParseInt) {
 
        var hexRegex = /^0[xX]/;
 
        return function parseInt(str, radix) {
 
            var string = String(str).trim();
 
            var defaultedRadix = Number(radix) || (hexRegex.test(string) ? 16 : 10);
 
            return origParseInt(string, defaultedRadix);
 
        };
 
    }(parseInt));
 
}
 

	
 
}));
 

	
 
/*!
 
 * https://github.com/es-shims/es5-shim
 
 * @license es5-shim Copyright 2009-2015 by contributors, MIT License
 
 * see https://github.com/es-shims/es5-shim/blob/master/LICENSE
 
 */
 

	
 
// vim: ts=4 sts=4 sw=4 expandtab
 

	
 
//Add semicolon to prevent IIFE from being passed as argument to concated code.
 
;
 

	
 
// UMD (Universal Module Definition)
 
// see https://github.com/umdjs/umd/blob/master/returnExports.js
 
(function (root, factory) {
 
    'use strict';
 

	
 
    /*global define, exports, module */
 
    if (typeof define === 'function' && define.amd) {
 
        // AMD. Register as an anonymous module.
 
        define(factory);
 
    } else if (typeof exports === 'object') {
 
        // Node. Does not work with strict CommonJS, but
 
        // only CommonJS-like enviroments that support module.exports,
 
        // like Node.
 
        module.exports = factory();
 
    } else {
 
        // Browser globals (root is window)
 
        root.returnExports = factory();
 
  }
 
}(this, function () {
 

	
 
var call = Function.prototype.call;
 
var prototypeOfObject = Object.prototype;
 
var owns = call.bind(prototypeOfObject.hasOwnProperty);
 

	
 
// If JS engine supports accessors creating shortcuts.
 
var defineGetter;
 
var defineSetter;
 
var lookupGetter;
 
var lookupSetter;
 
var supportsAccessors = owns(prototypeOfObject, '__defineGetter__');
 
if (supportsAccessors) {
 
    /*eslint-disable no-underscore-dangle */
 
    defineGetter = call.bind(prototypeOfObject.__defineGetter__);
 
    defineSetter = call.bind(prototypeOfObject.__defineSetter__);
 
    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);
 
    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);
 
    /*eslint-enable no-underscore-dangle */
 
}
 

	
 
// ES5 15.2.3.2
 
// http://es5.github.com/#x15.2.3.2
 
if (!Object.getPrototypeOf) {
 
    // https://github.com/es-shims/es5-shim/issues#issue/2
 
    // http://ejohn.org/blog/objectgetprototypeof/
 
    // recommended by fschaefer on github
 
    //
 
    // sure, and webreflection says ^_^
 
    // ... this will nerever possibly return null
 
    // ... Opera Mini breaks here with infinite loops
 
    Object.getPrototypeOf = function getPrototypeOf(object) {
 
        /*eslint-disable no-proto */
 
        var proto = object.__proto__;
 
        /*eslint-enable no-proto */
 
        if (proto || proto === null) {
 
            return proto;
 
        } else if (object.constructor) {
 
            return object.constructor.prototype;
 
        } else {
 
            return prototypeOfObject;
 
        }
 
    };
 
}
 

	
 
//ES5 15.2.3.3
 
//http://es5.github.com/#x15.2.3.3
 

	
 
var doesGetOwnPropertyDescriptorWork = function doesGetOwnPropertyDescriptorWork(object) {
 
    try {
 
        object.sentinel = 0;
 
        return Object.getOwnPropertyDescriptor(object, 'sentinel').value === 0;
 
    } catch (exception) {
 
        return false;
 
    }
 
};
 

	
 
//check whether getOwnPropertyDescriptor works if it's given. Otherwise,
 
//shim partially.
 
if (Object.defineProperty) {
 
    var getOwnPropertyDescriptorWorksOnObject = doesGetOwnPropertyDescriptorWork({});
 
    var getOwnPropertyDescriptorWorksOnDom = typeof document === 'undefined' ||
 
    doesGetOwnPropertyDescriptorWork(document.createElement('div'));
 
    if (!getOwnPropertyDescriptorWorksOnDom || !getOwnPropertyDescriptorWorksOnObject) {
 
        var getOwnPropertyDescriptorFallback = Object.getOwnPropertyDescriptor;
 
    }
 
}
 

	
 
if (!Object.getOwnPropertyDescriptor || getOwnPropertyDescriptorFallback) {
 
    var ERR_NON_OBJECT = 'Object.getOwnPropertyDescriptor called on a non-object: ';
 

	
 
    /*eslint-disable no-proto */
 
    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {
 
        if ((typeof object !== 'object' && typeof object !== 'function') || object === null) {
 
            throw new TypeError(ERR_NON_OBJECT + object);
 
        }
 

	
 
        // make a valiant attempt to use the real getOwnPropertyDescriptor
 
        // for I8's DOM elements.
 
        if (getOwnPropertyDescriptorFallback) {
 
            try {
 
                return getOwnPropertyDescriptorFallback.call(Object, object, property);
 
            } catch (exception) {
 
                // try the shim if the real one doesn't work
 
            }
 
        }
 

	
 
        var descriptor;
 

	
 
        // If object does not owns property return undefined immediately.
 
        if (!owns(object, property)) {
 
            return descriptor;
 
        }
 

	
 
        // If object has a property then it's for sure both `enumerable` and
 
        // `configurable`.
 
        descriptor = { enumerable: true, configurable: true };
 

	
 
        // If JS engine supports accessor properties then property may be a
 
        // getter or setter.
 
        if (supportsAccessors) {
 
            // Unfortunately `__lookupGetter__` will return a getter even
 
            // if object has own non getter property along with a same named
 
            // inherited getter. To avoid misbehavior we temporary remove
 
            // `__proto__` so that `__lookupGetter__` will return getter only
 
            // if it's owned by an object.
 
            var prototype = object.__proto__;
 
            var notPrototypeOfObject = object !== prototypeOfObject;
 
            // avoid recursion problem, breaking in Opera Mini when
 
            // Object.getOwnPropertyDescriptor(Object.prototype, 'toString')
 
            // or any other Object.prototype accessor
 
            if (notPrototypeOfObject) {
 
                object.__proto__ = prototypeOfObject;
 
            }
 

	
 
            var getter = lookupGetter(object, property);
 
            var setter = lookupSetter(object, property);
 

	
 
            if (notPrototypeOfObject) {
 
                // Once we have getter and setter we can put values back.
 
                object.__proto__ = prototype;
 
            }
 

	
 
            if (getter || setter) {
 
                if (getter) {
 
                    descriptor.get = getter;
 
                }
 
                if (setter) {
 
                    descriptor.set = setter;
 
                }
 
                // If it was accessor property we're done and return here
 
                // in order to avoid adding `value` to the descriptor.
 
                return descriptor;
 
            }
 
        }
 

	
 
        // If we got this far we know that object has an own property that is
 
        // not an accessor so we set it as a value and return descriptor.
 
        descriptor.value = object[property];
 
        descriptor.writable = true;
 
        return descriptor;
 
    };
 
    /*eslint-enable no-proto */
 
}
 

	
 
// ES5 15.2.3.4
 
// http://es5.github.com/#x15.2.3.4
 
if (!Object.getOwnPropertyNames) {
 
    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {
 
        return Object.keys(object);
 
    };
 
}
 

	
 
// ES5 15.2.3.5
 
// http://es5.github.com/#x15.2.3.5
 
if (!Object.create) {
 

	
 
    // Contributed by Brandon Benvie, October, 2012
 
    var createEmpty;
 
    var supportsProto = !({ __proto__: null } instanceof Object);
 
                        // the following produces false positives
 
                        // in Opera Mini => not a reliable check
 
                        // Object.prototype.__proto__ === null
 
    /*global document */
 
    if (supportsProto || typeof document === 'undefined') {
 
        createEmpty = function () {
 
            return { __proto__: null };
 
        };
 
    } else {
 
        // In old IE __proto__ can't be used to manually set `null`, nor does
 
        // any other method exist to make an object that inherits from nothing,
 
        // aside from Object.prototype itself. Instead, create a new global
 
        // object and *steal* its Object.prototype and strip it bare. This is
 
        // used as the prototype to create nullary objects.
 
        createEmpty = function () {
 
            var iframe = document.createElement('iframe');
 
            var parent = document.body || document.documentElement;
 
            iframe.style.display = 'none';
 
            parent.appendChild(iframe);
 
            /*eslint-disable no-script-url */
 
            iframe.src = 'javascript:';
 
            /*eslint-enable no-script-url */
 
            var empty = iframe.contentWindow.Object.prototype;
 
            parent.removeChild(iframe);
 
            iframe = null;
 
            delete empty.constructor;
 
            delete empty.hasOwnProperty;
 
            delete empty.propertyIsEnumerable;
 
            delete empty.isPrototypeOf;
 
            delete empty.toLocaleString;
 
            delete empty.toString;
 
            delete empty.valueOf;
 
            /*eslint-disable no-proto */
 
            empty.__proto__ = null;
 
            /*eslint-enable no-proto */
 

	
 
            var Empty = function Empty() {};
 
            Empty.prototype = empty;
 
            // short-circuit future calls
 
            createEmpty = function () {
 
                return new Empty();
 
            };
 
            return new Empty();
 
        };
 
    }
 

	
 
    Object.create = function create(prototype, properties) {
 

	
 
        var object;
 
        var Type = function Type() {}; // An empty constructor.
 

	
 
        if (prototype === null) {
 
            object = createEmpty();
 
        } else {
 
            if (typeof prototype !== 'object' && typeof prototype !== 'function') {
 
                // In the native implementation `parent` can be `null`
 
                // OR *any* `instanceof Object`  (Object|Function|Array|RegExp|etc)
 
                // Use `typeof` tho, b/c in old IE, DOM elements are not `instanceof Object`
 
                // like they are in modern browsers. Using `Object.create` on DOM elements
 
                // is...err...probably inappropriate, but the native version allows for it.
 
                throw new TypeError('Object prototype may only be an Object or null'); // same msg as Chrome
 
            }
 
            Type.prototype = prototype;
 
            object = new Type();
 
            // IE has no built-in implementation of `Object.getPrototypeOf`
 
            // neither `__proto__`, but this manually setting `__proto__` will
 
            // guarantee that `Object.getPrototypeOf` will work as expected with
 
            // objects created using `Object.create`
 
            /*eslint-disable no-proto */
 
            object.__proto__ = prototype;
 
            /*eslint-enable no-proto */
 
        }
 

	
 
        if (properties !== void 0) {
 
            Object.defineProperties(object, properties);
 
        }
 

	
 
        return object;
 
    };
 
}
 

	
 
// ES5 15.2.3.6
 
// http://es5.github.com/#x15.2.3.6
 

	
 
// Patch for WebKit and IE8 standard mode
 
// Designed by hax <hax.github.com>
 
// related issue: https://github.com/es-shims/es5-shim/issues#issue/5
 
// IE8 Reference:
 
//     http://msdn.microsoft.com/en-us/library/dd282900.aspx
 
//     http://msdn.microsoft.com/en-us/library/dd229916.aspx
 
// WebKit Bugs:
 
//     https://bugs.webkit.org/show_bug.cgi?id=36423
 

	
 
var doesDefinePropertyWork = function doesDefinePropertyWork(object) {
 
    try {
 
        Object.defineProperty(object, 'sentinel', {});
 
        return 'sentinel' in object;
 
    } catch (exception) {
 
        return false;
 
    }
 
};
 

	
 
// check whether defineProperty works if it's given. Otherwise,
 
// shim partially.
 
if (Object.defineProperty) {
 
    var definePropertyWorksOnObject = doesDefinePropertyWork({});
 
    var definePropertyWorksOnDom = typeof document === 'undefined' ||
 
        doesDefinePropertyWork(document.createElement('div'));
 
    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {
 
        var definePropertyFallback = Object.defineProperty,
 
            definePropertiesFallback = Object.defineProperties;
 
    }
 
}
 

	
 
if (!Object.defineProperty || definePropertyFallback) {
 
    var ERR_NON_OBJECT_DESCRIPTOR = 'Property description must be an object: ';
 
    var ERR_NON_OBJECT_TARGET = 'Object.defineProperty called on non-object: ';
 
    var ERR_ACCESSORS_NOT_SUPPORTED = 'getters & setters can not be defined on this javascript engine';
 

	
 
    Object.defineProperty = function defineProperty(object, property, descriptor) {
 
        if ((typeof object !== 'object' && typeof object !== 'function') || object === null) {
 
            throw new TypeError(ERR_NON_OBJECT_TARGET + object);
 
        }
 
        if ((typeof descriptor !== 'object' && typeof descriptor !== 'function') || descriptor === null) {
 
            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);
 
        }
 
        // make a valiant attempt to use the real defineProperty
 
        // for I8's DOM elements.
 
        if (definePropertyFallback) {
 
            try {
 
                return definePropertyFallback.call(Object, object, property, descriptor);
 
            } catch (exception) {
 
                // try the shim if the real one doesn't work
 
            }
 
        }
 

	
 
        // If it's a data property.
 
        if ('value' in descriptor) {
 
            // fail silently if 'writable', 'enumerable', or 'configurable'
 
            // are requested but not supported
 
            /*
 
            // alternate approach:
 
            if ( // can't implement these features; allow false but not true
 
                ('writable' in descriptor && !descriptor.writable) ||
 
                ('enumerable' in descriptor && !descriptor.enumerable) ||
 
                ('configurable' in descriptor && !descriptor.configurable)
 
            ))
 
                throw new RangeError(
 
                    'This implementation of Object.defineProperty does not support configurable, enumerable, or writable.'
 
                );
 
            */
 

	
 
            if (supportsAccessors && (lookupGetter(object, property) || lookupSetter(object, property))) {
 
                // As accessors are supported only on engines implementing
 
                // `__proto__` we can safely override `__proto__` while defining
 
                // a property to make sure that we don't hit an inherited
 
                // accessor.
 
                /*eslint-disable no-proto */
 
                var prototype = object.__proto__;
 
                object.__proto__ = prototypeOfObject;
 
                // Deleting a property anyway since getter / setter may be
 
                // defined on object itself.
 
                delete object[property];
 
                object[property] = descriptor.value;
 
                // Setting original `__proto__` back now.
 
                object.__proto__ = prototype;
 
                /*eslint-enable no-proto */
 
            } else {
 
                object[property] = descriptor.value;
 
            }
 
        } else {
 
            if (!supportsAccessors) {
 
                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
 
            }
 
            // If we got that far then getters and setters can be defined !!
 
            if ('get' in descriptor) {
 
                defineGetter(object, property, descriptor.get);
 
            }
 
            if ('set' in descriptor) {
 
                defineSetter(object, property, descriptor.set);
 
            }
 
        }
 
        return object;
 
    };
 
}
 

	
 
// ES5 15.2.3.7
 
// http://es5.github.com/#x15.2.3.7
 
if (!Object.defineProperties || definePropertiesFallback) {
 
    Object.defineProperties = function defineProperties(object, properties) {
 
        // make a valiant attempt to use the real defineProperties
 
        if (definePropertiesFallback) {
 
            try {
 
                return definePropertiesFallback.call(Object, object, properties);
 
            } catch (exception) {
 
                // try the shim if the real one doesn't work
 
            }
 
        }
 

	
 
        Object.keys(properties).forEach(function (property) {
 
            if (property !== '__proto__') {
 
                Object.defineProperty(object, property, properties[property]);
 
            }
 
        });
 
        return object;
 
    };
 
}
 

	
 
// ES5 15.2.3.8
 
// http://es5.github.com/#x15.2.3.8
 
if (!Object.seal) {
 
    Object.seal = function seal(object) {
 
        if (Object(object) !== object) {
 
            throw new TypeError('Object.seal can only be called on Objects.');
 
        }
 
        // this is misleading and breaks feature-detection, but
 
        // allows "securable" code to "gracefully" degrade to working
 
        // but insecure code.
 
        return object;
 
    };
 
}
 

	
 
// ES5 15.2.3.9
 
// http://es5.github.com/#x15.2.3.9
 
if (!Object.freeze) {
 
    Object.freeze = function freeze(object) {
 
        if (Object(object) !== object) {
 
            throw new TypeError('Object.freeze can only be called on Objects.');
 
        }
 
        // this is misleading and breaks feature-detection, but
 
        // allows "securable" code to "gracefully" degrade to working
 
        // but insecure code.
 
        return object;
 
    };
 
}
 

	
 
// detect a Rhino bug and patch it
 
try {
 
    Object.freeze(function () {});
 
} catch (exception) {
 
    Object.freeze = (function freeze(freezeObject) {
 
        return function freeze(object) {
 
            if (typeof object === 'function') {
 
                return object;
 
            } else {
 
                return freezeObject(object);
 
            }
 
        };
 
    }(Object.freeze));
 
}
 

	
 
// ES5 15.2.3.10
 
// http://es5.github.com/#x15.2.3.10
 
if (!Object.preventExtensions) {
 
    Object.preventExtensions = function preventExtensions(object) {
 
        if (Object(object) !== object) {
 
            throw new TypeError('Object.preventExtensions can only be called on Objects.');
 
        }
 
        // this is misleading and breaks feature-detection, but
 
        // allows "securable" code to "gracefully" degrade to working
 
        // but insecure code.
 
        return object;
 
    };
 
}
 

	
 
// ES5 15.2.3.11
 
// http://es5.github.com/#x15.2.3.11
 
if (!Object.isSealed) {
 
    Object.isSealed = function isSealed(object) {
 
        if (Object(object) !== object) {
 
            throw new TypeError('Object.isSealed can only be called on Objects.');
 
        }
 
        return false;
 
    };
 
}
 

	
 
// ES5 15.2.3.12
 
// http://es5.github.com/#x15.2.3.12
 
if (!Object.isFrozen) {
 
    Object.isFrozen = function isFrozen(object) {
 
        if (Object(object) !== object) {
 
            throw new TypeError('Object.isFrozen can only be called on Objects.');
 
        }
 
        return false;
 
    };
 
}
 

	
 
// ES5 15.2.3.13
 
// http://es5.github.com/#x15.2.3.13
 
if (!Object.isExtensible) {
 
    Object.isExtensible = function isExtensible(object) {
 
        // 1. If Type(O) is not Object throw a TypeError exception.
 
        if (Object(object) !== object) {
 
            throw new TypeError('Object.isExtensible can only be called on Objects.');
 
        }
 
        // 2. Return the Boolean value of the [[Extensible]] internal property of O.
 
        var name = '';
 
        while (owns(object, name)) {
 
            name += '?';
 
        }
 
        object[name] = true;
 
        var returnValue = owns(object, name);
 
        delete object[name];
 
        return returnValue;
 
    };
 
}
 

	
 
}));
ennstatus/static/js/video.js/dist/ie8/videojs-ie8.min.js
Show inline comments
 
new file 100644
 
!function(a,b){"undefined"==typeof a.HTMLVideoElement&&(b.createElement("video"),b.createElement("audio"),b.createElement("track")),function(a,b){"use strict";"function"==typeof define&&define.amd?define(b):"object"==typeof exports?module.exports=b():a.returnExports=b()}(this,function(){var a,b=Array.prototype,c=Object.prototype,d=Function.prototype,e=String.prototype,f=Number.prototype,g=b.slice,h=b.splice,i=b.push,j=b.unshift,k=b.concat,l=d.call,m=c.toString,n=Array.isArray||function(a){return"[object Array]"===m.call(a)},o="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag,p=Function.prototype.toString,q=function(a){try{return p.call(a),!0}catch(b){return!1}},r="[object Function]",s="[object GeneratorFunction]";a=function(a){if("function"!=typeof a)return!1;if(o)return q(a);var b=m.call(a);return b===r||b===s};var t,u=RegExp.prototype.exec,v=function(a){try{return u.call(a),!0}catch(b){return!1}},w="[object RegExp]";t=function(a){return"object"!=typeof a?!1:o?v(a):m.call(a)===w};var x,y=String.prototype.valueOf,z=function(a){try{return y.call(a),!0}catch(b){return!1}},A="[object String]";x=function(a){return"string"==typeof a?!0:"object"!=typeof a?!1:o?z(a):m.call(a)===A};var B=function(b){var c=m.call(b),d="[object Arguments]"===c;return d||(d=!n(b)&&null!==b&&"object"==typeof b&&"number"==typeof b.length&&b.length>=0&&a(b.callee)),d},C=function(a){var b,c=Object.defineProperty&&function(){try{var a={};Object.defineProperty(a,"x",{enumerable:!1,value:a});for(var b in a)return!1;return a.x===a}catch(c){return!1}}();return b=c?function(a,b,c,d){!d&&b in a||Object.defineProperty(a,b,{configurable:!0,enumerable:!1,writable:!0,value:c})}:function(a,b,c,d){!d&&b in a||(a[b]=c)},function(c,d,e){for(var f in d)a.call(d,f)&&b(c,f,d[f],e)}}(c.hasOwnProperty),D=function(a){var b=typeof a;return null===a||"object"!==b&&"function"!==b},E={ToInteger:function(a){var b=+a;return b!==b?b=0:0!==b&&b!==1/0&&b!==-(1/0)&&(b=(b>0||-1)*Math.floor(Math.abs(b))),b},ToPrimitive:function(b){var c,d,e;if(D(b))return b;if(d=b.valueOf,a(d)&&(c=d.call(b),D(c)))return c;if(e=b.toString,a(e)&&(c=e.call(b),D(c)))return c;throw new TypeError},ToObject:function(a){if(null==a)throw new TypeError("can't convert "+a+" to object");return Object(a)},ToUint32:function(a){return a>>>0}},F=function(){};C(d,{bind:function(b){var c=this;if(!a(c))throw new TypeError("Function.prototype.bind called on incompatible "+c);for(var d,e=g.call(arguments,1),f=function(){if(this instanceof d){var a=c.apply(this,k.call(e,g.call(arguments)));return Object(a)===a?a:this}return c.apply(b,k.call(e,g.call(arguments)))},h=Math.max(0,c.length-e.length),i=[],j=0;h>j;j++)i.push("$"+j);return d=Function("binder","return function ("+i.join(",")+"){ return binder.apply(this, arguments); }")(f),c.prototype&&(F.prototype=c.prototype,d.prototype=new F,F.prototype=null),d}});var G=l.bind(c.hasOwnProperty),H=function(){var a=[1,2],b=a.splice();return 2===a.length&&n(b)&&0===b.length}();C(b,{splice:function(a,b){return 0===arguments.length?[]:h.apply(this,arguments)}},!H);var I=function(){var a={};return b.splice.call(a,0,0,1),1===a.length}();C(b,{splice:function(a,b){if(0===arguments.length)return[];var c=arguments;return this.length=Math.max(E.ToInteger(this.length),0),arguments.length>0&&"number"!=typeof b&&(c=g.call(arguments),c.length<2?c.push(this.length-a):c[1]=E.ToInteger(b)),h.apply(this,c)}},!I);var J=1!==[].unshift(0);C(b,{unshift:function(){return j.apply(this,arguments),this.length}},J),C(Array,{isArray:n});var K=Object("a"),L="a"!==K[0]||!(0 in K),M=function(a){var b=!0,c=!0;return a&&(a.call("foo",function(a,c,d){"object"!=typeof d&&(b=!1)}),a.call([1],function(){"use strict";c="string"==typeof this},"x")),!!a&&b&&c};C(b,{forEach:function(b){var c,d=E.ToObject(this),e=L&&x(this)?this.split(""):d,f=-1,g=e.length>>>0;if(arguments.length>1&&(c=arguments[1]),!a(b))throw new TypeError("Array.prototype.forEach callback must be a function");for(;++f<g;)f in e&&("undefined"!=typeof c?b.call(c,e[f],f,d):b(e[f],f,d))}},!M(b.forEach)),C(b,{map:function(b){var c,d=E.ToObject(this),e=L&&x(this)?this.split(""):d,f=e.length>>>0,g=Array(f);if(arguments.length>1&&(c=arguments[1]),!a(b))throw new TypeError("Array.prototype.map callback must be a function");for(var h=0;f>h;h++)h in e&&("undefined"!=typeof c?g[h]=b.call(c,e[h],h,d):g[h]=b(e[h],h,d));return g}},!M(b.map)),C(b,{filter:function(b){var c,d,e=E.ToObject(this),f=L&&x(this)?this.split(""):e,g=f.length>>>0,h=[];if(arguments.length>1&&(d=arguments[1]),!a(b))throw new TypeError("Array.prototype.filter callback must be a function");for(var i=0;g>i;i++)i in f&&(c=f[i],("undefined"==typeof d?b(c,i,e):b.call(d,c,i,e))&&h.push(c));return h}},!M(b.filter)),C(b,{every:function(b){var c,d=E.ToObject(this),e=L&&x(this)?this.split(""):d,f=e.length>>>0;if(arguments.length>1&&(c=arguments[1]),!a(b))throw new TypeError("Array.prototype.every callback must be a function");for(var g=0;f>g;g++)if(g in e&&!("undefined"==typeof c?b(e[g],g,d):b.call(c,e[g],g,d)))return!1;return!0}},!M(b.every)),C(b,{some:function(b){var c,d=E.ToObject(this),e=L&&x(this)?this.split(""):d,f=e.length>>>0;if(arguments.length>1&&(c=arguments[1]),!a(b))throw new TypeError("Array.prototype.some callback must be a function");for(var g=0;f>g;g++)if(g in e&&("undefined"==typeof c?b(e[g],g,d):b.call(c,e[g],g,d)))return!0;return!1}},!M(b.some));var N=!1;b.reduce&&(N="object"==typeof b.reduce.call("es5",function(a,b,c,d){return d})),C(b,{reduce:function(b){var c=E.ToObject(this),d=L&&x(this)?this.split(""):c,e=d.length>>>0;if(!a(b))throw new TypeError("Array.prototype.reduce callback must be a function");if(0===e&&1===arguments.length)throw new TypeError("reduce of empty array with no initial value");var f,g=0;if(arguments.length>=2)f=arguments[1];else for(;;){if(g in d){f=d[g++];break}if(++g>=e)throw new TypeError("reduce of empty array with no initial value")}for(;e>g;g++)g in d&&(f=b(f,d[g],g,c));return f}},!N);var O=!1;b.reduceRight&&(O="object"==typeof b.reduceRight.call("es5",function(a,b,c,d){return d})),C(b,{reduceRight:function(b){var c=E.ToObject(this),d=L&&x(this)?this.split(""):c,e=d.length>>>0;if(!a(b))throw new TypeError("Array.prototype.reduceRight callback must be a function");if(0===e&&1===arguments.length)throw new TypeError("reduceRight of empty array with no initial value");var f,g=e-1;if(arguments.length>=2)f=arguments[1];else for(;;){if(g in d){f=d[g--];break}if(--g<0)throw new TypeError("reduceRight of empty array with no initial value")}if(0>g)return f;do g in d&&(f=b(f,d[g],g,c));while(g--);return f}},!O);var P=Array.prototype.indexOf&&-1!==[0,1].indexOf(1,2);C(b,{indexOf:function(a){var b=L&&x(this)?this.split(""):E.ToObject(this),c=b.length>>>0;if(0===c)return-1;var d=0;for(arguments.length>1&&(d=E.ToInteger(arguments[1])),d=d>=0?d:Math.max(0,c+d);c>d;d++)if(d in b&&b[d]===a)return d;return-1}},P);var Q=Array.prototype.lastIndexOf&&-1!==[0,1].lastIndexOf(0,-3);C(b,{lastIndexOf:function(a){var b=L&&x(this)?this.split(""):E.ToObject(this),c=b.length>>>0;if(0===c)return-1;var d=c-1;for(arguments.length>1&&(d=Math.min(d,E.ToInteger(arguments[1]))),d=d>=0?d:c-Math.abs(d);d>=0;d--)if(d in b&&a===b[d])return d;return-1}},Q);var R=!{toString:null}.propertyIsEnumerable("toString"),S=function(){}.propertyIsEnumerable("prototype"),T=!G("x","0"),U=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],V=U.length;C(Object,{keys:function(b){var c=a(b),d=B(b),e=null!==b&&"object"==typeof b,f=e&&x(b);if(!e&&!c&&!d)throw new TypeError("Object.keys called on a non-object");var g=[],h=S&&c;if(f&&T||d)for(var i=0;i<b.length;++i)g.push(String(i));if(!d)for(var j in b)h&&"prototype"===j||!G(b,j)||g.push(String(j));if(R)for(var k=b.constructor,l=k&&k.prototype===b,m=0;V>m;m++){var n=U[m];l&&"constructor"===n||!G(b,n)||g.push(n)}return g}});var W=Object.keys&&function(){return 2===Object.keys(arguments).length}(1,2),X=Object.keys;C(Object,{keys:function(a){return X(B(a)?b.slice.call(a):a)}},!W);var Y=-621987552e5,Z="-000001",$=Date.prototype.toISOString&&-1===new Date(Y).toISOString().indexOf(Z);C(Date.prototype,{toISOString:function(){var a,b,c,d,e;if(!isFinite(this))throw new RangeError("Date.prototype.toISOString called on non-finite value.");for(d=this.getUTCFullYear(),e=this.getUTCMonth(),d+=Math.floor(e/12),e=(e%12+12)%12,a=[e+1,this.getUTCDate(),this.getUTCHours(),this.getUTCMinutes(),this.getUTCSeconds()],d=(0>d?"-":d>9999?"+":"")+("00000"+Math.abs(d)).slice(d>=0&&9999>=d?-4:-6),b=a.length;b--;)c=a[b],10>c&&(a[b]="0"+c);return d+"-"+a.slice(0,2).join("-")+"T"+a.slice(2).join(":")+"."+("000"+this.getUTCMilliseconds()).slice(-3)+"Z"}},$);var _=function(){try{return Date.prototype.toJSON&&null===new Date(NaN).toJSON()&&-1!==new Date(Y).toJSON().indexOf(Z)&&Date.prototype.toJSON.call({toISOString:function(){return!0}})}catch(a){return!1}}();_||(Date.prototype.toJSON=function(b){var c=Object(this),d=E.ToPrimitive(c);if("number"==typeof d&&!isFinite(d))return null;var e=c.toISOString;if(!a(e))throw new TypeError("toISOString property is not callable");return e.call(c)});var aa=1e15===Date.parse("+033658-09-27T01:46:40.000Z"),ba=!isNaN(Date.parse("2012-04-04T24:00:00.500Z"))||!isNaN(Date.parse("2012-11-31T23:59:59.000Z")),ca=isNaN(Date.parse("2000-01-01T00:00:00.000Z"));(!Date.parse||ca||ba||!aa)&&(Date=function(a){var b=function(c,d,e,f,g,h,i){var j,k=arguments.length;return j=this instanceof a?1===k&&String(c)===c?new a(b.parse(c)):k>=7?new a(c,d,e,f,g,h,i):k>=6?new a(c,d,e,f,g,h):k>=5?new a(c,d,e,f,g):k>=4?new a(c,d,e,f):k>=3?new a(c,d,e):k>=2?new a(c,d):k>=1?new a(c):new a:a.apply(this,arguments),C(j,{constructor:b},!0),j},c=new RegExp("^(\\d{4}|[+-]\\d{6})(?:-(\\d{2})(?:-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:(\\.\\d{1,}))?)?(Z|(?:([-+])(\\d{2}):(\\d{2})))?)?)?)?$"),d=[0,31,59,90,120,151,181,212,243,273,304,334,365],e=function(a,b){var c=b>1?1:0;return d[b]+Math.floor((a-1969+c)/4)-Math.floor((a-1901+c)/100)+Math.floor((a-1601+c)/400)+365*(a-1970)},f=function(b){return Number(new a(1970,0,1,0,0,0,b))};for(var g in a)G(a,g)&&(b[g]=a[g]);return C(b,{now:a.now,UTC:a.UTC},!0),b.prototype=a.prototype,C(b.prototype,{constructor:b},!0),b.parse=function(b){var d=c.exec(b);if(d){var g,h=Number(d[1]),i=Number(d[2]||1)-1,j=Number(d[3]||1)-1,k=Number(d[4]||0),l=Number(d[5]||0),m=Number(d[6]||0),n=Math.floor(1e3*Number(d[7]||0)),o=Boolean(d[4]&&!d[8]),p="-"===d[9]?1:-1,q=Number(d[10]||0),r=Number(d[11]||0);return(l>0||m>0||n>0?24:25)>k&&60>l&&60>m&&1e3>n&&i>-1&&12>i&&24>q&&60>r&&j>-1&&j<e(h,i+1)-e(h,i)&&(g=60*(24*(e(h,i)+j)+k+q*p),g=1e3*(60*(g+l+r*p)+m)+n,o&&(g=f(g)),g>=-864e13&&864e13>=g)?g:NaN}return a.parse.apply(this,arguments)},b}(Date)),Date.now||(Date.now=function(){return(new Date).getTime()});var da=f.toFixed&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==0xde0b6b3a7640080.toFixed(0)),ea={base:1e7,size:6,data:[0,0,0,0,0,0],multiply:function(a,b){for(var c=-1,d=b;++c<ea.size;)d+=a*ea.data[c],ea.data[c]=d%ea.base,d=Math.floor(d/ea.base)},divide:function(a){for(var b=ea.size,c=0;--b>=0;)c+=ea.data[b],ea.data[b]=Math.floor(c/a),c=c%a*ea.base},numToString:function(){for(var a=ea.size,b="";--a>=0;)if(""!==b||0===a||0!==ea.data[a]){var c=String(ea.data[a]);""===b?b=c:b+="0000000".slice(0,7-c.length)+c}return b},pow:function qa(a,b,c){return 0===b?c:b%2===1?qa(a,b-1,c*a):qa(a*a,b/2,c)},log:function(a){for(var b=0,c=a;c>=4096;)b+=12,c/=4096;for(;c>=2;)b+=1,c/=2;return b}};C(f,{toFixed:function(a){var b,c,d,e,f,g,h,i;if(b=Number(a),b=b!==b?0:Math.floor(b),0>b||b>20)throw new RangeError("Number.toFixed called with invalid number of decimals");if(c=Number(this),c!==c)return"NaN";if(-1e21>=c||c>=1e21)return String(c);if(d="",0>c&&(d="-",c=-c),e="0",c>1e-21)if(f=ea.log(c*ea.pow(2,69,1))-69,g=0>f?c*ea.pow(2,-f,1):c/ea.pow(2,f,1),g*=4503599627370496,f=52-f,f>0){for(ea.multiply(0,g),h=b;h>=7;)ea.multiply(1e7,0),h-=7;for(ea.multiply(ea.pow(10,h,1),0),h=f-1;h>=23;)ea.divide(1<<23),h-=23;ea.divide(1<<h),ea.multiply(1,1),ea.divide(2),e=ea.numToString()}else ea.multiply(0,g),ea.multiply(1<<-f,0),e=ea.numToString()+"0.00000000000000000000".slice(2,2+b);return b>0?(i=e.length,e=b>=i?d+"0.0000000000000000000".slice(0,b-i+2)+e:d+e.slice(0,i-b)+"."+e.slice(i-b)):e=d+e,e}},da);var fa=e.split;2!=="ab".split(/(?:ab)*/).length||4!==".".split(/(.?)(.?)/).length||"t"==="tesst".split(/(s)*/)[1]||4!=="test".split(/(?:)/,-1).length||"".split(/.?/).length||".".split(/()()/).length>1?!function(){var a="undefined"==typeof/()??/.exec("")[1];e.split=function(b,c){var d=this;if("undefined"==typeof b&&0===c)return[];if(!t(b))return fa.call(this,b,c);var e,f,g,h,j=[],k=(b.ignoreCase?"i":"")+(b.multiline?"m":"")+(b.extended?"x":"")+(b.sticky?"y":""),l=0,m=new RegExp(b.source,k+"g");d+="",a||(e=new RegExp("^"+m.source+"$(?!\\s)",k));var n="undefined"==typeof c?-1>>>0:E.ToUint32(c);for(f=m.exec(d);f&&(g=f.index+f[0].length,!(g>l&&(j.push(d.slice(l,f.index)),!a&&f.length>1&&f[0].replace(e,function(){for(var a=1;a<arguments.length-2;a++)"undefined"==typeof arguments[a]&&(f[a]=void 0)}),f.length>1&&f.index<d.length&&i.apply(j,f.slice(1)),h=f[0].length,l=g,j.length>=n)));)m.lastIndex===f.index&&m.lastIndex++,f=m.exec(d);return l===d.length?(h||!m.test(""))&&j.push(""):j.push(d.slice(l)),j.length>n?j.slice(0,n):j}}():"0".split(void 0,0).length&&(e.split=function(a,b){return"undefined"==typeof a&&0===b?[]:fa.call(this,a,b)});var ga=e.replace,ha=function(){var a=[];return"x".replace(/x(.)?/g,function(b,c){a.push(c)}),1===a.length&&"undefined"==typeof a[0]}();ha||(e.replace=function(b,c){var d=a(c),e=t(b)&&/\)[*?]/.test(b.source);if(d&&e){var f=function(a){var d=arguments.length,e=b.lastIndex;b.lastIndex=0;var f=b.exec(a)||[];return b.lastIndex=e,f.push(arguments[d-2],arguments[d-1]),c.apply(this,f)};return ga.call(this,b,f)}return ga.call(this,b,c)});var ia=e.substr,ja="".substr&&"b"!=="0b".substr(-1);C(e,{substr:function(a,b){var c=a;return 0>a&&(c=Math.max(this.length+a,0)),ia.call(this,c,b)}},ja);var ka="	\n\f\r   ᠎              \u2028\u2029\ufeff",la="​",ma="["+ka+"]",na=new RegExp("^"+ma+ma+"*"),oa=new RegExp(ma+ma+"*$"),pa=e.trim&&(ka.trim()||!la.trim());C(e,{trim:function(){if("undefined"==typeof this||null===this)throw new TypeError("can't convert "+this+" to object");return String(this).replace(na,"").replace(oa,"")}},pa),(8!==parseInt(ka+"08")||22!==parseInt(ka+"0x16"))&&(parseInt=function(a){var b=/^0[xX]/;return function(c,d){var e=String(c).trim(),f=Number(d)||(b.test(e)?16:10);return a(e,f)}}(parseInt))}),function(a,b){"use strict";"function"==typeof define&&define.amd?define(b):"object"==typeof exports?module.exports=b():a.returnExports=b()}(this,function(){var a,c,d,e,f=Function.prototype.call,g=Object.prototype,h=f.bind(g.hasOwnProperty),i=h(g,"__defineGetter__");i&&(a=f.bind(g.__defineGetter__),c=f.bind(g.__defineSetter__),d=f.bind(g.__lookupGetter__),e=f.bind(g.__lookupSetter__)),Object.getPrototypeOf||(Object.getPrototypeOf=function(a){var b=a.__proto__;return b||null===b?b:a.constructor?a.constructor.prototype:g});var j=function(a){try{return a.sentinel=0,0===Object.getOwnPropertyDescriptor(a,"sentinel").value}catch(b){return!1}};if(Object.defineProperty){var k=j({}),l="undefined"==typeof b||j(b.createElement("div"));if(!l||!k)var m=Object.getOwnPropertyDescriptor}if(!Object.getOwnPropertyDescriptor||m){var n="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(a,b){if("object"!=typeof a&&"function"!=typeof a||null===a)throw new TypeError(n+a);if(m)try{return m.call(Object,a,b)}catch(c){}var f;if(!h(a,b))return f;if(f={enumerable:!0,configurable:!0},i){var j=a.__proto__,k=a!==g;k&&(a.__proto__=g);var l=d(a,b),o=e(a,b);if(k&&(a.__proto__=j),l||o)return l&&(f.get=l),o&&(f.set=o),f}return f.value=a[b],f.writable=!0,f}}if(Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(a){return Object.keys(a)}),!Object.create){var o,p=!({__proto__:null}instanceof Object);o=p||"undefined"==typeof b?function(){return{__proto__:null}}:function(){var a=b.createElement("iframe"),c=b.body||b.documentElement;a.style.display="none",c.appendChild(a),a.src="javascript:";var d=a.contentWindow.Object.prototype;c.removeChild(a),a=null,delete d.constructor,delete d.hasOwnProperty,delete d.propertyIsEnumerable,delete d.isPrototypeOf,delete d.toLocaleString,delete d.toString,delete d.valueOf,d.__proto__=null;var e=function(){};return e.prototype=d,o=function(){return new e},new e},Object.create=function(a,b){var c,d=function(){};if(null===a)c=o();else{if("object"!=typeof a&&"function"!=typeof a)throw new TypeError("Object prototype may only be an Object or null");d.prototype=a,c=new d,c.__proto__=a}return void 0!==b&&Object.defineProperties(c,b),c}}var q=function(a){try{return Object.defineProperty(a,"sentinel",{}),"sentinel"in a}catch(b){return!1}};if(Object.defineProperty){var r=q({}),s="undefined"==typeof b||q(b.createElement("div"));if(!r||!s)var t=Object.defineProperty,u=Object.defineProperties}if(!Object.defineProperty||t){var v="Property description must be an object: ",w="Object.defineProperty called on non-object: ",x="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(b,f,h){if("object"!=typeof b&&"function"!=typeof b||null===b)throw new TypeError(w+b);if("object"!=typeof h&&"function"!=typeof h||null===h)throw new TypeError(v+h);if(t)try{return t.call(Object,b,f,h)}catch(j){}if("value"in h)if(i&&(d(b,f)||e(b,f))){var k=b.__proto__;b.__proto__=g,delete b[f],b[f]=h.value,b.__proto__=k}else b[f]=h.value;else{if(!i)throw new TypeError(x);"get"in h&&a(b,f,h.get),"set"in h&&c(b,f,h.set)}return b}}(!Object.defineProperties||u)&&(Object.defineProperties=function(a,b){if(u)try{return u.call(Object,a,b)}catch(c){}return Object.keys(b).forEach(function(c){"__proto__"!==c&&Object.defineProperty(a,c,b[c])}),a}),Object.seal||(Object.seal=function(a){if(Object(a)!==a)throw new TypeError("Object.seal can only be called on Objects.");return a}),Object.freeze||(Object.freeze=function(a){if(Object(a)!==a)throw new TypeError("Object.freeze can only be called on Objects.");return a});try{Object.freeze(function(){})}catch(y){Object.freeze=function(a){return function(b){return"function"==typeof b?b:a(b)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(a){if(Object(a)!==a)throw new TypeError("Object.preventExtensions can only be called on Objects.");return a}),Object.isSealed||(Object.isSealed=function(a){if(Object(a)!==a)throw new TypeError("Object.isSealed can only be called on Objects.");return!1}),Object.isFrozen||(Object.isFrozen=function(a){if(Object(a)!==a)throw new TypeError("Object.isFrozen can only be called on Objects.");return!1}),Object.isExtensible||(Object.isExtensible=function(a){if(Object(a)!==a)throw new TypeError("Object.isExtensible can only be called on Objects.");for(var b="";h(a,b);)b+="?";a[b]=!0;var c=h(a,b);return delete a[b],c})})}(window,document);
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/ar.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("ar",{
 
 "Play": "تشغيل",
 
 "Pause": "ايقاف",
 
 "Current Time": "الوقت الحالي",
 
 "Duration Time": "Dauer",
 
 "Remaining Time": "الوقت المتبقي",
 
 "Stream Type": "نوع التيار",
 
 "LIVE": "مباشر",
 
 "Loaded": "تم التحميل",
 
 "Progress": "التقدم",
 
 "Fullscreen": "ملء الشاشة",
 
 "Non-Fullscreen": "غير ملء الشاشة",
 
 "Mute": "صامت",
 
 "Unmuted": "غير الصامت",
 
 "Playback Rate": "معدل التشغيل",
 
 "Subtitles": "الترجمة",
 
 "subtitles off": "ايقاف الترجمة",
 
 "Captions": "التعليقات",
 
 "captions off": "ايقاف التعليقات",
 
 "Chapters": "فصول",
 
 "You aborted the media playback": "لقد ألغيت تشغيل الفيديو",
 
 "A network error caused the media download to fail part-way.": "تسبب خطأ في الشبكة بفشل تحميل الفيديو بالكامل.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "لا يمكن تحميل الفيديو بسبب فشل في الخادم أو الشبكة ، أو فشل بسبب عدم امكانية قراءة تنسيق الفيديو.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "تم ايقاف تشغيل الفيديو بسبب مشكلة فساد أو لأن الفيديو المستخدم يستخدم ميزات غير مدعومة من متصفحك.",
 
 "No compatible source was found for this media.": "فشل العثور على أي مصدر متوافق مع هذا الفيديو."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/ba.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("ba",{
 
 "Play": "Pusti",
 
 "Pause": "Pauza",
 
 "Current Time": "Trenutno vrijeme",
 
 "Duration Time": "Vrijeme trajanja",
 
 "Remaining Time": "Preostalo vrijeme",
 
 "Stream Type": "Način strimovanja",
 
 "LIVE": "UŽIVO",
 
 "Loaded": "Učitan",
 
 "Progress": "Progres",
 
 "Fullscreen": "Puni ekran",
 
 "Non-Fullscreen": "Mali ekran",
 
 "Mute": "Prigušen",
 
 "Unmuted": "Ne-prigušen",
 
 "Playback Rate": "Stopa reprodukcije",
 
 "Subtitles": "Podnaslov",
 
 "subtitles off": "Podnaslov deaktiviran",
 
 "Captions": "Titlovi",
 
 "captions off": "Titlovi deaktivirani",
 
 "Chapters": "Poglavlja",
 
 "You aborted the media playback": "Isključili ste reprodukciju videa.",
 
 "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.",
 
 "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/bg.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("bg",{
 
 "Play": "Възпроизвеждане",
 
 "Pause": "Пауза",
 
 "Current Time": "Текущо време",
 
 "Duration Time": "Продължителност",
 
 "Remaining Time": "Оставащо време",
 
 "Stream Type": "Тип на потока",
 
 "LIVE": "НА ЖИВО",
 
 "Loaded": "Заредено",
 
 "Progress": "Прогрес",
 
 "Fullscreen": "Цял екран",
 
 "Non-Fullscreen": "Спиране на цял екран",
 
 "Mute": "Без звук",
 
 "Unmuted": "Със звук",
 
 "Playback Rate": "Скорост на възпроизвеждане",
 
 "Subtitles": "Субтитри",
 
 "subtitles off": "Спряни субтитри",
 
 "Captions": "Аудио надписи",
 
 "captions off": "Спряни аудио надписи",
 
 "Chapters": "Глави",
 
 "You aborted the media playback": "Спряхте възпроизвеждането на видеото",
 
 "A network error caused the media download to fail part-way.": "Грешка в мрежата провали изтеглянето на видеото.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Видеото не може да бъде заредено заради проблем със сървъра или мрежата или защото този формат не е поддържан.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Възпроизвеждането на видеото беше прекъснато заради проблем с файла или защото видеото използва опции които браузърът Ви не поддържа.",
 
 "No compatible source was found for this media.": "Не беше намерен съвместим източник за това видео."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/ca.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("ca",{
 
 "Play": "Reproducció",
 
 "Pause": "Pausa",
 
 "Current Time": "Temps reproduït",
 
 "Duration Time": "Durada total",
 
 "Remaining Time": "Temps restant",
 
 "Stream Type": "Tipus de seqüència",
 
 "LIVE": "EN DIRECTE",
 
 "Loaded": "Carregat",
 
 "Progress": "Progrés",
 
 "Fullscreen": "Pantalla completa",
 
 "Non-Fullscreen": "Pantalla no completa",
 
 "Mute": "Silencia",
 
 "Unmuted": "Amb so",
 
 "Playback Rate": "Velocitat de reproducció",
 
 "Subtitles": "Subtítols",
 
 "subtitles off": "Subtítols desactivats",
 
 "Captions": "Llegendes",
 
 "captions off": "Llegendes desactivades",
 
 "Chapters": "Capítols",
 
 "You aborted the media playback": "Heu interromput la reproducció del vídeo.",
 
 "A network error caused the media download to fail part-way.": "Un error de la xarxa ha interromput la baixada del vídeo.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "No s'ha pogut carregar el vídeo perquè el servidor o la xarxa han fallat, o bé perquè el seu format no és compatible.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La reproducció de vídeo s'ha interrumput per un problema de corrupció de dades o bé perquè el vídeo demanava funcions que el vostre navegador no ofereix.",
 
 "No compatible source was found for this media.": "No s'ha trobat cap font compatible amb el vídeo."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/cs.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("cs",{
 
 "Play": "Přehrát",
 
 "Pause": "Pauza",
 
 "Current Time": "Aktuální čas",
 
 "Duration Time": "Doba trvání",
 
 "Remaining Time": "Zbývající čas",
 
 "Stream Type": "Stream Type",
 
 "LIVE": "ŽIVĚ",
 
 "Loaded": "Načteno",
 
 "Progress": "Stav",
 
 "Fullscreen": "Celá obrazovka",
 
 "Non-Fullscreen": "Zmenšená obrazovka",
 
 "Mute": "Ztlumit zvuk",
 
 "Unmuted": "Přehrát zvuk",
 
 "Playback Rate": "Rychlost přehrávání",
 
 "Subtitles": "Titulky",
 
 "subtitles off": "Titulky vypnuty",
 
 "Captions": "Popisky",
 
 "captions off": "Popisky vypnuty",
 
 "Chapters": "Kapitoly",
 
 "You aborted the media playback": "Přehrávání videa je přerušeno.",
 
 "A network error caused the media download to fail part-way.": "Video nemohlo být načteno, kvůli chybě v síti.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video nemohlo být načteno, buď kvůli chybě serveru nebo sítě nebo proto, že daný formát není podporován.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Váš prohlížeč nepodporuje formát videa.",
 
 "No compatible source was found for this media.": "Špatně zadaný zdroj videa."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/da.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("da",{
 
 "Play": "Afspil",
 
 "Pause": "Pause",
 
 "Current Time": "Aktuel tid",
 
 "Duration Time": "Varighed",
 
 "Remaining Time": "Resterende tid",
 
 "Stream Type": "Stream-type",
 
 "LIVE": "LIVE",
 
 "Loaded": "Indlæst",
 
 "Progress": "Status",
 
 "Fullscreen": "Fuldskærm",
 
 "Non-Fullscreen": "Luk fuldskærm",
 
 "Mute": "Uden lyd",
 
 "Unmuted": "Med lyd",
 
 "Playback Rate": "Afspilningsrate",
 
 "Subtitles": "Undertekster",
 
 "subtitles off": "Uden undertekster",
 
 "Captions": "Undertekster for hørehæmmede",
 
 "captions off": "Uden undertekster for hørehæmmede",
 
 "Chapters": "Kapitler",
 
 "You aborted the media playback": "Du afbrød videoafspilningen.",
 
 "A network error caused the media download to fail part-way.": "En netværksfejl fik download af videoen til at fejle.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videoen kunne ikke indlæses, enten fordi serveren eller netværket fejlede, eller fordi formatet ikke er understøttet.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videoafspilningen blev afbrudt på grund af ødelagte data eller fordi videoen benyttede faciliteter som din browser ikke understøtter.",
 
 "No compatible source was found for this media.": "Fandt ikke en kompatibel kilde for denne media."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/de.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("de",{
 
 "Play": "Wiedergabe",
 
 "Pause": "Pause",
 
 "Current Time": "Aktueller Zeitpunkt",
 
 "Duration Time": "Dauer",
 
 "Remaining Time": "Verbleibende Zeit",
 
 "Stream Type": "Streamtyp",
 
 "LIVE": "LIVE",
 
 "Loaded": "Geladen",
 
 "Progress": "Status",
 
 "Fullscreen": "Vollbild",
 
 "Non-Fullscreen": "Kein Vollbild",
 
 "Mute": "Ton aus",
 
 "Unmuted": "Ton ein",
 
 "Playback Rate": "Wiedergabegeschwindigkeit",
 
 "Subtitles": "Untertitel",
 
 "subtitles off": "Untertitel aus",
 
 "Captions": "Untertitel",
 
 "captions off": "Untertitel aus",
 
 "Chapters": "Kapitel",
 
 "You aborted the media playback": "Sie haben die Videowiedergabe abgebrochen.",
 
 "A network error caused the media download to fail part-way.": "Der Videodownload ist aufgrund eines Netzwerkfehlers fehlgeschlagen.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Das Video konnte nicht geladen werden, da entweder ein Server- oder Netzwerkfehler auftrat oder das Format nicht unterstützt wird.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Die Videowiedergabe wurde entweder wegen eines Problems mit einem beschädigten Video oder wegen verwendeten Funktionen, die vom Browser nicht unterstützt werden, abgebrochen.",
 
 "No compatible source was found for this media.": "Für dieses Video wurde keine kompatible Quelle gefunden."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/es.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("es",{
 
 "Play": "Reproducción",
 
 "Pause": "Pausa",
 
 "Current Time": "Tiempo reproducido",
 
 "Duration Time": "Duración total",
 
 "Remaining Time": "Tiempo restante",
 
 "Stream Type": "Tipo de secuencia",
 
 "LIVE": "DIRECTO",
 
 "Loaded": "Cargado",
 
 "Progress": "Progreso",
 
 "Fullscreen": "Pantalla completa",
 
 "Non-Fullscreen": "Pantalla no completa",
 
 "Mute": "Silenciar",
 
 "Unmuted": "No silenciado",
 
 "Playback Rate": "Velocidad de reproducción",
 
 "Subtitles": "Subtítulos",
 
 "subtitles off": "Subtítulos desactivados",
 
 "Captions": "Subtítulos especiales",
 
 "captions off": "Subtítulos especiales desactivados",
 
 "Chapters": "Capítulos",
 
 "You aborted the media playback": "Ha interrumpido la reproducción del vídeo.",
 
 "A network error caused the media download to fail part-way.": "Un error de red ha interrumpido la descarga del vídeo.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "No se ha podido cargar el vídeo debido a un fallo de red o del servidor o porque el formato es incompatible.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La reproducción de vídeo se ha interrumpido por un problema de corrupción de datos o porque el vídeo precisa funciones que su navegador no ofrece.",
 
 "No compatible source was found for this media.": "No se ha encontrado ninguna fuente compatible con este vídeo."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/fi.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("fi",{
 
 "Play": "Toisto",
 
 "Pause": "Tauko",
 
 "Current Time": "Tämänhetkinen aika",
 
 "Duration Time": "Kokonaisaika",
 
 "Remaining Time": "Jäljellä oleva aika",
 
 "Stream Type": "Lähetystyyppi",
 
 "LIVE": "LIVE",
 
 "Loaded": "Ladattu",
 
 "Progress": "Edistyminen",
 
 "Fullscreen": "Koko näyttö",
 
 "Non-Fullscreen": "Koko näyttö pois",
 
 "Mute": "Ääni pois",
 
 "Unmuted": "Ääni päällä",
 
 "Playback Rate": "Toistonopeus",
 
 "Subtitles": "Tekstitys",
 
 "subtitles off": "Tekstitys pois",
 
 "Captions": "Tekstitys",
 
 "captions off": "Tekstitys pois",
 
 "Chapters": "Kappaleet",
 
 "You aborted the media playback": "Olet keskeyttänyt videotoiston.",
 
 "A network error caused the media download to fail part-way.": "Verkkovirhe keskeytti videon latauksen.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videon lataus ei onnistunut joko palvelin- tai verkkovirheestä tai väärästä formaatista johtuen.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videon toisto keskeytyi, koska media on vaurioitunut tai käyttää käyttää toimintoja, joita selaimesi ei tue.",
 
 "No compatible source was found for this media.": "Tälle videolle ei löytynyt yhteensopivaa lähdettä."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/fr.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("fr",{
 
 "Play": "Lecture",
 
 "Pause": "Pause",
 
 "Current Time": "Temps actuel",
 
 "Duration Time": "Durée",
 
 "Remaining Time": "Temps restant",
 
 "Stream Type": "Type de flux",
 
 "LIVE": "EN DIRECT",
 
 "Loaded": "Chargé",
 
 "Progress": "Progression",
 
 "Fullscreen": "Plein écran",
 
 "Non-Fullscreen": "Fenêtré",
 
 "Mute": "Sourdine",
 
 "Unmuted": "Son activé",
 
 "Playback Rate": "Vitesse de lecture",
 
 "Subtitles": "Sous-titres",
 
 "subtitles off": "Sous-titres désactivés",
 
 "Captions": "Sous-titres",
 
 "captions off": "Sous-titres désactivés",
 
 "Chapters": "Chapitres",
 
 "You aborted the media playback": "Vous avez interrompu la lecture de la vidéo.",
 
 "A network error caused the media download to fail part-way.": "Une erreur de réseau a interrompu le téléchargement de la vidéo.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Cette vidéo n'a pas pu être chargée, soit parce que le serveur ou le réseau a échoué ou parce que le format n'est pas reconnu.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La lecture de la vidéo a été interrompue à cause d'un problème de corruption ou parce que la vidéo utilise des fonctionnalités non prises en charge par votre navigateur.",
 
 "No compatible source was found for this media.": "Aucune source compatible n'a été trouvée pour cette vidéo."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/hr.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("hr",{
 
 "Play": "Pusti",
 
 "Pause": "Pauza",
 
 "Current Time": "Trenutno vrijeme",
 
 "Duration Time": "Vrijeme trajanja",
 
 "Remaining Time": "Preostalo vrijeme",
 
 "Stream Type": "Način strimovanja",
 
 "LIVE": "UŽIVO",
 
 "Loaded": "Učitan",
 
 "Progress": "Progres",
 
 "Fullscreen": "Puni ekran",
 
 "Non-Fullscreen": "Mali ekran",
 
 "Mute": "Prigušen",
 
 "Unmuted": "Ne-prigušen",
 
 "Playback Rate": "Stopa reprodukcije",
 
 "Subtitles": "Podnaslov",
 
 "subtitles off": "Podnaslov deaktiviran",
 
 "Captions": "Titlovi",
 
 "captions off": "Titlovi deaktivirani",
 
 "Chapters": "Poglavlja",
 
 "You aborted the media playback": "Isključili ste reprodukciju videa.",
 
 "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.",
 
 "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/hu.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("hu",{
 
 "Play": "Lejátszás",
 
 "Pause": "Szünet",
 
 "Current Time": "Aktuális időpont",
 
 "Duration Time": "Hossz",
 
 "Remaining Time": "Hátralévő idő",
 
 "Stream Type": "Adatfolyam típusa",
 
 "LIVE": "ÉLŐ",
 
 "Loaded": "Betöltve",
 
 "Progress": "Állapot",
 
 "Fullscreen": "Teljes képernyő",
 
 "Non-Fullscreen": "Normál méret",
 
 "Mute": "Némítás",
 
 "Unmuted": "Némítás kikapcsolva",
 
 "Playback Rate": "Lejátszási sebesség",
 
 "Subtitles": "Feliratok",
 
 "subtitles off": "Feliratok kikapcsolva",
 
 "Captions": "Magyarázó szöveg",
 
 "captions off": "Magyarázó szöveg kikapcsolva",
 
 "Chapters": "Fejezetek",
 
 "You aborted the media playback": "Leállította a lejátszást",
 
 "A network error caused the media download to fail part-way.": "Hálózati hiba miatt a videó részlegesen töltődött le.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "A videó nem tölthető be hálózati vagy kiszolgálói hiba miatt, vagy a formátuma nem támogatott.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A lejátszás adatsérülés miatt leállt, vagy a videó egyes tulajdonságait a böngészője nem támogatja.",
 
 "No compatible source was found for this media.": "Nincs kompatibilis forrás ehhez a videóhoz."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/it.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("it",{
 
 "Play": "Play",
 
 "Pause": "Pausa",
 
 "Current Time": "Orario attuale",
 
 "Duration Time": "Durata",
 
 "Remaining Time": "Tempo rimanente",
 
 "Stream Type": "Tipo del Streaming",
 
 "LIVE": "LIVE",
 
 "Loaded": "Caricato",
 
 "Progress": "Stato",
 
 "Fullscreen": "Schermo intero",
 
 "Non-Fullscreen": "Chiudi schermo intero",
 
 "Mute": "Muto",
 
 "Unmuted": "Audio",
 
 "Playback Rate": "Tasso di riproduzione",
 
 "Subtitles": "Sottotitoli",
 
 "subtitles off": "Senza sottotitoli",
 
 "Captions": "Sottotitoli non udenti",
 
 "captions off": "Senza sottotitoli non udenti",
 
 "Chapters": "Capitolo",
 
 "You aborted the media playback": "La riproduzione del filmato è stata interrotta.",
 
 "A network error caused the media download to fail part-way.": "Il download del filmato è stato interrotto a causa di un problema rete.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Il filmato non può essere caricato a causa di un errore nel server o nella rete o perché il formato non viene supportato.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La riproduzione del filmato è stata interrotta a causa di un file danneggiato o per l’utilizzo di impostazioni non supportate dal browser.",
 
 "No compatible source was found for this media.": "Non ci sono fonti compatibili per questo filmato."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/ja.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("ja",{
 
 "Play": "再生",
 
 "Pause": "一時停止",
 
 "Current Time": "現在の時間",
 
 "Duration Time": "長さ",
 
 "Remaining Time": "残りの時間",
 
 "Stream Type": "ストリームの種類",
 
 "LIVE": "ライブ",
 
 "Loaded": "ロード済み",
 
 "Progress": "進行状況",
 
 "Fullscreen": "フルスクリーン",
 
 "Non-Fullscreen": "フルスクリーン以外",
 
 "Mute": "ミュート",
 
 "Unmuted": "ミュート解除",
 
 "Playback Rate": "再生レート",
 
 "Subtitles": "サブタイトル",
 
 "subtitles off": "サブタイトル オフ",
 
 "Captions": "キャプション",
 
 "captions off": "キャプション オフ",
 
 "Chapters": "チャプター",
 
 "You aborted the media playback": "動画再生を中止しました",
 
 "A network error caused the media download to fail part-way.": "ネットワーク エラーにより動画のダウンロードが途中で失敗しました",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "サーバーまたはネットワークのエラー、またはフォーマットがサポートされていないため、動画をロードできませんでした",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "破損の問題、またはお使いのブラウザがサポートしていない機能が動画に使用されていたため、動画の再生が中止されました",
 
 "No compatible source was found for this media.": "この動画に対して互換性のあるソースが見つかりませんでした"
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/ko.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("ko",{
 
 "Play": "재생",
 
 "Pause": "일시중지",
 
 "Current Time": "현재 시간",
 
 "Duration Time": "지정 기간",
 
 "Remaining Time": "남은 시간",
 
 "Stream Type": "스트리밍 유형",
 
 "LIVE": "라이브",
 
 "Loaded": "로드됨",
 
 "Progress": "진행",
 
 "Fullscreen": "전체 화면",
 
 "Non-Fullscreen": "전체 화면 해제",
 
 "Mute": "음소거",
 
 "Unmuted": "음소거 해제",
 
 "Playback Rate": "재생 비율",
 
 "Subtitles": "서브타이틀",
 
 "subtitles off": "서브타이틀 끄기",
 
 "Captions": "자막",
 
 "captions off": "자막 끄기",
 
 "Chapters": "챕터",
 
 "You aborted the media playback": "비디오 재생을 취소했습니다.",
 
 "A network error caused the media download to fail part-way.": "네트워크 오류로 인하여 비디오 일부를 다운로드하지 못 했습니다.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "비디오를 로드할 수 없습니다. 서버 혹은 네트워크 오류 때문이거나 지원되지 않는 형식 때문일 수 있습니다.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "비디오 재생이 취소됐습니다. 비디오가 손상되었거나 비디오가 사용하는 기능을 브라우저에서 지원하지 않는 것 같습니다.",
 
 "No compatible source was found for this media.": "비디오에 호환되지 않는 소스가 있습니다."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/nl.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("nl",{
 
 "Play": "Afspelen",
 
 "Pause": "Pauze",
 
 "Current Time": "Huidige Tijd",
 
 "Duration Time": "Looptijd",
 
 "Remaining Time": "Resterende Tijd",
 
 "Stream Type": "Stream Type",
 
 "LIVE": "LIVE",
 
 "Loaded": "Geladen",
 
 "Progress": "Status",
 
 "Fullscreen": "Volledig scherm",
 
 "Non-Fullscreen": "Geen volledig scherm",
 
 "Mute": "Geluid Uit",
 
 "Unmuted": "Geluid Aan",
 
 "Playback Rate": "Weergave Rate",
 
 "Subtitles": "Ondertiteling",
 
 "subtitles off": "Ondertiteling uit",
 
 "Captions": "Onderschriften",
 
 "captions off": "Onderschriften uit",
 
 "Chapters": "Hoofdstukken",
 
 "You aborted the media playback": "Je hebt de media weergave afgebroken.",
 
 "A network error caused the media download to fail part-way.": "De media download is mislukt door een netwerkfout.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "De media kon niet worden geladen, veroorzaakt door een server of netwerkfout of het formaat word niet ondersteund.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "De media weergave is afgebroken omdat deze beschadigd is of de media gebruikt functionaliteit die niet door je browser word ondersteund.",
 
 "No compatible source was found for this media.": "Voor deze media is geen ondersteunde bron gevonden."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/pt-BR.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("pt-BR",{
 
 "Play": "Tocar",
 
 "Pause": "Pause",
 
 "Current Time": "Tempo",
 
 "Duration Time": "Duração",
 
 "Remaining Time": "Tempo Restante",
 
 "Stream Type": "Tipo de Stream",
 
 "LIVE": "AO VIVO",
 
 "Loaded": "Carregado",
 
 "Progress": "Progresso",
 
 "Fullscreen": "Tela Cheia",
 
 "Non-Fullscreen": "Tela Normal",
 
 "Mute": "Mudo",
 
 "Unmuted": "Habilitar Som",
 
 "Playback Rate": "Velocidade",
 
 "Subtitles": "Legendas",
 
 "subtitles off": "Sem Legendas",
 
 "Captions": "Anotações",
 
 "captions off": "Sem Anotações",
 
 "Chapters": "Capítulos",
 
 "You aborted the media playback": "Você parou a execução de vídeo.",
 
 "A network error caused the media download to fail part-way.": "Um erro na rede fez o vídeo parar parcialmente.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "O vídeo não pode ser carregado, ou porque houve um problema com sua rede ou pelo formato do vídeo não ser suportado.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A Execução foi interrompida por um problema com o vídeo ou por seu navegador não dar suporte ao seu formato.",
 
 "No compatible source was found for this media.": "Não foi encontrada fonte de vídeo compatível."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/ru.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("ru",{
 
 "Play": "Воспроизвести",
 
 "Pause": "Приостановить",
 
 "Current Time": "Текущее время",
 
 "Duration Time": "Продолжительность",
 
 "Remaining Time": "Оставшееся время",
 
 "Stream Type": "Тип потока",
 
 "LIVE": "ОНЛАЙН",
 
 "Loaded": "Загрузка",
 
 "Progress": "Прогресс",
 
 "Fullscreen": "Полноэкранный режим",
 
 "Non-Fullscreen": "Неполноэкранный режим",
 
 "Mute": "Без звука",
 
 "Unmuted": "Со звуком",
 
 "Playback Rate": "Скорость воспроизведения",
 
 "Subtitles": "Субтитры",
 
 "subtitles off": "Субтитры выкл.",
 
 "Captions": "Подписи",
 
 "captions off": "Подписи выкл.",
 
 "Chapters": "Главы",
 
 "You aborted the media playback": "Вы прервали воспроизведение видео",
 
 "A network error caused the media download to fail part-way.": "Ошибка сети вызвала сбой во время загрузки видео.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Невозможно загрузить видео из-за сетевого или серверного сбоя либо формат не поддерживается.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Воспроизведение видео было приостановлено из-за повреждения либо в связи с тем, что видео использует функции, неподдерживаемые вашим браузером.",
 
 "No compatible source was found for this media.": "Совместимые источники для этого видео отсутствуют."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/sr.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("sr",{
 
 "Play": "Pusti",
 
 "Pause": "Pauza",
 
 "Current Time": "Trenutno vrijeme",
 
 "Duration Time": "Vrijeme trajanja",
 
 "Remaining Time": "Preostalo vrijeme",
 
 "Stream Type": "Način strimovanja",
 
 "LIVE": "UŽIVO",
 
 "Loaded": "Učitan",
 
 "Progress": "Progres",
 
 "Fullscreen": "Puni ekran",
 
 "Non-Fullscreen": "Mali ekran",
 
 "Mute": "Prigušen",
 
 "Unmuted": "Ne-prigušen",
 
 "Playback Rate": "Stopa reprodukcije",
 
 "Subtitles": "Podnaslov",
 
 "subtitles off": "Podnaslov deaktiviran",
 
 "Captions": "Titlovi",
 
 "captions off": "Titlovi deaktivirani",
 
 "Chapters": "Poglavlja",
 
 "You aborted the media playback": "Isključili ste reprodukciju videa.",
 
 "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.",
 
 "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/sv.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("sv",{
 
 "Play": "Spela",
 
 "Pause": "Pausa",
 
 "Current Time": "Aktuell tid",
 
 "Duration Time": "Total tid",
 
 "Remaining Time": "Återstående tid",
 
 "Stream Type": "Strömningstyp",
 
 "LIVE": "LIVE",
 
 "Loaded": "Laddad",
 
 "Progress": "Förlopp",
 
 "Fullscreen": "Fullskärm",
 
 "Non-Fullscreen": "Ej fullskärm",
 
 "Mute": "Ljud av",
 
 "Unmuted": "Ljud på",
 
 "Playback Rate": "Uppspelningshastighet",
 
 "Subtitles": "Text på",
 
 "subtitles off": "Text av",
 
 "Captions": "Text på",
 
 "captions off": "Text av",
 
 "Chapters": "Kapitel",
 
 "You aborted the media playback": "Du har avbrutit videouppspelningen.",
 
 "A network error caused the media download to fail part-way.": "Ett nätverksfel gjorde att nedladdningen av videon avbröts.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Det gick inte att ladda videon, antingen på grund av ett server- eller nätverksfel, eller för att formatet inte stöds.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Uppspelningen avbröts på grund av att videon är skadad, eller också för att videon använder funktioner som din webbläsare inte stöder.",
 
 "No compatible source was found for this media.": "Det gick inte att hitta någon kompatibel källa för den här videon."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/tr.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("tr",{
 
 "Play": "Oynat",
 
 "Pause": "Duraklat",
 
 "Current Time": "Süre",
 
 "Duration Time": "Toplam Süre",
 
 "Remaining Time": "Kalan Süre",
 
 "Stream Type": "Yayın Tipi",
 
 "LIVE": "CANLI",
 
 "Loaded": "Yüklendi",
 
 "Progress": "Yükleniyor",
 
 "Fullscreen": "Tam Ekran",
 
 "Non-Fullscreen": "Küçük Ekran",
 
 "Mute": "Ses Kapa",
 
 "Unmuted": "Ses Aç",
 
 "Playback Rate": "Oynatma Hızı",
 
 "Subtitles": "Altyazı",
 
 "subtitles off": "Altyazı Kapat",
 
 "Captions": "Ek Açıklamalar",
 
 "captions off": "Ek Açıklamalar Kapalı",
 
 "Chapters": "Bölümler",
 
 "You aborted the media playback": "Video oynatmayı iptal ettiniz",
 
 "A network error caused the media download to fail part-way.": "Video indirilirken bağlantı sorunu oluştu.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video oynatılamadı, ağ ya da sunucu hatası veya belirtilen format desteklenmiyor.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Tarayıcınız desteklemediği için videoda hata oluştu.",
 
 "No compatible source was found for this media.": "Video için kaynak bulunamadı."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/uk.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("uk",{
 
 "Play": "Відтворити",
 
 "Pause": "Призупинити",
 
 "Current Time": "Поточний час",
 
 "Duration Time": "Тривалість",
 
 "Remaining Time": "Час, що залишився",
 
 "Stream Type": "Тип потоку",
 
 "LIVE": "НАЖИВО",
 
 "Loaded": "Завантаження",
 
 "Progress": "Прогрес",
 
 "Fullscreen": "Повноекранний режим",
 
 "Non-Fullscreen": "Неповноекранний режим",
 
 "Mute": "Без звуку",
 
 "Unmuted": "Зі звуком",
 
 "Playback Rate": "Швидкість відтворення",
 
 "Subtitles": "Субтитри",
 
 "subtitles off": "Без субтитрів",
 
 "Captions": "Підписи",
 
 "captions off": "Без підписів",
 
 "Chapters": "Розділи",
 
 "You aborted the media playback": "Ви припинили відтворення відео",
 
 "A network error caused the media download to fail part-way.": "Помилка мережі викликала збій під час завантаження відео.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Неможливо завантажити відео через мережевий чи серверний збій або формат не підтримується.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Відтворення відео було припинено через пошкодження або у зв'язку з тим, що відео використовує функції, які не підтримуються вашим браузером.",
 
 "No compatible source was found for this media.": "Сумісні джерела для цього відео відсутні."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/vi.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("vi",{
 
 "Play": "Phát",
 
 "Pause": "Tạm dừng",
 
 "Current Time": "Thời gian hiện tại",
 
 "Duration Time": "Độ dài",
 
 "Remaining Time": "Thời gian còn lại",
 
 "Stream Type": "Kiểu Stream",
 
 "LIVE": "TRỰC TIẾP",
 
 "Loaded": "Đã tải",
 
 "Progress": "Tiến trình",
 
 "Fullscreen": "Toàn màn hình",
 
 "Non-Fullscreen": "Thoát toàn màn hình",
 
 "Mute": "Tắt tiếng",
 
 "Unmuted": "Bật âm thanh",
 
 "Playback Rate": "Tốc độ phát",
 
 "Subtitles": "Phụ đề",
 
 "subtitles off": "Tắt phụ đề",
 
 "Captions": "Chú thích",
 
 "captions off": "Tắt chú thích",
 
 "Chapters": "Chương",
 
 "You aborted the media playback": "Bạn đã hủy việc phát media.",
 
 "A network error caused the media download to fail part-way.": "Một lỗi mạng dẫn đến việc tải media bị lỗi.",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video không tải được, mạng hay server có lỗi hoặc định dạng không được hỗ trợ.",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Phát media đã bị hủy do một sai lỗi hoặc media sử dụng những tính năng trình duyệt không hỗ trợ.",
 
 "No compatible source was found for this media.": "Không có nguồn tương thích cho media này."
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/zh-CN.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("zh-CN",{
 
 "Play": "播放",
 
 "Pause": "暂停",
 
 "Current Time": "当前时间",
 
 "Duration Time": "时长",
 
 "Remaining Time": "剩余时间",
 
 "Stream Type": "媒体流类型",
 
 "LIVE": "直播",
 
 "Loaded": "加载完毕",
 
 "Progress": "进度",
 
 "Fullscreen": "全屏",
 
 "Non-Fullscreen": "退出全屏",
 
 "Mute": "静音",
 
 "Unmuted": "取消静音",
 
 "Playback Rate": "播放码率",
 
 "Subtitles": "字幕",
 
 "subtitles off": "字幕关闭",
 
 "Captions": "内嵌字幕",
 
 "captions off": "内嵌字幕关闭",
 
 "Chapters": "节目段落",
 
 "You aborted the media playback": "视频播放被终止",
 
 "A network error caused the media download to fail part-way.": "网络错误导致视频下载中途失败。",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "视频因格式不支持或者服务器或网络的问题无法加载。",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由于视频文件损坏或是该视频使用了你的浏览器不支持的功能,播放终止。",
 
 "No compatible source was found for this media.": "无法找到此视频兼容的源。",
 
 "The media is encrypted and we do not have the keys to decrypt it.": "视频已加密,无法解密。"
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/lang/zh-TW.js
Show inline comments
 
new file 100644
 
videojs.addLanguage("zh-TW",{
 
 "Play": "播放",
 
 "Pause": "暫停",
 
 "Current Time": "目前時間",
 
 "Duration Time": "總共時間",
 
 "Remaining Time": "剩餘時間",
 
 "Stream Type": "串流類型",
 
 "LIVE": "直播",
 
 "Loaded": "載入完畢",
 
 "Progress": "進度",
 
 "Fullscreen": "全螢幕",
 
 "Non-Fullscreen": "退出全螢幕",
 
 "Mute": "靜音",
 
 "Unmuted": "取消靜音",
 
 "Playback Rate": " 播放速率",
 
 "Subtitles": "字幕",
 
 "subtitles off": "關閉字幕",
 
 "Captions": "內嵌字幕",
 
 "captions off": "關閉內嵌字幕",
 
 "Chapters": "章節",
 
 "You aborted the media playback": "影片播放已終止",
 
 "A network error caused the media download to fail part-way.": "網路錯誤導致影片下載失敗。",
 
 "The media could not be loaded, either because the server or network failed or because the format is not supported.": "影片因格式不支援或者伺服器或網路的問題無法載入。",
 
 "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由於影片檔案損毀或是該影片使用了您的瀏覽器不支援的功能,播放終止。",
 
 "No compatible source was found for this media.": "無法找到相容此影片的來源。",
 
 "The media is encrypted and we do not have the keys to decrypt it.": "影片已加密,無法解密。"
 
});
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/video-js-5.0.0.zip
Show inline comments
 
new file 100644
 
binary diff not shown
ennstatus/static/js/video.js/dist/video-js.css
Show inline comments
 
new file 100644
 
.video-js .vjs-big-play-button:before, .video-js .vjs-control:before {
 
  position: absolute;
 
  top: 0;
 
  left: 0;
 
  width: 100%;
 
  height: 100%;
 
  text-align: center; }
 

	
 
@font-face {
 
  font-family: VideoJS;
 
  src: url('font/VideoJS.eot?') format('eot'); }
 

	
 
@font-face {
 
  font-family: VideoJS;
 
  src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'), url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAAKAIAAAwAgT1MvMkC6TWMAAAEoAAAAVmNtYXDiJhC2AAAB1AAAAUpnbHlmI2i9NgAAA0wAAAf8aGVhZARKlDsAAADQAAAANmhoZWEELwIWAAAArAAAACRobXR4KgAAAAAAAYAAAABUbG9jYRAUEmYAAAMgAAAALG1heHABJgBkAAABCAAAACBuYW1l1cf1oAAAC0gAAAIKcG9zdCVzSbMAAA1UAAABJQABAAACAAAAAC4CAAAAAAACAAABAAAAAAAAAAAAAAAAAAAAFQABAAAAAQAAmyhx5F8PPPUACwIAAAAAANGWKbQAAAAA0ZYptAAAAAACAAHWAAAACAACAAAAAAAAAAEAAAAVAFgABwAAAAAAAgAAAAoACgAAAP8AAAAAAAAAAQIAAZAABQAIAUQBZgAAAEcBRAFmAAAA9QAZAIQAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA8QHxFAIAAAAALgIAAAAAAAABAAAAAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAAAAwAAAAMAAAAcAAEAAAAAAEQAAwABAAAAHAAEACgAAAAGAAQAAQACAADxFP//AAAAAPEB//8AAA8AAAEAAAAAAAAAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAPgBQAJIAogC+AOwBEgE4AWABpgHaAjICWgKQAvYDEAM+A3oD/gABAAAAAAGWAZYAAgAAExE3q+oBlf7WlQADAAAAAAHWAdYAAgAOABoAAD8BJzcOAQceARc+ATcuAQMuASc+ATceARcOAdWAgCtbeAICeFtbeAICeFtIYQICYUhIYQICYaBgYHUCeFtbeAICeFtbeP6CAmFISGECAmFISGEAAgAAAAABgAGWAAMABwAANzMRIzMRMxGAVVWrVWsBKv7WASoABAAAAAABwAHAAAYAEgAiACUAAAE0JicVFzY3FAcXNjcuAScVHgElBxcjFTMXNRcGBxU2Nxc3AwcXAWAdGDQBNQsgFQEBU0EvOv7HG2VlVWtbFhosIiwbwC0tAQAdLQwvNQcHHhohKTBGZRAsD0yMG2WAa5BbEQgsChwrGwFQLS0AAAAAAQAAAAABVgGrAAUAABMVMxcRB5VWamoBQIBrAVZrAAACAAAAAAGLAasABgAMAAABLgEnFT4BJRUzFxEHAYsBHRgYHf7hVWtrAQAdLQysDC1dgGsBVmsAAAMAAAAAAcABvAAFAAwAGQAAExUzFxEHFzQmJxU+AScVHgEUBgcVPgE3LgFAVWtryx0YGB01Lzo6L0FTAQFTAUCAawFWa0AdLQysDC3YLA9MaEwPLBBlRkZlAAAABAAAAAABlgGWAAUACwARABcAADcjFTM1IyczNTM1IwEjFTM1IycVMxUzNZUqakAqKkBqAQBAaipAQCrVaiqWQCr/ACpqwCpAagAAAAQAAAAAAZYBlgAFAAsAEQAXAAA3MxUzNSM3IxUzNSMTMzUzNSM3NSMVMzVrQCpqQEBqKoAqQGoqKmqrQGqAKmr+1kAqgEBqKgAAAAACAAAAAAGrAasADwATAAABIQ4BBxEeARchPgE3ES4BAyERIQGA/wASGAEBGBIBABIYAQEYEv8AAQABqwEYEv8AEhgBARgSAQASGP7WAQAAAAYAAAAAAdYB1gAHAAwAEwAbACAAKAAAEzcmIyIGBxclLgEnBxcjFz4BNTQFJw4BFRQXMwceARc3MwcWMzI2NyfJZRYYJ0QcTgEFEEIuTtOgbBoe/uFTGh4EoJsQQi5OI1MWGCdEHE4BILAFGReHIi9HEYcVux1JKhYWkB1JKhYVFS9HEYeQBRkXhwAABQAAAAAB1gGrAA8AEwAXABsAHwAAASEOARURFBYXIT4BNRE0JgUzFSMXIzUzFyM1MzUjNTMBq/6qEhgYEgFWEhgY/phWVtbW1oBWVtbWAasBGBL/ABIYAQEYEgEAEhiqK1UrKysqKwADAAAAAAHAAasADwAnAD8AAAEhDgEVERQWFyE+ATURNCYHIzUjFTM1MxUOASsBIiY9ATQ2OwEyFh8BIzUjFTM1MxUUBisBIiYnNT4BOwEyFhUBlf7WEhkZEgEqEhkZvCArKyABDAlACQwMCUAJDAGVICsrIAwJQAkMAQEMCUAJDAGrARgS/wASGAEBGBIBABIYlQtACxYJDAwJVgkMDAkWC0ALFgkMDAlWCQwMCQAAAAYAAAAAAcABawADAAcACwAPABMAFwAANzM1IxUzNSM1MzUjFyE1IRUhNSE1FSE1QCsrKysrK1UBK/7VASv+1QEr6yqAK4ArgCqAK6srKwAAAQAAAAABwAHWACIAACUGByc2NCc3FjI2NCYiBgcUFwcmIgYUFjI3FwYVFBYyNjQmAYAZEZgCApYSNSQkNiQBApYSNSQkNRKYAiQ0JCSpARBZBxAHWBEkNyQkHAcHWBAkNiQQWAcHGyMjNSMAAgAAAAAB0gHWADcAQAAAJTY0Jzc2LwEmDwEmLwEmKwEiDwEGBycmDwEGHwEGFBcHBh8BFj8BFh8BFjsBMj8BNjcXFj8BNicHLgE0NjIWFAYBnwEBLQYEKgUINhAUCAIIVggCCBQQNQkEKwQGLQEBLQYEKwQJNRAUCAIIVggCCBQQNQkEKwQGzCAqKkAqKusKFgojBghKBwMVDQg4CQk4CA0VAwdKCAYjChYKIwYISgcDFQ0IOAkJOAgNFQMHSggGEwEqQCoqQCoAAAAAAQAAAAAB1gHWAAsAABMeARc+ATcuAScOASsCeFtbeAICeFtbeAEAW3gCAnhbW3gCAngAAAIAAAAAAdYB1gALABcAAAEOAQceARc+ATcuAQMuASc+ATceARcOAQEAW3gCAnhbW3gCAnhbSGECAmFISGECAmEB1QJ4W1t4AgJ4W1t4/oICYUhIYQICYUhIYQAAAwAAAAAB1gHWAAsAFwAgAAABDgEHHgEXPgE3LgEDLgEnPgE3HgEXDgEnDgEiJjQ2MhYBAFt4AgJ4W1t4AgJ4W0hhAgJhSEhhAgJhCAEkNiQkNiQB1QJ4W1t4AgJ4W1t4/oICYUhIYQICYUhIYakbJCQ2JCQAAAAABwAAAAACAAFgAA0AFgAoADoATABUAFcAADc1Nh4CBw4BBwYjJzA3MjY3NiYHFRYXFjY3PgE1NCYnIxYXHgEXFAYXFjY3PgE1LgEnIxQXHgEVFAYXFjY3PgE1LgEnIxQXHgEVFAYFMz8BFTM1IxcVI+MmOyoaAgQxJRQZGzAYHgMCIB0BbQkKBAoMFg0JAQMKDwESHAoJBAoNARUOCAQKDxIcCgkECg0BFQ4IBAoPEv4lRRJAMTsMKIPaAQQdNiQoNwQBATkYFh0hAWgCNwIPCBErGSQ0EgYEEjAcITYVAg8IESsZJDQSBgQSMBwhNhUCDwgRKxkkNBIGBBIwHCE2FxwBHd9ORwAAAAAQAMYAAQAAAAAAAQAHAAAAAQAAAAAAAgAHAAcAAQAAAAAAAwAHAA4AAQAAAAAABAAHABUAAQAAAAAABQALABwAAQAAAAAABgAHACcAAQAAAAAACgArAC4AAQAAAAAACwATAFkAAwABBAkAAQAOAGwAAwABBAkAAgAOAHoAAwABBAkAAwAOAIgAAwABBAkABAAOAJYAAwABBAkABQAWAKQAAwABBAkABgAOALoAAwABBAkACgBWAMgAAwABBAkACwAmAR5WaWRlb0pTUmVndWxhclZpZGVvSlNWaWRlb0pTVmVyc2lvbiAxLjBWaWRlb0pTR2VuZXJhdGVkIGJ5IHN2ZzJ0dGYgZnJvbSBGb250ZWxsbyBwcm9qZWN0Lmh0dHA6Ly9mb250ZWxsby5jb20AVgBpAGQAZQBvAEoAUwBSAGUAZwB1AGwAYQByAFYAaQBkAGUAbwBKAFMAVgBpAGQAZQBvAEoAUwBWAGUAcgBzAGkAbwBuACAAMQAuADAAVgBpAGQAZQBvAEoAUwBHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAACAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAAAECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUEcGxheQtwbGF5LWNpcmNsZQVwYXVzZQt2b2x1bWUtbXV0ZQp2b2x1bWUtbG93CnZvbHVtZS1taWQLdm9sdW1lLWhpZ2gQZnVsbHNjcmVlbi1lbnRlcg9mdWxsc2NyZWVuLWV4aXQGc3F1YXJlB3NwaW5uZXIJc3VidGl0bGVzCGNhcHRpb25zCGNoYXB0ZXJzBXNoYXJlA2NvZwZjaXJjbGUOY2lyY2xlLW91dGxpbmUTY2lyY2xlLWlubmVyLWNpcmNsZRFhdWRpby1kZXNjcmlwdGlvbgAAAAAA) format('truetype');
 
  font-weight: normal;
 
  font-style: normal; }
 

	
 
.vjs-icon-play, .video-js .vjs-big-play-button, .video-js .vjs-play-control {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-play:before, .video-js .vjs-big-play-button:before, .video-js .vjs-play-control:before {
 
    content: '\f101'; }
 

	
 
.vjs-icon-play-circle {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-play-circle:before {
 
    content: '\f102'; }
 

	
 
.vjs-icon-pause, .video-js .vjs-play-control.vjs-playing {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-pause:before, .video-js .vjs-play-control.vjs-playing:before {
 
    content: '\f103'; }
 

	
 
.vjs-icon-volume-mute, .video-js .vjs-mute-control.vjs-vol-0, .video-js .vjs-volume-menu-button.vjs-vol-0 {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-volume-mute:before, .video-js .vjs-mute-control.vjs-vol-0:before, .video-js .vjs-volume-menu-button.vjs-vol-0:before {
 
    content: '\f104'; }
 

	
 
.vjs-icon-volume-low, .video-js .vjs-mute-control.vjs-vol-1, .video-js .vjs-volume-menu-button.vjs-vol-1 {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-volume-low:before, .video-js .vjs-mute-control.vjs-vol-1:before, .video-js .vjs-volume-menu-button.vjs-vol-1:before {
 
    content: '\f105'; }
 

	
 
.vjs-icon-volume-mid, .video-js .vjs-mute-control.vjs-vol-2, .video-js .vjs-volume-menu-button.vjs-vol-2 {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-volume-mid:before, .video-js .vjs-mute-control.vjs-vol-2:before, .video-js .vjs-volume-menu-button.vjs-vol-2:before {
 
    content: '\f106'; }
 

	
 
.vjs-icon-volume-high, .video-js .vjs-mute-control, .video-js .vjs-volume-menu-button {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-volume-high:before, .video-js .vjs-mute-control:before, .video-js .vjs-volume-menu-button:before {
 
    content: '\f107'; }
 

	
 
.vjs-icon-fullscreen-enter, .video-js .vjs-fullscreen-control {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-fullscreen-enter:before, .video-js .vjs-fullscreen-control:before {
 
    content: '\f108'; }
 

	
 
.vjs-icon-fullscreen-exit, .video-js.vjs-fullscreen .vjs-fullscreen-control {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-fullscreen-exit:before, .video-js.vjs-fullscreen .vjs-fullscreen-control:before {
 
    content: '\f109'; }
 

	
 
.vjs-icon-square {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-square:before {
 
    content: '\f10a'; }
 

	
 
.vjs-icon-spinner {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-spinner:before {
 
    content: '\f10b'; }
 

	
 
.vjs-icon-subtitles, .video-js .vjs-subtitles-button {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-subtitles:before, .video-js .vjs-subtitles-button:before {
 
    content: '\f10c'; }
 

	
 
.vjs-icon-captions, .video-js .vjs-captions-button {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-captions:before, .video-js .vjs-captions-button:before {
 
    content: '\f10d'; }
 

	
 
.vjs-icon-chapters, .video-js .vjs-chapters-button {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-chapters:before, .video-js .vjs-chapters-button:before {
 
    content: '\f10e'; }
 

	
 
.vjs-icon-share {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-share:before {
 
    content: '\f10f'; }
 

	
 
.vjs-icon-cog {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-cog:before {
 
    content: '\f110'; }
 

	
 
.vjs-icon-circle, .video-js .vjs-mouse-display, .video-js .vjs-play-progress, .video-js .vjs-volume-level {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-circle:before, .video-js .vjs-mouse-display:before, .video-js .vjs-play-progress:before, .video-js .vjs-volume-level:before {
 
    content: '\f111'; }
 

	
 
.vjs-icon-circle-outline {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-circle-outline:before {
 
    content: '\f112'; }
 

	
 
.vjs-icon-circle-inner-circle {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-circle-inner-circle:before {
 
    content: '\f113'; }
 

	
 
.vjs-icon-audio-description {
 
  font-family: VideoJS;
 
  font-weight: normal;
 
  font-style: normal; }
 
  .vjs-icon-audio-description:before {
 
    content: '\f114'; }
 

	
 
.video-js {
 
  /* display:inline-block would be closer to the video el's display:inline
 
   * but it results in flash reloading when going into fullscreen [#2205]
 
   */
 
  display: block;
 
  /* Make video.js videos align top when next to video elements */
 
  vertical-align: top;
 
  box-sizing: border-box;
 
  color: #fff;
 
  background-color: #000;
 
  position: relative;
 
  padding: 0;
 
  /* Start with 10px for base font size so other dimensions can be em based and
 
  easily calculable. */
 
  font-size: 10px;
 
  line-height: 1;
 
  /* Provide some basic defaults for fonts */
 
  font-weight: normal;
 
  font-style: normal;
 
  /* Avoiding helvetica: issue #376 */
 
  font-family: Arial, Helvetica, sans-serif;
 
  -webkit-user-select: none;
 
  -moz-user-select: none;
 
  -ms-user-select: none;
 
  user-select: none;
 
  /* Fix for Firefox 9 fullscreen (only if it is enabled). Not needed when
 
  checking fullScreenEnabled. */ }
 
  .video-js:-moz-full-screen {
 
    position: absolute; }
 
  .video-js:-webkit-full-screen {
 
    width: 100% !important;
 
    height: 100% !important; }
 

	
 
/* All elements inherit border-box sizing */
 
.video-js *, .video-js *:before, .video-js *:after {
 
  box-sizing: inherit; }
 

	
 
/* List style reset */
 
.video-js ul {
 
  font-family: inherit;
 
  font-size: inherit;
 
  line-height: inherit;
 
  list-style-position: outside;
 
  /* Important to specify each */
 
  margin-left: 0;
 
  margin-right: 0;
 
  margin-top: 0;
 
  margin-bottom: 0; }
 

	
 
/* Fill the width of the containing element and use padding to create the
 
   desired aspect ratio. Default to 16x9 unless another ratio is given. */
 
/* Not including a default AR in vjs-fluid because it would override
 
   the user set AR injected into the header. */
 
.video-js.vjs-fluid, .video-js.vjs-16-9, .video-js.vjs-4-3 {
 
  width: 100%;
 
  max-width: 100%;
 
  height: 0; }
 

	
 
.video-js.vjs-16-9 {
 
  padding-top: 56.25%; }
 

	
 
.video-js.vjs-4-3 {
 
  padding-top: 75%; }
 

	
 
.video-js.vjs-fill {
 
  width: 100%;
 
  height: 100%; }
 

	
 
/* Playback technology elements expand to the width/height of the containing div
 
<video> or <object> */
 
.video-js .vjs-tech {
 
  position: absolute;
 
  top: 0;
 
  left: 0;
 
  width: 100%;
 
  height: 100%; }
 

	
 
/* Fullscreen Styles */
 
body.vjs-full-window {
 
  padding: 0;
 
  margin: 0;
 
  height: 100%;
 
  /* Fix for IE6 full-window. http://www.cssplay.co.uk/layouts/fixed.html */
 
  overflow-y: auto; }
 

	
 
.vjs-full-window .video-js.vjs-fullscreen {
 
  position: fixed;
 
  overflow: hidden;
 
  z-index: 1000;
 
  left: 0;
 
  top: 0;
 
  bottom: 0;
 
  right: 0; }
 

	
 
.video-js.vjs-fullscreen {
 
  width: 100% !important;
 
  height: 100% !important;
 
  /* Undo any aspect ratio padding for fluid layouts */
 
  padding-top: 0 !important; }
 

	
 
.video-js.vjs-fullscreen.vjs-user-inactive {
 
  cursor: none; }
 

	
 
/* Hide disabled or unsupported controls. */
 
.vjs-hidden {
 
  display: none !important; }
 

	
 
.vjs-lock-showing {
 
  display: block !important;
 
  opacity: 1;
 
  visibility: visible; }
 

	
 
/*  In IE8 w/ no JavaScript (no HTML5 shim), the video tag doesn't register.
 
The .video-js classname on the video tag also isn't considered.
 
This optional paragraph inside the video tag can provide a message to users
 
about what's required to play video. */
 
.vjs-no-js {
 
  padding: 20px;
 
  color: #fff;
 
  background-color: #000;
 
  font-size: 18px;
 
  font-family: Arial, Helvetica, sans-serif;
 
  text-align: center;
 
  width: 300px;
 
  height: 150px;
 
  margin: 0px auto; }
 

	
 
.vjs-no-js a, .vjs-no-js a:visited {
 
  color: #66A8CC; }
 

	
 
.video-js .vjs-big-play-button {
 
  font-size: 3em;
 
  line-height: 1.5em;
 
  height: 1.5em;
 
  width: 3em;
 
  display: block;
 
  z-index: 2;
 
  position: absolute;
 
  top: 10px;
 
  left: 10px;
 
  padding: 0;
 
  cursor: pointer;
 
  opacity: 1;
 
  border: 0.06666em solid #fff;
 
  /* Need a slightly gray bg so it can be seen on black backgrounds */
 
  background-color: #2B333F;
 
  background-color: rgba(43, 51, 63, 0.7);
 
  -webkit-border-radius: 0.3em;
 
  -moz-border-radius: 0.3em;
 
  border-radius: 0.3em;
 
  -webkit-transition: all 0.4s;
 
  -moz-transition: all 0.4s;
 
  -o-transition: all 0.4s;
 
  transition: all 0.4s; }
 

	
 
.vjs-big-play-centered .vjs-big-play-button {
 
  top: 50%;
 
  left: 50%;
 
  margin-top: -0.75em;
 
  margin-left: -1.5em; }
 

	
 
.video-js:hover .vjs-big-play-button, .video-js .vjs-big-play-button:focus {
 
  outline: 0;
 
  border-color: #fff;
 
  background-color: #73859f;
 
  background-color: rgba(115, 133, 159, 0.5);
 
  -webkit-transition: all 0s;
 
  -moz-transition: all 0s;
 
  -o-transition: all 0s;
 
  transition: all 0s; }
 

	
 
.vjs-controls-disabled .vjs-big-play-button, .vjs-has-started .vjs-big-play-button, .vjs-using-native-controls .vjs-big-play-button, .vjs-error .vjs-big-play-button {
 
  display: none; }
 

	
 
.video-js button {
 
  background: none;
 
  border: none;
 
  color: inherit;
 
  display: inline-block;
 
  overflow: visible;
 
  font-size: inherit;
 
  line-height: inherit;
 
  text-transform: none;
 
  text-decoration: none;
 
  transition: none;
 
  -webkit-appearance: none;
 
  -moz-appearance: none;
 
  appearance: none; }
 

	
 
.vjs-menu-button {
 
  cursor: pointer; }
 

	
 
.vjs-menu .vjs-menu-content {
 
  display: block;
 
  padding: 0;
 
  margin: 0;
 
  overflow: auto; }
 

	
 
/* prevent menus from opening while scrubbing (FF, IE) */
 
.vjs-scrubbing .vjs-menu-button:hover .vjs-menu {
 
  display: none; }
 

	
 
.vjs-menu li {
 
  list-style: none;
 
  margin: 0;
 
  padding: 0.2em 0;
 
  line-height: 1.4em;
 
  font-size: 1.2em;
 
  text-align: center;
 
  text-transform: lowercase; }
 

	
 
.vjs-menu li:focus, .vjs-menu li:hover {
 
  outline: 0;
 
  background-color: #73859f;
 
  background-color: rgba(115, 133, 159, 0.5); }
 

	
 
.vjs-menu li.vjs-selected, .vjs-menu li.vjs-selected:focus, .vjs-menu li.vjs-selected:hover {
 
  background-color: #fff;
 
  color: #2B333F; }
 

	
 
.vjs-menu li.vjs-menu-title {
 
  text-align: center;
 
  text-transform: uppercase;
 
  font-size: 1em;
 
  line-height: 2em;
 
  padding: 0;
 
  margin: 0 0 0.3em 0;
 
  font-weight: bold;
 
  cursor: default; }
 

	
 
.vjs-menu-button-popup .vjs-menu {
 
  display: none;
 
  position: absolute;
 
  bottom: 0;
 
  width: 10em;
 
  left: -3em;
 
  /* (Width of vjs-menu - width of button) / 2 */
 
  height: 0em;
 
  margin-bottom: 1.5em;
 
  border-top-color: rgba(43, 51, 63, 0.7);
 
  /* Same as ul background */ }
 

	
 
/* Button Pop-up Menu */
 
.vjs-menu-button-popup .vjs-menu ul {
 
  background-color: #2B333F;
 
  background-color: rgba(43, 51, 63, 0.7);
 
  position: absolute;
 
  width: 100%;
 
  bottom: 1.5em;
 
  /* Same bottom as vjs-menu border-top */
 
  max-height: 15em; }
 

	
 
.vjs-menu-button-popup:hover .vjs-menu, .vjs-menu-button-popup .vjs-menu.vjs-lock-showing {
 
  display: block; }
 

	
 
.video-js .vjs-menu-button-inline {
 
  -webkit-transition: all 0.4s;
 
  -moz-transition: all 0.4s;
 
  -o-transition: all 0.4s;
 
  transition: all 0.4s;
 
  overflow: hidden; }
 

	
 
.video-js .vjs-menu-button-inline:before {
 
  width: 2.222222222em; }
 

	
 
.video-js .vjs-menu-button-inline:hover, .video-js .vjs-menu-button-inline:focus, .video-js .vjs-menu-button-inline.vjs-slider-active, .video-js.vjs-no-flex .vjs-menu-button-inline {
 
  width: 12em; }
 

	
 
.video-js .vjs-menu-button-inline.vjs-slider-active {
 
  -webkit-transition: none;
 
  -moz-transition: none;
 
  -o-transition: none;
 
  transition: none; }
 

	
 
.vjs-menu-button-inline .vjs-menu {
 
  opacity: 0;
 
  height: 100%;
 
  width: auto;
 
  position: absolute;
 
  left: 2.2222222em;
 
  top: 0;
 
  padding: 0;
 
  margin: 0;
 
  -webkit-transition: all 0.4s;
 
  -moz-transition: all 0.4s;
 
  -o-transition: all 0.4s;
 
  transition: all 0.4s; }
 

	
 
.vjs-menu-button-inline:hover .vjs-menu, .vjs-menu-button-inline:focus .vjs-menu, .vjs-menu-button-inline.vjs-slider-active .vjs-menu {
 
  display: block;
 
  opacity: 1; }
 

	
 
.vjs-no-flex .vjs-menu-button-inline .vjs-menu {
 
  display: block;
 
  opacity: 1;
 
  position: relative;
 
  width: auto; }
 

	
 
.vjs-no-flex .vjs-menu-button-inline:hover .vjs-menu, .vjs-no-flex .vjs-menu-button-inline:focus .vjs-menu, .vjs-no-flex .vjs-menu-button-inline.vjs-slider-active .vjs-menu {
 
  width: auto; }
 

	
 
.vjs-menu-button-inline .vjs-menu-content {
 
  width: auto;
 
  height: 100%;
 
  margin: 0;
 
  overflow: hidden; }
 

	
 
.video-js .vjs-control-bar {
 
  display: none;
 
  width: 100%;
 
  position: absolute;
 
  bottom: 0;
 
  left: 0;
 
  right: 0;
 
  height: 3em;
 
  background-color: #2B333F;
 
  background-color: rgba(43, 51, 63, 0.7); }
 

	
 
.vjs-has-started .vjs-control-bar {
 
  display: -webkit-box;
 
  display: -webkit-flex;
 
  display: -ms-flexbox;
 
  display: flex;
 
  visibility: visible;
 
  opacity: 1;
 
  -webkit-transition: visibility 0.1s, opacity 0.1s;
 
  -moz-transition: visibility 0.1s, opacity 0.1s;
 
  -o-transition: visibility 0.1s, opacity 0.1s;
 
  transition: visibility 0.1s, opacity 0.1s; }
 

	
 
.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {
 
  visibility: hidden;
 
  opacity: 0;
 
  -webkit-transition: visibility 1s, opacity 1s;
 
  -moz-transition: visibility 1s, opacity 1s;
 
  -o-transition: visibility 1s, opacity 1s;
 
  transition: visibility 1s, opacity 1s; }
 

	
 
.vjs-controls-disabled .vjs-control-bar, .vjs-using-native-controls .vjs-control-bar, .vjs-error .vjs-control-bar {
 
  /* !important is ok in this context. */
 
  display: none !important; }
 

	
 
.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {
 
  opacity: 1;
 
  visibility: visible; }
 

	
 
/* IE8 is flakey with fonts, and you have to change the actual content to force
 
fonts to show/hide properly.
 
- "\9" IE8 hack didn't work for this
 
- Found in XP IE8 from http://modern.ie. Does not show up in "IE8 mode" in IE9
 
*/
 
@media \0screen {
 
  .vjs-user-inactive.vjs-playing .vjs-control-bar :before {
 
    content: ""; } }
 

	
 
/* IE 8 + 9 Support */
 
.vjs-has-started.vjs-no-flex .vjs-control-bar {
 
  display: table; }
 

	
 
.video-js .vjs-control {
 
  outline: none;
 
  position: relative;
 
  text-align: center;
 
  margin: 0;
 
  padding: 0;
 
  height: 100%;
 
  width: 4em;
 
  -webkit-box-flex: none;
 
  -moz-box-flex: none;
 
  -webkit-flex: none;
 
  -ms-flex: none;
 
  flex: none; }
 
  .video-js .vjs-control:before {
 
    font-size: 1.8em;
 
    line-height: 1.67; }
 

	
 
/* Replacement for focus outline */
 
.video-js .vjs-control:focus:before, .video-js .vjs-control:hover:before, .video-js .vjs-control:focus {
 
  text-shadow: 0em 0em 1em white; }
 

	
 
/* Hide control text visually, but have it available for screenreaders */
 
.video-js .vjs-control-text {
 
  border: 0;
 
  clip: rect(0 0 0 0);
 
  height: 1px;
 
  margin: -1px;
 
  overflow: hidden;
 
  padding: 0;
 
  position: absolute;
 
  width: 1px; }
 

	
 
/* IE 8 + 9 Support */
 
.vjs-no-flex .vjs-control {
 
  display: table-cell;
 
  vertical-align: middle; }
 

	
 
.video-js .vjs-custom-control-spacer {
 
  display: none; }
 

	
 
/**
 
 * Let's talk pixel math!
 
 * Start with a base font size of 10px (assuming that hasn't changed)
 
 * No Hover:
 
 * - Progress holder is 3px
 
 * - Progress handle is 9px
 
 * - Progress handle is pulled up 3px to center it.
 
 *
 
 * Hover:
 
 * - Progress holder becomes 5px
 
 * - Progress handle becomes 15px
 
 * - Progress handle is pulled up 5px to center it
 
 */
 
.video-js .vjs-progress-control {
 
  -webkit-box-flex: auto;
 
  -moz-box-flex: auto;
 
  -webkit-flex: auto;
 
  -ms-flex: auto;
 
  flex: auto;
 
  display: -webkit-box;
 
  display: -webkit-flex;
 
  display: -ms-flexbox;
 
  display: flex;
 
  -webkit-box-align: center;
 
  -webkit-align-items: center;
 
  -ms-flex-align: center;
 
  align-items: center; }
 

	
 
.vjs-live .vjs-progress-control {
 
  display: none; }
 

	
 
/* Box containing play and load progresses. Also acts as seek scrubber. */
 
.video-js .vjs-progress-holder {
 
  -webkit-box-flex: auto;
 
  -moz-box-flex: auto;
 
  -webkit-flex: auto;
 
  -ms-flex: auto;
 
  flex: auto;
 
  -webkit-transition: all 0.2s;
 
  -moz-transition: all 0.2s;
 
  -o-transition: all 0.2s;
 
  transition: all 0.2s;
 
  height: 0.3em; }
 

	
 
/* We need an increased hit area on hover */
 
.video-js .vjs-progress-control:hover .vjs-progress-holder {
 
  font-size: 1.6666666667em; }
 

	
 
/* Also show the current time tooltip */
 
.video-js .vjs-progress-control:hover .vjs-mouse-display:after, .video-js .vjs-progress-control:hover .vjs-play-progress:after {
 
  display: block;
 
  /* If we let the font size grow as much as everything else, the current time tooltip ends up
 
     ginormous. If you'd like to enable the current time tooltip all the time, this should be disabled
 
     to avoid a weird hitch when you roll off the hover. */
 
  font-size: 0.6em; }
 

	
 
/* Progress Bars */
 
.video-js .vjs-progress-holder .vjs-play-progress, .video-js .vjs-progress-holder .vjs-load-progress, .video-js .vjs-progress-holder .vjs-load-progress div {
 
  position: absolute;
 
  display: block;
 
  height: 0.3em;
 
  margin: 0;
 
  padding: 0;
 
  /* updated by javascript during playback */
 
  width: 0;
 
  /* Needed for IE6 */
 
  left: 0;
 
  top: 0; }
 

	
 
.video-js .vjs-mouse-display:before {
 
  display: none; }
 

	
 
.video-js .vjs-play-progress {
 
  background-color: #fff; }
 
  .video-js .vjs-play-progress:before {
 
    position: absolute;
 
    top: -0.3333333333em;
 
    right: -0.5em;
 
    font-size: 0.9em; }
 

	
 
.video-js .vjs-mouse-display:after, .video-js .vjs-play-progress:after {
 
  /* By default this is hidden and only shown when hovering over the progress control */
 
  display: none;
 
  position: absolute;
 
  top: -2.4em;
 
  right: -1.5em;
 
  font-size: 0.9em;
 
  color: #000;
 
  content: attr(data-current-time);
 
  padding: 0.2em 0.5em;
 
  background-color: #fff;
 
  background-color: rgba(255, 255, 255, 0.8);
 
  -webkit-border-radius: 0.3em;
 
  -moz-border-radius: 0.3em;
 
  border-radius: 0.3em; }
 

	
 
.video-js .vjs-play-progress:before, .video-js .vjs-play-progress:after {
 
  z-index: 1; }
 

	
 
.video-js .vjs-load-progress {
 
  /* For IE8 we'll lighten the color */
 
  background: ligthen(#73859f, 25%);
 
  /* Otherwise we'll rely on stacked opacities */
 
  background: rgba(115, 133, 159, 0.5); }
 

	
 
/* there are child elements of the load progress bar that represent the
 
specific time ranges that have been buffered */
 
.video-js .vjs-load-progress div {
 
  /* For IE8 we'll lighten the color */
 
  background: ligthen(#73859f, 50%);
 
  /* Otherwise we'll rely on stacked opacities */
 
  background: rgba(115, 133, 159, 0.75); }
 

	
 
.video-js.vjs-no-flex .vjs-progress-control {
 
  width: auto; }
 

	
 
.video-js .vjs-progress-control .vjs-mouse-display {
 
  display: none;
 
  position: absolute;
 
  width: 1px;
 
  height: 100%;
 
  background-color: #000;
 
  z-index: 1; }
 

	
 
.vjs-no-flex .vjs-progress-control .vjs-mouse-display {
 
  z-index: 0; }
 

	
 
.video-js .vjs-progress-control:hover .vjs-mouse-display {
 
  display: block; }
 

	
 
.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display, .video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display:after {
 
  visibility: hidden;
 
  opacity: 0;
 
  -webkit-transition: visibility 1s, opacity 1s;
 
  -moz-transition: visibility 1s, opacity 1s;
 
  -o-transition: visibility 1s, opacity 1s;
 
  transition: visibility 1s, opacity 1s; }
 

	
 
.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display, .video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display:after {
 
  display: none; }
 

	
 
.video-js .vjs-progress-control .vjs-mouse-display:after {
 
  color: #fff;
 
  background-color: #000;
 
  background-color: rgba(0, 0, 0, 0.8); }
 

	
 
.video-js .vjs-slider {
 
  outline: 0;
 
  position: relative;
 
  cursor: pointer;
 
  padding: 0;
 
  margin: 0 0.45em 0 0.45em;
 
  background-color: #73859f;
 
  background-color: rgba(115, 133, 159, 0.5); }
 

	
 
.video-js .vjs-slider:focus {
 
  text-shadow: 0em 0em 1em white;
 
  -webkit-box-shadow: 0 0 1em #fff;
 
  -moz-box-shadow: 0 0 1em #fff;
 
  box-shadow: 0 0 1em #fff; }
 

	
 
.video-js .vjs-mute-control, .video-js .vjs-volume-menu-button {
 
  cursor: pointer;
 
  -webkit-box-flex: none;
 
  -moz-box-flex: none;
 
  -webkit-flex: none;
 
  -ms-flex: none;
 
  flex: none; }
 

	
 
.video-js .vjs-volume-control {
 
  width: 5em;
 
  -webkit-box-flex: none;
 
  -moz-box-flex: none;
 
  -webkit-flex: none;
 
  -ms-flex: none;
 
  flex: none;
 
  display: -webkit-box;
 
  display: -webkit-flex;
 
  display: -ms-flexbox;
 
  display: flex;
 
  -webkit-box-align: center;
 
  -webkit-align-items: center;
 
  -ms-flex-align: center;
 
  align-items: center; }
 

	
 
.video-js .vjs-volume-bar {
 
  margin: 1.35em; }
 

	
 
.vjs-volume-bar.vjs-slider-horizontal {
 
  width: 5em;
 
  height: 0.3em; }
 

	
 
.vjs-volume-bar.vjs-slider-vertical {
 
  width: 0.3em;
 
  height: 5em; }
 

	
 
.video-js .vjs-volume-level {
 
  position: absolute;
 
  bottom: 0;
 
  left: 0;
 
  background-color: #fff; }
 
  .video-js .vjs-volume-level:before {
 
    position: absolute;
 
    font-size: 0.9em; }
 

	
 
.vjs-slider-vertical .vjs-volume-level {
 
  width: 0.3em; }
 
  .vjs-slider-vertical .vjs-volume-level:before {
 
    top: -0.5em;
 
    left: -0.3em; }
 

	
 
.vjs-slider-horizontal .vjs-volume-level {
 
  height: 0.3em; }
 
  .vjs-slider-horizontal .vjs-volume-level:before {
 
    top: -0.3em;
 
    right: -0.5em; }
 

	
 
/* Assumes volume starts at 1.0. */
 
.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level {
 
  height: 100%; }
 

	
 
.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level {
 
  width: 100%; }
 

	
 
/* The volume menu button is like menu buttons (captions/subtitles) but works
 
a little differently. It needs to be possible to tab to the volume slider
 
without hitting space bar on the menu button. To do this we're not using
 
display:none to hide the slider menu by default, and instead setting the
 
width and height to zero. */
 
.vjs-menu-button-popup.vjs-volume-menu-button .vjs-menu {
 
  display: block;
 
  width: 0;
 
  height: 0;
 
  border-top-color: transparent; }
 

	
 
.vjs-menu-button-popup.vjs-volume-menu-button-vertical .vjs-menu {
 
  left: 0.5em; }
 

	
 
.vjs-menu-button-popup.vjs-volume-menu-button-horizontal .vjs-menu {
 
  left: -2em; }
 

	
 
.vjs-menu-button-popup.vjs-volume-menu-button .vjs-menu-content {
 
  height: 0;
 
  width: 0;
 
  overflow-x: hidden;
 
  overflow-y: hidden; }
 

	
 
.vjs-volume-menu-button-vertical:hover .vjs-menu-content, .vjs-volume-menu-button-vertical .vjs-lock-showing .vjs-menu-content {
 
  height: 8em;
 
  width: 2.9em; }
 

	
 
.vjs-volume-menu-button-horizontal:hover .vjs-menu-content, .vjs-volume-menu-button-horizontal .vjs-lock-showing .vjs-menu-content {
 
  height: 2.9em;
 
  width: 8em; }
 

	
 
.vjs-volume-menu-button.vjs-menu-button-inline .vjs-menu-content {
 
  /* An inline volume should never have a menu background color.
 
     This protects it from external changes to background colors. */
 
  background-color: transparent !important; }
 

	
 
.vjs-poster {
 
  display: inline-block;
 
  vertical-align: middle;
 
  background-repeat: no-repeat;
 
  background-position: 50% 50%;
 
  background-size: contain;
 
  cursor: pointer;
 
  margin: 0;
 
  padding: 0;
 
  position: absolute;
 
  top: 0;
 
  right: 0;
 
  bottom: 0;
 
  left: 0;
 
  height: 100%; }
 

	
 
/* Used for IE8 fallback */
 
.vjs-poster img {
 
  display: block;
 
  vertical-align: middle;
 
  margin: 0 auto;
 
  max-height: 100%;
 
  padding: 0;
 
  width: 100%; }
 

	
 
/* Hide the poster after the video has started playing */
 
.vjs-has-started .vjs-poster {
 
  display: none; }
 

	
 
/* Don't hide the poster if we're playing audio */
 
.vjs-audio.vjs-has-started .vjs-poster {
 
  display: block; }
 

	
 
/* Hide the poster when controls are disabled because it's clickable
 
and the native poster can take over */
 
.vjs-controls-disabled .vjs-poster {
 
  display: none; }
 

	
 
/* Hide the poster when native controls are used otherwise it covers them */
 
.vjs-using-native-controls .vjs-poster {
 
  display: none; }
 

	
 
.video-js .vjs-live-control {
 
  display: -webkit-box;
 
  display: -webkit-flex;
 
  display: -ms-flexbox;
 
  display: flex;
 
  -webkit-box-align: flex-start;
 
  -webkit-align-items: flex-start;
 
  -ms-flex-align: flex-start;
 
  align-items: flex-start;
 
  -webkit-box-flex: auto;
 
  -moz-box-flex: auto;
 
  -webkit-flex: auto;
 
  -ms-flex: auto;
 
  flex: auto;
 
  font-size: 1em;
 
  line-height: 3em; }
 

	
 
.vjs-no-flex .vjs-live-control {
 
  display: table-cell;
 
  width: auto;
 
  text-align: left; }
 

	
 
.video-js .vjs-time-control {
 
  -webkit-box-flex: none;
 
  -moz-box-flex: none;
 
  -webkit-flex: none;
 
  -ms-flex: none;
 
  flex: none;
 
  font-size: 1em;
 
  line-height: 3em; }
 

	
 
.vjs-live .vjs-time-control {
 
  display: none; }
 

	
 
/* We need the extra specificity that referencing .vjs-no-flex provides. */
 
.video-js .vjs-current-time, .vjs-no-flex .vjs-current-time {
 
  display: none; }
 

	
 
.video-js .vjs-duration, .vjs-no-flex .vjs-duration {
 
  display: none; }
 

	
 
.vjs-time-divider {
 
  display: none;
 
  line-height: 3em; }
 

	
 
.vjs-live .vjs-time-divider {
 
  display: none; }
 

	
 
.video-js .vjs-play-control {
 
  cursor: pointer;
 
  -webkit-box-flex: none;
 
  -moz-box-flex: none;
 
  -webkit-flex: none;
 
  -ms-flex: none;
 
  flex: none; }
 

	
 
.vjs-text-track-display {
 
  position: absolute;
 
  bottom: 3em;
 
  left: 0;
 
  right: 0;
 
  top: 0;
 
  pointer-events: none; }
 

	
 
/* Move captions down when controls aren't being shown */
 
.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display {
 
  bottom: 1em; }
 

	
 
/* Individual tracks */
 
.video-js .vjs-text-track {
 
  font-size: 1.4em;
 
  text-align: center;
 
  margin-bottom: 0.1em;
 
  /* Transparent black background, or fallback to all black (oldIE) */
 
  background-color: #000;
 
  background-color: rgba(0, 0, 0, 0.5); }
 

	
 
.vjs-subtitles {
 
  color: #fff;
 
  /* Subtitles are white */ }
 

	
 
.vjs-captions {
 
  color: #fc6;
 
  /* Captions are yellow */ }
 

	
 
.vjs-tt-cue {
 
  display: block; }
 

	
 
.video-js .vjs-fullscreen-control {
 
  width: 3.8em;
 
  cursor: pointer;
 
  -webkit-box-flex: none;
 
  -moz-box-flex: none;
 
  -webkit-flex: none;
 
  -ms-flex: none;
 
  flex: none; }
 

	
 
/* Switch to the exit icon when the player is in fullscreen */
 
.vjs-playback-rate .vjs-playback-rate-value {
 
  font-size: 1.5em;
 
  line-height: 2;
 
  position: absolute;
 
  top: 0;
 
  left: 0;
 
  width: 100%;
 
  height: 100%;
 
  text-align: center; }
 

	
 
.vjs-playback-rate .vjs-menu {
 
  width: 4em;
 
  left: 0em; }
 

	
 
.vjs-error-display {
 
  display: none; }
 

	
 
.vjs-error .vjs-error-display {
 
  display: block;
 
  position: absolute;
 
  left: 0;
 
  top: 0;
 
  width: 100%;
 
  height: 100%; }
 

	
 
.vjs-error .vjs-error-display:before {
 
  content: 'X';
 
  font-family: Arial, Helvetica, sans-serif;
 
  font-size: 4em;
 
  color: #fff;
 
  /* In order to center the play icon vertically we need to set the line height
 
  to the same as the button height */
 
  line-height: 1;
 
  text-shadow: 0.05em 0.05em 0.1em #000;
 
  text-align: center;
 
  /* Needed for IE8 */
 
  vertical-align: middle;
 
  position: absolute;
 
  left: 0;
 
  top: 50%;
 
  margin-top: -0.5em;
 
  width: 100%; }
 

	
 
.vjs-error-display div {
 
  position: absolute;
 
  bottom: 1em;
 
  right: 0;
 
  left: 0;
 
  font-size: 1.4em;
 
  text-align: center;
 
  padding: 3px;
 
  background-color: #000;
 
  background-color: rgba(0, 0, 0, 0.5); }
 

	
 
.vjs-error-display a, .vjs-error-display a:visited {
 
  color: #66A8CC; }
 

	
 
.vjs-loading-spinner {
 
  display: none;
 
  position: absolute;
 
  top: 50%;
 
  left: 50%;
 
  margin: -25px 0 0 -25px;
 
  opacity: 0.85;
 
  /* Need to fix centered page layouts */
 
  text-align: left;
 
  border: 6px solid rgba(43, 51, 63, 0.7);
 
  box-sizing: border-box;
 
  background-clip: padding-box;
 
  width: 50px;
 
  height: 50px;
 
  border-radius: 25px; }
 

	
 
.vjs-seeking .vjs-loading-spinner, .vjs-waiting .vjs-loading-spinner {
 
  display: block; }
 

	
 
.vjs-loading-spinner:before, .vjs-loading-spinner:after {
 
  content: "";
 
  position: absolute;
 
  margin: -6px;
 
  box-sizing: inherit;
 
  width: inherit;
 
  height: inherit;
 
  border-radius: inherit;
 
  /* Keep 100% opacity so they don't show through each other */
 
  opacity: 1;
 
  border: inherit;
 
  border-color: transparent;
 
  border-top-color: white; }
 

	
 
/* only animate when showing because it can be processor heavy */
 
.vjs-seeking .vjs-loading-spinner:before, .vjs-seeking .vjs-loading-spinner:after, .vjs-waiting .vjs-loading-spinner:before, .vjs-waiting .vjs-loading-spinner:after {
 
  -webkit-animation: vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite, vjs-spinner-fade 1.1s linear infinite;
 
  animation: vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite, vjs-spinner-fade 1.1s linear infinite; }
 

	
 
.vjs-seeking .vjs-loading-spinner:before, .vjs-waiting .vjs-loading-spinner:before {
 
  border-top-color: white; }
 

	
 
.vjs-seeking .vjs-loading-spinner:after, .vjs-waiting .vjs-loading-spinner:after {
 
  border-top-color: white;
 
  -webkit-animation-delay: 0.44s;
 
  animation-delay: 0.44s; }
 

	
 
@keyframes vjs-spinner-spin {
 
  100% {
 
    transform: rotate(360deg); } }
 

	
 
@-webkit-keyframes vjs-spinner-spin {
 
  100% {
 
    -webkit-transform: rotate(360deg); } }
 

	
 
@keyframes vjs-spinner-fade {
 
  0% {
 
    border-top-color: #73859f; }
 

	
 
  20% {
 
    border-top-color: #73859f; }
 

	
 
  35% {
 
    border-top-color: white; }
 

	
 
  60% {
 
    border-top-color: #73859f; }
 

	
 
  100% {
 
    border-top-color: #73859f; } }
 

	
 
@-webkit-keyframes vjs-spinner-fade {
 
  0% {
 
    border-top-color: #73859f; }
 

	
 
  20% {
 
    border-top-color: #73859f; }
 

	
 
  35% {
 
    border-top-color: white; }
 

	
 
  60% {
 
    border-top-color: #73859f; }
 

	
 
  100% {
 
    border-top-color: #73859f; } }
 

	
 
.vjs-chapters-button .vjs-menu {
 
  left: -10em;
 
  /* (Width of vjs-menu - width of vjs-control) / 2 */
 
  width: 0; }
 

	
 
.vjs-chapters-button .vjs-menu ul {
 
  width: 24em; }
 

	
 
.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-custom-control-spacer {
 
  -webkit-box-flex: auto;
 
  -moz-box-flex: auto;
 
  -webkit-flex: auto;
 
  -ms-flex: auto;
 
  flex: auto; }
 
.video-js.vjs-layout-tiny:not(.vjs-fullscreen).vjs-no-flex .vjs-custom-control-spacer {
 
  width: auto; }
 
.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-current-time, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-captions-button, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-time-divider, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-progress-control, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-duration, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-remaining-time, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-playback-rate, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-mute-control, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-volume-control, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-chapters-button, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-captions-button, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-subtitles-button, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-volume-menu-button {
 
  display: none; }
 

	
 
.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-current-time, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-captions-button, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-time-divider, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-duration, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-remaining-time, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-playback-rate, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-captions-button, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-mute-control, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-volume-control, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-chapters-button, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-subtitles-button, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-volume-button, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-fullscreen-control {
 
  display: none; }
 

	
 
.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-current-time, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-captions-button, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-time-divider, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-duration, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-remaining-time, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-playback-rate, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-mute-control, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-volume-control, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-chapters-button, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-subtitles-button {
 
  display: none; }
 

	
 
.vjs-caption-settings {
 
  position: relative;
 
  top: 1em;
 
  background-color: #2B333F;
 
  background-color: rgba(43, 51, 63, 0.75);
 
  color: #fff;
 
  margin: 0 auto;
 
  padding: 0.5em;
 
  height: 15em;
 
  font-size: 12px;
 
  width: 40em; }
 

	
 
.vjs-caption-settings .vjs-tracksettings {
 
  top: 0;
 
  bottom: 2em;
 
  left: 0;
 
  right: 0;
 
  position: absolute;
 
  overflow: auto; }
 

	
 
.vjs-caption-settings .vjs-tracksettings-colors, .vjs-caption-settings .vjs-tracksettings-font {
 
  float: left; }
 

	
 
.vjs-caption-settings .vjs-tracksettings-colors:after, .vjs-caption-settings .vjs-tracksettings-font:after, .vjs-caption-settings .vjs-tracksettings-controls:after {
 
  clear: both; }
 

	
 
.vjs-caption-settings .vjs-tracksettings-controls {
 
  position: absolute;
 
  bottom: 1em;
 
  right: 1em; }
 

	
 
.vjs-caption-settings .vjs-tracksetting {
 
  margin: 5px;
 
  padding: 3px;
 
  min-height: 40px; }
 

	
 
.vjs-caption-settings .vjs-tracksetting label {
 
  display: block;
 
  width: 100px;
 
  margin-bottom: 5px; }
 

	
 
.vjs-caption-settings .vjs-tracksetting span {
 
  display: inline;
 
  margin-left: 5px; }
 

	
 
.vjs-caption-settings .vjs-tracksetting > div {
 
  margin-bottom: 5px;
 
  min-height: 20px; }
 

	
 
.vjs-caption-settings .vjs-tracksetting > div:last-child {
 
  margin-bottom: 0;
 
  padding-bottom: 0;
 
  min-height: 0; }
 

	
 
.vjs-caption-settings label > input {
 
  margin-right: 10px; }
 

	
 
.vjs-caption-settings input[type="button"] {
 
  width: 40px;
 
  height: 40px; }
ennstatus/static/js/video.js/dist/video-js.min.css
Show inline comments
 
new file 100644
 
.video-js .vjs-big-play-button:before,.video-js .vjs-control:before{position:absolute;top:0;left:0;width:100%;height:100%;text-align:center}@font-face{font-family:VideoJS;src:url(font/VideoJS.eot?) format('eot')}@font-face{font-family:VideoJS;src:url(data:application/font-woff;charset=utf-8;base64,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) format('woff'),url(data:application/x-font-ttf;charset=utf-8;base64,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) format('truetype');font-weight:400;font-style:normal}.vjs-icon-play,.video-js .vjs-big-play-button,.video-js .vjs-play-control{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-play:before,.video-js .vjs-big-play-button:before,.video-js .vjs-play-control:before{content:'\f101'}.vjs-icon-play-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-play-circle:before{content:'\f102'}.vjs-icon-pause,.video-js .vjs-play-control.vjs-playing{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-pause:before,.video-js .vjs-play-control.vjs-playing:before{content:'\f103'}.vjs-icon-volume-mute,.video-js .vjs-mute-control.vjs-vol-0,.video-js .vjs-volume-menu-button.vjs-vol-0{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-mute:before,.video-js .vjs-mute-control.vjs-vol-0:before,.video-js .vjs-volume-menu-button.vjs-vol-0:before{content:'\f104'}.vjs-icon-volume-low,.video-js .vjs-mute-control.vjs-vol-1,.video-js .vjs-volume-menu-button.vjs-vol-1{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-low:before,.video-js .vjs-mute-control.vjs-vol-1:before,.video-js .vjs-volume-menu-button.vjs-vol-1:before{content:'\f105'}.vjs-icon-volume-mid,.video-js .vjs-mute-control.vjs-vol-2,.video-js .vjs-volume-menu-button.vjs-vol-2{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-mid:before,.video-js .vjs-mute-control.vjs-vol-2:before,.video-js .vjs-volume-menu-button.vjs-vol-2:before{content:'\f106'}.vjs-icon-volume-high,.video-js .vjs-mute-control,.video-js .vjs-volume-menu-button{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-high:before,.video-js .vjs-mute-control:before,.video-js .vjs-volume-menu-button:before{content:'\f107'}.vjs-icon-fullscreen-enter,.video-js .vjs-fullscreen-control{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-fullscreen-enter:before,.video-js .vjs-fullscreen-control:before{content:'\f108'}.vjs-icon-fullscreen-exit,.video-js.vjs-fullscreen .vjs-fullscreen-control{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-fullscreen-exit:before,.video-js.vjs-fullscreen .vjs-fullscreen-control:before{content:'\f109'}.vjs-icon-square{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-square:before{content:'\f10a'}.vjs-icon-spinner{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-spinner:before{content:'\f10b'}.vjs-icon-subtitles,.video-js .vjs-subtitles-button{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-subtitles:before,.video-js .vjs-subtitles-button:before{content:'\f10c'}.vjs-icon-captions,.video-js .vjs-captions-button{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-captions:before,.video-js .vjs-captions-button:before{content:'\f10d'}.vjs-icon-chapters,.video-js .vjs-chapters-button{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-chapters:before,.video-js .vjs-chapters-button:before{content:'\f10e'}.vjs-icon-share{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-share:before{content:'\f10f'}.vjs-icon-cog{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cog:before{content:'\f110'}.vjs-icon-circle,.video-js .vjs-mouse-display,.video-js .vjs-play-progress,.video-js .vjs-volume-level{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle:before,.video-js .vjs-mouse-display:before,.video-js .vjs-play-progress:before,.video-js .vjs-volume-level:before{content:'\f111'}.vjs-icon-circle-outline{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-outline:before{content:'\f112'}.vjs-icon-circle-inner-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-inner-circle:before{content:'\f113'}.vjs-icon-audio-description{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-audio-description:before{content:'\f114'}.video-js{display:block;vertical-align:top;box-sizing:border-box;color:#fff;background-color:#000;position:relative;padding:0;font-size:10px;line-height:1;font-weight:400;font-style:normal;font-family:Arial,Helvetica,sans-serif;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.video-js:-moz-full-screen{position:absolute}.video-js:-webkit-full-screen{width:100%!important;height:100%!important}.video-js *,.video-js :before,.video-js :after{box-sizing:inherit}.video-js ul{font-family:inherit;font-size:inherit;line-height:inherit;list-style-position:outside;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}.video-js.vjs-fluid,.video-js.vjs-16-9,.video-js.vjs-4-3{width:100%;max-width:100%;height:0}.video-js.vjs-16-9{padding-top:56.25%}.video-js.vjs-4-3{padding-top:75%}.video-js.vjs-fill{width:100%;height:100%}.video-js .vjs-tech{position:absolute;top:0;left:0;width:100%;height:100%}body.vjs-full-window{padding:0;margin:0;height:100%;overflow-y:auto}.vjs-full-window .video-js.vjs-fullscreen{position:fixed;overflow:hidden;z-index:1000;left:0;top:0;bottom:0;right:0}.video-js.vjs-fullscreen{width:100%!important;height:100%!important;padding-top:0!important}.video-js.vjs-fullscreen.vjs-user-inactive{cursor:none}.vjs-hidden{display:none!important}.vjs-lock-showing{display:block!important;opacity:1;visibility:visible}.vjs-no-js{padding:20px;color:#fff;background-color:#000;font-size:18px;font-family:Arial,Helvetica,sans-serif;text-align:center;width:300px;height:150px;margin:0 auto}.vjs-no-js a,.vjs-no-js a:visited{color:#66A8CC}.video-js .vjs-big-play-button{font-size:3em;line-height:1.5em;height:1.5em;width:3em;display:block;z-index:2;position:absolute;top:10px;left:10px;padding:0;cursor:pointer;opacity:1;border:.06666em solid #fff;background-color:#2B333F;background-color:rgba(43,51,63,.7);-webkit-border-radius:.3em;-moz-border-radius:.3em;border-radius:.3em;-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;transition:all .4s}.vjs-big-play-centered .vjs-big-play-button{top:50%;left:50%;margin-top:-.75em;margin-left:-1.5em}.video-js:hover .vjs-big-play-button,.video-js .vjs-big-play-button:focus{outline:0;border-color:#fff;background-color:#73859f;background-color:rgba(115,133,159,.5);-webkit-transition:all 0s;-moz-transition:all 0s;-o-transition:all 0s;transition:all 0s}.vjs-controls-disabled .vjs-big-play-button,.vjs-has-started .vjs-big-play-button,.vjs-using-native-controls .vjs-big-play-button,.vjs-error .vjs-big-play-button{display:none}.video-js button{background:0 0;border:0;color:inherit;display:inline-block;overflow:visible;font-size:inherit;line-height:inherit;text-transform:none;text-decoration:none;transition:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.vjs-menu-button{cursor:pointer}.vjs-menu .vjs-menu-content{display:block;padding:0;margin:0;overflow:auto}.vjs-scrubbing .vjs-menu-button:hover .vjs-menu{display:none}.vjs-menu li{list-style:none;margin:0;padding:.2em 0;line-height:1.4em;font-size:1.2em;text-align:center;text-transform:lowercase}.vjs-menu li:focus,.vjs-menu li:hover{outline:0;background-color:#73859f;background-color:rgba(115,133,159,.5)}.vjs-menu li.vjs-selected,.vjs-menu li.vjs-selected:focus,.vjs-menu li.vjs-selected:hover{background-color:#fff;color:#2B333F}.vjs-menu li.vjs-menu-title{text-align:center;text-transform:uppercase;font-size:1em;line-height:2em;padding:0;margin:0 0 .3em;font-weight:700;cursor:default}.vjs-menu-button-popup .vjs-menu{display:none;position:absolute;bottom:0;width:10em;left:-3em;height:0;margin-bottom:1.5em;border-top-color:rgba(43,51,63,.7)}.vjs-menu-button-popup .vjs-menu ul{background-color:#2B333F;background-color:rgba(43,51,63,.7);position:absolute;width:100%;bottom:1.5em;max-height:15em}.vjs-menu-button-popup:hover .vjs-menu,.vjs-menu-button-popup .vjs-menu.vjs-lock-showing{display:block}.video-js .vjs-menu-button-inline{-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;transition:all .4s;overflow:hidden}.video-js .vjs-menu-button-inline:before{width:2.222222222em}.video-js .vjs-menu-button-inline:hover,.video-js .vjs-menu-button-inline:focus,.video-js .vjs-menu-button-inline.vjs-slider-active,.video-js.vjs-no-flex .vjs-menu-button-inline{width:12em}.video-js .vjs-menu-button-inline.vjs-slider-active{-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.vjs-menu-button-inline .vjs-menu{opacity:0;height:100%;width:auto;position:absolute;left:2.2222222em;top:0;padding:0;margin:0;-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;transition:all .4s}.vjs-menu-button-inline:hover .vjs-menu,.vjs-menu-button-inline:focus .vjs-menu,.vjs-menu-button-inline.vjs-slider-active .vjs-menu{display:block;opacity:1}.vjs-no-flex .vjs-menu-button-inline .vjs-menu{display:block;opacity:1;position:relative;width:auto}.vjs-no-flex .vjs-menu-button-inline:hover .vjs-menu,.vjs-no-flex .vjs-menu-button-inline:focus .vjs-menu,.vjs-no-flex .vjs-menu-button-inline.vjs-slider-active .vjs-menu{width:auto}.vjs-menu-button-inline .vjs-menu-content{width:auto;height:100%;margin:0;overflow:hidden}.video-js .vjs-control-bar{display:none;width:100%;position:absolute;bottom:0;left:0;right:0;height:3em;background-color:#2B333F;background-color:rgba(43,51,63,.7)}.vjs-has-started .vjs-control-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;visibility:visible;opacity:1;-webkit-transition:visibility .1s,opacity .1s;-moz-transition:visibility .1s,opacity .1s;-o-transition:visibility .1s,opacity .1s;transition:visibility .1s,opacity .1s}.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{visibility:hidden;opacity:0;-webkit-transition:visibility 1s,opacity 1s;-moz-transition:visibility 1s,opacity 1s;-o-transition:visibility 1s,opacity 1s;transition:visibility 1s,opacity 1s}.vjs-controls-disabled .vjs-control-bar,.vjs-using-native-controls .vjs-control-bar,.vjs-error .vjs-control-bar{display:none!important}.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{opacity:1;visibility:visible}@media \0screen{.vjs-user-inactive.vjs-playing .vjs-control-bar :before{content:""}}.vjs-has-started.vjs-no-flex .vjs-control-bar{display:table}.video-js .vjs-control{outline:0;position:relative;text-align:center;margin:0;padding:0;height:100%;width:4em;-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none;-ms-flex:none;flex:none}.video-js .vjs-control:before{font-size:1.8em;line-height:1.67}.video-js .vjs-control:focus:before,.video-js .vjs-control:hover:before,.video-js .vjs-control:focus{text-shadow:0 0 1em #fff}.video-js .vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.vjs-no-flex .vjs-control{display:table-cell;vertical-align:middle}.video-js .vjs-custom-control-spacer{display:none}.video-js .vjs-progress-control{-webkit-box-flex:auto;-moz-box-flex:auto;-webkit-flex:auto;-ms-flex:auto;flex:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.vjs-live .vjs-progress-control{display:none}.video-js .vjs-progress-holder{-webkit-box-flex:auto;-moz-box-flex:auto;-webkit-flex:auto;-ms-flex:auto;flex:auto;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s;height:.3em}.video-js .vjs-progress-control:hover .vjs-progress-holder{font-size:1.6666666667em}.video-js .vjs-progress-control:hover .vjs-mouse-display:after,.video-js .vjs-progress-control:hover .vjs-play-progress:after{display:block;font-size:.6em}.video-js .vjs-progress-holder .vjs-play-progress,.video-js .vjs-progress-holder .vjs-load-progress,.video-js .vjs-progress-holder .vjs-load-progress div{position:absolute;display:block;height:.3em;margin:0;padding:0;width:0;left:0;top:0}.video-js .vjs-mouse-display:before{display:none}.video-js .vjs-play-progress{background-color:#fff}.video-js .vjs-play-progress:before{position:absolute;top:-.3333333333em;right:-.5em;font-size:.9em}.video-js .vjs-mouse-display:after,.video-js .vjs-play-progress:after{display:none;position:absolute;top:-2.4em;right:-1.5em;font-size:.9em;color:#000;content:attr(data-current-time);padding:.2em .5em;background-color:#fff;background-color:rgba(255,255,255,.8);-webkit-border-radius:.3em;-moz-border-radius:.3em;border-radius:.3em}.video-js .vjs-play-progress:before,.video-js .vjs-play-progress:after{z-index:1}.video-js .vjs-load-progress{background:ligthen(#73859f,25%);background:rgba(115,133,159,.5)}.video-js .vjs-load-progress div{background:ligthen(#73859f,50%);background:rgba(115,133,159,.75)}.video-js.vjs-no-flex .vjs-progress-control{width:auto}.video-js .vjs-progress-control .vjs-mouse-display{display:none;position:absolute;width:1px;height:100%;background-color:#000;z-index:1}.vjs-no-flex .vjs-progress-control .vjs-mouse-display{z-index:0}.video-js .vjs-progress-control:hover .vjs-mouse-display{display:block}.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display,.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display:after{visibility:hidden;opacity:0;-webkit-transition:visibility 1s,opacity 1s;-moz-transition:visibility 1s,opacity 1s;-o-transition:visibility 1s,opacity 1s;transition:visibility 1s,opacity 1s}.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display,.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display:after{display:none}.video-js .vjs-progress-control .vjs-mouse-display:after{color:#fff;background-color:#000;background-color:rgba(0,0,0,.8)}.video-js .vjs-slider{outline:0;position:relative;cursor:pointer;padding:0;margin:0 .45em;background-color:#73859f;background-color:rgba(115,133,159,.5)}.video-js .vjs-slider:focus{text-shadow:0 0 1em #fff;-webkit-box-shadow:0 0 1em #fff;-moz-box-shadow:0 0 1em #fff;box-shadow:0 0 1em #fff}.video-js .vjs-mute-control,.video-js .vjs-volume-menu-button{cursor:pointer;-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none;-ms-flex:none;flex:none}.video-js .vjs-volume-control{width:5em;-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none;-ms-flex:none;flex:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.video-js .vjs-volume-bar{margin:1.35em}.vjs-volume-bar.vjs-slider-horizontal{width:5em;height:.3em}.vjs-volume-bar.vjs-slider-vertical{width:.3em;height:5em}.video-js .vjs-volume-level{position:absolute;bottom:0;left:0;background-color:#fff}.video-js .vjs-volume-level:before{position:absolute;font-size:.9em}.vjs-slider-vertical .vjs-volume-level{width:.3em}.vjs-slider-vertical .vjs-volume-level:before{top:-.5em;left:-.3em}.vjs-slider-horizontal .vjs-volume-level{height:.3em}.vjs-slider-horizontal .vjs-volume-level:before{top:-.3em;right:-.5em}.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level{height:100%}.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level{width:100%}.vjs-menu-button-popup.vjs-volume-menu-button .vjs-menu{display:block;width:0;height:0;border-top-color:transparent}.vjs-menu-button-popup.vjs-volume-menu-button-vertical .vjs-menu{left:.5em}.vjs-menu-button-popup.vjs-volume-menu-button-horizontal .vjs-menu{left:-2em}.vjs-menu-button-popup.vjs-volume-menu-button .vjs-menu-content{height:0;width:0;overflow-x:hidden;overflow-y:hidden}.vjs-volume-menu-button-vertical:hover .vjs-menu-content,.vjs-volume-menu-button-vertical .vjs-lock-showing .vjs-menu-content{height:8em;width:2.9em}.vjs-volume-menu-button-horizontal:hover .vjs-menu-content,.vjs-volume-menu-button-horizontal .vjs-lock-showing .vjs-menu-content{height:2.9em;width:8em}.vjs-volume-menu-button.vjs-menu-button-inline .vjs-menu-content{background-color:transparent!important}.vjs-poster{display:inline-block;vertical-align:middle;background-repeat:no-repeat;background-position:50% 50%;background-size:contain;cursor:pointer;margin:0;padding:0;position:absolute;top:0;right:0;bottom:0;left:0;height:100%}.vjs-poster img{display:block;vertical-align:middle;margin:0 auto;max-height:100%;padding:0;width:100%}.vjs-has-started .vjs-poster{display:none}.vjs-audio.vjs-has-started .vjs-poster{display:block}.vjs-controls-disabled .vjs-poster{display:none}.vjs-using-native-controls .vjs-poster{display:none}.video-js .vjs-live-control{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-flex:auto;-moz-box-flex:auto;-webkit-flex:auto;-ms-flex:auto;flex:auto;font-size:1em;line-height:3em}.vjs-no-flex .vjs-live-control{display:table-cell;width:auto;text-align:left}.video-js .vjs-time-control{-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none;-ms-flex:none;flex:none;font-size:1em;line-height:3em}.vjs-live .vjs-time-control{display:none}.video-js .vjs-current-time,.vjs-no-flex .vjs-current-time{display:none}.video-js .vjs-duration,.vjs-no-flex .vjs-duration{display:none}.vjs-time-divider{display:none;line-height:3em}.vjs-live .vjs-time-divider{display:none}.video-js .vjs-play-control{cursor:pointer;-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none;-ms-flex:none;flex:none}.vjs-text-track-display{position:absolute;bottom:3em;left:0;right:0;top:0;pointer-events:none}.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display{bottom:1em}.video-js .vjs-text-track{font-size:1.4em;text-align:center;margin-bottom:.1em;background-color:#000;background-color:rgba(0,0,0,.5)}.vjs-subtitles{color:#fff}.vjs-captions{color:#fc6}.vjs-tt-cue{display:block}.video-js .vjs-fullscreen-control{width:3.8em;cursor:pointer;-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none;-ms-flex:none;flex:none}.vjs-playback-rate .vjs-playback-rate-value{font-size:1.5em;line-height:2;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center}.vjs-playback-rate .vjs-menu{width:4em;left:0}.vjs-error-display{display:none}.vjs-error .vjs-error-display{display:block;position:absolute;left:0;top:0;width:100%;height:100%}.vjs-error .vjs-error-display:before{content:'X';font-family:Arial,Helvetica,sans-serif;font-size:4em;color:#fff;line-height:1;text-shadow:.05em .05em .1em #000;text-align:center;vertical-align:middle;position:absolute;left:0;top:50%;margin-top:-.5em;width:100%}.vjs-error-display div{position:absolute;bottom:1em;right:0;left:0;font-size:1.4em;text-align:center;padding:3px;background-color:#000;background-color:rgba(0,0,0,.5)}.vjs-error-display a,.vjs-error-display a:visited{color:#66A8CC}.vjs-loading-spinner{display:none;position:absolute;top:50%;left:50%;margin:-25px 0 0 -25px;opacity:.85;text-align:left;border:6px solid rgba(43,51,63,.7);box-sizing:border-box;background-clip:padding-box;width:50px;height:50px;border-radius:25px}.vjs-seeking .vjs-loading-spinner,.vjs-waiting .vjs-loading-spinner{display:block}.vjs-loading-spinner:before,.vjs-loading-spinner:after{content:"";position:absolute;margin:-6px;box-sizing:inherit;width:inherit;height:inherit;border-radius:inherit;opacity:1;border:inherit;border-color:transparent;border-top-color:#fff}.vjs-seeking .vjs-loading-spinner:before,.vjs-seeking .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:after{-webkit-animation:vjs-spinner-spin 1.1s cubic-bezier(0.6,.2,0,.8) infinite,vjs-spinner-fade 1.1s linear infinite;animation:vjs-spinner-spin 1.1s cubic-bezier(0.6,.2,0,.8) infinite,vjs-spinner-fade 1.1s linear infinite}.vjs-seeking .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:before{border-top-color:#fff}.vjs-seeking .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:after{border-top-color:#fff;-webkit-animation-delay:.44s;animation-delay:.44s}@keyframes vjs-spinner-spin{100%{transform:rotate(360deg)}}@-webkit-keyframes vjs-spinner-spin{100%{-webkit-transform:rotate(360deg)}}@keyframes vjs-spinner-fade{0%{border-top-color:#73859f}20%{border-top-color:#73859f}35%{border-top-color:#fff}60%{border-top-color:#73859f}100%{border-top-color:#73859f}}@-webkit-keyframes vjs-spinner-fade{0%{border-top-color:#73859f}20%{border-top-color:#73859f}35%{border-top-color:#fff}60%{border-top-color:#73859f}100%{border-top-color:#73859f}}.vjs-chapters-button .vjs-menu{left:-10em;width:0}.vjs-chapters-button .vjs-menu ul{width:24em}.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-custom-control-spacer{-webkit-box-flex:auto;-moz-box-flex:auto;-webkit-flex:auto;-ms-flex:auto;flex:auto}.video-js.vjs-layout-tiny:not(.vjs-fullscreen).vjs-no-flex .vjs-custom-control-spacer{width:auto}.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-current-time,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-captions-button,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-time-divider,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-progress-control,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-duration,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-remaining-time,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-playback-rate,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-mute-control,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-volume-control,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-chapters-button,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-captions-button,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-subtitles-button,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-volume-menu-button{display:none}.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-current-time,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-captions-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-time-divider,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-duration,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-remaining-time,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-playback-rate,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-captions-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-mute-control,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-volume-control,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-chapters-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-subtitles-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-volume-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-fullscreen-control{display:none}.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-current-time,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-captions-button,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-time-divider,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-duration,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-remaining-time,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-playback-rate,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-mute-control,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-volume-control,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-chapters-button,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-subtitles-button{display:none}.vjs-caption-settings{position:relative;top:1em;background-color:#2B333F;background-color:rgba(43,51,63,.75);color:#fff;margin:0 auto;padding:.5em;height:15em;font-size:12px;width:40em}.vjs-caption-settings .vjs-tracksettings{top:0;bottom:2em;left:0;right:0;position:absolute;overflow:auto}.vjs-caption-settings .vjs-tracksettings-colors,.vjs-caption-settings .vjs-tracksettings-font{float:left}.vjs-caption-settings .vjs-tracksettings-colors:after,.vjs-caption-settings .vjs-tracksettings-font:after,.vjs-caption-settings .vjs-tracksettings-controls:after{clear:both}.vjs-caption-settings .vjs-tracksettings-controls{position:absolute;bottom:1em;right:1em}.vjs-caption-settings .vjs-tracksetting{margin:5px;padding:3px;min-height:40px}.vjs-caption-settings .vjs-tracksetting label{display:block;width:100px;margin-bottom:5px}.vjs-caption-settings .vjs-tracksetting span{display:inline;margin-left:5px}.vjs-caption-settings .vjs-tracksetting>div{margin-bottom:5px;min-height:20px}.vjs-caption-settings .vjs-tracksetting>div:last-child{margin-bottom:0;padding-bottom:0;min-height:0}.vjs-caption-settings label>input{margin-right:10px}.vjs-caption-settings input[type=button]{width:40px;height:40px}
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/video.js
Show inline comments
 
new file 100644
 
/**
 
 * @license
 
 * Video.js 5.0.0 <http://videojs.com/>
 
 * Copyright Brightcove, Inc. <https://www.brightcove.com/>
 
 * Available under Apache License Version 2.0
 
 * <https://github.com/videojs/video.js/blob/master/LICENSE>
 
 *
 
 * Includes vtt.js <https://github.com/mozilla/vtt.js>
 
 * Available under Apache License Version 2.0
 
 * <https://github.com/mozilla/vtt.js/blob/master/LICENSE>
 
 */
 

	
 
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.videojs = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
 
(function (global){
 
var topLevel = typeof global !== 'undefined' ? global :
 
    typeof window !== 'undefined' ? window : {}
 
var minDoc = _dereq_('min-document');
 

	
 
if (typeof document !== 'undefined') {
 
    module.exports = document;
 
} else {
 
    var doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];
 

	
 
    if (!doccy) {
 
        doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;
 
    }
 

	
 
    module.exports = doccy;
 
}
 

	
 
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
 
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9nbG9iYWwvZG9jdW1lbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9wTGV2ZWwgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6XG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB7fVxudmFyIG1pbkRvYyA9IHJlcXVpcmUoJ21pbi1kb2N1bWVudCcpO1xuXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQ7XG59IGVsc2Uge1xuICAgIHZhciBkb2NjeSA9IHRvcExldmVsWydfX0dMT0JBTF9ET0NVTUVOVF9DQUNIRUA0J107XG5cbiAgICBpZiAoIWRvY2N5KSB7XG4gICAgICAgIGRvY2N5ID0gdG9wTGV2ZWxbJ19fR0xPQkFMX0RPQ1VNRU5UX0NBQ0hFQDQnXSA9IG1pbkRvYztcbiAgICB9XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IGRvY2N5O1xufVxuIl19
 
},{"min-document":3}],2:[function(_dereq_,module,exports){
 
(function (global){
 
if (typeof window !== "undefined") {
 
    module.exports = window;
 
} else if (typeof global !== "undefined") {
 
    module.exports = global;
 
} else if (typeof self !== "undefined"){
 
    module.exports = self;
 
} else {
 
    module.exports = {};
 
}
 

	
 
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
 
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9nbG9iYWwvd2luZG93LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBzZWxmO1xufSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHt9O1xufVxuIl19
 
},{}],3:[function(_dereq_,module,exports){
 

	
 
},{}],4:[function(_dereq_,module,exports){
 
var getNative = _dereq_('../internal/getNative');
 

	
 
/* Native method references for those with the same name as other `lodash` methods. */
 
var nativeNow = getNative(Date, 'now');
 

	
 
/**
 
 * Gets the number of milliseconds that have elapsed since the Unix epoch
 
 * (1 January 1970 00:00:00 UTC).
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Date
 
 * @example
 
 *
 
 * _.defer(function(stamp) {
 
 *   console.log(_.now() - stamp);
 
 * }, _.now());
 
 * // => logs the number of milliseconds it took for the deferred function to be invoked
 
 */
 
var now = nativeNow || function() {
 
  return new Date().getTime();
 
};
 

	
 
module.exports = now;
 

	
 
},{"../internal/getNative":20}],5:[function(_dereq_,module,exports){
 
var isObject = _dereq_('../lang/isObject'),
 
    now = _dereq_('../date/now');
 

	
 
/** Used as the `TypeError` message for "Functions" methods. */
 
var FUNC_ERROR_TEXT = 'Expected a function';
 

	
 
/* Native method references for those with the same name as other `lodash` methods. */
 
var nativeMax = Math.max;
 

	
 
/**
 
 * Creates a debounced function that delays invoking `func` until after `wait`
 
 * milliseconds have elapsed since the last time the debounced function was
 
 * invoked. The debounced function comes with a `cancel` method to cancel
 
 * delayed invocations. Provide an options object to indicate that `func`
 
 * should be invoked on the leading and/or trailing edge of the `wait` timeout.
 
 * Subsequent calls to the debounced function return the result of the last
 
 * `func` invocation.
 
 *
 
 * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
 
 * on the trailing edge of the timeout only if the the debounced function is
 
 * invoked more than once during the `wait` timeout.
 
 *
 
 * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
 
 * for details over the differences between `_.debounce` and `_.throttle`.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Function
 
 * @param {Function} func The function to debounce.
 
 * @param {number} [wait=0] The number of milliseconds to delay.
 
 * @param {Object} [options] The options object.
 
 * @param {boolean} [options.leading=false] Specify invoking on the leading
 
 *  edge of the timeout.
 
 * @param {number} [options.maxWait] The maximum time `func` is allowed to be
 
 *  delayed before it's invoked.
 
 * @param {boolean} [options.trailing=true] Specify invoking on the trailing
 
 *  edge of the timeout.
 
 * @returns {Function} Returns the new debounced function.
 
 * @example
 
 *
 
 * // avoid costly calculations while the window size is in flux
 
 * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
 
 *
 
 * // invoke `sendMail` when the click event is fired, debouncing subsequent calls
 
 * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {
 
 *   'leading': true,
 
 *   'trailing': false
 
 * }));
 
 *
 
 * // ensure `batchLog` is invoked once after 1 second of debounced calls
 
 * var source = new EventSource('/stream');
 
 * jQuery(source).on('message', _.debounce(batchLog, 250, {
 
 *   'maxWait': 1000
 
 * }));
 
 *
 
 * // cancel a debounced call
 
 * var todoChanges = _.debounce(batchLog, 1000);
 
 * Object.observe(models.todo, todoChanges);
 
 *
 
 * Object.observe(models, function(changes) {
 
 *   if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {
 
 *     todoChanges.cancel();
 
 *   }
 
 * }, ['delete']);
 
 *
 
 * // ...at some point `models.todo` is changed
 
 * models.todo.completed = true;
 
 *
 
 * // ...before 1 second has passed `models.todo` is deleted
 
 * // which cancels the debounced `todoChanges` call
 
 * delete models.todo;
 
 */
 
function debounce(func, wait, options) {
 
  var args,
 
      maxTimeoutId,
 
      result,
 
      stamp,
 
      thisArg,
 
      timeoutId,
 
      trailingCall,
 
      lastCalled = 0,
 
      maxWait = false,
 
      trailing = true;
 

	
 
  if (typeof func != 'function') {
 
    throw new TypeError(FUNC_ERROR_TEXT);
 
  }
 
  wait = wait < 0 ? 0 : (+wait || 0);
 
  if (options === true) {
 
    var leading = true;
 
    trailing = false;
 
  } else if (isObject(options)) {
 
    leading = !!options.leading;
 
    maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);
 
    trailing = 'trailing' in options ? !!options.trailing : trailing;
 
  }
 

	
 
  function cancel() {
 
    if (timeoutId) {
 
      clearTimeout(timeoutId);
 
    }
 
    if (maxTimeoutId) {
 
      clearTimeout(maxTimeoutId);
 
    }
 
    lastCalled = 0;
 
    maxTimeoutId = timeoutId = trailingCall = undefined;
 
  }
 

	
 
  function complete(isCalled, id) {
 
    if (id) {
 
      clearTimeout(id);
 
    }
 
    maxTimeoutId = timeoutId = trailingCall = undefined;
 
    if (isCalled) {
 
      lastCalled = now();
 
      result = func.apply(thisArg, args);
 
      if (!timeoutId && !maxTimeoutId) {
 
        args = thisArg = undefined;
 
      }
 
    }
 
  }
 

	
 
  function delayed() {
 
    var remaining = wait - (now() - stamp);
 
    if (remaining <= 0 || remaining > wait) {
 
      complete(trailingCall, maxTimeoutId);
 
    } else {
 
      timeoutId = setTimeout(delayed, remaining);
 
    }
 
  }
 

	
 
  function maxDelayed() {
 
    complete(trailing, timeoutId);
 
  }
 

	
 
  function debounced() {
 
    args = arguments;
 
    stamp = now();
 
    thisArg = this;
 
    trailingCall = trailing && (timeoutId || !leading);
 

	
 
    if (maxWait === false) {
 
      var leadingCall = leading && !timeoutId;
 
    } else {
 
      if (!maxTimeoutId && !leading) {
 
        lastCalled = stamp;
 
      }
 
      var remaining = maxWait - (stamp - lastCalled),
 
          isCalled = remaining <= 0 || remaining > maxWait;
 

	
 
      if (isCalled) {
 
        if (maxTimeoutId) {
 
          maxTimeoutId = clearTimeout(maxTimeoutId);
 
        }
 
        lastCalled = stamp;
 
        result = func.apply(thisArg, args);
 
      }
 
      else if (!maxTimeoutId) {
 
        maxTimeoutId = setTimeout(maxDelayed, remaining);
 
      }
 
    }
 
    if (isCalled && timeoutId) {
 
      timeoutId = clearTimeout(timeoutId);
 
    }
 
    else if (!timeoutId && wait !== maxWait) {
 
      timeoutId = setTimeout(delayed, wait);
 
    }
 
    if (leadingCall) {
 
      isCalled = true;
 
      result = func.apply(thisArg, args);
 
    }
 
    if (isCalled && !timeoutId && !maxTimeoutId) {
 
      args = thisArg = undefined;
 
    }
 
    return result;
 
  }
 
  debounced.cancel = cancel;
 
  return debounced;
 
}
 

	
 
module.exports = debounce;
 

	
 
},{"../date/now":4,"../lang/isObject":33}],6:[function(_dereq_,module,exports){
 
/** Used as the `TypeError` message for "Functions" methods. */
 
var FUNC_ERROR_TEXT = 'Expected a function';
 

	
 
/* Native method references for those with the same name as other `lodash` methods. */
 
var nativeMax = Math.max;
 

	
 
/**
 
 * Creates a function that invokes `func` with the `this` binding of the
 
 * created function and arguments from `start` and beyond provided as an array.
 
 *
 
 * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters).
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Function
 
 * @param {Function} func The function to apply a rest parameter to.
 
 * @param {number} [start=func.length-1] The start position of the rest parameter.
 
 * @returns {Function} Returns the new function.
 
 * @example
 
 *
 
 * var say = _.restParam(function(what, names) {
 
 *   return what + ' ' + _.initial(names).join(', ') +
 
 *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
 
 * });
 
 *
 
 * say('hello', 'fred', 'barney', 'pebbles');
 
 * // => 'hello fred, barney, & pebbles'
 
 */
 
function restParam(func, start) {
 
  if (typeof func != 'function') {
 
    throw new TypeError(FUNC_ERROR_TEXT);
 
  }
 
  start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);
 
  return function() {
 
    var args = arguments,
 
        index = -1,
 
        length = nativeMax(args.length - start, 0),
 
        rest = Array(length);
 

	
 
    while (++index < length) {
 
      rest[index] = args[start + index];
 
    }
 
    switch (start) {
 
      case 0: return func.call(this, rest);
 
      case 1: return func.call(this, args[0], rest);
 
      case 2: return func.call(this, args[0], args[1], rest);
 
    }
 
    var otherArgs = Array(start + 1);
 
    index = -1;
 
    while (++index < start) {
 
      otherArgs[index] = args[index];
 
    }
 
    otherArgs[start] = rest;
 
    return func.apply(this, otherArgs);
 
  };
 
}
 

	
 
module.exports = restParam;
 

	
 
},{}],7:[function(_dereq_,module,exports){
 
var debounce = _dereq_('./debounce'),
 
    isObject = _dereq_('../lang/isObject');
 

	
 
/** Used as the `TypeError` message for "Functions" methods. */
 
var FUNC_ERROR_TEXT = 'Expected a function';
 

	
 
/**
 
 * Creates a throttled function that only invokes `func` at most once per
 
 * every `wait` milliseconds. The throttled function comes with a `cancel`
 
 * method to cancel delayed invocations. Provide an options object to indicate
 
 * that `func` should be invoked on the leading and/or trailing edge of the
 
 * `wait` timeout. Subsequent calls to the throttled function return the
 
 * result of the last `func` call.
 
 *
 
 * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
 
 * on the trailing edge of the timeout only if the the throttled function is
 
 * invoked more than once during the `wait` timeout.
 
 *
 
 * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
 
 * for details over the differences between `_.throttle` and `_.debounce`.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Function
 
 * @param {Function} func The function to throttle.
 
 * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
 
 * @param {Object} [options] The options object.
 
 * @param {boolean} [options.leading=true] Specify invoking on the leading
 
 *  edge of the timeout.
 
 * @param {boolean} [options.trailing=true] Specify invoking on the trailing
 
 *  edge of the timeout.
 
 * @returns {Function} Returns the new throttled function.
 
 * @example
 
 *
 
 * // avoid excessively updating the position while scrolling
 
 * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
 
 *
 
 * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes
 
 * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {
 
 *   'trailing': false
 
 * }));
 
 *
 
 * // cancel a trailing throttled call
 
 * jQuery(window).on('popstate', throttled.cancel);
 
 */
 
function throttle(func, wait, options) {
 
  var leading = true,
 
      trailing = true;
 

	
 
  if (typeof func != 'function') {
 
    throw new TypeError(FUNC_ERROR_TEXT);
 
  }
 
  if (options === false) {
 
    leading = false;
 
  } else if (isObject(options)) {
 
    leading = 'leading' in options ? !!options.leading : leading;
 
    trailing = 'trailing' in options ? !!options.trailing : trailing;
 
  }
 
  return debounce(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing });
 
}
 

	
 
module.exports = throttle;
 

	
 
},{"../lang/isObject":33,"./debounce":5}],8:[function(_dereq_,module,exports){
 
/**
 
 * Copies the values of `source` to `array`.
 
 *
 
 * @private
 
 * @param {Array} source The array to copy values from.
 
 * @param {Array} [array=[]] The array to copy values to.
 
 * @returns {Array} Returns `array`.
 
 */
 
function arrayCopy(source, array) {
 
  var index = -1,
 
      length = source.length;
 

	
 
  array || (array = Array(length));
 
  while (++index < length) {
 
    array[index] = source[index];
 
  }
 
  return array;
 
}
 

	
 
module.exports = arrayCopy;
 

	
 
},{}],9:[function(_dereq_,module,exports){
 
/**
 
 * A specialized version of `_.forEach` for arrays without support for callback
 
 * shorthands and `this` binding.
 
 *
 
 * @private
 
 * @param {Array} array The array to iterate over.
 
 * @param {Function} iteratee The function invoked per iteration.
 
 * @returns {Array} Returns `array`.
 
 */
 
function arrayEach(array, iteratee) {
 
  var index = -1,
 
      length = array.length;
 

	
 
  while (++index < length) {
 
    if (iteratee(array[index], index, array) === false) {
 
      break;
 
    }
 
  }
 
  return array;
 
}
 

	
 
module.exports = arrayEach;
 

	
 
},{}],10:[function(_dereq_,module,exports){
 
/**
 
 * Copies properties of `source` to `object`.
 
 *
 
 * @private
 
 * @param {Object} source The object to copy properties from.
 
 * @param {Array} props The property names to copy.
 
 * @param {Object} [object={}] The object to copy properties to.
 
 * @returns {Object} Returns `object`.
 
 */
 
function baseCopy(source, props, object) {
 
  object || (object = {});
 

	
 
  var index = -1,
 
      length = props.length;
 

	
 
  while (++index < length) {
 
    var key = props[index];
 
    object[key] = source[key];
 
  }
 
  return object;
 
}
 

	
 
module.exports = baseCopy;
 

	
 
},{}],11:[function(_dereq_,module,exports){
 
var createBaseFor = _dereq_('./createBaseFor');
 

	
 
/**
 
 * The base implementation of `baseForIn` and `baseForOwn` which iterates
 
 * over `object` properties returned by `keysFunc` invoking `iteratee` for
 
 * each property. Iteratee functions may exit iteration early by explicitly
 
 * returning `false`.
 
 *
 
 * @private
 
 * @param {Object} object The object to iterate over.
 
 * @param {Function} iteratee The function invoked per iteration.
 
 * @param {Function} keysFunc The function to get the keys of `object`.
 
 * @returns {Object} Returns `object`.
 
 */
 
var baseFor = createBaseFor();
 

	
 
module.exports = baseFor;
 

	
 
},{"./createBaseFor":18}],12:[function(_dereq_,module,exports){
 
var baseFor = _dereq_('./baseFor'),
 
    keysIn = _dereq_('../object/keysIn');
 

	
 
/**
 
 * The base implementation of `_.forIn` without support for callback
 
 * shorthands and `this` binding.
 
 *
 
 * @private
 
 * @param {Object} object The object to iterate over.
 
 * @param {Function} iteratee The function invoked per iteration.
 
 * @returns {Object} Returns `object`.
 
 */
 
function baseForIn(object, iteratee) {
 
  return baseFor(object, iteratee, keysIn);
 
}
 

	
 
module.exports = baseForIn;
 

	
 
},{"../object/keysIn":39,"./baseFor":11}],13:[function(_dereq_,module,exports){
 
var arrayEach = _dereq_('./arrayEach'),
 
    baseMergeDeep = _dereq_('./baseMergeDeep'),
 
    isArray = _dereq_('../lang/isArray'),
 
    isArrayLike = _dereq_('./isArrayLike'),
 
    isObject = _dereq_('../lang/isObject'),
 
    isObjectLike = _dereq_('./isObjectLike'),
 
    isTypedArray = _dereq_('../lang/isTypedArray'),
 
    keys = _dereq_('../object/keys');
 

	
 
/**
 
 * The base implementation of `_.merge` without support for argument juggling,
 
 * multiple sources, and `this` binding `customizer` functions.
 
 *
 
 * @private
 
 * @param {Object} object The destination object.
 
 * @param {Object} source The source object.
 
 * @param {Function} [customizer] The function to customize merged values.
 
 * @param {Array} [stackA=[]] Tracks traversed source objects.
 
 * @param {Array} [stackB=[]] Associates values with source counterparts.
 
 * @returns {Object} Returns `object`.
 
 */
 
function baseMerge(object, source, customizer, stackA, stackB) {
 
  if (!isObject(object)) {
 
    return object;
 
  }
 
  var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),
 
      props = isSrcArr ? undefined : keys(source);
 

	
 
  arrayEach(props || source, function(srcValue, key) {
 
    if (props) {
 
      key = srcValue;
 
      srcValue = source[key];
 
    }
 
    if (isObjectLike(srcValue)) {
 
      stackA || (stackA = []);
 
      stackB || (stackB = []);
 
      baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);
 
    }
 
    else {
 
      var value = object[key],
 
          result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
 
          isCommon = result === undefined;
 

	
 
      if (isCommon) {
 
        result = srcValue;
 
      }
 
      if ((result !== undefined || (isSrcArr && !(key in object))) &&
 
          (isCommon || (result === result ? (result !== value) : (value === value)))) {
 
        object[key] = result;
 
      }
 
    }
 
  });
 
  return object;
 
}
 

	
 
module.exports = baseMerge;
 

	
 
},{"../lang/isArray":30,"../lang/isObject":33,"../lang/isTypedArray":36,"../object/keys":38,"./arrayEach":9,"./baseMergeDeep":14,"./isArrayLike":21,"./isObjectLike":26}],14:[function(_dereq_,module,exports){
 
var arrayCopy = _dereq_('./arrayCopy'),
 
    isArguments = _dereq_('../lang/isArguments'),
 
    isArray = _dereq_('../lang/isArray'),
 
    isArrayLike = _dereq_('./isArrayLike'),
 
    isPlainObject = _dereq_('../lang/isPlainObject'),
 
    isTypedArray = _dereq_('../lang/isTypedArray'),
 
    toPlainObject = _dereq_('../lang/toPlainObject');
 

	
 
/**
 
 * A specialized version of `baseMerge` for arrays and objects which performs
 
 * deep merges and tracks traversed objects enabling objects with circular
 
 * references to be merged.
 
 *
 
 * @private
 
 * @param {Object} object The destination object.
 
 * @param {Object} source The source object.
 
 * @param {string} key The key of the value to merge.
 
 * @param {Function} mergeFunc The function to merge values.
 
 * @param {Function} [customizer] The function to customize merged values.
 
 * @param {Array} [stackA=[]] Tracks traversed source objects.
 
 * @param {Array} [stackB=[]] Associates values with source counterparts.
 
 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
 
 */
 
function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {
 
  var length = stackA.length,
 
      srcValue = source[key];
 

	
 
  while (length--) {
 
    if (stackA[length] == srcValue) {
 
      object[key] = stackB[length];
 
      return;
 
    }
 
  }
 
  var value = object[key],
 
      result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
 
      isCommon = result === undefined;
 

	
 
  if (isCommon) {
 
    result = srcValue;
 
    if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) {
 
      result = isArray(value)
 
        ? value
 
        : (isArrayLike(value) ? arrayCopy(value) : []);
 
    }
 
    else if (isPlainObject(srcValue) || isArguments(srcValue)) {
 
      result = isArguments(value)
 
        ? toPlainObject(value)
 
        : (isPlainObject(value) ? value : {});
 
    }
 
    else {
 
      isCommon = false;
 
    }
 
  }
 
  // Add the source value to the stack of traversed objects and associate
 
  // it with its merged value.
 
  stackA.push(srcValue);
 
  stackB.push(result);
 

	
 
  if (isCommon) {
 
    // Recursively merge objects and arrays (susceptible to call stack limits).
 
    object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);
 
  } else if (result === result ? (result !== value) : (value === value)) {
 
    object[key] = result;
 
  }
 
}
 

	
 
module.exports = baseMergeDeep;
 

	
 
},{"../lang/isArguments":29,"../lang/isArray":30,"../lang/isPlainObject":34,"../lang/isTypedArray":36,"../lang/toPlainObject":37,"./arrayCopy":8,"./isArrayLike":21}],15:[function(_dereq_,module,exports){
 
var toObject = _dereq_('./toObject');
 

	
 
/**
 
 * The base implementation of `_.property` without support for deep paths.
 
 *
 
 * @private
 
 * @param {string} key The key of the property to get.
 
 * @returns {Function} Returns the new function.
 
 */
 
function baseProperty(key) {
 
  return function(object) {
 
    return object == null ? undefined : toObject(object)[key];
 
  };
 
}
 

	
 
module.exports = baseProperty;
 

	
 
},{"./toObject":28}],16:[function(_dereq_,module,exports){
 
var identity = _dereq_('../utility/identity');
 

	
 
/**
 
 * A specialized version of `baseCallback` which only supports `this` binding
 
 * and specifying the number of arguments to provide to `func`.
 
 *
 
 * @private
 
 * @param {Function} func The function to bind.
 
 * @param {*} thisArg The `this` binding of `func`.
 
 * @param {number} [argCount] The number of arguments to provide to `func`.
 
 * @returns {Function} Returns the callback.
 
 */
 
function bindCallback(func, thisArg, argCount) {
 
  if (typeof func != 'function') {
 
    return identity;
 
  }
 
  if (thisArg === undefined) {
 
    return func;
 
  }
 
  switch (argCount) {
 
    case 1: return function(value) {
 
      return func.call(thisArg, value);
 
    };
 
    case 3: return function(value, index, collection) {
 
      return func.call(thisArg, value, index, collection);
 
    };
 
    case 4: return function(accumulator, value, index, collection) {
 
      return func.call(thisArg, accumulator, value, index, collection);
 
    };
 
    case 5: return function(value, other, key, object, source) {
 
      return func.call(thisArg, value, other, key, object, source);
 
    };
 
  }
 
  return function() {
 
    return func.apply(thisArg, arguments);
 
  };
 
}
 

	
 
module.exports = bindCallback;
 

	
 
},{"../utility/identity":42}],17:[function(_dereq_,module,exports){
 
var bindCallback = _dereq_('./bindCallback'),
 
    isIterateeCall = _dereq_('./isIterateeCall'),
 
    restParam = _dereq_('../function/restParam');
 

	
 
/**
 
 * Creates a `_.assign`, `_.defaults`, or `_.merge` function.
 
 *
 
 * @private
 
 * @param {Function} assigner The function to assign values.
 
 * @returns {Function} Returns the new assigner function.
 
 */
 
function createAssigner(assigner) {
 
  return restParam(function(object, sources) {
 
    var index = -1,
 
        length = object == null ? 0 : sources.length,
 
        customizer = length > 2 ? sources[length - 2] : undefined,
 
        guard = length > 2 ? sources[2] : undefined,
 
        thisArg = length > 1 ? sources[length - 1] : undefined;
 

	
 
    if (typeof customizer == 'function') {
 
      customizer = bindCallback(customizer, thisArg, 5);
 
      length -= 2;
 
    } else {
 
      customizer = typeof thisArg == 'function' ? thisArg : undefined;
 
      length -= (customizer ? 1 : 0);
 
    }
 
    if (guard && isIterateeCall(sources[0], sources[1], guard)) {
 
      customizer = length < 3 ? undefined : customizer;
 
      length = 1;
 
    }
 
    while (++index < length) {
 
      var source = sources[index];
 
      if (source) {
 
        assigner(object, source, customizer);
 
      }
 
    }
 
    return object;
 
  });
 
}
 

	
 
module.exports = createAssigner;
 

	
 
},{"../function/restParam":6,"./bindCallback":16,"./isIterateeCall":24}],18:[function(_dereq_,module,exports){
 
var toObject = _dereq_('./toObject');
 

	
 
/**
 
 * Creates a base function for `_.forIn` or `_.forInRight`.
 
 *
 
 * @private
 
 * @param {boolean} [fromRight] Specify iterating from right to left.
 
 * @returns {Function} Returns the new base function.
 
 */
 
function createBaseFor(fromRight) {
 
  return function(object, iteratee, keysFunc) {
 
    var iterable = toObject(object),
 
        props = keysFunc(object),
 
        length = props.length,
 
        index = fromRight ? length : -1;
 

	
 
    while ((fromRight ? index-- : ++index < length)) {
 
      var key = props[index];
 
      if (iteratee(iterable[key], key, iterable) === false) {
 
        break;
 
      }
 
    }
 
    return object;
 
  };
 
}
 

	
 
module.exports = createBaseFor;
 

	
 
},{"./toObject":28}],19:[function(_dereq_,module,exports){
 
var baseProperty = _dereq_('./baseProperty');
 

	
 
/**
 
 * Gets the "length" property value of `object`.
 
 *
 
 * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
 
 * that affects Safari on at least iOS 8.1-8.3 ARM64.
 
 *
 
 * @private
 
 * @param {Object} object The object to query.
 
 * @returns {*} Returns the "length" value.
 
 */
 
var getLength = baseProperty('length');
 

	
 
module.exports = getLength;
 

	
 
},{"./baseProperty":15}],20:[function(_dereq_,module,exports){
 
var isNative = _dereq_('../lang/isNative');
 

	
 
/**
 
 * Gets the native function at `key` of `object`.
 
 *
 
 * @private
 
 * @param {Object} object The object to query.
 
 * @param {string} key The key of the method to get.
 
 * @returns {*} Returns the function if it's native, else `undefined`.
 
 */
 
function getNative(object, key) {
 
  var value = object == null ? undefined : object[key];
 
  return isNative(value) ? value : undefined;
 
}
 

	
 
module.exports = getNative;
 

	
 
},{"../lang/isNative":32}],21:[function(_dereq_,module,exports){
 
var getLength = _dereq_('./getLength'),
 
    isLength = _dereq_('./isLength');
 

	
 
/**
 
 * Checks if `value` is array-like.
 
 *
 
 * @private
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
 
 */
 
function isArrayLike(value) {
 
  return value != null && isLength(getLength(value));
 
}
 

	
 
module.exports = isArrayLike;
 

	
 
},{"./getLength":19,"./isLength":25}],22:[function(_dereq_,module,exports){
 
/**
 
 * Checks if `value` is a host object in IE < 9.
 
 *
 
 * @private
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is a host object, else `false`.
 
 */
 
var isHostObject = (function() {
 
  try {
 
    Object({ 'toString': 0 } + '');
 
  } catch(e) {
 
    return function() { return false; };
 
  }
 
  return function(value) {
 
    // IE < 9 presents many host objects as `Object` objects that can coerce
 
    // to strings despite having improperly defined `toString` methods.
 
    return typeof value.toString != 'function' && typeof (value + '') == 'string';
 
  };
 
}());
 

	
 
module.exports = isHostObject;
 

	
 
},{}],23:[function(_dereq_,module,exports){
 
/** Used to detect unsigned integer values. */
 
var reIsUint = /^\d+$/;
 

	
 
/**
 
 * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
 
 * of an array-like value.
 
 */
 
var MAX_SAFE_INTEGER = 9007199254740991;
 

	
 
/**
 
 * Checks if `value` is a valid array-like index.
 
 *
 
 * @private
 
 * @param {*} value The value to check.
 
 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
 
 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
 
 */
 
function isIndex(value, length) {
 
  value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
 
  length = length == null ? MAX_SAFE_INTEGER : length;
 
  return value > -1 && value % 1 == 0 && value < length;
 
}
 

	
 
module.exports = isIndex;
 

	
 
},{}],24:[function(_dereq_,module,exports){
 
var isArrayLike = _dereq_('./isArrayLike'),
 
    isIndex = _dereq_('./isIndex'),
 
    isObject = _dereq_('../lang/isObject');
 

	
 
/**
 
 * Checks if the provided arguments are from an iteratee call.
 
 *
 
 * @private
 
 * @param {*} value The potential iteratee value argument.
 
 * @param {*} index The potential iteratee index or key argument.
 
 * @param {*} object The potential iteratee object argument.
 
 * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.
 
 */
 
function isIterateeCall(value, index, object) {
 
  if (!isObject(object)) {
 
    return false;
 
  }
 
  var type = typeof index;
 
  if (type == 'number'
 
      ? (isArrayLike(object) && isIndex(index, object.length))
 
      : (type == 'string' && index in object)) {
 
    var other = object[index];
 
    return value === value ? (value === other) : (other !== other);
 
  }
 
  return false;
 
}
 

	
 
module.exports = isIterateeCall;
 

	
 
},{"../lang/isObject":33,"./isArrayLike":21,"./isIndex":23}],25:[function(_dereq_,module,exports){
 
/**
 
 * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
 
 * of an array-like value.
 
 */
 
var MAX_SAFE_INTEGER = 9007199254740991;
 

	
 
/**
 
 * Checks if `value` is a valid array-like length.
 
 *
 
 * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
 
 *
 
 * @private
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
 
 */
 
function isLength(value) {
 
  return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
 
}
 

	
 
module.exports = isLength;
 

	
 
},{}],26:[function(_dereq_,module,exports){
 
/**
 
 * Checks if `value` is object-like.
 
 *
 
 * @private
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
 
 */
 
function isObjectLike(value) {
 
  return !!value && typeof value == 'object';
 
}
 

	
 
module.exports = isObjectLike;
 

	
 
},{}],27:[function(_dereq_,module,exports){
 
var isArguments = _dereq_('../lang/isArguments'),
 
    isArray = _dereq_('../lang/isArray'),
 
    isIndex = _dereq_('./isIndex'),
 
    isLength = _dereq_('./isLength'),
 
    isString = _dereq_('../lang/isString'),
 
    keysIn = _dereq_('../object/keysIn');
 

	
 
/** Used for native method references. */
 
var objectProto = Object.prototype;
 

	
 
/** Used to check objects for own properties. */
 
var hasOwnProperty = objectProto.hasOwnProperty;
 

	
 
/**
 
 * A fallback implementation of `Object.keys` which creates an array of the
 
 * own enumerable property names of `object`.
 
 *
 
 * @private
 
 * @param {Object} object The object to query.
 
 * @returns {Array} Returns the array of property names.
 
 */
 
function shimKeys(object) {
 
  var props = keysIn(object),
 
      propsLength = props.length,
 
      length = propsLength && object.length;
 

	
 
  var allowIndexes = !!length && isLength(length) &&
 
    (isArray(object) || isArguments(object) || isString(object));
 

	
 
  var index = -1,
 
      result = [];
 

	
 
  while (++index < propsLength) {
 
    var key = props[index];
 
    if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {
 
      result.push(key);
 
    }
 
  }
 
  return result;
 
}
 

	
 
module.exports = shimKeys;
 

	
 
},{"../lang/isArguments":29,"../lang/isArray":30,"../lang/isString":35,"../object/keysIn":39,"./isIndex":23,"./isLength":25}],28:[function(_dereq_,module,exports){
 
var isObject = _dereq_('../lang/isObject'),
 
    isString = _dereq_('../lang/isString'),
 
    support = _dereq_('../support');
 

	
 
/**
 
 * Converts `value` to an object if it's not one.
 
 *
 
 * @private
 
 * @param {*} value The value to process.
 
 * @returns {Object} Returns the object.
 
 */
 
function toObject(value) {
 
  if (support.unindexedChars && isString(value)) {
 
    var index = -1,
 
        length = value.length,
 
        result = Object(value);
 

	
 
    while (++index < length) {
 
      result[index] = value.charAt(index);
 
    }
 
    return result;
 
  }
 
  return isObject(value) ? value : Object(value);
 
}
 

	
 
module.exports = toObject;
 

	
 
},{"../lang/isObject":33,"../lang/isString":35,"../support":41}],29:[function(_dereq_,module,exports){
 
var isArrayLike = _dereq_('../internal/isArrayLike'),
 
    isObjectLike = _dereq_('../internal/isObjectLike');
 

	
 
/** Used for native method references. */
 
var objectProto = Object.prototype;
 

	
 
/** Used to check objects for own properties. */
 
var hasOwnProperty = objectProto.hasOwnProperty;
 

	
 
/** Native method references. */
 
var propertyIsEnumerable = objectProto.propertyIsEnumerable;
 

	
 
/**
 
 * Checks if `value` is classified as an `arguments` object.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
 
 * @example
 
 *
 
 * _.isArguments(function() { return arguments; }());
 
 * // => true
 
 *
 
 * _.isArguments([1, 2, 3]);
 
 * // => false
 
 */
 
function isArguments(value) {
 
  return isObjectLike(value) && isArrayLike(value) &&
 
    hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');
 
}
 

	
 
module.exports = isArguments;
 

	
 
},{"../internal/isArrayLike":21,"../internal/isObjectLike":26}],30:[function(_dereq_,module,exports){
 
var getNative = _dereq_('../internal/getNative'),
 
    isLength = _dereq_('../internal/isLength'),
 
    isObjectLike = _dereq_('../internal/isObjectLike');
 

	
 
/** `Object#toString` result references. */
 
var arrayTag = '[object Array]';
 

	
 
/** Used for native method references. */
 
var objectProto = Object.prototype;
 

	
 
/**
 
 * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
 
 * of values.
 
 */
 
var objToString = objectProto.toString;
 

	
 
/* Native method references for those with the same name as other `lodash` methods. */
 
var nativeIsArray = getNative(Array, 'isArray');
 

	
 
/**
 
 * Checks if `value` is classified as an `Array` object.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
 
 * @example
 
 *
 
 * _.isArray([1, 2, 3]);
 
 * // => true
 
 *
 
 * _.isArray(function() { return arguments; }());
 
 * // => false
 
 */
 
var isArray = nativeIsArray || function(value) {
 
  return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
 
};
 

	
 
module.exports = isArray;
 

	
 
},{"../internal/getNative":20,"../internal/isLength":25,"../internal/isObjectLike":26}],31:[function(_dereq_,module,exports){
 
var isObject = _dereq_('./isObject');
 

	
 
/** `Object#toString` result references. */
 
var funcTag = '[object Function]';
 

	
 
/** Used for native method references. */
 
var objectProto = Object.prototype;
 

	
 
/**
 
 * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
 
 * of values.
 
 */
 
var objToString = objectProto.toString;
 

	
 
/**
 
 * Checks if `value` is classified as a `Function` object.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
 
 * @example
 
 *
 
 * _.isFunction(_);
 
 * // => true
 
 *
 
 * _.isFunction(/abc/);
 
 * // => false
 
 */
 
function isFunction(value) {
 
  // The use of `Object#toString` avoids issues with the `typeof` operator
 
  // in older versions of Chrome and Safari which return 'function' for regexes
 
  // and Safari 8 which returns 'object' for typed array constructors.
 
  return isObject(value) && objToString.call(value) == funcTag;
 
}
 

	
 
module.exports = isFunction;
 

	
 
},{"./isObject":33}],32:[function(_dereq_,module,exports){
 
var isFunction = _dereq_('./isFunction'),
 
    isHostObject = _dereq_('../internal/isHostObject'),
 
    isObjectLike = _dereq_('../internal/isObjectLike');
 

	
 
/** Used to detect host constructors (Safari > 5). */
 
var reIsHostCtor = /^\[object .+?Constructor\]$/;
 

	
 
/** Used for native method references. */
 
var objectProto = Object.prototype;
 

	
 
/** Used to resolve the decompiled source of functions. */
 
var fnToString = Function.prototype.toString;
 

	
 
/** Used to check objects for own properties. */
 
var hasOwnProperty = objectProto.hasOwnProperty;
 

	
 
/** Used to detect if a method is native. */
 
var reIsNative = RegExp('^' +
 
  fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
 
  .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
 
);
 

	
 
/**
 
 * Checks if `value` is a native function.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
 
 * @example
 
 *
 
 * _.isNative(Array.prototype.push);
 
 * // => true
 
 *
 
 * _.isNative(_);
 
 * // => false
 
 */
 
function isNative(value) {
 
  if (value == null) {
 
    return false;
 
  }
 
  if (isFunction(value)) {
 
    return reIsNative.test(fnToString.call(value));
 
  }
 
  return isObjectLike(value) && (isHostObject(value) ? reIsNative : reIsHostCtor).test(value);
 
}
 

	
 
module.exports = isNative;
 

	
 
},{"../internal/isHostObject":22,"../internal/isObjectLike":26,"./isFunction":31}],33:[function(_dereq_,module,exports){
 
/**
 
 * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
 
 * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
 
 * @example
 
 *
 
 * _.isObject({});
 
 * // => true
 
 *
 
 * _.isObject([1, 2, 3]);
 
 * // => true
 
 *
 
 * _.isObject(1);
 
 * // => false
 
 */
 
function isObject(value) {
 
  // Avoid a V8 JIT bug in Chrome 19-20.
 
  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
 
  var type = typeof value;
 
  return !!value && (type == 'object' || type == 'function');
 
}
 

	
 
module.exports = isObject;
 

	
 
},{}],34:[function(_dereq_,module,exports){
 
var baseForIn = _dereq_('../internal/baseForIn'),
 
    isArguments = _dereq_('./isArguments'),
 
    isHostObject = _dereq_('../internal/isHostObject'),
 
    isObjectLike = _dereq_('../internal/isObjectLike'),
 
    support = _dereq_('../support');
 

	
 
/** `Object#toString` result references. */
 
var objectTag = '[object Object]';
 

	
 
/** Used for native method references. */
 
var objectProto = Object.prototype;
 

	
 
/** Used to check objects for own properties. */
 
var hasOwnProperty = objectProto.hasOwnProperty;
 

	
 
/**
 
 * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
 
 * of values.
 
 */
 
var objToString = objectProto.toString;
 

	
 
/**
 
 * Checks if `value` is a plain object, that is, an object created by the
 
 * `Object` constructor or one with a `[[Prototype]]` of `null`.
 
 *
 
 * **Note:** This method assumes objects created by the `Object` constructor
 
 * have no inherited enumerable properties.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
 
 * @example
 
 *
 
 * function Foo() {
 
 *   this.a = 1;
 
 * }
 
 *
 
 * _.isPlainObject(new Foo);
 
 * // => false
 
 *
 
 * _.isPlainObject([1, 2, 3]);
 
 * // => false
 
 *
 
 * _.isPlainObject({ 'x': 0, 'y': 0 });
 
 * // => true
 
 *
 
 * _.isPlainObject(Object.create(null));
 
 * // => true
 
 */
 
function isPlainObject(value) {
 
  var Ctor;
 

	
 
  // Exit early for non `Object` objects.
 
  if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isHostObject(value) && !isArguments(value)) ||
 
      (!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {
 
    return false;
 
  }
 
  // IE < 9 iterates inherited properties before own properties. If the first
 
  // iterated property is an object's own property then there are no inherited
 
  // enumerable properties.
 
  var result;
 
  if (support.ownLast) {
 
    baseForIn(value, function(subValue, key, object) {
 
      result = hasOwnProperty.call(object, key);
 
      return false;
 
    });
 
    return result !== false;
 
  }
 
  // In most environments an object's own properties are iterated before
 
  // its inherited properties. If the last iterated property is an object's
 
  // own property then there are no inherited enumerable properties.
 
  baseForIn(value, function(subValue, key) {
 
    result = key;
 
  });
 
  return result === undefined || hasOwnProperty.call(value, result);
 
}
 

	
 
module.exports = isPlainObject;
 

	
 
},{"../internal/baseForIn":12,"../internal/isHostObject":22,"../internal/isObjectLike":26,"../support":41,"./isArguments":29}],35:[function(_dereq_,module,exports){
 
var isObjectLike = _dereq_('../internal/isObjectLike');
 

	
 
/** `Object#toString` result references. */
 
var stringTag = '[object String]';
 

	
 
/** Used for native method references. */
 
var objectProto = Object.prototype;
 

	
 
/**
 
 * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
 
 * of values.
 
 */
 
var objToString = objectProto.toString;
 

	
 
/**
 
 * Checks if `value` is classified as a `String` primitive or object.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
 
 * @example
 
 *
 
 * _.isString('abc');
 
 * // => true
 
 *
 
 * _.isString(1);
 
 * // => false
 
 */
 
function isString(value) {
 
  return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);
 
}
 

	
 
module.exports = isString;
 

	
 
},{"../internal/isObjectLike":26}],36:[function(_dereq_,module,exports){
 
var isLength = _dereq_('../internal/isLength'),
 
    isObjectLike = _dereq_('../internal/isObjectLike');
 

	
 
/** `Object#toString` result references. */
 
var argsTag = '[object Arguments]',
 
    arrayTag = '[object Array]',
 
    boolTag = '[object Boolean]',
 
    dateTag = '[object Date]',
 
    errorTag = '[object Error]',
 
    funcTag = '[object Function]',
 
    mapTag = '[object Map]',
 
    numberTag = '[object Number]',
 
    objectTag = '[object Object]',
 
    regexpTag = '[object RegExp]',
 
    setTag = '[object Set]',
 
    stringTag = '[object String]',
 
    weakMapTag = '[object WeakMap]';
 

	
 
var arrayBufferTag = '[object ArrayBuffer]',
 
    float32Tag = '[object Float32Array]',
 
    float64Tag = '[object Float64Array]',
 
    int8Tag = '[object Int8Array]',
 
    int16Tag = '[object Int16Array]',
 
    int32Tag = '[object Int32Array]',
 
    uint8Tag = '[object Uint8Array]',
 
    uint8ClampedTag = '[object Uint8ClampedArray]',
 
    uint16Tag = '[object Uint16Array]',
 
    uint32Tag = '[object Uint32Array]';
 

	
 
/** Used to identify `toStringTag` values of typed arrays. */
 
var typedArrayTags = {};
 
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
 
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
 
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
 
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
 
typedArrayTags[uint32Tag] = true;
 
typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
 
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
 
typedArrayTags[dateTag] = typedArrayTags[errorTag] =
 
typedArrayTags[funcTag] = typedArrayTags[mapTag] =
 
typedArrayTags[numberTag] = typedArrayTags[objectTag] =
 
typedArrayTags[regexpTag] = typedArrayTags[setTag] =
 
typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
 

	
 
/** Used for native method references. */
 
var objectProto = Object.prototype;
 

	
 
/**
 
 * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
 
 * of values.
 
 */
 
var objToString = objectProto.toString;
 

	
 
/**
 
 * Checks if `value` is classified as a typed array.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to check.
 
 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
 
 * @example
 
 *
 
 * _.isTypedArray(new Uint8Array);
 
 * // => true
 
 *
 
 * _.isTypedArray([]);
 
 * // => false
 
 */
 
function isTypedArray(value) {
 
  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];
 
}
 

	
 
module.exports = isTypedArray;
 

	
 
},{"../internal/isLength":25,"../internal/isObjectLike":26}],37:[function(_dereq_,module,exports){
 
var baseCopy = _dereq_('../internal/baseCopy'),
 
    keysIn = _dereq_('../object/keysIn');
 

	
 
/**
 
 * Converts `value` to a plain object flattening inherited enumerable
 
 * properties of `value` to own properties of the plain object.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Lang
 
 * @param {*} value The value to convert.
 
 * @returns {Object} Returns the converted plain object.
 
 * @example
 
 *
 
 * function Foo() {
 
 *   this.b = 2;
 
 * }
 
 *
 
 * Foo.prototype.c = 3;
 
 *
 
 * _.assign({ 'a': 1 }, new Foo);
 
 * // => { 'a': 1, 'b': 2 }
 
 *
 
 * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
 
 * // => { 'a': 1, 'b': 2, 'c': 3 }
 
 */
 
function toPlainObject(value) {
 
  return baseCopy(value, keysIn(value));
 
}
 

	
 
module.exports = toPlainObject;
 

	
 
},{"../internal/baseCopy":10,"../object/keysIn":39}],38:[function(_dereq_,module,exports){
 
var getNative = _dereq_('../internal/getNative'),
 
    isArrayLike = _dereq_('../internal/isArrayLike'),
 
    isObject = _dereq_('../lang/isObject'),
 
    shimKeys = _dereq_('../internal/shimKeys'),
 
    support = _dereq_('../support');
 

	
 
/* Native method references for those with the same name as other `lodash` methods. */
 
var nativeKeys = getNative(Object, 'keys');
 

	
 
/**
 
 * Creates an array of the own enumerable property names of `object`.
 
 *
 
 * **Note:** Non-object values are coerced to objects. See the
 
 * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
 
 * for more details.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Object
 
 * @param {Object} object The object to query.
 
 * @returns {Array} Returns the array of property names.
 
 * @example
 
 *
 
 * function Foo() {
 
 *   this.a = 1;
 
 *   this.b = 2;
 
 * }
 
 *
 
 * Foo.prototype.c = 3;
 
 *
 
 * _.keys(new Foo);
 
 * // => ['a', 'b'] (iteration order is not guaranteed)
 
 *
 
 * _.keys('hi');
 
 * // => ['0', '1']
 
 */
 
var keys = !nativeKeys ? shimKeys : function(object) {
 
  var Ctor = object == null ? undefined : object.constructor;
 
  if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
 
      (typeof object == 'function' ? support.enumPrototypes : isArrayLike(object))) {
 
    return shimKeys(object);
 
  }
 
  return isObject(object) ? nativeKeys(object) : [];
 
};
 

	
 
module.exports = keys;
 

	
 
},{"../internal/getNative":20,"../internal/isArrayLike":21,"../internal/shimKeys":27,"../lang/isObject":33,"../support":41}],39:[function(_dereq_,module,exports){
 
var arrayEach = _dereq_('../internal/arrayEach'),
 
    isArguments = _dereq_('../lang/isArguments'),
 
    isArray = _dereq_('../lang/isArray'),
 
    isFunction = _dereq_('../lang/isFunction'),
 
    isIndex = _dereq_('../internal/isIndex'),
 
    isLength = _dereq_('../internal/isLength'),
 
    isObject = _dereq_('../lang/isObject'),
 
    isString = _dereq_('../lang/isString'),
 
    support = _dereq_('../support');
 

	
 
/** `Object#toString` result references. */
 
var arrayTag = '[object Array]',
 
    boolTag = '[object Boolean]',
 
    dateTag = '[object Date]',
 
    errorTag = '[object Error]',
 
    funcTag = '[object Function]',
 
    numberTag = '[object Number]',
 
    objectTag = '[object Object]',
 
    regexpTag = '[object RegExp]',
 
    stringTag = '[object String]';
 

	
 
/** Used to fix the JScript `[[DontEnum]]` bug. */
 
var shadowProps = [
 
  'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',
 
  'toLocaleString', 'toString', 'valueOf'
 
];
 

	
 
/** Used for native method references. */
 
var errorProto = Error.prototype,
 
    objectProto = Object.prototype,
 
    stringProto = String.prototype;
 

	
 
/** Used to check objects for own properties. */
 
var hasOwnProperty = objectProto.hasOwnProperty;
 

	
 
/**
 
 * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
 
 * of values.
 
 */
 
var objToString = objectProto.toString;
 

	
 
/** Used to avoid iterating over non-enumerable properties in IE < 9. */
 
var nonEnumProps = {};
 
nonEnumProps[arrayTag] = nonEnumProps[dateTag] = nonEnumProps[numberTag] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };
 
nonEnumProps[boolTag] = nonEnumProps[stringTag] = { 'constructor': true, 'toString': true, 'valueOf': true };
 
nonEnumProps[errorTag] = nonEnumProps[funcTag] = nonEnumProps[regexpTag] = { 'constructor': true, 'toString': true };
 
nonEnumProps[objectTag] = { 'constructor': true };
 

	
 
arrayEach(shadowProps, function(key) {
 
  for (var tag in nonEnumProps) {
 
    if (hasOwnProperty.call(nonEnumProps, tag)) {
 
      var props = nonEnumProps[tag];
 
      props[key] = hasOwnProperty.call(props, key);
 
    }
 
  }
 
});
 

	
 
/**
 
 * Creates an array of the own and inherited enumerable property names of `object`.
 
 *
 
 * **Note:** Non-object values are coerced to objects.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Object
 
 * @param {Object} object The object to query.
 
 * @returns {Array} Returns the array of property names.
 
 * @example
 
 *
 
 * function Foo() {
 
 *   this.a = 1;
 
 *   this.b = 2;
 
 * }
 
 *
 
 * Foo.prototype.c = 3;
 
 *
 
 * _.keysIn(new Foo);
 
 * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
 
 */
 
function keysIn(object) {
 
  if (object == null) {
 
    return [];
 
  }
 
  if (!isObject(object)) {
 
    object = Object(object);
 
  }
 
  var length = object.length;
 

	
 
  length = (length && isLength(length) &&
 
    (isArray(object) || isArguments(object) || isString(object)) && length) || 0;
 

	
 
  var Ctor = object.constructor,
 
      index = -1,
 
      proto = (isFunction(Ctor) && Ctor.prototype) || objectProto,
 
      isProto = proto === object,
 
      result = Array(length),
 
      skipIndexes = length > 0,
 
      skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error),
 
      skipProto = support.enumPrototypes && isFunction(object);
 

	
 
  while (++index < length) {
 
    result[index] = (index + '');
 
  }
 
  // lodash skips the `constructor` property when it infers it's iterating
 
  // over a `prototype` object because IE < 9 can't set the `[[Enumerable]]`
 
  // attribute of an existing property and the `constructor` property of a
 
  // prototype defaults to non-enumerable.
 
  for (var key in object) {
 
    if (!(skipProto && key == 'prototype') &&
 
        !(skipErrorProps && (key == 'message' || key == 'name')) &&
 
        !(skipIndexes && isIndex(key, length)) &&
 
        !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
 
      result.push(key);
 
    }
 
  }
 
  if (support.nonEnumShadows && object !== objectProto) {
 
    var tag = object === stringProto ? stringTag : (object === errorProto ? errorTag : objToString.call(object)),
 
        nonEnums = nonEnumProps[tag] || nonEnumProps[objectTag];
 

	
 
    if (tag == objectTag) {
 
      proto = objectProto;
 
    }
 
    length = shadowProps.length;
 
    while (length--) {
 
      key = shadowProps[length];
 
      var nonEnum = nonEnums[key];
 
      if (!(isProto && nonEnum) &&
 
          (nonEnum ? hasOwnProperty.call(object, key) : object[key] !== proto[key])) {
 
        result.push(key);
 
      }
 
    }
 
  }
 
  return result;
 
}
 

	
 
module.exports = keysIn;
 

	
 
},{"../internal/arrayEach":9,"../internal/isIndex":23,"../internal/isLength":25,"../lang/isArguments":29,"../lang/isArray":30,"../lang/isFunction":31,"../lang/isObject":33,"../lang/isString":35,"../support":41}],40:[function(_dereq_,module,exports){
 
var baseMerge = _dereq_('../internal/baseMerge'),
 
    createAssigner = _dereq_('../internal/createAssigner');
 

	
 
/**
 
 * Recursively merges own enumerable properties of the source object(s), that
 
 * don't resolve to `undefined` into the destination object. Subsequent sources
 
 * overwrite property assignments of previous sources. If `customizer` is
 
 * provided it's invoked to produce the merged values of the destination and
 
 * source properties. If `customizer` returns `undefined` merging is handled
 
 * by the method instead. The `customizer` is bound to `thisArg` and invoked
 
 * with five arguments: (objectValue, sourceValue, key, object, source).
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Object
 
 * @param {Object} object The destination object.
 
 * @param {...Object} [sources] The source objects.
 
 * @param {Function} [customizer] The function to customize assigned values.
 
 * @param {*} [thisArg] The `this` binding of `customizer`.
 
 * @returns {Object} Returns `object`.
 
 * @example
 
 *
 
 * var users = {
 
 *   'data': [{ 'user': 'barney' }, { 'user': 'fred' }]
 
 * };
 
 *
 
 * var ages = {
 
 *   'data': [{ 'age': 36 }, { 'age': 40 }]
 
 * };
 
 *
 
 * _.merge(users, ages);
 
 * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }
 
 *
 
 * // using a customizer callback
 
 * var object = {
 
 *   'fruits': ['apple'],
 
 *   'vegetables': ['beet']
 
 * };
 
 *
 
 * var other = {
 
 *   'fruits': ['banana'],
 
 *   'vegetables': ['carrot']
 
 * };
 
 *
 
 * _.merge(object, other, function(a, b) {
 
 *   if (_.isArray(a)) {
 
 *     return a.concat(b);
 
 *   }
 
 * });
 
 * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
 
 */
 
var merge = createAssigner(baseMerge);
 

	
 
module.exports = merge;
 

	
 
},{"../internal/baseMerge":13,"../internal/createAssigner":17}],41:[function(_dereq_,module,exports){
 
/** Used for native method references. */
 
var arrayProto = Array.prototype,
 
    errorProto = Error.prototype,
 
    objectProto = Object.prototype;
 

	
 
/** Native method references. */
 
var propertyIsEnumerable = objectProto.propertyIsEnumerable,
 
    splice = arrayProto.splice;
 

	
 
/**
 
 * An object environment feature flags.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @type Object
 
 */
 
var support = {};
 

	
 
(function(x) {
 
  var Ctor = function() { this.x = x; },
 
      object = { '0': x, 'length': x },
 
      props = [];
 

	
 
  Ctor.prototype = { 'valueOf': x, 'y': x };
 
  for (var key in new Ctor) { props.push(key); }
 

	
 
  /**
 
   * Detect if `name` or `message` properties of `Error.prototype` are
 
   * enumerable by default (IE < 9, Safari < 5.1).
 
   *
 
   * @memberOf _.support
 
   * @type boolean
 
   */
 
  support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') ||
 
    propertyIsEnumerable.call(errorProto, 'name');
 

	
 
  /**
 
   * Detect if `prototype` properties are enumerable by default.
 
   *
 
   * Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1
 
   * (if the prototype or a property on the prototype has been set)
 
   * incorrectly set the `[[Enumerable]]` value of a function's `prototype`
 
   * property to `true`.
 
   *
 
   * @memberOf _.support
 
   * @type boolean
 
   */
 
  support.enumPrototypes = propertyIsEnumerable.call(Ctor, 'prototype');
 

	
 
  /**
 
   * Detect if properties shadowing those on `Object.prototype` are non-enumerable.
 
   *
 
   * In IE < 9 an object's own properties, shadowing non-enumerable ones,
 
   * are made non-enumerable as well (a.k.a the JScript `[[DontEnum]]` bug).
 
   *
 
   * @memberOf _.support
 
   * @type boolean
 
   */
 
  support.nonEnumShadows = !/valueOf/.test(props);
 

	
 
  /**
 
   * Detect if own properties are iterated after inherited properties (IE < 9).
 
   *
 
   * @memberOf _.support
 
   * @type boolean
 
   */
 
  support.ownLast = props[0] != 'x';
 

	
 
  /**
 
   * Detect if `Array#shift` and `Array#splice` augment array-like objects
 
   * correctly.
 
   *
 
   * Firefox < 10, compatibility modes of IE 8, and IE < 9 have buggy Array
 
   * `shift()` and `splice()` functions that fail to remove the last element,
 
   * `value[0]`, of array-like objects even though the "length" property is
 
   * set to `0`. The `shift()` method is buggy in compatibility modes of IE 8,
 
   * while `splice()` is buggy regardless of mode in IE < 9.
 
   *
 
   * @memberOf _.support
 
   * @type boolean
 
   */
 
  support.spliceObjects = (splice.call(object, 0, 1), !object[0]);
 

	
 
  /**
 
   * Detect lack of support for accessing string characters by index.
 
   *
 
   * IE < 8 can't access characters by index. IE 8 can only access characters
 
   * by index on string literals, not string objects.
 
   *
 
   * @memberOf _.support
 
   * @type boolean
 
   */
 
  support.unindexedChars = ('x'[0] + Object('x')[0]) != 'xx';
 
}(1, 0));
 

	
 
module.exports = support;
 

	
 
},{}],42:[function(_dereq_,module,exports){
 
/**
 
 * This method returns the first argument provided to it.
 
 *
 
 * @static
 
 * @memberOf _
 
 * @category Utility
 
 * @param {*} value Any value.
 
 * @returns {*} Returns `value`.
 
 * @example
 
 *
 
 * var object = { 'user': 'fred' };
 
 *
 
 * _.identity(object) === object;
 
 * // => true
 
 */
 
function identity(value) {
 
  return value;
 
}
 

	
 
module.exports = identity;
 

	
 
},{}],43:[function(_dereq_,module,exports){
 
'use strict';
 

	
 
// modified from https://github.com/es-shims/es6-shim
 
var keys = _dereq_('object-keys');
 
var canBeObject = function (obj) {
 
	return typeof obj !== 'undefined' && obj !== null;
 
};
 
var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';
 
var defineProperties = _dereq_('define-properties');
 
var toObject = Object;
 
var push = Array.prototype.push;
 
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
 

	
 
var assignShim = function assign(target, source1) {
 
	if (!canBeObject(target)) { throw new TypeError('target must be an object'); }
 
	var objTarget = toObject(target);
 
	var s, source, i, props, syms;
 
	for (s = 1; s < arguments.length; ++s) {
 
		source = toObject(arguments[s]);
 
		props = keys(source);
 
		if (hasSymbols && Object.getOwnPropertySymbols) {
 
			syms = Object.getOwnPropertySymbols(source);
 
			for (i = 0; i < syms.length; ++i) {
 
				if (propIsEnumerable.call(source, syms[i])) {
 
					push.call(props, syms[i]);
 
				}
 
			}
 
		}
 
		for (i = 0; i < props.length; ++i) {
 
			objTarget[props[i]] = source[props[i]];
 
		}
 
	}
 
	return objTarget;
 
};
 

	
 
defineProperties(assignShim, {
 
	shim: function shimObjectAssign() {
 
		var assignHasPendingExceptions = function () {
 
			if (!Object.assign || !Object.preventExtensions) {
 
				return false;
 
			}
 
			// Firefox 37 still has "pending exception" logic in its Object.assign implementation,
 
			// which is 72% slower than our shim, and Firefox 40's native implementation.
 
			var thrower = Object.preventExtensions({ 1: 2 });
 
			try {
 
				Object.assign(thrower, 'xy');
 
			} catch (e) {
 
				return thrower[1] === 'y';
 
			}
 
		};
 
		defineProperties(
 
			Object,
 
			{ assign: assignShim },
 
			{ assign: assignHasPendingExceptions }
 
		);
 
		return Object.assign || assignShim;
 
	}
 
});
 

	
 
module.exports = assignShim;
 

	
 
},{"define-properties":44,"object-keys":46}],44:[function(_dereq_,module,exports){
 
'use strict';
 

	
 
var keys = _dereq_('object-keys');
 
var foreach = _dereq_('foreach');
 
var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';
 

	
 
var toStr = Object.prototype.toString;
 

	
 
var isFunction = function (fn) {
 
	return typeof fn === 'function' && toStr.call(fn) === '[object Function]';
 
};
 

	
 
var arePropertyDescriptorsSupported = function () {
 
	var obj = {};
 
	try {
 
		Object.defineProperty(obj, 'x', { value: obj, enumerable: false });
 
        /* eslint-disable no-unused-vars */
 
        for (var _ in obj) { return false; }
 
        /* eslint-enable no-unused-vars */
 
		return obj.x === obj;
 
	} catch (e) { /* this is IE 8. */
 
		return false;
 
	}
 
};
 
var supportsDescriptors = Object.defineProperty && arePropertyDescriptorsSupported();
 

	
 
var defineProperty = function (object, name, value, predicate) {
 
	if (name in object && (!isFunction(predicate) || !predicate())) {
 
		return;
 
	}
 
	if (supportsDescriptors) {
 
		Object.defineProperty(object, name, {
 
			configurable: true,
 
			enumerable: false,
 
			writable: true,
 
			value: value
 
		});
 
	} else {
 
		object[name] = value;
 
	}
 
};
 

	
 
var defineProperties = function (object, map) {
 
	var predicates = arguments.length > 2 ? arguments[2] : {};
 
	var props = keys(map);
 
	if (hasSymbols) {
 
		props = props.concat(Object.getOwnPropertySymbols(map));
 
	}
 
	foreach(props, function (name) {
 
		defineProperty(object, name, map[name], predicates[name]);
 
	});
 
};
 

	
 
defineProperties.supportsDescriptors = !!supportsDescriptors;
 

	
 
module.exports = defineProperties;
 

	
 
},{"foreach":45,"object-keys":46}],45:[function(_dereq_,module,exports){
 

	
 
var hasOwn = Object.prototype.hasOwnProperty;
 
var toString = Object.prototype.toString;
 

	
 
module.exports = function forEach (obj, fn, ctx) {
 
    if (toString.call(fn) !== '[object Function]') {
 
        throw new TypeError('iterator must be a function');
 
    }
 
    var l = obj.length;
 
    if (l === +l) {
 
        for (var i = 0; i < l; i++) {
 
            fn.call(ctx, obj[i], i, obj);
 
        }
 
    } else {
 
        for (var k in obj) {
 
            if (hasOwn.call(obj, k)) {
 
                fn.call(ctx, obj[k], k, obj);
 
            }
 
        }
 
    }
 
};
 

	
 

	
 
},{}],46:[function(_dereq_,module,exports){
 
'use strict';
 

	
 
// modified from https://github.com/es-shims/es5-shim
 
var has = Object.prototype.hasOwnProperty;
 
var toStr = Object.prototype.toString;
 
var slice = Array.prototype.slice;
 
var isArgs = _dereq_('./isArguments');
 
var hasDontEnumBug = !({ 'toString': null }).propertyIsEnumerable('toString');
 
var hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype');
 
var dontEnums = [
 
	'toString',
 
	'toLocaleString',
 
	'valueOf',
 
	'hasOwnProperty',
 
	'isPrototypeOf',
 
	'propertyIsEnumerable',
 
	'constructor'
 
];
 
var equalsConstructorPrototype = function (o) {
 
	var ctor = o.constructor;
 
	return ctor && ctor.prototype === o;
 
};
 
var blacklistedKeys = {
 
	$window: true,
 
	$console: true,
 
	$parent: true,
 
	$self: true,
 
	$frames: true,
 
	$webkitIndexedDB: true,
 
	$webkitStorageInfo: true
 
};
 
var hasAutomationEqualityBug = (function () {
 
	/* global window */
 
	if (typeof window === 'undefined') { return false; }
 
	for (var k in window) {
 
		if (!blacklistedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
 
			try {
 
				equalsConstructorPrototype(window[k]);
 
			} catch (e) {
 
				return true;
 
			}
 
		}
 
	}
 
	return false;
 
}());
 
var equalsConstructorPrototypeIfNotBuggy = function (o) {
 
	/* global window */
 
	if (typeof window === 'undefined' && !hasAutomationEqualityBug) {
 
		return equalsConstructorPrototype(o);
 
	}
 
	try {
 
		return equalsConstructorPrototype(o);
 
	} catch (e) {
 
		return false;
 
	}
 
};
 

	
 
var keysShim = function keys(object) {
 
	var isObject = object !== null && typeof object === 'object';
 
	var isFunction = toStr.call(object) === '[object Function]';
 
	var isArguments = isArgs(object);
 
	var isString = isObject && toStr.call(object) === '[object String]';
 
	var theKeys = [];
 

	
 
	if (!isObject && !isFunction && !isArguments) {
 
		throw new TypeError('Object.keys called on a non-object');
 
	}
 

	
 
	var skipProto = hasProtoEnumBug && isFunction;
 
	if (isString && object.length > 0 && !has.call(object, 0)) {
 
		for (var i = 0; i < object.length; ++i) {
 
			theKeys.push(String(i));
 
		}
 
	}
 

	
 
	if (isArguments && object.length > 0) {
 
		for (var j = 0; j < object.length; ++j) {
 
			theKeys.push(String(j));
 
		}
 
	} else {
 
		for (var name in object) {
 
			if (!(skipProto && name === 'prototype') && has.call(object, name)) {
 
				theKeys.push(String(name));
 
			}
 
		}
 
	}
 

	
 
	if (hasDontEnumBug) {
 
		var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
 

	
 
		for (var k = 0; k < dontEnums.length; ++k) {
 
			if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
 
				theKeys.push(dontEnums[k]);
 
			}
 
		}
 
	}
 
	return theKeys;
 
};
 

	
 
keysShim.shim = function shimObjectKeys() {
 
	if (!Object.keys) {
 
		Object.keys = keysShim;
 
	} else {
 
		var keysWorksWithArguments = (function () {
 
			// Safari 5.0 bug
 
			return (Object.keys(arguments) || '').length === 2;
 
		}(1, 2));
 
		if (!keysWorksWithArguments) {
 
			var originalKeys = Object.keys;
 
			Object.keys = function keys(object) {
 
				if (isArgs(object)) {
 
					return originalKeys(slice.call(object));
 
				} else {
 
					return originalKeys(object);
 
				}
 
			};
 
		}
 
	}
 
	return Object.keys || keysShim;
 
};
 

	
 
module.exports = keysShim;
 

	
 
},{"./isArguments":47}],47:[function(_dereq_,module,exports){
 
'use strict';
 

	
 
var toStr = Object.prototype.toString;
 

	
 
module.exports = function isArguments(value) {
 
	var str = toStr.call(value);
 
	var isArgs = str === '[object Arguments]';
 
	if (!isArgs) {
 
		isArgs = str !== '[object Array]' &&
 
			value !== null &&
 
			typeof value === 'object' &&
 
			typeof value.length === 'number' &&
 
			value.length >= 0 &&
 
			toStr.call(value.callee) === '[object Function]';
 
	}
 
	return isArgs;
 
};
 

	
 
},{}],48:[function(_dereq_,module,exports){
 
module.exports = SafeParseTuple
 

	
 
function SafeParseTuple(obj, reviver) {
 
    var json
 
    var error = null
 

	
 
    try {
 
        json = JSON.parse(obj, reviver)
 
    } catch (err) {
 
        error = err
 
    }
 

	
 
    return [error, json]
 
}
 

	
 
},{}],49:[function(_dereq_,module,exports){
 
function clean (s) {
 
  return s.replace(/\n\r?\s*/g, '')
 
}
 

	
 

	
 
module.exports = function tsml (sa) {
 
  var s = ''
 
    , i = 0
 

	
 
  for (; i < arguments.length; i++)
 
    s += clean(sa[i]) + (arguments[i + 1] || '')
 

	
 
  return s
 
}
 
},{}],50:[function(_dereq_,module,exports){
 
"use strict";
 
var window = _dereq_("global/window")
 
var once = _dereq_("once")
 
var parseHeaders = _dereq_("parse-headers")
 

	
 

	
 

	
 
module.exports = createXHR
 
createXHR.XMLHttpRequest = window.XMLHttpRequest || noop
 
createXHR.XDomainRequest = "withCredentials" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window.XDomainRequest
 

	
 

	
 
function isEmpty(obj){
 
    for(var i in obj){
 
        if(obj.hasOwnProperty(i)) return false
 
    }
 
    return true
 
}
 

	
 
function createXHR(options, callback) {
 
    function readystatechange() {
 
        if (xhr.readyState === 4) {
 
            loadFunc()
 
        }
 
    }
 

	
 
    function getBody() {
 
        // Chrome with requestType=blob throws errors arround when even testing access to responseText
 
        var body = undefined
 

	
 
        if (xhr.response) {
 
            body = xhr.response
 
        } else if (xhr.responseType === "text" || !xhr.responseType) {
 
            body = xhr.responseText || xhr.responseXML
 
        }
 

	
 
        if (isJson) {
 
            try {
 
                body = JSON.parse(body)
 
            } catch (e) {}
 
        }
 

	
 
        return body
 
    }
 

	
 
    var failureResponse = {
 
                body: undefined,
 
                headers: {},
 
                statusCode: 0,
 
                method: method,
 
                url: uri,
 
                rawRequest: xhr
 
            }
 

	
 
    function errorFunc(evt) {
 
        clearTimeout(timeoutTimer)
 
        if(!(evt instanceof Error)){
 
            evt = new Error("" + (evt || "Unknown XMLHttpRequest Error") )
 
        }
 
        evt.statusCode = 0
 
        callback(evt, failureResponse)
 
    }
 

	
 
    // will load the data & process the response in a special response object
 
    function loadFunc() {
 
        if (aborted) return
 
        var status
 
        clearTimeout(timeoutTimer)
 
        if(options.useXDR && xhr.status===undefined) {
 
            //IE8 CORS GET successful response doesn't have a status field, but body is fine
 
            status = 200
 
        } else {
 
            status = (xhr.status === 1223 ? 204 : xhr.status)
 
        }
 
        var response = failureResponse
 
        var err = null
 

	
 
        if (status !== 0){
 
            response = {
 
                body: getBody(),
 
                statusCode: status,
 
                method: method,
 
                headers: {},
 
                url: uri,
 
                rawRequest: xhr
 
            }
 
            if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE
 
                response.headers = parseHeaders(xhr.getAllResponseHeaders())
 
            }
 
        } else {
 
            err = new Error("Internal XMLHttpRequest Error")
 
        }
 
        callback(err, response, response.body)
 

	
 
    }
 

	
 
    if (typeof options === "string") {
 
        options = { uri: options }
 
    }
 

	
 
    options = options || {}
 
    if(typeof callback === "undefined"){
 
        throw new Error("callback argument missing")
 
    }
 
    callback = once(callback)
 

	
 
    var xhr = options.xhr || null
 

	
 
    if (!xhr) {
 
        if (options.cors || options.useXDR) {
 
            xhr = new createXHR.XDomainRequest()
 
        }else{
 
            xhr = new createXHR.XMLHttpRequest()
 
        }
 
    }
 

	
 
    var key
 
    var aborted
 
    var uri = xhr.url = options.uri || options.url
 
    var method = xhr.method = options.method || "GET"
 
    var body = options.body || options.data
 
    var headers = xhr.headers = options.headers || {}
 
    var sync = !!options.sync
 
    var isJson = false
 
    var timeoutTimer
 

	
 
    if ("json" in options) {
 
        isJson = true
 
        headers["accept"] || headers["Accept"] || (headers["Accept"] = "application/json") //Don't override existing accept header declared by user
 
        if (method !== "GET" && method !== "HEAD") {
 
            headers["content-type"] || headers["Content-Type"] || (headers["Content-Type"] = "application/json") //Don't override existing accept header declared by user
 
            body = JSON.stringify(options.json)
 
        }
 
    }
 

	
 
    xhr.onreadystatechange = readystatechange
 
    xhr.onload = loadFunc
 
    xhr.onerror = errorFunc
 
    // IE9 must have onprogress be set to a unique function.
 
    xhr.onprogress = function () {
 
        // IE must die
 
    }
 
    xhr.ontimeout = errorFunc
 
    xhr.open(method, uri, !sync, options.username, options.password)
 
    //has to be after open
 
    if(!sync) {
 
        xhr.withCredentials = !!options.withCredentials
 
    }
 
    // Cannot set timeout with sync request
 
    // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly
 
    // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent
 
    if (!sync && options.timeout > 0 ) {
 
        timeoutTimer = setTimeout(function(){
 
            aborted=true//IE9 may still call readystatechange
 
            xhr.abort("timeout")
 
            var e = new Error("XMLHttpRequest timeout")
 
            e.code = "ETIMEDOUT"
 
            errorFunc(e)
 
        }, options.timeout )
 
    }
 

	
 
    if (xhr.setRequestHeader) {
 
        for(key in headers){
 
            if(headers.hasOwnProperty(key)){
 
                xhr.setRequestHeader(key, headers[key])
 
            }
 
        }
 
    } else if (options.headers && !isEmpty(options.headers)) {
 
        throw new Error("Headers cannot be set on an XDomainRequest object")
 
    }
 

	
 
    if ("responseType" in options) {
 
        xhr.responseType = options.responseType
 
    }
 

	
 
    if ("beforeSend" in options &&
 
        typeof options.beforeSend === "function"
 
    ) {
 
        options.beforeSend(xhr)
 
    }
 

	
 
    xhr.send(body)
 

	
 
    return xhr
 

	
 

	
 
}
 

	
 
function noop() {}
 

	
 
},{"global/window":2,"once":51,"parse-headers":55}],51:[function(_dereq_,module,exports){
 
module.exports = once
 

	
 
once.proto = once(function () {
 
  Object.defineProperty(Function.prototype, 'once', {
 
    value: function () {
 
      return once(this)
 
    },
 
    configurable: true
 
  })
 
})
 

	
 
function once (fn) {
 
  var called = false
 
  return function () {
 
    if (called) return
 
    called = true
 
    return fn.apply(this, arguments)
 
  }
 
}
 

	
 
},{}],52:[function(_dereq_,module,exports){
 
var isFunction = _dereq_('is-function')
 

	
 
module.exports = forEach
 

	
 
var toString = Object.prototype.toString
 
var hasOwnProperty = Object.prototype.hasOwnProperty
 

	
 
function forEach(list, iterator, context) {
 
    if (!isFunction(iterator)) {
 
        throw new TypeError('iterator must be a function')
 
    }
 

	
 
    if (arguments.length < 3) {
 
        context = this
 
    }
 
    
 
    if (toString.call(list) === '[object Array]')
 
        forEachArray(list, iterator, context)
 
    else if (typeof list === 'string')
 
        forEachString(list, iterator, context)
 
    else
 
        forEachObject(list, iterator, context)
 
}
 

	
 
function forEachArray(array, iterator, context) {
 
    for (var i = 0, len = array.length; i < len; i++) {
 
        if (hasOwnProperty.call(array, i)) {
 
            iterator.call(context, array[i], i, array)
 
        }
 
    }
 
}
 

	
 
function forEachString(string, iterator, context) {
 
    for (var i = 0, len = string.length; i < len; i++) {
 
        // no such thing as a sparse string.
 
        iterator.call(context, string.charAt(i), i, string)
 
    }
 
}
 

	
 
function forEachObject(object, iterator, context) {
 
    for (var k in object) {
 
        if (hasOwnProperty.call(object, k)) {
 
            iterator.call(context, object[k], k, object)
 
        }
 
    }
 
}
 

	
 
},{"is-function":53}],53:[function(_dereq_,module,exports){
 
module.exports = isFunction
 

	
 
var toString = Object.prototype.toString
 

	
 
function isFunction (fn) {
 
  var string = toString.call(fn)
 
  return string === '[object Function]' ||
 
    (typeof fn === 'function' && string !== '[object RegExp]') ||
 
    (typeof window !== 'undefined' &&
 
     // IE8 and below
 
     (fn === window.setTimeout ||
 
      fn === window.alert ||
 
      fn === window.confirm ||
 
      fn === window.prompt))
 
};
 

	
 
},{}],54:[function(_dereq_,module,exports){
 

	
 
exports = module.exports = trim;
 

	
 
function trim(str){
 
  return str.replace(/^\s*|\s*$/g, '');
 
}
 

	
 
exports.left = function(str){
 
  return str.replace(/^\s*/, '');
 
};
 

	
 
exports.right = function(str){
 
  return str.replace(/\s*$/, '');
 
};
 

	
 
},{}],55:[function(_dereq_,module,exports){
 
var trim = _dereq_('trim')
 
  , forEach = _dereq_('for-each')
 
  , isArray = function(arg) {
 
      return Object.prototype.toString.call(arg) === '[object Array]';
 
    }
 

	
 
module.exports = function (headers) {
 
  if (!headers)
 
    return {}
 

	
 
  var result = {}
 

	
 
  forEach(
 
      trim(headers).split('\n')
 
    , function (row) {
 
        var index = row.indexOf(':')
 
          , key = trim(row.slice(0, index)).toLowerCase()
 
          , value = trim(row.slice(index + 1))
 

	
 
        if (typeof(result[key]) === 'undefined') {
 
          result[key] = value
 
        } else if (isArray(result[key])) {
 
          result[key].push(value)
 
        } else {
 
          result[key] = [ result[key], value ]
 
        }
 
      }
 
  )
 

	
 
  return result
 
}
 
},{"for-each":52,"trim":54}],56:[function(_dereq_,module,exports){
 
/**
 
 * @file big-play-button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _buttonJs = _dereq_('./button.js');
 

	
 
var _buttonJs2 = _interopRequireDefault(_buttonJs);
 

	
 
var _componentJs = _dereq_('./component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * Initial play button. Shows before the video has played. The hiding of the
 
 * big play button is done via CSS and player states.
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @extends Button
 
 * @class BigPlayButton
 
 */
 

	
 
var BigPlayButton = (function (_Button) {
 
  _inherits(BigPlayButton, _Button);
 

	
 
  function BigPlayButton(player, options) {
 
    _classCallCheck(this, BigPlayButton);
 

	
 
    _Button.call(this, player, options);
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  BigPlayButton.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-big-play-button';
 
  };
 

	
 
  /**
 
   * Handles click for play
 
   *
 
   * @method handleClick
 
   */
 

	
 
  BigPlayButton.prototype.handleClick = function handleClick() {
 
    this.player_.play();
 
  };
 

	
 
  return BigPlayButton;
 
})(_buttonJs2['default']);
 

	
 
BigPlayButton.prototype.controlText_ = 'Play Video';
 

	
 
_componentJs2['default'].registerComponent('BigPlayButton', BigPlayButton);
 
exports['default'] = BigPlayButton;
 
module.exports = exports['default'];
 

	
 
},{"./button.js":57,"./component.js":58}],57:[function(_dereq_,module,exports){
 
/**
 
 * @file button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _component = _dereq_('./component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _utilsDomJs = _dereq_('./utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsEventsJs = _dereq_('./utils/events.js');
 

	
 
var Events = _interopRequireWildcard(_utilsEventsJs);
 

	
 
var _utilsFnJs = _dereq_('./utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
/**
 
 * Base class for all buttons
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @extends Component
 
 * @class Button
 
 */
 

	
 
var Button = (function (_Component) {
 
  _inherits(Button, _Component);
 

	
 
  function Button(player, options) {
 
    _classCallCheck(this, Button);
 

	
 
    _Component.call(this, player, options);
 

	
 
    this.emitTapEvents();
 

	
 
    this.on('tap', this.handleClick);
 
    this.on('click', this.handleClick);
 
    this.on('focus', this.handleFocus);
 
    this.on('blur', this.handleBlur);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @param {String=} type Element's node type. e.g. 'div'
 
   * @param {Object=} props An object of element attributes that should be set on the element Tag name
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  Button.prototype.createEl = function createEl() {
 
    var tag = arguments.length <= 0 || arguments[0] === undefined ? 'button' : arguments[0];
 
    var props = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
 
    var attributes = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
 

	
 
    props = _objectAssign2['default']({
 
      className: this.buildCSSClass(),
 
      tabIndex: 0
 
    }, props);
 

	
 
    // Add standard Aria info
 
    attributes = _objectAssign2['default']({
 
      role: 'button',
 
      type: 'button', // Necessary since the default button type is "submit"
 
      'aria-live': 'polite' // let the screen reader user know that the text of the button may change
 
    }, attributes);
 

	
 
    var el = _Component.prototype.createEl.call(this, tag, props, attributes);
 

	
 
    this.controlTextEl_ = Dom.createEl('span', {
 
      className: 'vjs-control-text'
 
    });
 

	
 
    el.appendChild(this.controlTextEl_);
 

	
 
    this.controlText(this.controlText_);
 

	
 
    return el;
 
  };
 

	
 
  /**
 
   * Controls text - both request and localize
 
   *
 
   * @param {String} text Text for button
 
   * @return {String}
 
   * @method controlText
 
   */
 

	
 
  Button.prototype.controlText = function controlText(text) {
 
    if (!text) return this.controlText_ || 'Need Text';
 

	
 
    this.controlText_ = text;
 
    this.controlTextEl_.innerHTML = this.localize(this.controlText_);
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Allows sub components to stack CSS class names
 
   *
 
   * @return {String}
 
   * @method buildCSSClass
 
   */
 

	
 
  Button.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-control vjs-button ' + _Component.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Handle Click - Override with specific functionality for button
 
   *
 
   * @method handleClick
 
   */
 

	
 
  Button.prototype.handleClick = function handleClick() {};
 

	
 
  /**
 
   * Handle Focus - Add keyboard functionality to element
 
   *
 
   * @method handleFocus
 
   */
 

	
 
  Button.prototype.handleFocus = function handleFocus() {
 
    Events.on(_globalDocument2['default'], 'keydown', Fn.bind(this, this.handleKeyPress));
 
  };
 

	
 
  /**
 
   * Handle KeyPress (document level) - Trigger click when keys are pressed
 
   *
 
   * @method handleKeyPress
 
   */
 

	
 
  Button.prototype.handleKeyPress = function handleKeyPress(event) {
 
    // Check for space bar (32) or enter (13) keys
 
    if (event.which === 32 || event.which === 13) {
 
      event.preventDefault();
 
      this.handleClick(event);
 
    }
 
  };
 

	
 
  /**
 
   * Handle Blur - Remove keyboard triggers
 
   *
 
   * @method handleBlur
 
   */
 

	
 
  Button.prototype.handleBlur = function handleBlur() {
 
    Events.off(_globalDocument2['default'], 'keydown', Fn.bind(this, this.handleKeyPress));
 
  };
 

	
 
  return Button;
 
})(_component2['default']);
 

	
 
_component2['default'].registerComponent('Button', Button);
 
exports['default'] = Button;
 
module.exports = exports['default'];
 

	
 
},{"./component":58,"./utils/dom.js":118,"./utils/events.js":119,"./utils/fn.js":120,"global/document":1,"object.assign":43}],58:[function(_dereq_,module,exports){
 
/**
 
 * @file component.js
 
 *
 
 * Player Component - Base class for all UI objects
 
 */
 

	
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _utilsDomJs = _dereq_('./utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFnJs = _dereq_('./utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsGuidJs = _dereq_('./utils/guid.js');
 

	
 
var Guid = _interopRequireWildcard(_utilsGuidJs);
 

	
 
var _utilsEventsJs = _dereq_('./utils/events.js');
 

	
 
var Events = _interopRequireWildcard(_utilsEventsJs);
 

	
 
var _utilsLogJs = _dereq_('./utils/log.js');
 

	
 
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
 

	
 
var _utilsToTitleCaseJs = _dereq_('./utils/to-title-case.js');
 

	
 
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
var _utilsMergeOptionsJs = _dereq_('./utils/merge-options.js');
 

	
 
var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs);
 

	
 
/**
 
 * Base UI Component class
 
 * Components are embeddable UI objects that are represented by both a
 
 * javascript object and an element in the DOM. They can be children of other
 
 * components, and can have many children themselves.
 
 * ```js
 
 *     // adding a button to the player
 
 *     var button = player.addChild('button');
 
 *     button.el(); // -> button element
 
 * ```
 
 * ```html
 
 *     <div class="video-js">
 
 *       <div class="vjs-button">Button</div>
 
 *     </div>
 
 * ```
 
 * Components are also event targets.
 
 * ```js
 
 *     button.on('click', function(){
 
 *       console.log('Button Clicked!');
 
 *     });
 
 *     button.trigger('customevent');
 
 * ```
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @class Component
 
 */
 

	
 
var Component = (function () {
 
  function Component(player, options, ready) {
 
    _classCallCheck(this, Component);
 

	
 
    // The component might be the player itself and we can't pass `this` to super
 
    if (!player && this.play) {
 
      this.player_ = player = this; // eslint-disable-line
 
    } else {
 
        this.player_ = player;
 
      }
 

	
 
    // Make a copy of prototype.options_ to protect against overriding defaults
 
    this.options_ = _utilsMergeOptionsJs2['default']({}, this.options_);
 

	
 
    // Updated options with supplied options
 
    options = this.options_ = _utilsMergeOptionsJs2['default'](this.options_, options);
 

	
 
    // Get ID from options or options element if one is supplied
 
    this.id_ = options.id || options.el && options.el.id;
 

	
 
    // If there was no ID from the options, generate one
 
    if (!this.id_) {
 
      // Don't require the player ID function in the case of mock players
 
      var id = player && player.id && player.id() || 'no_player';
 

	
 
      this.id_ = id + '_component_' + Guid.newGUID();
 
    }
 

	
 
    this.name_ = options.name || null;
 

	
 
    // Create element if one wasn't provided in options
 
    if (options.el) {
 
      this.el_ = options.el;
 
    } else if (options.createEl !== false) {
 
      this.el_ = this.createEl();
 
    }
 

	
 
    this.children_ = [];
 
    this.childIndex_ = {};
 
    this.childNameIndex_ = {};
 

	
 
    // Add any child components in options
 
    if (options.initChildren !== false) {
 
      this.initChildren();
 
    }
 

	
 
    this.ready(ready);
 
    // Don't want to trigger ready here or it will before init is actually
 
    // finished for all children that run this constructor
 

	
 
    if (options.reportTouchActivity !== false) {
 
      this.enableTouchActivity();
 
    }
 
  }
 

	
 
  /**
 
   * Dispose of the component and all child components
 
   *
 
   * @method dispose
 
   */
 

	
 
  Component.prototype.dispose = function dispose() {
 
    this.trigger({ type: 'dispose', bubbles: false });
 

	
 
    // Dispose all children.
 
    if (this.children_) {
 
      for (var i = this.children_.length - 1; i >= 0; i--) {
 
        if (this.children_[i].dispose) {
 
          this.children_[i].dispose();
 
        }
 
      }
 
    }
 

	
 
    // Delete child references
 
    this.children_ = null;
 
    this.childIndex_ = null;
 
    this.childNameIndex_ = null;
 

	
 
    // Remove all event listeners.
 
    this.off();
 

	
 
    // Remove element from DOM
 
    if (this.el_.parentNode) {
 
      this.el_.parentNode.removeChild(this.el_);
 
    }
 

	
 
    Dom.removeElData(this.el_);
 
    this.el_ = null;
 
  };
 

	
 
  /**
 
   * Return the component's player
 
   *
 
   * @return {Player}
 
   * @method player
 
   */
 

	
 
  Component.prototype.player = function player() {
 
    return this.player_;
 
  };
 

	
 
  /**
 
   * Deep merge of options objects
 
   * Whenever a property is an object on both options objects
 
   * the two properties will be merged using mergeOptions.
 
   *
 
   * ```js
 
   *     Parent.prototype.options_ = {
 
   *       optionSet: {
 
   *         'childOne': { 'foo': 'bar', 'asdf': 'fdsa' },
 
   *         'childTwo': {},
 
   *         'childThree': {}
 
   *       }
 
   *     }
 
   *     newOptions = {
 
   *       optionSet: {
 
   *         'childOne': { 'foo': 'baz', 'abc': '123' }
 
   *         'childTwo': null,
 
   *         'childFour': {}
 
   *       }
 
   *     }
 
   *
 
   *     this.options(newOptions);
 
   * ```
 
   * RESULT
 
   * ```js
 
   *     {
 
   *       optionSet: {
 
   *         'childOne': { 'foo': 'baz', 'asdf': 'fdsa', 'abc': '123' },
 
   *         'childTwo': null, // Disabled. Won't be initialized.
 
   *         'childThree': {},
 
   *         'childFour': {}
 
   *       }
 
   *     }
 
   * ```
 
   *
 
   * @param  {Object} obj Object of new option values
 
   * @return {Object}     A NEW object of this.options_ and obj merged
 
   * @method options
 
   */
 

	
 
  Component.prototype.options = function options(obj) {
 
    _utilsLogJs2['default'].warn('this.options() has been deprecated and will be moved to the constructor in 6.0');
 

	
 
    if (!obj) {
 
      return this.options_;
 
    }
 

	
 
    this.options_ = _utilsMergeOptionsJs2['default'](this.options_, obj);
 
    return this.options_;
 
  };
 

	
 
  /**
 
   * Get the component's DOM element
 
   * ```js
 
   *     var domEl = myComponent.el();
 
   * ```
 
   *
 
   * @return {Element}
 
   * @method el
 
   */
 

	
 
  Component.prototype.el = function el() {
 
    return this.el_;
 
  };
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @param  {String=} tagName  Element's node type. e.g. 'div'
 
   * @param  {Object=} properties An object of properties that should be set
 
   * @param  {Object=} attributes An object of attributes that should be set
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  Component.prototype.createEl = function createEl(tagName, properties, attributes) {
 
    return Dom.createEl(tagName, properties, attributes);
 
  };
 

	
 
  Component.prototype.localize = function localize(string) {
 
    var code = this.player_.language && this.player_.language();
 
    var languages = this.player_.languages && this.player_.languages();
 

	
 
    if (!code || !languages) {
 
      return string;
 
    }
 

	
 
    var language = languages[code];
 

	
 
    if (language && language[string]) {
 
      return language[string];
 
    }
 

	
 
    var primaryCode = code.split('-')[0];
 
    var primaryLang = languages[primaryCode];
 

	
 
    if (primaryLang && primaryLang[string]) {
 
      return primaryLang[string];
 
    }
 

	
 
    return string;
 
  };
 

	
 
  /**
 
   * Return the component's DOM element where children are inserted.
 
   * Will either be the same as el() or a new element defined in createEl().
 
   *
 
   * @return {Element}
 
   * @method contentEl
 
   */
 

	
 
  Component.prototype.contentEl = function contentEl() {
 
    return this.contentEl_ || this.el_;
 
  };
 

	
 
  /**
 
   * Get the component's ID
 
   * ```js
 
   *     var id = myComponent.id();
 
   * ```
 
   *
 
   * @return {String}
 
   * @method id
 
   */
 

	
 
  Component.prototype.id = function id() {
 
    return this.id_;
 
  };
 

	
 
  /**
 
   * Get the component's name. The name is often used to reference the component.
 
   * ```js
 
   *     var name = myComponent.name();
 
   * ```
 
   *
 
   * @return {String}
 
   * @method name
 
   */
 

	
 
  Component.prototype.name = function name() {
 
    return this.name_;
 
  };
 

	
 
  /**
 
   * Get an array of all child components
 
   * ```js
 
   *     var kids = myComponent.children();
 
   * ```
 
   *
 
   * @return {Array} The children
 
   * @method children
 
   */
 

	
 
  Component.prototype.children = function children() {
 
    return this.children_;
 
  };
 

	
 
  /**
 
   * Returns a child component with the provided ID
 
   *
 
   * @return {Component}
 
   * @method getChildById
 
   */
 

	
 
  Component.prototype.getChildById = function getChildById(id) {
 
    return this.childIndex_[id];
 
  };
 

	
 
  /**
 
   * Returns a child component with the provided name
 
   *
 
   * @return {Component}
 
   * @method getChild
 
   */
 

	
 
  Component.prototype.getChild = function getChild(name) {
 
    return this.childNameIndex_[name];
 
  };
 

	
 
  /**
 
   * Adds a child component inside this component
 
   * ```js
 
   *     myComponent.el();
 
   *     // -> <div class='my-component'></div>
 
   *     myComponent.children();
 
   *     // [empty array]
 
   *
 
   *     var myButton = myComponent.addChild('MyButton');
 
   *     // -> <div class='my-component'><div class="my-button">myButton<div></div>
 
   *     // -> myButton === myComponent.children()[0];
 
   * ```
 
   * Pass in options for child constructors and options for children of the child
 
   * ```js
 
   *     var myButton = myComponent.addChild('MyButton', {
 
   *       text: 'Press Me',
 
   *       buttonChildExample: {
 
   *         buttonChildOption: true
 
   *       }
 
   *     });
 
   * ```
 
   *
 
   * @param {String|Component} child The class name or instance of a child to add
 
   * @param {Object=} options Options, including options to be passed to children of the child.
 
   * @return {Component} The child component (created by this process if a string was used)
 
   * @method addChild
 
   */
 

	
 
  Component.prototype.addChild = function addChild(child) {
 
    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
 

	
 
    var component = undefined;
 
    var componentName = undefined;
 

	
 
    // If child is a string, create nt with options
 
    if (typeof child === 'string') {
 
      componentName = child;
 

	
 
      // Options can also be specified as a boolean, so convert to an empty object if false.
 
      if (!options) {
 
        options = {};
 
      }
 

	
 
      // Same as above, but true is deprecated so show a warning.
 
      if (options === true) {
 
        _utilsLogJs2['default'].warn('Initializing a child component with `true` is deprecated. Children should be defined in an array when possible, but if necessary use an object instead of `true`.');
 
        options = {};
 
      }
 

	
 
      // If no componentClass in options, assume componentClass is the name lowercased
 
      // (e.g. playButton)
 
      var componentClassName = options.componentClass || _utilsToTitleCaseJs2['default'](componentName);
 

	
 
      // Set name through options
 
      options.name = componentName;
 

	
 
      // Create a new object & element for this controls set
 
      // If there's no .player_, this is a player
 
      var ComponentClass = Component.getComponent(componentClassName);
 

	
 
      component = new ComponentClass(this.player_ || this, options);
 

	
 
      // child is a component instance
 
    } else {
 
        component = child;
 
      }
 

	
 
    this.children_.push(component);
 

	
 
    if (typeof component.id === 'function') {
 
      this.childIndex_[component.id()] = component;
 
    }
 

	
 
    // If a name wasn't used to create the component, check if we can use the
 
    // name function of the component
 
    componentName = componentName || component.name && component.name();
 

	
 
    if (componentName) {
 
      this.childNameIndex_[componentName] = component;
 
    }
 

	
 
    // Add the UI object's element to the container div (box)
 
    // Having an element is not required
 
    if (typeof component.el === 'function' && component.el()) {
 
      this.contentEl().appendChild(component.el());
 
    }
 

	
 
    // Return so it can stored on parent object if desired.
 
    return component;
 
  };
 

	
 
  /**
 
   * Remove a child component from this component's list of children, and the
 
   * child component's element from this component's element
 
   *
 
   * @param  {Component} component Component to remove
 
   * @method removeChild
 
   */
 

	
 
  Component.prototype.removeChild = function removeChild(component) {
 
    if (typeof component === 'string') {
 
      component = this.getChild(component);
 
    }
 

	
 
    if (!component || !this.children_) {
 
      return;
 
    }
 

	
 
    var childFound = false;
 

	
 
    for (var i = this.children_.length - 1; i >= 0; i--) {
 
      if (this.children_[i] === component) {
 
        childFound = true;
 
        this.children_.splice(i, 1);
 
        break;
 
      }
 
    }
 

	
 
    if (!childFound) {
 
      return;
 
    }
 

	
 
    this.childIndex_[component.id()] = null;
 
    this.childNameIndex_[component.name()] = null;
 

	
 
    var compEl = component.el();
 

	
 
    if (compEl && compEl.parentNode === this.contentEl()) {
 
      this.contentEl().removeChild(component.el());
 
    }
 
  };
 

	
 
  /**
 
   * Add and initialize default child components from options
 
   * ```js
 
   *     // when an instance of MyComponent is created, all children in options
 
   *     // will be added to the instance by their name strings and options
 
   *     MyComponent.prototype.options_ = {
 
   *       children: [
 
   *         'myChildComponent'
 
   *       ],
 
   *       myChildComponent: {
 
   *         myChildOption: true
 
   *       }
 
   *     };
 
   *
 
   *     // Or when creating the component
 
   *     var myComp = new MyComponent(player, {
 
   *       children: [
 
   *         'myChildComponent'
 
   *       ],
 
   *       myChildComponent: {
 
   *         myChildOption: true
 
   *       }
 
   *     });
 
   * ```
 
   * The children option can also be an array of
 
   * child options objects (that also include a 'name' key).
 
   * This can be used if you have two child components of the
 
   * same type that need different options.
 
   * ```js
 
   *     var myComp = new MyComponent(player, {
 
   *       children: [
 
   *         'button',
 
   *         {
 
   *           name: 'button',
 
   *           someOtherOption: true
 
   *         },
 
   *         {
 
   *           name: 'button',
 
   *           someOtherOption: false
 
   *         }
 
   *       ]
 
   *     });
 
   * ```
 
   *
 
   * @method initChildren
 
   */
 

	
 
  Component.prototype.initChildren = function initChildren() {
 
    var _this = this;
 

	
 
    var children = this.options_.children;
 

	
 
    if (children) {
 
      (function () {
 
        // `this` is `parent`
 
        var parentOptions = _this.options_;
 

	
 
        var handleAdd = function handleAdd(name, opts) {
 
          // Allow options for children to be set at the parent options
 
          // e.g. videojs(id, { controlBar: false });
 
          // instead of videojs(id, { children: { controlBar: false });
 
          if (parentOptions[name] !== undefined) {
 
            opts = parentOptions[name];
 
          }
 

	
 
          // Allow for disabling default components
 
          // e.g. options['children']['posterImage'] = false
 
          if (opts === false) {
 
            return;
 
          }
 

	
 
          // Allow options to be passed as a simple boolean if no configuration
 
          // is necessary.
 
          if (opts === true) {
 
            opts = {};
 
          }
 

	
 
          // We also want to pass the original player options to each component as well so they don't need to
 
          // reach back into the player for options later.
 
          opts.playerOptions = _this.options_.playerOptions;
 

	
 
          // Create and add the child component.
 
          // Add a direct reference to the child by name on the parent instance.
 
          // If two of the same component are used, different names should be supplied
 
          // for each
 
          _this[name] = _this.addChild(name, opts);
 
        };
 

	
 
        // Allow for an array of children details to passed in the options
 
        if (Array.isArray(children)) {
 
          for (var i = 0; i < children.length; i++) {
 
            var child = children[i];
 
            var _name = undefined;
 
            var opts = undefined;
 

	
 
            if (typeof child === 'string') {
 
              // ['myComponent']
 
              _name = child;
 
              opts = {};
 
            } else {
 
              // [{ name: 'myComponent', otherOption: true }]
 
              _name = child.name;
 
              opts = child;
 
            }
 

	
 
            handleAdd(_name, opts);
 
          }
 
        } else {
 
          Object.getOwnPropertyNames(children).forEach(function (name) {
 
            handleAdd(name, children[name]);
 
          });
 
        }
 
      })();
 
    }
 
  };
 

	
 
  /**
 
   * Allows sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  Component.prototype.buildCSSClass = function buildCSSClass() {
 
    // Child classes can include a function that does:
 
    // return 'CLASS NAME' + this._super();
 
    return '';
 
  };
 

	
 
  /**
 
   * Add an event listener to this component's element
 
   * ```js
 
   *     var myFunc = function(){
 
   *       var myComponent = this;
 
   *       // Do something when the event is fired
 
   *     };
 
   *
 
   *     myComponent.on('eventType', myFunc);
 
   * ```
 
   * The context of myFunc will be myComponent unless previously bound.
 
   * Alternatively, you can add a listener to another element or component.
 
   * ```js
 
   *     myComponent.on(otherElement, 'eventName', myFunc);
 
   *     myComponent.on(otherComponent, 'eventName', myFunc);
 
   * ```
 
   * The benefit of using this over `VjsEvents.on(otherElement, 'eventName', myFunc)`
 
   * and `otherComponent.on('eventName', myFunc)` is that this way the listeners
 
   * will be automatically cleaned up when either component is disposed.
 
   * It will also bind myComponent as the context of myFunc.
 
   * **NOTE**: When using this on elements in the page other than window
 
   * and document (both permanent), if you remove the element from the DOM
 
   * you need to call `myComponent.trigger(el, 'dispose')` on it to clean up
 
   * references to it and allow the browser to garbage collect it.
 
   *
 
   * @param  {String|Component} first   The event type or other component
 
   * @param  {Function|String}      second  The event handler or event type
 
   * @param  {Function}             third   The event handler
 
   * @return {Component}
 
   * @method on
 
   */
 

	
 
  Component.prototype.on = function on(first, second, third) {
 
    var _this2 = this;
 

	
 
    if (typeof first === 'string' || Array.isArray(first)) {
 
      Events.on(this.el_, first, Fn.bind(this, second));
 

	
 
      // Targeting another component or element
 
    } else {
 
        (function () {
 
          var target = first;
 
          var type = second;
 
          var fn = Fn.bind(_this2, third);
 

	
 
          // When this component is disposed, remove the listener from the other component
 
          var removeOnDispose = function removeOnDispose() {
 
            return _this2.off(target, type, fn);
 
          };
 

	
 
          // Use the same function ID so we can remove it later it using the ID
 
          // of the original listener
 
          removeOnDispose.guid = fn.guid;
 
          _this2.on('dispose', removeOnDispose);
 

	
 
          // If the other component is disposed first we need to clean the reference
 
          // to the other component in this component's removeOnDispose listener
 
          // Otherwise we create a memory leak.
 
          var cleanRemover = function cleanRemover() {
 
            return _this2.off('dispose', removeOnDispose);
 
          };
 

	
 
          // Add the same function ID so we can easily remove it later
 
          cleanRemover.guid = fn.guid;
 

	
 
          // Check if this is a DOM node
 
          if (first.nodeName) {
 
            // Add the listener to the other element
 
            Events.on(target, type, fn);
 
            Events.on(target, 'dispose', cleanRemover);
 

	
 
            // Should be a component
 
            // Not using `instanceof Component` because it makes mock players difficult
 
          } else if (typeof first.on === 'function') {
 
              // Add the listener to the other component
 
              target.on(type, fn);
 
              target.on('dispose', cleanRemover);
 
            }
 
        })();
 
      }
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Remove an event listener from this component's element
 
   * ```js
 
   *     myComponent.off('eventType', myFunc);
 
   * ```
 
   * If myFunc is excluded, ALL listeners for the event type will be removed.
 
   * If eventType is excluded, ALL listeners will be removed from the component.
 
   * Alternatively you can use `off` to remove listeners that were added to other
 
   * elements or components using `myComponent.on(otherComponent...`.
 
   * In this case both the event type and listener function are REQUIRED.
 
   * ```js
 
   *     myComponent.off(otherElement, 'eventType', myFunc);
 
   *     myComponent.off(otherComponent, 'eventType', myFunc);
 
   * ```
 
   *
 
   * @param  {String=|Component}  first  The event type or other component
 
   * @param  {Function=|String}       second The listener function or event type
 
   * @param  {Function=}              third  The listener for other component
 
   * @return {Component}
 
   * @method off
 
   */
 

	
 
  Component.prototype.off = function off(first, second, third) {
 
    if (!first || typeof first === 'string' || Array.isArray(first)) {
 
      Events.off(this.el_, first, second);
 
    } else {
 
      var target = first;
 
      var type = second;
 
      // Ensure there's at least a guid, even if the function hasn't been used
 
      var fn = Fn.bind(this, third);
 

	
 
      // Remove the dispose listener on this component,
 
      // which was given the same guid as the event listener
 
      this.off('dispose', fn);
 

	
 
      if (first.nodeName) {
 
        // Remove the listener
 
        Events.off(target, type, fn);
 
        // Remove the listener for cleaning the dispose listener
 
        Events.off(target, 'dispose', fn);
 
      } else {
 
        target.off(type, fn);
 
        target.off('dispose', fn);
 
      }
 
    }
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Add an event listener to be triggered only once and then removed
 
   * ```js
 
   *     myComponent.one('eventName', myFunc);
 
   * ```
 
   * Alternatively you can add a listener to another element or component
 
   * that will be triggered only once.
 
   * ```js
 
   *     myComponent.one(otherElement, 'eventName', myFunc);
 
   *     myComponent.one(otherComponent, 'eventName', myFunc);
 
   * ```
 
   *
 
   * @param  {String|Component}  first   The event type or other component
 
   * @param  {Function|String}       second  The listener function or event type
 
   * @param  {Function=}             third   The listener function for other component
 
   * @return {Component}
 
   * @method one
 
   */
 

	
 
  Component.prototype.one = function one(first, second, third) {
 
    var _this3 = this,
 
        _arguments = arguments;
 

	
 
    if (typeof first === 'string' || Array.isArray(first)) {
 
      Events.one(this.el_, first, Fn.bind(this, second));
 
    } else {
 
      (function () {
 
        var target = first;
 
        var type = second;
 
        var fn = Fn.bind(_this3, third);
 

	
 
        var newFunc = function newFunc() {
 
          _this3.off(target, type, newFunc);
 
          fn.apply(null, _arguments);
 
        };
 

	
 
        // Keep the same function ID so we can remove it later
 
        newFunc.guid = fn.guid;
 

	
 
        _this3.on(target, type, newFunc);
 
      })();
 
    }
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Trigger an event on an element
 
   * ```js
 
   *     myComponent.trigger('eventName');
 
   *     myComponent.trigger({'type':'eventName'});
 
   *     myComponent.trigger('eventName', {data: 'some data'});
 
   *     myComponent.trigger({'type':'eventName'}, {data: 'some data'});
 
   * ```
 
   *
 
   * @param  {Event|Object|String} event  A string (the type) or an event object with a type attribute
 
   * @param  {Object} [hash] data hash to pass along with the event
 
   * @return {Component}       self
 
   * @method trigger
 
   */
 

	
 
  Component.prototype.trigger = function trigger(event, hash) {
 
    Events.trigger(this.el_, event, hash);
 
    return this;
 
  };
 

	
 
  /**
 
   * Bind a listener to the component's ready state.
 
   * Different from event listeners in that if the ready event has already happened
 
   * it will trigger the function immediately.
 
   *
 
   * @param  {Function} fn Ready listener
 
   * @param  {Boolean} sync Exec the listener synchronously if component is ready
 
   * @return {Component}
 
   * @method ready
 
   */
 

	
 
  Component.prototype.ready = function ready(fn) {
 
    var sync = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];
 

	
 
    if (fn) {
 
      if (this.isReady_) {
 
        if (sync) {
 
          fn.call(this);
 
        } else {
 
          // Call the function asynchronously by default for consistency
 
          this.setTimeout(fn, 1);
 
        }
 
      } else {
 
        this.readyQueue_ = this.readyQueue_ || [];
 
        this.readyQueue_.push(fn);
 
      }
 
    }
 
    return this;
 
  };
 

	
 
  /**
 
   * Trigger the ready listeners
 
   *
 
   * @return {Component}
 
   * @method triggerReady
 
   */
 

	
 
  Component.prototype.triggerReady = function triggerReady() {
 
    this.isReady_ = true;
 

	
 
    // Ensure ready is triggerd asynchronously
 
    this.setTimeout(function () {
 
      var readyQueue = this.readyQueue_;
 

	
 
      // Reset Ready Queue
 
      this.readyQueue_ = [];
 

	
 
      if (readyQueue && readyQueue.length > 0) {
 
        readyQueue.forEach(function (fn) {
 
          fn.call(this);
 
        }, this);
 
      }
 

	
 
      // Allow for using event listeners also
 
      this.trigger('ready');
 
    }, 1);
 
  };
 

	
 
  /**
 
   * Check if a component's element has a CSS class name
 
   *
 
   * @param {String} classToCheck Classname to check
 
   * @return {Component}
 
   * @method hasClass
 
   */
 

	
 
  Component.prototype.hasClass = function hasClass(classToCheck) {
 
    return Dom.hasElClass(this.el_, classToCheck);
 
  };
 

	
 
  /**
 
   * Add a CSS class name to the component's element
 
   *
 
   * @param {String} classToAdd Classname to add
 
   * @return {Component}
 
   * @method addClass
 
   */
 

	
 
  Component.prototype.addClass = function addClass(classToAdd) {
 
    Dom.addElClass(this.el_, classToAdd);
 
    return this;
 
  };
 

	
 
  /**
 
   * Remove and return a CSS class name from the component's element
 
   *
 
   * @param {String} classToRemove Classname to remove
 
   * @return {Component}
 
   * @method removeClass
 
   */
 

	
 
  Component.prototype.removeClass = function removeClass(classToRemove) {
 
    Dom.removeElClass(this.el_, classToRemove);
 
    return this;
 
  };
 

	
 
  /**
 
   * Show the component element if hidden
 
   *
 
   * @return {Component}
 
   * @method show
 
   */
 

	
 
  Component.prototype.show = function show() {
 
    this.removeClass('vjs-hidden');
 
    return this;
 
  };
 

	
 
  /**
 
   * Hide the component element if currently showing
 
   *
 
   * @return {Component}
 
   * @method hide
 
   */
 

	
 
  Component.prototype.hide = function hide() {
 
    this.addClass('vjs-hidden');
 
    return this;
 
  };
 

	
 
  /**
 
   * Lock an item in its visible state
 
   * To be used with fadeIn/fadeOut.
 
   *
 
   * @return {Component}
 
   * @private
 
   * @method lockShowing
 
   */
 

	
 
  Component.prototype.lockShowing = function lockShowing() {
 
    this.addClass('vjs-lock-showing');
 
    return this;
 
  };
 

	
 
  /**
 
   * Unlock an item to be hidden
 
   * To be used with fadeIn/fadeOut.
 
   *
 
   * @return {Component}
 
   * @private
 
   * @method unlockShowing
 
   */
 

	
 
  Component.prototype.unlockShowing = function unlockShowing() {
 
    this.removeClass('vjs-lock-showing');
 
    return this;
 
  };
 

	
 
  /**
 
   * Set or get the width of the component (CSS values)
 
   * Setting the video tag dimension values only works with values in pixels.
 
   * Percent values will not work.
 
   * Some percents can be used, but width()/height() will return the number + %,
 
   * not the actual computed width/height.
 
   *
 
   * @param  {Number|String=} num   Optional width number
 
   * @param  {Boolean} skipListeners Skip the 'resize' event trigger
 
   * @return {Component} This component, when setting the width
 
   * @return {Number|String} The width, when getting
 
   * @method width
 
   */
 

	
 
  Component.prototype.width = function width(num, skipListeners) {
 
    return this.dimension('width', num, skipListeners);
 
  };
 

	
 
  /**
 
   * Get or set the height of the component (CSS values)
 
   * Setting the video tag dimension values only works with values in pixels.
 
   * Percent values will not work.
 
   * Some percents can be used, but width()/height() will return the number + %,
 
   * not the actual computed width/height.
 
   *
 
   * @param  {Number|String=} num     New component height
 
   * @param  {Boolean=} skipListeners Skip the resize event trigger
 
   * @return {Component} This component, when setting the height
 
   * @return {Number|String} The height, when getting
 
   * @method height
 
   */
 

	
 
  Component.prototype.height = function height(num, skipListeners) {
 
    return this.dimension('height', num, skipListeners);
 
  };
 

	
 
  /**
 
   * Set both width and height at the same time
 
   *
 
   * @param  {Number|String} width Width of player
 
   * @param  {Number|String} height Height of player
 
   * @return {Component} The component
 
   * @method dimensions
 
   */
 

	
 
  Component.prototype.dimensions = function dimensions(width, height) {
 
    // Skip resize listeners on width for optimization
 
    return this.width(width, true).height(height);
 
  };
 

	
 
  /**
 
   * Get or set width or height
 
   * This is the shared code for the width() and height() methods.
 
   * All for an integer, integer + 'px' or integer + '%';
 
   * Known issue: Hidden elements officially have a width of 0. We're defaulting
 
   * to the style.width value and falling back to computedStyle which has the
 
   * hidden element issue. Info, but probably not an efficient fix:
 
   * http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/
 
   *
 
   * @param  {String} widthOrHeight  'width' or 'height'
 
   * @param  {Number|String=} num     New dimension
 
   * @param  {Boolean=} skipListeners Skip resize event trigger
 
   * @return {Component} The component if a dimension was set
 
   * @return {Number|String} The dimension if nothing was set
 
   * @private
 
   * @method dimension
 
   */
 

	
 
  Component.prototype.dimension = function dimension(widthOrHeight, num, skipListeners) {
 
    if (num !== undefined) {
 
      // Set to zero if null or literally NaN (NaN !== NaN)
 
      if (num === null || num !== num) {
 
        num = 0;
 
      }
 

	
 
      // Check if using css width/height (% or px) and adjust
 
      if (('' + num).indexOf('%') !== -1 || ('' + num).indexOf('px') !== -1) {
 
        this.el_.style[widthOrHeight] = num;
 
      } else if (num === 'auto') {
 
        this.el_.style[widthOrHeight] = '';
 
      } else {
 
        this.el_.style[widthOrHeight] = num + 'px';
 
      }
 

	
 
      // skipListeners allows us to avoid triggering the resize event when setting both width and height
 
      if (!skipListeners) {
 
        this.trigger('resize');
 
      }
 

	
 
      // Return component
 
      return this;
 
    }
 

	
 
    // Not setting a value, so getting it
 
    // Make sure element exists
 
    if (!this.el_) {
 
      return 0;
 
    }
 

	
 
    // Get dimension value from style
 
    var val = this.el_.style[widthOrHeight];
 
    var pxIndex = val.indexOf('px');
 

	
 
    if (pxIndex !== -1) {
 
      // Return the pixel value with no 'px'
 
      return parseInt(val.slice(0, pxIndex), 10);
 
    }
 

	
 
    // No px so using % or no style was set, so falling back to offsetWidth/height
 
    // If component has display:none, offset will return 0
 
    // TODO: handle display:none and no dimension style using px
 
    return parseInt(this.el_['offset' + _utilsToTitleCaseJs2['default'](widthOrHeight)], 10);
 
  };
 

	
 
  /**
 
   * Emit 'tap' events when touch events are supported
 
   * This is used to support toggling the controls through a tap on the video.
 
   * We're requiring them to be enabled because otherwise every component would
 
   * have this extra overhead unnecessarily, on mobile devices where extra
 
   * overhead is especially bad.
 
   *
 
   * @private
 
   * @method emitTapEvents
 
   */
 

	
 
  Component.prototype.emitTapEvents = function emitTapEvents() {
 
    // Track the start time so we can determine how long the touch lasted
 
    var touchStart = 0;
 
    var firstTouch = null;
 

	
 
    // Maximum movement allowed during a touch event to still be considered a tap
 
    // Other popular libs use anywhere from 2 (hammer.js) to 15, so 10 seems like a nice, round number.
 
    var tapMovementThreshold = 10;
 

	
 
    // The maximum length a touch can be while still being considered a tap
 
    var touchTimeThreshold = 200;
 

	
 
    var couldBeTap = undefined;
 

	
 
    this.on('touchstart', function (event) {
 
      // If more than one finger, don't consider treating this as a click
 
      if (event.touches.length === 1) {
 
        // Copy the touches object to prevent modifying the original
 
        firstTouch = _objectAssign2['default']({}, event.touches[0]);
 
        // Record start time so we can detect a tap vs. "touch and hold"
 
        touchStart = new Date().getTime();
 
        // Reset couldBeTap tracking
 
        couldBeTap = true;
 
      }
 
    });
 

	
 
    this.on('touchmove', function (event) {
 
      // If more than one finger, don't consider treating this as a click
 
      if (event.touches.length > 1) {
 
        couldBeTap = false;
 
      } else if (firstTouch) {
 
        // Some devices will throw touchmoves for all but the slightest of taps.
 
        // So, if we moved only a small distance, this could still be a tap
 
        var xdiff = event.touches[0].pageX - firstTouch.pageX;
 
        var ydiff = event.touches[0].pageY - firstTouch.pageY;
 
        var touchDistance = Math.sqrt(xdiff * xdiff + ydiff * ydiff);
 

	
 
        if (touchDistance > tapMovementThreshold) {
 
          couldBeTap = false;
 
        }
 
      }
 
    });
 

	
 
    var noTap = function noTap() {
 
      couldBeTap = false;
 
    };
 

	
 
    // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s
 
    this.on('touchleave', noTap);
 
    this.on('touchcancel', noTap);
 

	
 
    // When the touch ends, measure how long it took and trigger the appropriate
 
    // event
 
    this.on('touchend', function (event) {
 
      firstTouch = null;
 
      // Proceed only if the touchmove/leave/cancel event didn't happen
 
      if (couldBeTap === true) {
 
        // Measure how long the touch lasted
 
        var touchTime = new Date().getTime() - touchStart;
 

	
 
        // Make sure the touch was less than the threshold to be considered a tap
 
        if (touchTime < touchTimeThreshold) {
 
          // Don't let browser turn this into a click
 
          event.preventDefault();
 
          this.trigger('tap');
 
          // It may be good to copy the touchend event object and change the
 
          // type to tap, if the other event properties aren't exact after
 
          // Events.fixEvent runs (e.g. event.target)
 
        }
 
      }
 
    });
 
  };
 

	
 
  /**
 
   * Report user touch activity when touch events occur
 
   * User activity is used to determine when controls should show/hide. It's
 
   * relatively simple when it comes to mouse events, because any mouse event
 
   * should show the controls. So we capture mouse events that bubble up to the
 
   * player and report activity when that happens.
 
   * With touch events it isn't as easy. We can't rely on touch events at the
 
   * player level, because a tap (touchstart + touchend) on the video itself on
 
   * mobile devices is meant to turn controls off (and on). User activity is
 
   * checked asynchronously, so what could happen is a tap event on the video
 
   * turns the controls off, then the touchend event bubbles up to the player,
 
   * which if it reported user activity, would turn the controls right back on.
 
   * (We also don't want to completely block touch events from bubbling up)
 
   * Also a touchmove, touch+hold, and anything other than a tap is not supposed
 
   * to turn the controls back on on a mobile device.
 
   * Here we're setting the default component behavior to report user activity
 
   * whenever touch events happen, and this can be turned off by components that
 
   * want touch events to act differently.
 
   *
 
   * @method enableTouchActivity
 
   */
 

	
 
  Component.prototype.enableTouchActivity = function enableTouchActivity() {
 
    // Don't continue if the root player doesn't support reporting user activity
 
    if (!this.player() || !this.player().reportUserActivity) {
 
      return;
 
    }
 

	
 
    // listener for reporting that the user is active
 
    var report = Fn.bind(this.player(), this.player().reportUserActivity);
 

	
 
    var touchHolding = undefined;
 

	
 
    this.on('touchstart', function () {
 
      report();
 
      // For as long as the they are touching the device or have their mouse down,
 
      // we consider them active even if they're not moving their finger or mouse.
 
      // So we want to continue to update that they are active
 
      this.clearInterval(touchHolding);
 
      // report at the same interval as activityCheck
 
      touchHolding = this.setInterval(report, 250);
 
    });
 

	
 
    var touchEnd = function touchEnd(event) {
 
      report();
 
      // stop the interval that maintains activity if the touch is holding
 
      this.clearInterval(touchHolding);
 
    };
 

	
 
    this.on('touchmove', report);
 
    this.on('touchend', touchEnd);
 
    this.on('touchcancel', touchEnd);
 
  };
 

	
 
  /**
 
   * Creates timeout and sets up disposal automatically.
 
   *
 
   * @param {Function} fn The function to run after the timeout.
 
   * @param {Number} timeout Number of ms to delay before executing specified function.
 
   * @return {Number} Returns the timeout ID
 
   * @method setTimeout
 
   */
 

	
 
  Component.prototype.setTimeout = function setTimeout(fn, timeout) {
 
    fn = Fn.bind(this, fn);
 

	
 
    // window.setTimeout would be preferable here, but due to some bizarre issue with Sinon and/or Phantomjs, we can't.
 
    var timeoutId = _globalWindow2['default'].setTimeout(fn, timeout);
 

	
 
    var disposeFn = function disposeFn() {
 
      this.clearTimeout(timeoutId);
 
    };
 

	
 
    disposeFn.guid = 'vjs-timeout-' + timeoutId;
 

	
 
    this.on('dispose', disposeFn);
 

	
 
    return timeoutId;
 
  };
 

	
 
  /**
 
   * Clears a timeout and removes the associated dispose listener
 
   *
 
   * @param {Number} timeoutId The id of the timeout to clear
 
   * @return {Number} Returns the timeout ID
 
   * @method clearTimeout
 
   */
 

	
 
  Component.prototype.clearTimeout = function clearTimeout(timeoutId) {
 
    _globalWindow2['default'].clearTimeout(timeoutId);
 

	
 
    var disposeFn = function disposeFn() {};
 

	
 
    disposeFn.guid = 'vjs-timeout-' + timeoutId;
 

	
 
    this.off('dispose', disposeFn);
 

	
 
    return timeoutId;
 
  };
 

	
 
  /**
 
   * Creates an interval and sets up disposal automatically.
 
   *
 
   * @param {Function} fn The function to run every N seconds.
 
   * @param {Number} interval Number of ms to delay before executing specified function.
 
   * @return {Number} Returns the interval ID
 
   * @method setInterval
 
   */
 

	
 
  Component.prototype.setInterval = function setInterval(fn, interval) {
 
    fn = Fn.bind(this, fn);
 

	
 
    var intervalId = _globalWindow2['default'].setInterval(fn, interval);
 

	
 
    var disposeFn = function disposeFn() {
 
      this.clearInterval(intervalId);
 
    };
 

	
 
    disposeFn.guid = 'vjs-interval-' + intervalId;
 

	
 
    this.on('dispose', disposeFn);
 

	
 
    return intervalId;
 
  };
 

	
 
  /**
 
   * Clears an interval and removes the associated dispose listener
 
   *
 
   * @param {Number} intervalId The id of the interval to clear
 
   * @return {Number} Returns the interval ID
 
   * @method clearInterval
 
   */
 

	
 
  Component.prototype.clearInterval = function clearInterval(intervalId) {
 
    _globalWindow2['default'].clearInterval(intervalId);
 

	
 
    var disposeFn = function disposeFn() {};
 

	
 
    disposeFn.guid = 'vjs-interval-' + intervalId;
 

	
 
    this.off('dispose', disposeFn);
 

	
 
    return intervalId;
 
  };
 

	
 
  /**
 
   * Registers a component
 
   *
 
   * @param {String} name Name of the component to register
 
   * @param {Object} comp The component to register
 
   * @static
 
   * @method registerComponent
 
   */
 

	
 
  Component.registerComponent = function registerComponent(name, comp) {
 
    if (!Component.components_) {
 
      Component.components_ = {};
 
    }
 

	
 
    Component.components_[name] = comp;
 
    return comp;
 
  };
 

	
 
  /**
 
   * Gets a component by name
 
   *
 
   * @param {String} name Name of the component to get
 
   * @return {Component}
 
   * @static
 
   * @method getComponent
 
   */
 

	
 
  Component.getComponent = function getComponent(name) {
 
    if (Component.components_ && Component.components_[name]) {
 
      return Component.components_[name];
 
    }
 

	
 
    if (_globalWindow2['default'] && _globalWindow2['default'].videojs && _globalWindow2['default'].videojs[name]) {
 
      _utilsLogJs2['default'].warn('The ' + name + ' component was added to the videojs object when it should be registered using videojs.registerComponent(name, component)');
 
      return _globalWindow2['default'].videojs[name];
 
    }
 
  };
 

	
 
  /**
 
   * Sets up the constructor using the supplied init method
 
   * or uses the init of the parent object
 
   *
 
   * @param {Object} props An object of properties
 
   * @static
 
   * @deprecated
 
   * @method extend
 
   */
 

	
 
  Component.extend = function extend(props) {
 
    props = props || {};
 

	
 
    _utilsLogJs2['default'].warn('Component.extend({}) has been deprecated, use videojs.extend(Component, {}) instead');
 

	
 
    // Set up the constructor using the supplied init method
 
    // or using the init of the parent object
 
    // Make sure to check the unobfuscated version for external libs
 
    var init = props.init || props.init || this.prototype.init || this.prototype.init || function () {};
 
    // In Resig's simple class inheritance (previously used) the constructor
 
    //  is a function that calls `this.init.apply(arguments)`
 
    // However that would prevent us from using `ParentObject.call(this);`
 
    //  in a Child constructor because the `this` in `this.init`
 
    //  would still refer to the Child and cause an infinite loop.
 
    // We would instead have to do
 
    //    `ParentObject.prototype.init.apply(this, arguments);`
 
    //  Bleh. We're not creating a _super() function, so it's good to keep
 
    //  the parent constructor reference simple.
 
    var subObj = function subObj() {
 
      init.apply(this, arguments);
 
    };
 

	
 
    // Inherit from this object's prototype
 
    subObj.prototype = Object.create(this.prototype);
 
    // Reset the constructor property for subObj otherwise
 
    // instances of subObj would have the constructor of the parent Object
 
    subObj.prototype.constructor = subObj;
 

	
 
    // Make the class extendable
 
    subObj.extend = Component.extend;
 

	
 
    // Extend subObj's prototype with functions and other properties from props
 
    for (var _name2 in props) {
 
      if (props.hasOwnProperty(_name2)) {
 
        subObj.prototype[_name2] = props[_name2];
 
      }
 
    }
 

	
 
    return subObj;
 
  };
 

	
 
  return Component;
 
})();
 

	
 
Component.registerComponent('Component', Component);
 
exports['default'] = Component;
 
module.exports = exports['default'];
 

	
 
},{"./utils/dom.js":118,"./utils/events.js":119,"./utils/fn.js":120,"./utils/guid.js":122,"./utils/log.js":123,"./utils/merge-options.js":124,"./utils/to-title-case.js":127,"global/window":2,"object.assign":43}],59:[function(_dereq_,module,exports){
 
/**
 
 * @file control-bar.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
// Required children
 

	
 
var _playToggleJs = _dereq_('./play-toggle.js');
 

	
 
var _playToggleJs2 = _interopRequireDefault(_playToggleJs);
 

	
 
var _timeControlsCurrentTimeDisplayJs = _dereq_('./time-controls/current-time-display.js');
 

	
 
var _timeControlsCurrentTimeDisplayJs2 = _interopRequireDefault(_timeControlsCurrentTimeDisplayJs);
 

	
 
var _timeControlsDurationDisplayJs = _dereq_('./time-controls/duration-display.js');
 

	
 
var _timeControlsDurationDisplayJs2 = _interopRequireDefault(_timeControlsDurationDisplayJs);
 

	
 
var _timeControlsTimeDividerJs = _dereq_('./time-controls/time-divider.js');
 

	
 
var _timeControlsTimeDividerJs2 = _interopRequireDefault(_timeControlsTimeDividerJs);
 

	
 
var _timeControlsRemainingTimeDisplayJs = _dereq_('./time-controls/remaining-time-display.js');
 

	
 
var _timeControlsRemainingTimeDisplayJs2 = _interopRequireDefault(_timeControlsRemainingTimeDisplayJs);
 

	
 
var _liveDisplayJs = _dereq_('./live-display.js');
 

	
 
var _liveDisplayJs2 = _interopRequireDefault(_liveDisplayJs);
 

	
 
var _progressControlProgressControlJs = _dereq_('./progress-control/progress-control.js');
 

	
 
var _progressControlProgressControlJs2 = _interopRequireDefault(_progressControlProgressControlJs);
 

	
 
var _fullscreenToggleJs = _dereq_('./fullscreen-toggle.js');
 

	
 
var _fullscreenToggleJs2 = _interopRequireDefault(_fullscreenToggleJs);
 

	
 
var _volumeControlVolumeControlJs = _dereq_('./volume-control/volume-control.js');
 

	
 
var _volumeControlVolumeControlJs2 = _interopRequireDefault(_volumeControlVolumeControlJs);
 

	
 
var _volumeMenuButtonJs = _dereq_('./volume-menu-button.js');
 

	
 
var _volumeMenuButtonJs2 = _interopRequireDefault(_volumeMenuButtonJs);
 

	
 
var _muteToggleJs = _dereq_('./mute-toggle.js');
 

	
 
var _muteToggleJs2 = _interopRequireDefault(_muteToggleJs);
 

	
 
var _textTrackControlsChaptersButtonJs = _dereq_('./text-track-controls/chapters-button.js');
 

	
 
var _textTrackControlsChaptersButtonJs2 = _interopRequireDefault(_textTrackControlsChaptersButtonJs);
 

	
 
var _textTrackControlsSubtitlesButtonJs = _dereq_('./text-track-controls/subtitles-button.js');
 

	
 
var _textTrackControlsSubtitlesButtonJs2 = _interopRequireDefault(_textTrackControlsSubtitlesButtonJs);
 

	
 
var _textTrackControlsCaptionsButtonJs = _dereq_('./text-track-controls/captions-button.js');
 

	
 
var _textTrackControlsCaptionsButtonJs2 = _interopRequireDefault(_textTrackControlsCaptionsButtonJs);
 

	
 
var _playbackRateMenuPlaybackRateMenuButtonJs = _dereq_('./playback-rate-menu/playback-rate-menu-button.js');
 

	
 
var _playbackRateMenuPlaybackRateMenuButtonJs2 = _interopRequireDefault(_playbackRateMenuPlaybackRateMenuButtonJs);
 

	
 
var _spacerControlsCustomControlSpacerJs = _dereq_('./spacer-controls/custom-control-spacer.js');
 

	
 
var _spacerControlsCustomControlSpacerJs2 = _interopRequireDefault(_spacerControlsCustomControlSpacerJs);
 

	
 
/**
 
 * Container of main controls
 
 *
 
 * @extends Component
 
 * @class ControlBar
 
 */
 

	
 
var ControlBar = (function (_Component) {
 
  _inherits(ControlBar, _Component);
 

	
 
  function ControlBar() {
 
    _classCallCheck(this, ControlBar);
 

	
 
    _Component.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  ControlBar.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-control-bar'
 
    });
 
  };
 

	
 
  return ControlBar;
 
})(_componentJs2['default']);
 

	
 
ControlBar.prototype.options_ = {
 
  loadEvent: 'play',
 
  children: ['playToggle', 'volumeMenuButton', 'currentTimeDisplay', 'timeDivider', 'durationDisplay', 'progressControl', 'liveDisplay', 'remainingTimeDisplay', 'customControlSpacer', 'playbackRateMenuButton', 'chaptersButton', 'subtitlesButton', 'captionsButton', 'fullscreenToggle']
 
};
 

	
 
_componentJs2['default'].registerComponent('ControlBar', ControlBar);
 
exports['default'] = ControlBar;
 
module.exports = exports['default'];
 

	
 
},{"../component.js":58,"./fullscreen-toggle.js":60,"./live-display.js":61,"./mute-toggle.js":62,"./play-toggle.js":63,"./playback-rate-menu/playback-rate-menu-button.js":64,"./progress-control/progress-control.js":69,"./spacer-controls/custom-control-spacer.js":71,"./text-track-controls/captions-button.js":74,"./text-track-controls/chapters-button.js":75,"./text-track-controls/subtitles-button.js":78,"./time-controls/current-time-display.js":81,"./time-controls/duration-display.js":82,"./time-controls/remaining-time-display.js":83,"./time-controls/time-divider.js":84,"./volume-control/volume-control.js":86,"./volume-menu-button.js":88}],60:[function(_dereq_,module,exports){
 
/**
 
 * @file fullscreen-toggle.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _buttonJs = _dereq_('../button.js');
 

	
 
var _buttonJs2 = _interopRequireDefault(_buttonJs);
 

	
 
var _componentJs = _dereq_('../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * Toggle fullscreen video
 
 *
 
 * @extends Button
 
 * @class FullscreenToggle
 
 */
 

	
 
var FullscreenToggle = (function (_Button) {
 
  _inherits(FullscreenToggle, _Button);
 

	
 
  function FullscreenToggle() {
 
    _classCallCheck(this, FullscreenToggle);
 

	
 
    _Button.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  FullscreenToggle.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-fullscreen-control ' + _Button.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Handles click for full screen
 
   *
 
   * @method handleClick
 
   */
 

	
 
  FullscreenToggle.prototype.handleClick = function handleClick() {
 
    if (!this.player_.isFullscreen()) {
 
      this.player_.requestFullscreen();
 
      this.controlText('Non-Fullscreen');
 
    } else {
 
      this.player_.exitFullscreen();
 
      this.controlText('Fullscreen');
 
    }
 
  };
 

	
 
  return FullscreenToggle;
 
})(_buttonJs2['default']);
 

	
 
FullscreenToggle.prototype.controlText_ = 'Fullscreen';
 

	
 
_componentJs2['default'].registerComponent('FullscreenToggle', FullscreenToggle);
 
exports['default'] = FullscreenToggle;
 
module.exports = exports['default'];
 

	
 
},{"../button.js":57,"../component.js":58}],61:[function(_dereq_,module,exports){
 
/**
 
 * @file live-display.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _component = _dereq_('../component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _utilsDomJs = _dereq_('../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
/**
 
 * Displays the live indicator
 
 * TODO - Future make it click to snap to live
 
 *
 
 * @extends Component
 
 * @class LiveDisplay
 
 */
 

	
 
var LiveDisplay = (function (_Component) {
 
  _inherits(LiveDisplay, _Component);
 

	
 
  function LiveDisplay(player, options) {
 
    _classCallCheck(this, LiveDisplay);
 

	
 
    _Component.call(this, player, options);
 

	
 
    this.updateShowing();
 
    this.on(this.player(), 'durationchange', this.updateShowing);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  LiveDisplay.prototype.createEl = function createEl() {
 
    var el = _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-live-control vjs-control'
 
    });
 

	
 
    this.contentEl_ = Dom.createEl('div', {
 
      className: 'vjs-live-display',
 
      innerHTML: '<span class="vjs-control-text">' + this.localize('Stream Type') + '</span>' + this.localize('LIVE')
 
    }, {
 
      'aria-live': 'off'
 
    });
 

	
 
    el.appendChild(this.contentEl_);
 
    return el;
 
  };
 

	
 
  LiveDisplay.prototype.updateShowing = function updateShowing() {
 
    if (this.player().duration() === Infinity) {
 
      this.show();
 
    } else {
 
      this.hide();
 
    }
 
  };
 

	
 
  return LiveDisplay;
 
})(_component2['default']);
 

	
 
_component2['default'].registerComponent('LiveDisplay', LiveDisplay);
 
exports['default'] = LiveDisplay;
 
module.exports = exports['default'];
 

	
 
},{"../component":58,"../utils/dom.js":118}],62:[function(_dereq_,module,exports){
 
/**
 
 * @file mute-toggle.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _button = _dereq_('../button');
 

	
 
var _button2 = _interopRequireDefault(_button);
 

	
 
var _component = _dereq_('../component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _utilsDomJs = _dereq_('../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
/**
 
 * A button component for muting the audio
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Button
 
 * @class MuteToggle
 
 */
 

	
 
var MuteToggle = (function (_Button) {
 
  _inherits(MuteToggle, _Button);
 

	
 
  function MuteToggle(player, options) {
 
    _classCallCheck(this, MuteToggle);
 

	
 
    _Button.call(this, player, options);
 

	
 
    this.on(player, 'volumechange', this.update);
 

	
 
    // hide mute toggle if the current tech doesn't support volume control
 
    if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {
 
      this.addClass('vjs-hidden');
 
    }
 

	
 
    this.on(player, 'loadstart', function () {
 
      this.update(); // We need to update the button to account for a default muted state.
 

	
 
      if (player.tech_['featuresVolumeControl'] === false) {
 
        this.addClass('vjs-hidden');
 
      } else {
 
        this.removeClass('vjs-hidden');
 
      }
 
    });
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  MuteToggle.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-mute-control ' + _Button.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Handle click on mute
 
   *
 
   * @method handleClick
 
   */
 

	
 
  MuteToggle.prototype.handleClick = function handleClick() {
 
    this.player_.muted(this.player_.muted() ? false : true);
 
  };
 

	
 
  /**
 
   * Update volume
 
   *
 
   * @method update
 
   */
 

	
 
  MuteToggle.prototype.update = function update() {
 
    var vol = this.player_.volume(),
 
        level = 3;
 

	
 
    if (vol === 0 || this.player_.muted()) {
 
      level = 0;
 
    } else if (vol < 0.33) {
 
      level = 1;
 
    } else if (vol < 0.67) {
 
      level = 2;
 
    }
 

	
 
    // Don't rewrite the button text if the actual text doesn't change.
 
    // This causes unnecessary and confusing information for screen reader users.
 
    // This check is needed because this function gets called every time the volume level is changed.
 
    var toMute = this.player_.muted() ? 'Unmute' : 'Mute';
 
    var localizedMute = this.localize(toMute);
 
    if (this.controlText() !== localizedMute) {
 
      this.controlText(localizedMute);
 
    }
 

	
 
    /* TODO improve muted icon classes */
 
    for (var i = 0; i < 4; i++) {
 
      Dom.removeElClass(this.el_, 'vjs-vol-' + i);
 
    }
 
    Dom.addElClass(this.el_, 'vjs-vol-' + level);
 
  };
 

	
 
  return MuteToggle;
 
})(_button2['default']);
 

	
 
MuteToggle.prototype.controlText_ = 'Mute';
 

	
 
_component2['default'].registerComponent('MuteToggle', MuteToggle);
 
exports['default'] = MuteToggle;
 
module.exports = exports['default'];
 

	
 
},{"../button":57,"../component":58,"../utils/dom.js":118}],63:[function(_dereq_,module,exports){
 
/**
 
 * @file play-toggle.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _buttonJs = _dereq_('../button.js');
 

	
 
var _buttonJs2 = _interopRequireDefault(_buttonJs);
 

	
 
var _componentJs = _dereq_('../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * Button to toggle between play and pause
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Button
 
 * @class PlayToggle
 
 */
 

	
 
var PlayToggle = (function (_Button) {
 
  _inherits(PlayToggle, _Button);
 

	
 
  function PlayToggle(player, options) {
 
    _classCallCheck(this, PlayToggle);
 

	
 
    _Button.call(this, player, options);
 

	
 
    this.on(player, 'play', this.handlePlay);
 
    this.on(player, 'pause', this.handlePause);
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  PlayToggle.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-play-control ' + _Button.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Handle click to toggle between play and pause
 
   *
 
   * @method handleClick
 
   */
 

	
 
  PlayToggle.prototype.handleClick = function handleClick() {
 
    if (this.player_.paused()) {
 
      this.player_.play();
 
    } else {
 
      this.player_.pause();
 
    }
 
  };
 

	
 
  /**
 
   * Add the vjs-playing class to the element so it can change appearance
 
   *
 
   * @method handlePlay
 
   */
 

	
 
  PlayToggle.prototype.handlePlay = function handlePlay() {
 
    this.removeClass('vjs-paused');
 
    this.addClass('vjs-playing');
 
    this.controlText('Pause'); // change the button text to "Pause"
 
  };
 

	
 
  /**
 
   * Add the vjs-paused class to the element so it can change appearance
 
   *
 
   * @method handlePause
 
   */
 

	
 
  PlayToggle.prototype.handlePause = function handlePause() {
 
    this.removeClass('vjs-playing');
 
    this.addClass('vjs-paused');
 
    this.controlText('Play'); // change the button text to "Play"
 
  };
 

	
 
  return PlayToggle;
 
})(_buttonJs2['default']);
 

	
 
PlayToggle.prototype.controlText_ = 'Play';
 

	
 
_componentJs2['default'].registerComponent('PlayToggle', PlayToggle);
 
exports['default'] = PlayToggle;
 
module.exports = exports['default'];
 

	
 
},{"../button.js":57,"../component.js":58}],64:[function(_dereq_,module,exports){
 
/**
 
 * @file playback-rate-menu-button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _menuMenuButtonJs = _dereq_('../../menu/menu-button.js');
 

	
 
var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs);
 

	
 
var _menuMenuJs = _dereq_('../../menu/menu.js');
 

	
 
var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs);
 

	
 
var _playbackRateMenuItemJs = _dereq_('./playback-rate-menu-item.js');
 

	
 
var _playbackRateMenuItemJs2 = _interopRequireDefault(_playbackRateMenuItemJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsDomJs = _dereq_('../../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
/**
 
 * The component for controlling the playback rate
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuButton
 
 * @class PlaybackRateMenuButton
 
 */
 

	
 
var PlaybackRateMenuButton = (function (_MenuButton) {
 
  _inherits(PlaybackRateMenuButton, _MenuButton);
 

	
 
  function PlaybackRateMenuButton(player, options) {
 
    _classCallCheck(this, PlaybackRateMenuButton);
 

	
 
    _MenuButton.call(this, player, options);
 

	
 
    this.updateVisibility();
 
    this.updateLabel();
 

	
 
    this.on(player, 'loadstart', this.updateVisibility);
 
    this.on(player, 'ratechange', this.updateLabel);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.createEl = function createEl() {
 
    var el = _MenuButton.prototype.createEl.call(this);
 

	
 
    this.labelEl_ = Dom.createEl('div', {
 
      className: 'vjs-playback-rate-value',
 
      innerHTML: 1.0
 
    });
 

	
 
    el.appendChild(this.labelEl_);
 

	
 
    return el;
 
  };
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-playback-rate ' + _MenuButton.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Create the playback rate menu
 
   *
 
   * @return {Menu} Menu object populated with items
 
   * @method createMenu
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.createMenu = function createMenu() {
 
    var menu = new _menuMenuJs2['default'](this.player());
 
    var rates = this.playbackRates();
 

	
 
    if (rates) {
 
      for (var i = rates.length - 1; i >= 0; i--) {
 
        menu.addChild(new _playbackRateMenuItemJs2['default'](this.player(), { 'rate': rates[i] + 'x' }));
 
      }
 
    }
 

	
 
    return menu;
 
  };
 

	
 
  /**
 
   * Updates ARIA accessibility attributes
 
   *
 
   * @method updateARIAAttributes
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.updateARIAAttributes = function updateARIAAttributes() {
 
    // Current playback rate
 
    this.el().setAttribute('aria-valuenow', this.player().playbackRate());
 
  };
 

	
 
  /**
 
   * Handle menu item click
 
   *
 
   * @method handleClick
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.handleClick = function handleClick() {
 
    // select next rate option
 
    var currentRate = this.player().playbackRate();
 
    var rates = this.playbackRates();
 

	
 
    // this will select first one if the last one currently selected
 
    var newRate = rates[0];
 
    for (var i = 0; i < rates.length; i++) {
 
      if (rates[i] > currentRate) {
 
        newRate = rates[i];
 
        break;
 
      }
 
    }
 
    this.player().playbackRate(newRate);
 
  };
 

	
 
  /**
 
   * Get possible playback rates
 
   *
 
   * @return {Array} Possible playback rates
 
   * @method playbackRates
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.playbackRates = function playbackRates() {
 
    return this.options_['playbackRates'] || this.options_.playerOptions && this.options_.playerOptions['playbackRates'];
 
  };
 

	
 
  /**
 
   * Get supported playback rates
 
   *
 
   * @return {Array} Supported playback rates
 
   * @method playbackRateSupported
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.playbackRateSupported = function playbackRateSupported() {
 
    return this.player().tech_ && this.player().tech_['featuresPlaybackRate'] && this.playbackRates() && this.playbackRates().length > 0;
 
  };
 

	
 
  /**
 
   * Hide playback rate controls when they're no playback rate options to select
 
   *
 
   * @method updateVisibility
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.updateVisibility = function updateVisibility() {
 
    if (this.playbackRateSupported()) {
 
      this.removeClass('vjs-hidden');
 
    } else {
 
      this.addClass('vjs-hidden');
 
    }
 
  };
 

	
 
  /**
 
   * Update button label when rate changed
 
   *
 
   * @method updateLabel
 
   */
 

	
 
  PlaybackRateMenuButton.prototype.updateLabel = function updateLabel() {
 
    if (this.playbackRateSupported()) {
 
      this.labelEl_.innerHTML = this.player().playbackRate() + 'x';
 
    }
 
  };
 

	
 
  return PlaybackRateMenuButton;
 
})(_menuMenuButtonJs2['default']);
 

	
 
PlaybackRateMenuButton.prototype.controlText_ = 'Playback Rate';
 

	
 
_componentJs2['default'].registerComponent('PlaybackRateMenuButton', PlaybackRateMenuButton);
 
exports['default'] = PlaybackRateMenuButton;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../menu/menu-button.js":95,"../../menu/menu.js":97,"../../utils/dom.js":118,"./playback-rate-menu-item.js":65}],65:[function(_dereq_,module,exports){
 
/**
 
 * @file playback-rate-menu-item.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _menuMenuItemJs = _dereq_('../../menu/menu-item.js');
 

	
 
var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * The specific menu item type for selecting a playback rate
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuItem
 
 * @class PlaybackRateMenuItem
 
 */
 

	
 
var PlaybackRateMenuItem = (function (_MenuItem) {
 
  _inherits(PlaybackRateMenuItem, _MenuItem);
 

	
 
  function PlaybackRateMenuItem(player, options) {
 
    _classCallCheck(this, PlaybackRateMenuItem);
 

	
 
    var label = options['rate'];
 
    var rate = parseFloat(label, 10);
 

	
 
    // Modify options for parent MenuItem class's init.
 
    options['label'] = label;
 
    options['selected'] = rate === 1;
 
    _MenuItem.call(this, player, options);
 

	
 
    this.label = label;
 
    this.rate = rate;
 

	
 
    this.on(player, 'ratechange', this.update);
 
  }
 

	
 
  /**
 
   * Handle click on menu item
 
   *
 
   * @method handleClick
 
   */
 

	
 
  PlaybackRateMenuItem.prototype.handleClick = function handleClick() {
 
    _MenuItem.prototype.handleClick.call(this);
 
    this.player().playbackRate(this.rate);
 
  };
 

	
 
  /**
 
   * Update playback rate with selected rate
 
   *
 
   * @method update
 
   */
 

	
 
  PlaybackRateMenuItem.prototype.update = function update() {
 
    this.selected(this.player().playbackRate() === this.rate);
 
  };
 

	
 
  return PlaybackRateMenuItem;
 
})(_menuMenuItemJs2['default']);
 

	
 
PlaybackRateMenuItem.prototype.contentElType = 'button';
 

	
 
_componentJs2['default'].registerComponent('PlaybackRateMenuItem', PlaybackRateMenuItem);
 
exports['default'] = PlaybackRateMenuItem;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../menu/menu-item.js":96}],66:[function(_dereq_,module,exports){
 
/**
 
 * @file load-progress-bar.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsDomJs = _dereq_('../../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
/**
 
 * Shows load progress
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class LoadProgressBar
 
 */
 

	
 
var LoadProgressBar = (function (_Component) {
 
  _inherits(LoadProgressBar, _Component);
 

	
 
  function LoadProgressBar(player, options) {
 
    _classCallCheck(this, LoadProgressBar);
 

	
 
    _Component.call(this, player, options);
 
    this.on(player, 'progress', this.update);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  LoadProgressBar.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-load-progress',
 
      innerHTML: '<span class="vjs-control-text"><span>' + this.localize('Loaded') + '</span>: 0%</span>'
 
    });
 
  };
 

	
 
  /**
 
   * Update progress bar
 
   *
 
   * @method update
 
   */
 

	
 
  LoadProgressBar.prototype.update = function update() {
 
    var buffered = this.player_.buffered();
 
    var duration = this.player_.duration();
 
    var bufferedEnd = this.player_.bufferedEnd();
 
    var children = this.el_.children;
 

	
 
    // get the percent width of a time compared to the total end
 
    var percentify = function percentify(time, end) {
 
      var percent = time / end || 0; // no NaN
 
      return (percent >= 1 ? 1 : percent) * 100 + '%';
 
    };
 

	
 
    // update the width of the progress bar
 
    this.el_.style.width = percentify(bufferedEnd, duration);
 

	
 
    // add child elements to represent the individual buffered time ranges
 
    for (var i = 0; i < buffered.length; i++) {
 
      var start = buffered.start(i);
 
      var end = buffered.end(i);
 
      var part = children[i];
 

	
 
      if (!part) {
 
        part = this.el_.appendChild(Dom.createEl());
 
      }
 

	
 
      // set the percent based on the width of the progress bar (bufferedEnd)
 
      part.style.left = percentify(start, bufferedEnd);
 
      part.style.width = percentify(end - start, bufferedEnd);
 
    }
 

	
 
    // remove unused buffered range elements
 
    for (var i = children.length; i > buffered.length; i--) {
 
      this.el_.removeChild(children[i - 1]);
 
    }
 
  };
 

	
 
  return LoadProgressBar;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('LoadProgressBar', LoadProgressBar);
 
exports['default'] = LoadProgressBar;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../utils/dom.js":118}],67:[function(_dereq_,module,exports){
 
/**
 
 * @file mouse-time-display.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsDomJs = _dereq_('../../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFnJs = _dereq_('../../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
 

	
 
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
 

	
 
var _lodashCompatFunctionThrottle = _dereq_('lodash-compat/function/throttle');
 

	
 
var _lodashCompatFunctionThrottle2 = _interopRequireDefault(_lodashCompatFunctionThrottle);
 

	
 
/**
 
 * The Mouse Time Display component shows the time you will seek to
 
 * when hovering over the progress bar
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class MouseTimeDisplay
 
 */
 

	
 
var MouseTimeDisplay = (function (_Component) {
 
  _inherits(MouseTimeDisplay, _Component);
 

	
 
  function MouseTimeDisplay(player, options) {
 
    var _this = this;
 

	
 
    _classCallCheck(this, MouseTimeDisplay);
 

	
 
    _Component.call(this, player, options);
 

	
 
    this.update(0, 0);
 

	
 
    player.on('ready', function () {
 
      _this.on(player.controlBar.progressControl.el(), 'mousemove', _lodashCompatFunctionThrottle2['default'](Fn.bind(_this, _this.handleMouseMove), 25));
 
    });
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  MouseTimeDisplay.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-mouse-display'
 
    });
 
  };
 

	
 
  MouseTimeDisplay.prototype.handleMouseMove = function handleMouseMove(event) {
 
    var duration = this.player_.duration();
 
    var newTime = this.calculateDistance(event) * duration;
 
    var position = event.pageX - Dom.findElPosition(this.el().parentNode).left;
 

	
 
    this.update(newTime, position);
 
  };
 

	
 
  MouseTimeDisplay.prototype.update = function update(newTime, position) {
 
    var time = _utilsFormatTimeJs2['default'](newTime, this.player_.duration());
 

	
 
    this.el().style.left = position + 'px';
 
    this.el().setAttribute('data-current-time', time);
 
  };
 

	
 
  MouseTimeDisplay.prototype.calculateDistance = function calculateDistance(event) {
 
    return Dom.getPointerPosition(this.el().parentNode, event).x;
 
  };
 

	
 
  return MouseTimeDisplay;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('MouseTimeDisplay', MouseTimeDisplay);
 
exports['default'] = MouseTimeDisplay;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../utils/dom.js":118,"../../utils/fn.js":120,"../../utils/format-time.js":121,"lodash-compat/function/throttle":7}],68:[function(_dereq_,module,exports){
 
/**
 
 * @file play-progress-bar.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsFnJs = _dereq_('../../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
 

	
 
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
 

	
 
/**
 
 * Shows play progress
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class PlayProgressBar
 
 */
 

	
 
var PlayProgressBar = (function (_Component) {
 
  _inherits(PlayProgressBar, _Component);
 

	
 
  function PlayProgressBar(player, options) {
 
    _classCallCheck(this, PlayProgressBar);
 

	
 
    _Component.call(this, player, options);
 
    this.updateDataAttr();
 
    this.on(player, 'timeupdate', this.updateDataAttr);
 
    player.ready(Fn.bind(this, this.updateDataAttr));
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  PlayProgressBar.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-play-progress vjs-slider-bar',
 
      innerHTML: '<span class="vjs-control-text"><span>' + this.localize('Progress') + '</span>: 0%</span>'
 
    });
 
  };
 

	
 
  PlayProgressBar.prototype.updateDataAttr = function updateDataAttr() {
 
    var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();
 
    this.el_.setAttribute('data-current-time', _utilsFormatTimeJs2['default'](time, this.player_.duration()));
 
  };
 

	
 
  return PlayProgressBar;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('PlayProgressBar', PlayProgressBar);
 
exports['default'] = PlayProgressBar;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../utils/fn.js":120,"../../utils/format-time.js":121}],69:[function(_dereq_,module,exports){
 
/**
 
 * @file progress-control.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _seekBarJs = _dereq_('./seek-bar.js');
 

	
 
var _seekBarJs2 = _interopRequireDefault(_seekBarJs);
 

	
 
var _mouseTimeDisplayJs = _dereq_('./mouse-time-display.js');
 

	
 
var _mouseTimeDisplayJs2 = _interopRequireDefault(_mouseTimeDisplayJs);
 

	
 
/**
 
 * The Progress Control component contains the seek bar, load progress,
 
 * and play progress
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class ProgressControl
 
 */
 

	
 
var ProgressControl = (function (_Component) {
 
  _inherits(ProgressControl, _Component);
 

	
 
  function ProgressControl() {
 
    _classCallCheck(this, ProgressControl);
 

	
 
    _Component.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  ProgressControl.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-progress-control vjs-control'
 
    });
 
  };
 

	
 
  return ProgressControl;
 
})(_componentJs2['default']);
 

	
 
ProgressControl.prototype.options_ = {
 
  children: ['seekBar']
 
};
 

	
 
_componentJs2['default'].registerComponent('ProgressControl', ProgressControl);
 
exports['default'] = ProgressControl;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"./mouse-time-display.js":67,"./seek-bar.js":70}],70:[function(_dereq_,module,exports){
 
/**
 
 * @file seek-bar.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _sliderSliderJs = _dereq_('../../slider/slider.js');
 

	
 
var _sliderSliderJs2 = _interopRequireDefault(_sliderSliderJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _loadProgressBarJs = _dereq_('./load-progress-bar.js');
 

	
 
var _loadProgressBarJs2 = _interopRequireDefault(_loadProgressBarJs);
 

	
 
var _playProgressBarJs = _dereq_('./play-progress-bar.js');
 

	
 
var _playProgressBarJs2 = _interopRequireDefault(_playProgressBarJs);
 

	
 
var _utilsFnJs = _dereq_('../../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
 

	
 
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
/**
 
 * Seek Bar and holder for the progress bars
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Slider
 
 * @class SeekBar
 
 */
 

	
 
var SeekBar = (function (_Slider) {
 
  _inherits(SeekBar, _Slider);
 

	
 
  function SeekBar(player, options) {
 
    _classCallCheck(this, SeekBar);
 

	
 
    _Slider.call(this, player, options);
 
    this.on(player, 'timeupdate', this.updateARIAAttributes);
 
    player.ready(Fn.bind(this, this.updateARIAAttributes));
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  SeekBar.prototype.createEl = function createEl() {
 
    return _Slider.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-progress-holder'
 
    }, {
 
      'aria-label': 'video progress bar'
 
    });
 
  };
 

	
 
  /**
 
   * Update ARIA accessibility attributes
 
   *
 
   * @method updateARIAAttributes
 
   */
 

	
 
  SeekBar.prototype.updateARIAAttributes = function updateARIAAttributes() {
 
    // Allows for smooth scrubbing, when player can't keep up.
 
    var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();
 
    this.el_.setAttribute('aria-valuenow', (this.getPercent() * 100).toFixed(2)); // machine readable value of progress bar (percentage complete)
 
    this.el_.setAttribute('aria-valuetext', _utilsFormatTimeJs2['default'](time, this.player_.duration())); // human readable value of progress bar (time complete)
 
  };
 

	
 
  /**
 
   * Get percentage of video played
 
   *
 
   * @return {Number} Percentage played
 
   * @method getPercent
 
   */
 

	
 
  SeekBar.prototype.getPercent = function getPercent() {
 
    var percent = this.player_.currentTime() / this.player_.duration();
 
    return percent >= 1 ? 1 : percent;
 
  };
 

	
 
  /**
 
   * Handle mouse down on seek bar
 
   *
 
   * @method handleMouseDown
 
   */
 

	
 
  SeekBar.prototype.handleMouseDown = function handleMouseDown(event) {
 
    _Slider.prototype.handleMouseDown.call(this, event);
 

	
 
    this.player_.scrubbing(true);
 

	
 
    this.videoWasPlaying = !this.player_.paused();
 
    this.player_.pause();
 
  };
 

	
 
  /**
 
   * Handle mouse move on seek bar
 
   *
 
   * @method handleMouseMove
 
   */
 

	
 
  SeekBar.prototype.handleMouseMove = function handleMouseMove(event) {
 
    var newTime = this.calculateDistance(event) * this.player_.duration();
 

	
 
    // Don't let video end while scrubbing.
 
    if (newTime === this.player_.duration()) {
 
      newTime = newTime - 0.1;
 
    }
 

	
 
    // Set new time (tell player to seek to new time)
 
    this.player_.currentTime(newTime);
 
  };
 

	
 
  /**
 
   * Handle mouse up on seek bar
 
   *
 
   * @method handleMouseUp
 
   */
 

	
 
  SeekBar.prototype.handleMouseUp = function handleMouseUp(event) {
 
    _Slider.prototype.handleMouseUp.call(this, event);
 

	
 
    this.player_.scrubbing(false);
 
    if (this.videoWasPlaying) {
 
      this.player_.play();
 
    }
 
  };
 

	
 
  /**
 
   * Move more quickly fast forward for keyboard-only users
 
   *
 
   * @method stepForward
 
   */
 

	
 
  SeekBar.prototype.stepForward = function stepForward() {
 
    this.player_.currentTime(this.player_.currentTime() + 5); // more quickly fast forward for keyboard-only users
 
  };
 

	
 
  /**
 
   * Move more quickly rewind for keyboard-only users
 
   *
 
   * @method stepBack
 
   */
 

	
 
  SeekBar.prototype.stepBack = function stepBack() {
 
    this.player_.currentTime(this.player_.currentTime() - 5); // more quickly rewind for keyboard-only users
 
  };
 

	
 
  return SeekBar;
 
})(_sliderSliderJs2['default']);
 

	
 
SeekBar.prototype.options_ = {
 
  children: ['loadProgressBar', 'mouseTimeDisplay', 'playProgressBar'],
 
  'barName': 'playProgressBar'
 
};
 

	
 
SeekBar.prototype.playerEvent = 'timeupdate';
 

	
 
_componentJs2['default'].registerComponent('SeekBar', SeekBar);
 
exports['default'] = SeekBar;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../slider/slider.js":102,"../../utils/fn.js":120,"../../utils/format-time.js":121,"./load-progress-bar.js":66,"./play-progress-bar.js":68,"object.assign":43}],71:[function(_dereq_,module,exports){
 
/**
 
 * @file custom-control-spacer.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _spacerJs = _dereq_('./spacer.js');
 

	
 
var _spacerJs2 = _interopRequireDefault(_spacerJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * Spacer specifically meant to be used as an insertion point for new plugins, etc.
 
 *
 
 * @extends Spacer
 
 * @class CustomControlSpacer
 
 */
 

	
 
var CustomControlSpacer = (function (_Spacer) {
 
  _inherits(CustomControlSpacer, _Spacer);
 

	
 
  function CustomControlSpacer() {
 
    _classCallCheck(this, CustomControlSpacer);
 

	
 
    _Spacer.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  CustomControlSpacer.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-custom-control-spacer ' + _Spacer.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  CustomControlSpacer.prototype.createEl = function createEl() {
 
    var el = _Spacer.prototype.createEl.call(this, {
 
      className: this.buildCSSClass()
 
    });
 

	
 
    // No-flex/table-cell mode requires there be some content
 
    // in the cell to fill the remaining space of the table.
 
    el.innerHTML = '&nbsp;';
 
    return el;
 
  };
 

	
 
  return CustomControlSpacer;
 
})(_spacerJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('CustomControlSpacer', CustomControlSpacer);
 
exports['default'] = CustomControlSpacer;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"./spacer.js":72}],72:[function(_dereq_,module,exports){
 
/**
 
 * @file spacer.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * Just an empty spacer element that can be used as an append point for plugins, etc.
 
 * Also can be used to create space between elements when necessary.
 
 *
 
 * @extends Component
 
 * @class Spacer
 
 */
 

	
 
var Spacer = (function (_Component) {
 
  _inherits(Spacer, _Component);
 

	
 
  function Spacer() {
 
    _classCallCheck(this, Spacer);
 

	
 
    _Component.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  Spacer.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-spacer ' + _Component.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  Spacer.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: this.buildCSSClass()
 
    });
 
  };
 

	
 
  return Spacer;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('Spacer', Spacer);
 

	
 
exports['default'] = Spacer;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58}],73:[function(_dereq_,module,exports){
 
/**
 
 * @file caption-settings-menu-item.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js');
 

	
 
var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * The menu item for caption track settings menu
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends TextTrackMenuItem
 
 * @class CaptionSettingsMenuItem
 
 */
 

	
 
var CaptionSettingsMenuItem = (function (_TextTrackMenuItem) {
 
  _inherits(CaptionSettingsMenuItem, _TextTrackMenuItem);
 

	
 
  function CaptionSettingsMenuItem(player, options) {
 
    _classCallCheck(this, CaptionSettingsMenuItem);
 

	
 
    options['track'] = {
 
      'kind': options['kind'],
 
      'player': player,
 
      'label': options['kind'] + ' settings',
 
      'default': false,
 
      mode: 'disabled'
 
    };
 

	
 
    _TextTrackMenuItem.call(this, player, options);
 
    this.addClass('vjs-texttrack-settings');
 
  }
 

	
 
  /**
 
   * Handle click on menu item
 
   *
 
   * @method handleClick
 
   */
 

	
 
  CaptionSettingsMenuItem.prototype.handleClick = function handleClick() {
 
    this.player().getChild('textTrackSettings').show();
 
  };
 

	
 
  return CaptionSettingsMenuItem;
 
})(_textTrackMenuItemJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('CaptionSettingsMenuItem', CaptionSettingsMenuItem);
 
exports['default'] = CaptionSettingsMenuItem;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"./text-track-menu-item.js":80}],74:[function(_dereq_,module,exports){
 
/**
 
 * @file captions-button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _textTrackButtonJs = _dereq_('./text-track-button.js');
 

	
 
var _textTrackButtonJs2 = _interopRequireDefault(_textTrackButtonJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _captionSettingsMenuItemJs = _dereq_('./caption-settings-menu-item.js');
 

	
 
var _captionSettingsMenuItemJs2 = _interopRequireDefault(_captionSettingsMenuItemJs);
 

	
 
/**
 
 * The button component for toggling and selecting captions
 
 *
 
 * @param {Object} player  Player object
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends TextTrackButton
 
 * @class CaptionsButton
 
 */
 

	
 
var CaptionsButton = (function (_TextTrackButton) {
 
  _inherits(CaptionsButton, _TextTrackButton);
 

	
 
  function CaptionsButton(player, options, ready) {
 
    _classCallCheck(this, CaptionsButton);
 

	
 
    _TextTrackButton.call(this, player, options, ready);
 
    this.el_.setAttribute('aria-label', 'Captions Menu');
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  CaptionsButton.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-captions-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Update caption menu items
 
   *
 
   * @method update
 
   */
 

	
 
  CaptionsButton.prototype.update = function update() {
 
    var threshold = 2;
 
    _TextTrackButton.prototype.update.call(this);
 

	
 
    // if native, then threshold is 1 because no settings button
 
    if (this.player().tech_ && this.player().tech_['featuresNativeTextTracks']) {
 
      threshold = 1;
 
    }
 

	
 
    if (this.items && this.items.length > threshold) {
 
      this.show();
 
    } else {
 
      this.hide();
 
    }
 
  };
 

	
 
  /**
 
   * Create caption menu items
 
   *
 
   * @return {Array} Array of menu items
 
   * @method createItems
 
   */
 

	
 
  CaptionsButton.prototype.createItems = function createItems() {
 
    var items = [];
 

	
 
    if (!(this.player().tech_ && this.player().tech_['featuresNativeTextTracks'])) {
 
      items.push(new _captionSettingsMenuItemJs2['default'](this.player_, { 'kind': this.kind_ }));
 
    }
 

	
 
    return _TextTrackButton.prototype.createItems.call(this, items);
 
  };
 

	
 
  return CaptionsButton;
 
})(_textTrackButtonJs2['default']);
 

	
 
CaptionsButton.prototype.kind_ = 'captions';
 
CaptionsButton.prototype.controlText_ = 'Captions';
 

	
 
_componentJs2['default'].registerComponent('CaptionsButton', CaptionsButton);
 
exports['default'] = CaptionsButton;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"./caption-settings-menu-item.js":73,"./text-track-button.js":79}],75:[function(_dereq_,module,exports){
 
/**
 
 * @file chapters-button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _textTrackButtonJs = _dereq_('./text-track-button.js');
 

	
 
var _textTrackButtonJs2 = _interopRequireDefault(_textTrackButtonJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js');
 

	
 
var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs);
 

	
 
var _chaptersTrackMenuItemJs = _dereq_('./chapters-track-menu-item.js');
 

	
 
var _chaptersTrackMenuItemJs2 = _interopRequireDefault(_chaptersTrackMenuItemJs);
 

	
 
var _menuMenuJs = _dereq_('../../menu/menu.js');
 

	
 
var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs);
 

	
 
var _utilsDomJs = _dereq_('../../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFnJs = _dereq_('../../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsToTitleCaseJs = _dereq_('../../utils/to-title-case.js');
 

	
 
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
/**
 
 * The button component for toggling and selecting chapters
 
 * Chapters act much differently than other text tracks
 
 * Cues are navigation vs. other tracks of alternative languages
 
 *
 
 * @param {Object} player  Player object
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends TextTrackButton
 
 * @class ChaptersButton
 
 */
 

	
 
var ChaptersButton = (function (_TextTrackButton) {
 
  _inherits(ChaptersButton, _TextTrackButton);
 

	
 
  function ChaptersButton(player, options, ready) {
 
    _classCallCheck(this, ChaptersButton);
 

	
 
    _TextTrackButton.call(this, player, options, ready);
 
    this.el_.setAttribute('aria-label', 'Chapters Menu');
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  ChaptersButton.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-chapters-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Create a menu item for each text track
 
   *
 
   * @return {Array} Array of menu items
 
   * @method createItems
 
   */
 

	
 
  ChaptersButton.prototype.createItems = function createItems() {
 
    var items = [];
 

	
 
    var tracks = this.player_.textTracks();
 

	
 
    if (!tracks) {
 
      return items;
 
    }
 

	
 
    for (var i = 0; i < tracks.length; i++) {
 
      var track = tracks[i];
 
      if (track['kind'] === this.kind_) {
 
        items.push(new _textTrackMenuItemJs2['default'](this.player_, {
 
          'track': track
 
        }));
 
      }
 
    }
 

	
 
    return items;
 
  };
 

	
 
  /**
 
   * Create menu from chapter buttons
 
   *
 
   * @return {Menu} Menu of chapter buttons
 
   * @method createMenu
 
   */
 

	
 
  ChaptersButton.prototype.createMenu = function createMenu() {
 
    var tracks = this.player_.textTracks() || [];
 
    var chaptersTrack = undefined;
 
    var items = this.items = [];
 

	
 
    for (var i = 0, l = tracks.length; i < l; i++) {
 
      var track = tracks[i];
 
      if (track['kind'] === this.kind_) {
 
        if (!track.cues) {
 
          track['mode'] = 'hidden';
 
          /* jshint loopfunc:true */
 
          // TODO see if we can figure out a better way of doing this https://github.com/videojs/video.js/issues/1864
 
          _globalWindow2['default'].setTimeout(Fn.bind(this, function () {
 
            this.createMenu();
 
          }), 100);
 
          /* jshint loopfunc:false */
 
        } else {
 
            chaptersTrack = track;
 
            break;
 
          }
 
      }
 
    }
 

	
 
    var menu = this.menu;
 
    if (menu === undefined) {
 
      menu = new _menuMenuJs2['default'](this.player_);
 
      menu.contentEl().appendChild(Dom.createEl('li', {
 
        className: 'vjs-menu-title',
 
        innerHTML: _utilsToTitleCaseJs2['default'](this.kind_),
 
        tabIndex: -1
 
      }));
 
    }
 

	
 
    if (chaptersTrack) {
 
      var cues = chaptersTrack['cues'],
 
          cue = undefined;
 

	
 
      for (var i = 0, l = cues.length; i < l; i++) {
 
        cue = cues[i];
 

	
 
        var mi = new _chaptersTrackMenuItemJs2['default'](this.player_, {
 
          'track': chaptersTrack,
 
          'cue': cue
 
        });
 

	
 
        items.push(mi);
 

	
 
        menu.addChild(mi);
 
      }
 
      this.addChild(menu);
 
    }
 

	
 
    if (this.items.length > 0) {
 
      this.show();
 
    }
 

	
 
    return menu;
 
  };
 

	
 
  return ChaptersButton;
 
})(_textTrackButtonJs2['default']);
 

	
 
ChaptersButton.prototype.kind_ = 'chapters';
 
ChaptersButton.prototype.controlText_ = 'Chapters';
 

	
 
_componentJs2['default'].registerComponent('ChaptersButton', ChaptersButton);
 
exports['default'] = ChaptersButton;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../menu/menu.js":97,"../../utils/dom.js":118,"../../utils/fn.js":120,"../../utils/to-title-case.js":127,"./chapters-track-menu-item.js":76,"./text-track-button.js":79,"./text-track-menu-item.js":80,"global/window":2}],76:[function(_dereq_,module,exports){
 
/**
 
 * @file chapters-track-menu-item.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _menuMenuItemJs = _dereq_('../../menu/menu-item.js');
 

	
 
var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsFnJs = _dereq_('../../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
/**
 
 * The chapter track menu item
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuItem
 
 * @class ChaptersTrackMenuItem
 
 */
 

	
 
var ChaptersTrackMenuItem = (function (_MenuItem) {
 
  _inherits(ChaptersTrackMenuItem, _MenuItem);
 

	
 
  function ChaptersTrackMenuItem(player, options) {
 
    _classCallCheck(this, ChaptersTrackMenuItem);
 

	
 
    var track = options['track'];
 
    var cue = options['cue'];
 
    var currentTime = player.currentTime();
 

	
 
    // Modify options for parent MenuItem class's init.
 
    options['label'] = cue.text;
 
    options['selected'] = cue['startTime'] <= currentTime && currentTime < cue['endTime'];
 
    _MenuItem.call(this, player, options);
 

	
 
    this.track = track;
 
    this.cue = cue;
 
    track.addEventListener('cuechange', Fn.bind(this, this.update));
 
  }
 

	
 
  /**
 
   * Handle click on menu item
 
   *
 
   * @method handleClick
 
   */
 

	
 
  ChaptersTrackMenuItem.prototype.handleClick = function handleClick() {
 
    _MenuItem.prototype.handleClick.call(this);
 
    this.player_.currentTime(this.cue.startTime);
 
    this.update(this.cue.startTime);
 
  };
 

	
 
  /**
 
   * Update chapter menu item
 
   *
 
   * @method update
 
   */
 

	
 
  ChaptersTrackMenuItem.prototype.update = function update() {
 
    var cue = this.cue;
 
    var currentTime = this.player_.currentTime();
 

	
 
    // vjs.log(currentTime, cue.startTime);
 
    this.selected(cue['startTime'] <= currentTime && currentTime < cue['endTime']);
 
  };
 

	
 
  return ChaptersTrackMenuItem;
 
})(_menuMenuItemJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('ChaptersTrackMenuItem', ChaptersTrackMenuItem);
 
exports['default'] = ChaptersTrackMenuItem;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../menu/menu-item.js":96,"../../utils/fn.js":120}],77:[function(_dereq_,module,exports){
 
/**
 
 * @file off-text-track-menu-item.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js');
 

	
 
var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * A special menu item for turning of a specific type of text track
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends TextTrackMenuItem
 
 * @class OffTextTrackMenuItem
 
 */
 

	
 
var OffTextTrackMenuItem = (function (_TextTrackMenuItem) {
 
  _inherits(OffTextTrackMenuItem, _TextTrackMenuItem);
 

	
 
  function OffTextTrackMenuItem(player, options) {
 
    _classCallCheck(this, OffTextTrackMenuItem);
 

	
 
    // Create pseudo track info
 
    // Requires options['kind']
 
    options['track'] = {
 
      'kind': options['kind'],
 
      'player': player,
 
      'label': options['kind'] + ' off',
 
      'default': false,
 
      'mode': 'disabled'
 
    };
 

	
 
    _TextTrackMenuItem.call(this, player, options);
 
    this.selected(true);
 
  }
 

	
 
  /**
 
   * Handle text track change
 
   *
 
   * @param {Object} event Event object
 
   * @method handleTracksChange
 
   */
 

	
 
  OffTextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {
 
    var tracks = this.player().textTracks();
 
    var selected = true;
 

	
 
    for (var i = 0, l = tracks.length; i < l; i++) {
 
      var track = tracks[i];
 
      if (track['kind'] === this.track['kind'] && track['mode'] === 'showing') {
 
        selected = false;
 
        break;
 
      }
 
    }
 

	
 
    this.selected(selected);
 
  };
 

	
 
  return OffTextTrackMenuItem;
 
})(_textTrackMenuItemJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('OffTextTrackMenuItem', OffTextTrackMenuItem);
 
exports['default'] = OffTextTrackMenuItem;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"./text-track-menu-item.js":80}],78:[function(_dereq_,module,exports){
 
/**
 
 * @file subtitles-button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _textTrackButtonJs = _dereq_('./text-track-button.js');
 

	
 
var _textTrackButtonJs2 = _interopRequireDefault(_textTrackButtonJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * The button component for toggling and selecting subtitles
 
 *
 
 * @param {Object} player  Player object
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends TextTrackButton
 
 * @class SubtitlesButton
 
 */
 

	
 
var SubtitlesButton = (function (_TextTrackButton) {
 
  _inherits(SubtitlesButton, _TextTrackButton);
 

	
 
  function SubtitlesButton(player, options, ready) {
 
    _classCallCheck(this, SubtitlesButton);
 

	
 
    _TextTrackButton.call(this, player, options, ready);
 
    this.el_.setAttribute('aria-label', 'Subtitles Menu');
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  SubtitlesButton.prototype.buildCSSClass = function buildCSSClass() {
 
    return 'vjs-subtitles-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  return SubtitlesButton;
 
})(_textTrackButtonJs2['default']);
 

	
 
SubtitlesButton.prototype.kind_ = 'subtitles';
 
SubtitlesButton.prototype.controlText_ = 'Subtitles';
 

	
 
_componentJs2['default'].registerComponent('SubtitlesButton', SubtitlesButton);
 
exports['default'] = SubtitlesButton;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"./text-track-button.js":79}],79:[function(_dereq_,module,exports){
 
/**
 
 * @file text-track-button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _menuMenuButtonJs = _dereq_('../../menu/menu-button.js');
 

	
 
var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsFnJs = _dereq_('../../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js');
 

	
 
var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs);
 

	
 
var _offTextTrackMenuItemJs = _dereq_('./off-text-track-menu-item.js');
 

	
 
var _offTextTrackMenuItemJs2 = _interopRequireDefault(_offTextTrackMenuItemJs);
 

	
 
/**
 
 * The base class for buttons that toggle specific text track types (e.g. subtitles)
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuButton
 
 * @class TextTrackButton
 
 */
 

	
 
var TextTrackButton = (function (_MenuButton) {
 
  _inherits(TextTrackButton, _MenuButton);
 

	
 
  function TextTrackButton(player, options) {
 
    _classCallCheck(this, TextTrackButton);
 

	
 
    _MenuButton.call(this, player, options);
 

	
 
    var tracks = this.player_.textTracks();
 

	
 
    if (this.items.length <= 1) {
 
      this.hide();
 
    }
 

	
 
    if (!tracks) {
 
      return;
 
    }
 

	
 
    var updateHandler = Fn.bind(this, this.update);
 
    tracks.addEventListener('removetrack', updateHandler);
 
    tracks.addEventListener('addtrack', updateHandler);
 

	
 
    this.player_.on('dispose', function () {
 
      tracks.removeEventListener('removetrack', updateHandler);
 
      tracks.removeEventListener('addtrack', updateHandler);
 
    });
 
  }
 

	
 
  // Create a menu item for each text track
 

	
 
  TextTrackButton.prototype.createItems = function createItems() {
 
    var items = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
 

	
 
    // Add an OFF menu item to turn all tracks off
 
    items.push(new _offTextTrackMenuItemJs2['default'](this.player_, { 'kind': this.kind_ }));
 

	
 
    var tracks = this.player_.textTracks();
 

	
 
    if (!tracks) {
 
      return items;
 
    }
 

	
 
    for (var i = 0; i < tracks.length; i++) {
 
      var track = tracks[i];
 

	
 
      // only add tracks that are of the appropriate kind and have a label
 
      if (track['kind'] === this.kind_) {
 
        items.push(new _textTrackMenuItemJs2['default'](this.player_, {
 
          'track': track
 
        }));
 
      }
 
    }
 

	
 
    return items;
 
  };
 

	
 
  return TextTrackButton;
 
})(_menuMenuButtonJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('TextTrackButton', TextTrackButton);
 
exports['default'] = TextTrackButton;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../menu/menu-button.js":95,"../../utils/fn.js":120,"./off-text-track-menu-item.js":77,"./text-track-menu-item.js":80}],80:[function(_dereq_,module,exports){
 
/**
 
 * @file text-track-menu-item.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _menuMenuItemJs = _dereq_('../../menu/menu-item.js');
 

	
 
var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsFnJs = _dereq_('../../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
/**
 
 * The specific menu item type for selecting a language within a text track kind
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuItem
 
 * @class TextTrackMenuItem
 
 */
 

	
 
var TextTrackMenuItem = (function (_MenuItem) {
 
  _inherits(TextTrackMenuItem, _MenuItem);
 

	
 
  function TextTrackMenuItem(player, options) {
 
    var _this = this;
 

	
 
    _classCallCheck(this, TextTrackMenuItem);
 

	
 
    var track = options['track'];
 
    var tracks = player.textTracks();
 

	
 
    // Modify options for parent MenuItem class's init.
 
    options['label'] = track['label'] || track['language'] || 'Unknown';
 
    options['selected'] = track['default'] || track['mode'] === 'showing';
 
    _MenuItem.call(this, player, options);
 

	
 
    this.track = track;
 

	
 
    if (tracks) {
 
      (function () {
 
        var changeHandler = Fn.bind(_this, _this.handleTracksChange);
 

	
 
        tracks.addEventListener('change', changeHandler);
 
        _this.on('dispose', function () {
 
          tracks.removeEventListener('change', changeHandler);
 
        });
 
      })();
 
    }
 

	
 
    // iOS7 doesn't dispatch change events to TextTrackLists when an
 
    // associated track's mode changes. Without something like
 
    // Object.observe() (also not present on iOS7), it's not
 
    // possible to detect changes to the mode attribute and polyfill
 
    // the change event. As a poor substitute, we manually dispatch
 
    // change events whenever the controls modify the mode.
 
    if (tracks && tracks.onchange === undefined) {
 
      (function () {
 
        var event = undefined;
 

	
 
        _this.on(['tap', 'click'], function () {
 
          if (typeof _globalWindow2['default'].Event !== 'object') {
 
            // Android 2.3 throws an Illegal Constructor error for window.Event
 
            try {
 
              event = new _globalWindow2['default'].Event('change');
 
            } catch (err) {}
 
          }
 

	
 
          if (!event) {
 
            event = _globalDocument2['default'].createEvent('Event');
 
            event.initEvent('change', true, true);
 
          }
 

	
 
          tracks.dispatchEvent(event);
 
        });
 
      })();
 
    }
 
  }
 

	
 
  /**
 
   * Handle click on text track
 
   *
 
   * @method handleClick
 
   */
 

	
 
  TextTrackMenuItem.prototype.handleClick = function handleClick(event) {
 
    var kind = this.track['kind'];
 
    var tracks = this.player_.textTracks();
 

	
 
    _MenuItem.prototype.handleClick.call(this, event);
 

	
 
    if (!tracks) return;
 

	
 
    for (var i = 0; i < tracks.length; i++) {
 
      var track = tracks[i];
 

	
 
      if (track['kind'] !== kind) {
 
        continue;
 
      }
 

	
 
      if (track === this.track) {
 
        track['mode'] = 'showing';
 
      } else {
 
        track['mode'] = 'disabled';
 
      }
 
    }
 
  };
 

	
 
  /**
 
   * Handle text track change
 
   *
 
   * @method handleTracksChange
 
   */
 

	
 
  TextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {
 
    this.selected(this.track['mode'] === 'showing');
 
  };
 

	
 
  return TextTrackMenuItem;
 
})(_menuMenuItemJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('TextTrackMenuItem', TextTrackMenuItem);
 
exports['default'] = TextTrackMenuItem;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../menu/menu-item.js":96,"../../utils/fn.js":120,"global/document":1,"global/window":2}],81:[function(_dereq_,module,exports){
 
/**
 
 * @file current-time-display.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsDomJs = _dereq_('../../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
 

	
 
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
 

	
 
/**
 
 * Displays the current time
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class CurrentTimeDisplay
 
 */
 

	
 
var CurrentTimeDisplay = (function (_Component) {
 
  _inherits(CurrentTimeDisplay, _Component);
 

	
 
  function CurrentTimeDisplay(player, options) {
 
    _classCallCheck(this, CurrentTimeDisplay);
 

	
 
    _Component.call(this, player, options);
 

	
 
    this.on(player, 'timeupdate', this.updateContent);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  CurrentTimeDisplay.prototype.createEl = function createEl() {
 
    var el = _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-current-time vjs-time-control vjs-control'
 
    });
 

	
 
    this.contentEl_ = Dom.createEl('div', {
 
      className: 'vjs-current-time-display',
 
      // label the current time for screen reader users
 
      innerHTML: '<span class="vjs-control-text">Current Time </span>' + '0:00'
 
    }, {
 
      // tell screen readers not to automatically read the time as it changes
 
      'aria-live': 'off'
 
    });
 

	
 
    el.appendChild(this.contentEl_);
 
    return el;
 
  };
 

	
 
  /**
 
   * Update current time display
 
   *
 
   * @method updateContent
 
   */
 

	
 
  CurrentTimeDisplay.prototype.updateContent = function updateContent() {
 
    // Allows for smooth scrubbing, when player can't keep up.
 
    var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();
 
    var localizedText = this.localize('Current Time');
 
    var formattedTime = _utilsFormatTimeJs2['default'](time, this.player_.duration());
 
    this.contentEl_.innerHTML = '<span class="vjs-control-text">' + localizedText + '</span> ' + formattedTime;
 
  };
 

	
 
  return CurrentTimeDisplay;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('CurrentTimeDisplay', CurrentTimeDisplay);
 
exports['default'] = CurrentTimeDisplay;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../utils/dom.js":118,"../../utils/format-time.js":121}],82:[function(_dereq_,module,exports){
 
/**
 
 * @file duration-display.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsDomJs = _dereq_('../../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
 

	
 
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
 

	
 
/**
 
 * Displays the duration
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class DurationDisplay
 
 */
 

	
 
var DurationDisplay = (function (_Component) {
 
  _inherits(DurationDisplay, _Component);
 

	
 
  function DurationDisplay(player, options) {
 
    _classCallCheck(this, DurationDisplay);
 

	
 
    _Component.call(this, player, options);
 

	
 
    // this might need to be changed to 'durationchange' instead of 'timeupdate' eventually,
 
    // however the durationchange event fires before this.player_.duration() is set,
 
    // so the value cannot be written out using this method.
 
    // Once the order of durationchange and this.player_.duration() being set is figured out,
 
    // this can be updated.
 
    this.on(player, 'timeupdate', this.updateContent);
 
    this.on(player, 'loadedmetadata', this.updateContent);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  DurationDisplay.prototype.createEl = function createEl() {
 
    var el = _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-duration vjs-time-control vjs-control'
 
    });
 

	
 
    this.contentEl_ = Dom.createEl('div', {
 
      className: 'vjs-duration-display',
 
      // label the duration time for screen reader users
 
      innerHTML: '<span class="vjs-control-text">' + this.localize('Duration Time') + '</span> 0:00'
 
    }, {
 
      // tell screen readers not to automatically read the time as it changes
 
      'aria-live': 'off'
 
    });
 

	
 
    el.appendChild(this.contentEl_);
 
    return el;
 
  };
 

	
 
  /**
 
   * Update duration time display
 
   *
 
   * @method updateContent
 
   */
 

	
 
  DurationDisplay.prototype.updateContent = function updateContent() {
 
    var duration = this.player_.duration();
 
    if (duration) {
 
      var localizedText = this.localize('Duration Time');
 
      var formattedTime = _utilsFormatTimeJs2['default'](duration);
 
      this.contentEl_.innerHTML = '<span class="vjs-control-text">' + localizedText + '</span> ' + formattedTime; // label the duration time for screen reader users
 
    }
 
  };
 

	
 
  return DurationDisplay;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('DurationDisplay', DurationDisplay);
 
exports['default'] = DurationDisplay;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../utils/dom.js":118,"../../utils/format-time.js":121}],83:[function(_dereq_,module,exports){
 
/**
 
 * @file remaining-time-display.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsDomJs = _dereq_('../../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
 

	
 
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
 

	
 
/**
 
 * Displays the time left in the video
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class RemainingTimeDisplay
 
 */
 

	
 
var RemainingTimeDisplay = (function (_Component) {
 
  _inherits(RemainingTimeDisplay, _Component);
 

	
 
  function RemainingTimeDisplay(player, options) {
 
    _classCallCheck(this, RemainingTimeDisplay);
 

	
 
    _Component.call(this, player, options);
 

	
 
    this.on(player, 'timeupdate', this.updateContent);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  RemainingTimeDisplay.prototype.createEl = function createEl() {
 
    var el = _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-remaining-time vjs-time-control vjs-control'
 
    });
 

	
 
    this.contentEl_ = Dom.createEl('div', {
 
      className: 'vjs-remaining-time-display',
 
      // label the remaining time for screen reader users
 
      innerHTML: '<span class="vjs-control-text">' + this.localize('Remaining Time') + '</span> -0:00'
 
    }, {
 
      // tell screen readers not to automatically read the time as it changes
 
      'aria-live': 'off'
 
    });
 

	
 
    el.appendChild(this.contentEl_);
 
    return el;
 
  };
 

	
 
  /**
 
   * Update remaining time display
 
   *
 
   * @method updateContent
 
   */
 

	
 
  RemainingTimeDisplay.prototype.updateContent = function updateContent() {
 
    if (this.player_.duration()) {
 
      var localizedText = this.localize('Remaining Time');
 
      var formattedTime = _utilsFormatTimeJs2['default'](this.player_.remainingTime());
 
      this.contentEl_.innerHTML = '<span class="vjs-control-text">' + localizedText + '</span> -' + formattedTime;
 
    }
 

	
 
    // Allows for smooth scrubbing, when player can't keep up.
 
    // var time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();
 
    // this.contentEl_.innerHTML = vjs.formatTime(time, this.player_.duration());
 
  };
 

	
 
  return RemainingTimeDisplay;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('RemainingTimeDisplay', RemainingTimeDisplay);
 
exports['default'] = RemainingTimeDisplay;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../utils/dom.js":118,"../../utils/format-time.js":121}],84:[function(_dereq_,module,exports){
 
/**
 
 * @file time-divider.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * The separator between the current time and duration.
 
 * Can be hidden if it's not needed in the design.
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class TimeDivider
 
 */
 

	
 
var TimeDivider = (function (_Component) {
 
  _inherits(TimeDivider, _Component);
 

	
 
  function TimeDivider() {
 
    _classCallCheck(this, TimeDivider);
 

	
 
    _Component.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  TimeDivider.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-time-control vjs-time-divider',
 
      innerHTML: '<div><span>/</span></div>'
 
    });
 
  };
 

	
 
  return TimeDivider;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('TimeDivider', TimeDivider);
 
exports['default'] = TimeDivider;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58}],85:[function(_dereq_,module,exports){
 
/**
 
 * @file volume-bar.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _sliderSliderJs = _dereq_('../../slider/slider.js');
 

	
 
var _sliderSliderJs2 = _interopRequireDefault(_sliderSliderJs);
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsFnJs = _dereq_('../../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
// Required children
 

	
 
var _volumeLevelJs = _dereq_('./volume-level.js');
 

	
 
var _volumeLevelJs2 = _interopRequireDefault(_volumeLevelJs);
 

	
 
/**
 
 * The bar that contains the volume level and can be clicked on to adjust the level
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Slider
 
 * @class VolumeBar
 
 */
 

	
 
var VolumeBar = (function (_Slider) {
 
  _inherits(VolumeBar, _Slider);
 

	
 
  function VolumeBar(player, options) {
 
    _classCallCheck(this, VolumeBar);
 

	
 
    _Slider.call(this, player, options);
 
    this.on(player, 'volumechange', this.updateARIAAttributes);
 
    player.ready(Fn.bind(this, this.updateARIAAttributes));
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  VolumeBar.prototype.createEl = function createEl() {
 
    return _Slider.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-volume-bar vjs-slider-bar'
 
    }, {
 
      'aria-label': 'volume level'
 
    });
 
  };
 

	
 
  /**
 
   * Handle mouse move on volume bar
 
   *
 
   * @method handleMouseMove
 
   */
 

	
 
  VolumeBar.prototype.handleMouseMove = function handleMouseMove(event) {
 
    if (this.player_.muted()) {
 
      this.player_.muted(false);
 
    }
 

	
 
    this.player_.volume(this.calculateDistance(event));
 
  };
 

	
 
  /**
 
   * Get percent of volume level
 
   *
 
   * @retun {Number} Volume level percent
 
   * @method getPercent
 
   */
 

	
 
  VolumeBar.prototype.getPercent = function getPercent() {
 
    if (this.player_.muted()) {
 
      return 0;
 
    } else {
 
      return this.player_.volume();
 
    }
 
  };
 

	
 
  /**
 
   * Increase volume level for keyboard users
 
   *
 
   * @method stepForward
 
   */
 

	
 
  VolumeBar.prototype.stepForward = function stepForward() {
 
    this.player_.volume(this.player_.volume() + 0.1);
 
  };
 

	
 
  /**
 
   * Decrease volume level for keyboard users
 
   *
 
   * @method stepBack
 
   */
 

	
 
  VolumeBar.prototype.stepBack = function stepBack() {
 
    this.player_.volume(this.player_.volume() - 0.1);
 
  };
 

	
 
  /**
 
   * Update ARIA accessibility attributes
 
   *
 
   * @method updateARIAAttributes
 
   */
 

	
 
  VolumeBar.prototype.updateARIAAttributes = function updateARIAAttributes() {
 
    // Current value of volume bar as a percentage
 
    var volume = (this.player_.volume() * 100).toFixed(2);
 
    this.el_.setAttribute('aria-valuenow', volume);
 
    this.el_.setAttribute('aria-valuetext', volume + '%');
 
  };
 

	
 
  return VolumeBar;
 
})(_sliderSliderJs2['default']);
 

	
 
VolumeBar.prototype.options_ = {
 
  children: ['volumeLevel'],
 
  'barName': 'volumeLevel'
 
};
 

	
 
VolumeBar.prototype.playerEvent = 'volumechange';
 

	
 
_componentJs2['default'].registerComponent('VolumeBar', VolumeBar);
 
exports['default'] = VolumeBar;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"../../slider/slider.js":102,"../../utils/fn.js":120,"./volume-level.js":87}],86:[function(_dereq_,module,exports){
 
/**
 
 * @file volume-control.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
// Required children
 

	
 
var _volumeBarJs = _dereq_('./volume-bar.js');
 

	
 
var _volumeBarJs2 = _interopRequireDefault(_volumeBarJs);
 

	
 
/**
 
 * The component for controlling the volume level
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class VolumeControl
 
 */
 

	
 
var VolumeControl = (function (_Component) {
 
  _inherits(VolumeControl, _Component);
 

	
 
  function VolumeControl(player, options) {
 
    _classCallCheck(this, VolumeControl);
 

	
 
    _Component.call(this, player, options);
 

	
 
    // hide volume controls when they're not supported by the current tech
 
    if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {
 
      this.addClass('vjs-hidden');
 
    }
 
    this.on(player, 'loadstart', function () {
 
      if (player.tech_['featuresVolumeControl'] === false) {
 
        this.addClass('vjs-hidden');
 
      } else {
 
        this.removeClass('vjs-hidden');
 
      }
 
    });
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  VolumeControl.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-volume-control vjs-control'
 
    });
 
  };
 

	
 
  return VolumeControl;
 
})(_componentJs2['default']);
 

	
 
VolumeControl.prototype.options_ = {
 
  children: ['volumeBar']
 
};
 

	
 
_componentJs2['default'].registerComponent('VolumeControl', VolumeControl);
 
exports['default'] = VolumeControl;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58,"./volume-bar.js":85}],87:[function(_dereq_,module,exports){
 
/**
 
 * @file volume-level.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
/**
 
 * Shows volume level
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class VolumeLevel
 
 */
 

	
 
var VolumeLevel = (function (_Component) {
 
  _inherits(VolumeLevel, _Component);
 

	
 
  function VolumeLevel() {
 
    _classCallCheck(this, VolumeLevel);
 

	
 
    _Component.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  VolumeLevel.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-volume-level',
 
      innerHTML: '<span class="vjs-control-text"></span>'
 
    });
 
  };
 

	
 
  return VolumeLevel;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('VolumeLevel', VolumeLevel);
 
exports['default'] = VolumeLevel;
 
module.exports = exports['default'];
 

	
 
},{"../../component.js":58}],88:[function(_dereq_,module,exports){
 
/**
 
 * @file volume-menu-button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _buttonJs = _dereq_('../button.js');
 

	
 
var _buttonJs2 = _interopRequireDefault(_buttonJs);
 

	
 
var _componentJs = _dereq_('../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _menuMenuJs = _dereq_('../menu/menu.js');
 

	
 
var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs);
 

	
 
var _menuMenuButtonJs = _dereq_('../menu/menu-button.js');
 

	
 
var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs);
 

	
 
var _muteToggleJs = _dereq_('./mute-toggle.js');
 

	
 
var _muteToggleJs2 = _interopRequireDefault(_muteToggleJs);
 

	
 
var _volumeControlVolumeBarJs = _dereq_('./volume-control/volume-bar.js');
 

	
 
var _volumeControlVolumeBarJs2 = _interopRequireDefault(_volumeControlVolumeBarJs);
 

	
 
/**
 
 * Button for volume menu
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuButton
 
 * @class VolumeMenuButton
 
 */
 

	
 
var VolumeMenuButton = (function (_MenuButton) {
 
  _inherits(VolumeMenuButton, _MenuButton);
 

	
 
  function VolumeMenuButton(player) {
 
    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
 

	
 
    _classCallCheck(this, VolumeMenuButton);
 

	
 
    // Default to inline
 
    if (options.inline === undefined) {
 
      options.inline = true;
 
    }
 

	
 
    // If the vertical option isn't passed at all, default to true.
 
    if (options.vertical === undefined) {
 
      // If an inline volumeMenuButton is used, we should default to using
 
      // a horizontal slider for obvious reasons.
 
      if (options.inline) {
 
        options.vertical = false;
 
      } else {
 
        options.vertical = true;
 
      }
 
    }
 

	
 
    // The vertical option needs to be set on the volumeBar as well,
 
    // since that will need to be passed along to the VolumeBar constructor
 
    options.volumeBar = options.volumeBar || {};
 
    options.volumeBar.vertical = !!options.vertical;
 

	
 
    _MenuButton.call(this, player, options);
 

	
 
    // Same listeners as MuteToggle
 
    this.on(player, 'volumechange', this.volumeUpdate);
 
    this.on(player, 'loadstart', this.volumeUpdate);
 

	
 
    // hide mute toggle if the current tech doesn't support volume control
 
    function updateVisibility() {
 
      if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {
 
        this.addClass('vjs-hidden');
 
      } else {
 
        this.removeClass('vjs-hidden');
 
      }
 
    }
 

	
 
    updateVisibility.call(this);
 
    this.on(player, 'loadstart', updateVisibility);
 

	
 
    this.on(this.volumeBar, ['slideractive', 'focus'], function () {
 
      this.addClass('vjs-slider-active');
 
    });
 

	
 
    this.on(this.volumeBar, ['sliderinactive', 'blur'], function () {
 
      this.removeClass('vjs-slider-active');
 
    });
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  VolumeMenuButton.prototype.buildCSSClass = function buildCSSClass() {
 
    var orientationClass = '';
 
    if (!!this.options_.vertical) {
 
      orientationClass = 'vjs-volume-menu-button-vertical';
 
    } else {
 
      orientationClass = 'vjs-volume-menu-button-horizontal';
 
    }
 

	
 
    return 'vjs-volume-menu-button ' + _MenuButton.prototype.buildCSSClass.call(this) + ' ' + orientationClass;
 
  };
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {Menu} The volume menu button
 
   * @method createMenu
 
   */
 

	
 
  VolumeMenuButton.prototype.createMenu = function createMenu() {
 
    var menu = new _menuMenuJs2['default'](this.player_, {
 
      contentElType: 'div'
 
    });
 

	
 
    var vb = new _volumeControlVolumeBarJs2['default'](this.player_, this.options_.volumeBar);
 

	
 
    menu.addChild(vb);
 

	
 
    this.volumeBar = vb;
 
    return menu;
 
  };
 

	
 
  /**
 
   * Handle click on volume menu and calls super
 
   *
 
   * @method handleClick
 
   */
 

	
 
  VolumeMenuButton.prototype.handleClick = function handleClick() {
 
    _muteToggleJs2['default'].prototype.handleClick.call(this);
 
    _MenuButton.prototype.handleClick.call(this);
 
  };
 

	
 
  return VolumeMenuButton;
 
})(_menuMenuButtonJs2['default']);
 

	
 
VolumeMenuButton.prototype.volumeUpdate = _muteToggleJs2['default'].prototype.update;
 
VolumeMenuButton.prototype.controlText_ = 'Mute';
 

	
 
_componentJs2['default'].registerComponent('VolumeMenuButton', VolumeMenuButton);
 
exports['default'] = VolumeMenuButton;
 
module.exports = exports['default'];
 

	
 
},{"../button.js":57,"../component.js":58,"../menu/menu-button.js":95,"../menu/menu.js":97,"./mute-toggle.js":62,"./volume-control/volume-bar.js":85}],89:[function(_dereq_,module,exports){
 
/**
 
 * @file error-display.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _component = _dereq_('./component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _utilsDomJs = _dereq_('./utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
/**
 
 * Display that an error has occurred making the video unplayable
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @extends Component
 
 * @class ErrorDisplay
 
 */
 

	
 
var ErrorDisplay = (function (_Component) {
 
  _inherits(ErrorDisplay, _Component);
 

	
 
  function ErrorDisplay(player, options) {
 
    _classCallCheck(this, ErrorDisplay);
 

	
 
    _Component.call(this, player, options);
 

	
 
    this.update();
 
    this.on(player, 'error', this.update);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  ErrorDisplay.prototype.createEl = function createEl() {
 
    var el = _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-error-display'
 
    });
 

	
 
    this.contentEl_ = Dom.createEl('div');
 
    el.appendChild(this.contentEl_);
 

	
 
    return el;
 
  };
 

	
 
  /**
 
   * Update the error message in localized language
 
   *
 
   * @method update
 
   */
 

	
 
  ErrorDisplay.prototype.update = function update() {
 
    if (this.player().error()) {
 
      this.contentEl_.innerHTML = this.localize(this.player().error().message);
 
    }
 
  };
 

	
 
  return ErrorDisplay;
 
})(_component2['default']);
 

	
 
_component2['default'].registerComponent('ErrorDisplay', ErrorDisplay);
 
exports['default'] = ErrorDisplay;
 
module.exports = exports['default'];
 

	
 
},{"./component":58,"./utils/dom.js":118}],90:[function(_dereq_,module,exports){
 
/**
 
 * @file event-target.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
var _utilsEventsJs = _dereq_('./utils/events.js');
 

	
 
var Events = _interopRequireWildcard(_utilsEventsJs);
 

	
 
var EventTarget = function EventTarget() {};
 

	
 
EventTarget.prototype.allowedEvents_ = {};
 

	
 
EventTarget.prototype.on = function (type, fn) {
 
  // Remove the addEventListener alias before calling Events.on
 
  // so we don't get into an infinite type loop
 
  var ael = this.addEventListener;
 
  this.addEventListener = Function.prototype;
 
  Events.on(this, type, fn);
 
  this.addEventListener = ael;
 
};
 
EventTarget.prototype.addEventListener = EventTarget.prototype.on;
 

	
 
EventTarget.prototype.off = function (type, fn) {
 
  Events.off(this, type, fn);
 
};
 
EventTarget.prototype.removeEventListener = EventTarget.prototype.off;
 

	
 
EventTarget.prototype.one = function (type, fn) {
 
  Events.one(this, type, fn);
 
};
 

	
 
EventTarget.prototype.trigger = function (event) {
 
  var type = event.type || event;
 

	
 
  if (typeof event === 'string') {
 
    event = {
 
      type: type
 
    };
 
  }
 
  event = Events.fixEvent(event);
 

	
 
  if (this.allowedEvents_[type] && this['on' + type]) {
 
    this['on' + type](event);
 
  }
 

	
 
  Events.trigger(this, event);
 
};
 
// The standard DOM EventTarget.dispatchEvent() is aliased to trigger()
 
EventTarget.prototype.dispatchEvent = EventTarget.prototype.trigger;
 

	
 
exports['default'] = EventTarget;
 
module.exports = exports['default'];
 

	
 
},{"./utils/events.js":119}],91:[function(_dereq_,module,exports){
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _utilsLog = _dereq_('./utils/log');
 

	
 
var _utilsLog2 = _interopRequireDefault(_utilsLog);
 

	
 
/*
 
 * @file extend.js
 
 *
 
 * A combination of node inherits and babel's inherits (after transpile).
 
 * Both work the same but node adds `super_` to the subClass
 
 * and Bable adds the superClass as __proto__. Both seem useful.
 
 */
 
var _inherits = function _inherits(subClass, superClass) {
 
  if (typeof superClass !== 'function' && superClass !== null) {
 
    throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);
 
  }
 

	
 
  subClass.prototype = Object.create(superClass && superClass.prototype, {
 
    constructor: {
 
      value: subClass,
 
      enumerable: false,
 
      writable: true,
 
      configurable: true
 
    }
 
  });
 

	
 
  if (superClass) {
 
    // node
 
    subClass.super_ = superClass;
 
  }
 
};
 

	
 
/*
 
 * Function for subclassing using the same inheritance that
 
 * videojs uses internally
 
 * ```js
 
 * var Button = videojs.getComponent('Button');
 
 * ```
 
 * ```js
 
 * var MyButton = videojs.extend(Button, {
 
 *   constructor: function(player, options) {
 
 *     Button.call(this, player, options);
 
 *   },
 
 *   onClick: function() {
 
 *     // doSomething
 
 *   }
 
 * });
 
 * ```
 
 */
 
var extendFn = function extendFn(superClass) {
 
  var subClassMethods = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
 

	
 
  var subClass = function subClass() {
 
    superClass.apply(this, arguments);
 
  };
 
  var methods = {};
 

	
 
  if (typeof subClassMethods === 'object') {
 
    if (typeof subClassMethods.init === 'function') {
 
      _utilsLog2['default'].warn('Constructor logic via init() is deprecated; please use constructor() instead.');
 
      subClassMethods.constructor = subClassMethods.init;
 
    }
 
    if (subClassMethods.constructor !== Object.prototype.constructor) {
 
      subClass = subClassMethods.constructor;
 
    }
 
    methods = subClassMethods;
 
  } else if (typeof subClassMethods === 'function') {
 
    subClass = subClassMethods;
 
  }
 

	
 
  _inherits(subClass, superClass);
 

	
 
  // Extend subObj's prototype with functions and other properties from props
 
  for (var name in methods) {
 
    if (methods.hasOwnProperty(name)) {
 
      subClass.prototype[name] = methods[name];
 
    }
 
  }
 

	
 
  return subClass;
 
};
 

	
 
exports['default'] = extendFn;
 
module.exports = exports['default'];
 

	
 
},{"./utils/log":123}],92:[function(_dereq_,module,exports){
 
/**
 
 * @file fullscreen-api.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
/*
 
 * Store the browser-specific methods for the fullscreen API
 
 * @type {Object|undefined}
 
 * @private
 
 */
 
var FullscreenApi = {};
 

	
 
// browser API methods
 
// map approach from Screenful.js - https://github.com/sindresorhus/screenfull.js
 
var apiMap = [
 
// Spec: https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
 
['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror'],
 
// WebKit
 
['webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror'],
 
// Old WebKit (Safari 5.1)
 
['webkitRequestFullScreen', 'webkitCancelFullScreen', 'webkitCurrentFullScreenElement', 'webkitCancelFullScreen', 'webkitfullscreenchange', 'webkitfullscreenerror'],
 
// Mozilla
 
['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror'],
 
// Microsoft
 
['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError']];
 

	
 
var specApi = apiMap[0];
 
var browserApi = undefined;
 

	
 
// determine the supported set of functions
 
for (var i = 0; i < apiMap.length; i++) {
 
  // check for exitFullscreen function
 
  if (apiMap[i][1] in _globalDocument2['default']) {
 
    browserApi = apiMap[i];
 
    break;
 
  }
 
}
 

	
 
// map the browser API names to the spec API names
 
if (browserApi) {
 
  for (var i = 0; i < browserApi.length; i++) {
 
    FullscreenApi[specApi[i]] = browserApi[i];
 
  }
 
}
 

	
 
exports['default'] = FullscreenApi;
 
module.exports = exports['default'];
 

	
 
},{"global/document":1}],93:[function(_dereq_,module,exports){
 
/**
 
 * @file loading-spinner.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _component = _dereq_('./component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
/* Loading Spinner
 
================================================================================ */
 
/**
 
 * Loading spinner for waiting events
 
 *
 
 * @extends Component
 
 * @class LoadingSpinner
 
 */
 

	
 
var LoadingSpinner = (function (_Component) {
 
  _inherits(LoadingSpinner, _Component);
 

	
 
  function LoadingSpinner() {
 
    _classCallCheck(this, LoadingSpinner);
 

	
 
    _Component.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @method createEl
 
   */
 

	
 
  LoadingSpinner.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-loading-spinner'
 
    });
 
  };
 

	
 
  return LoadingSpinner;
 
})(_component2['default']);
 

	
 
_component2['default'].registerComponent('LoadingSpinner', LoadingSpinner);
 
exports['default'] = LoadingSpinner;
 
module.exports = exports['default'];
 

	
 
},{"./component":58}],94:[function(_dereq_,module,exports){
 
/**
 
 * @file media-error.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
/*
 
 * Custom MediaError to mimic the HTML5 MediaError
 
 *
 
 * @param {Number} code The media error code
 
 */
 
var MediaError = function MediaError(code) {
 
  if (typeof code === 'number') {
 
    this.code = code;
 
  } else if (typeof code === 'string') {
 
    // default code is zero, so this is a custom error
 
    this.message = code;
 
  } else if (typeof code === 'object') {
 
    // object
 
    _objectAssign2['default'](this, code);
 
  }
 

	
 
  if (!this.message) {
 
    this.message = MediaError.defaultMessages[this.code] || '';
 
  }
 
};
 

	
 
/*
 
 * The error code that refers two one of the defined
 
 * MediaError types
 
 *
 
 * @type {Number}
 
 */
 
MediaError.prototype.code = 0;
 

	
 
/*
 
 * An optional message to be shown with the error.
 
 * Message is not part of the HTML5 video spec
 
 * but allows for more informative custom errors.
 
 *
 
 * @type {String}
 
 */
 
MediaError.prototype.message = '';
 

	
 
/*
 
 * An optional status code that can be set by plugins
 
 * to allow even more detail about the error.
 
 * For example the HLS plugin might provide the specific
 
 * HTTP status code that was returned when the error
 
 * occurred, then allowing a custom error overlay
 
 * to display more information.
 
 *
 
 * @type {Array}
 
 */
 
MediaError.prototype.status = null;
 

	
 
MediaError.errorTypes = ['MEDIA_ERR_CUSTOM', // = 0
 
'MEDIA_ERR_ABORTED', // = 1
 
'MEDIA_ERR_NETWORK', // = 2
 
'MEDIA_ERR_DECODE', // = 3
 
'MEDIA_ERR_SRC_NOT_SUPPORTED', // = 4
 
'MEDIA_ERR_ENCRYPTED' // = 5
 
];
 

	
 
MediaError.defaultMessages = {
 
  1: 'You aborted the media playback',
 
  2: 'A network error caused the media download to fail part-way.',
 
  3: 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.',
 
  4: 'The media could not be loaded, either because the server or network failed or because the format is not supported.',
 
  5: 'The media is encrypted and we do not have the keys to decrypt it.'
 
};
 

	
 
// Add types as properties on MediaError
 
// e.g. MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
 
for (var errNum = 0; errNum < MediaError.errorTypes.length; errNum++) {
 
  MediaError[MediaError.errorTypes[errNum]] = errNum;
 
  // values should be accessible on both the class and instance
 
  MediaError.prototype[MediaError.errorTypes[errNum]] = errNum;
 
}
 

	
 
exports['default'] = MediaError;
 
module.exports = exports['default'];
 

	
 
},{"object.assign":43}],95:[function(_dereq_,module,exports){
 
/**
 
 * @file menu-button.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _buttonJs = _dereq_('../button.js');
 

	
 
var _buttonJs2 = _interopRequireDefault(_buttonJs);
 

	
 
var _componentJs = _dereq_('../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _menuJs = _dereq_('./menu.js');
 

	
 
var _menuJs2 = _interopRequireDefault(_menuJs);
 

	
 
var _utilsDomJs = _dereq_('../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFnJs = _dereq_('../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsToTitleCaseJs = _dereq_('../utils/to-title-case.js');
 

	
 
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
 

	
 
/**
 
 * A button class with a popup menu
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Button
 
 * @class MenuButton
 
 */
 

	
 
var MenuButton = (function (_Button) {
 
  _inherits(MenuButton, _Button);
 

	
 
  function MenuButton(player) {
 
    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
 

	
 
    _classCallCheck(this, MenuButton);
 

	
 
    _Button.call(this, player, options);
 

	
 
    this.update();
 

	
 
    this.on('keydown', this.handleKeyPress);
 
    this.el_.setAttribute('aria-haspopup', true);
 
    this.el_.setAttribute('role', 'button');
 
  }
 

	
 
  /**
 
   * Update menu
 
   *
 
   * @method update
 
   */
 

	
 
  MenuButton.prototype.update = function update() {
 
    var menu = this.createMenu();
 

	
 
    if (this.menu) {
 
      this.removeChild(this.menu);
 
    }
 

	
 
    this.menu = menu;
 
    this.addChild(menu);
 

	
 
    /**
 
     * Track the state of the menu button
 
     *
 
     * @type {Boolean}
 
     * @private
 
     */
 
    this.buttonPressed_ = false;
 

	
 
    if (this.items && this.items.length === 0) {
 
      this.hide();
 
    } else if (this.items && this.items.length > 1) {
 
      this.show();
 
    }
 
  };
 

	
 
  /**
 
   * Create menu
 
   *
 
   * @return {Menu} The constructed menu
 
   * @method createMenu
 
   */
 

	
 
  MenuButton.prototype.createMenu = function createMenu() {
 
    var menu = new _menuJs2['default'](this.player_);
 

	
 
    // Add a title list item to the top
 
    if (this.options_.title) {
 
      menu.contentEl().appendChild(Dom.createEl('li', {
 
        className: 'vjs-menu-title',
 
        innerHTML: _utilsToTitleCaseJs2['default'](this.options_.title),
 
        tabIndex: -1
 
      }));
 
    }
 

	
 
    this.items = this['createItems']();
 

	
 
    if (this.items) {
 
      // Add menu items to the menu
 
      for (var i = 0; i < this.items.length; i++) {
 
        menu.addItem(this.items[i]);
 
      }
 
    }
 

	
 
    return menu;
 
  };
 

	
 
  /**
 
   * Create the list of menu items. Specific to each subclass.
 
   *
 
   * @method createItems
 
   */
 

	
 
  MenuButton.prototype.createItems = function createItems() {};
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  MenuButton.prototype.createEl = function createEl() {
 
    return _Button.prototype.createEl.call(this, 'div', {
 
      className: this.buildCSSClass()
 
    });
 
  };
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 

	
 
  MenuButton.prototype.buildCSSClass = function buildCSSClass() {
 
    var menuButtonClass = 'vjs-menu-button';
 

	
 
    // If the inline option is passed, we want to use different styles altogether.
 
    if (this.options_.inline === true) {
 
      menuButtonClass += '-inline';
 
    } else {
 
      menuButtonClass += '-popup';
 
    }
 

	
 
    return 'vjs-menu-button ' + menuButtonClass + ' ' + _Button.prototype.buildCSSClass.call(this);
 
  };
 

	
 
  /**
 
   * Focus - Add keyboard functionality to element
 
   * This function is not needed anymore. Instead, the
 
   * keyboard functionality is handled by
 
   * treating the button as triggering a submenu.
 
   * When the button is pressed, the submenu
 
   * appears. Pressing the button again makes
 
   * the submenu disappear.
 
   *
 
   * @method handleFocus
 
   */
 

	
 
  MenuButton.prototype.handleFocus = function handleFocus() {};
 

	
 
  /**
 
   * Can't turn off list display that we turned
 
   * on with focus, because list would go away.
 
   *
 
   * @method handleBlur
 
   */
 

	
 
  MenuButton.prototype.handleBlur = function handleBlur() {};
 

	
 
  /**
 
   * When you click the button it adds focus, which
 
   * will show the menu indefinitely.
 
   * So we'll remove focus when the mouse leaves the button.
 
   * Focus is needed for tab navigation.
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @method handleClick
 
   */
 

	
 
  MenuButton.prototype.handleClick = function handleClick() {
 
    this.one('mouseout', Fn.bind(this, function () {
 
      this.menu.unlockShowing();
 
      this.el_.blur();
 
    }));
 
    if (this.buttonPressed_) {
 
      this.unpressButton();
 
    } else {
 
      this.pressButton();
 
    }
 
  };
 

	
 
  /**
 
   * Handle key press on menu
 
   *
 
   * @param {Object} Key press event
 
   * @method handleKeyPress
 
   */
 

	
 
  MenuButton.prototype.handleKeyPress = function handleKeyPress(event) {
 

	
 
    // Check for space bar (32) or enter (13) keys
 
    if (event.which === 32 || event.which === 13) {
 
      if (this.buttonPressed_) {
 
        this.unpressButton();
 
      } else {
 
        this.pressButton();
 
      }
 
      event.preventDefault();
 
      // Check for escape (27) key
 
    } else if (event.which === 27) {
 
        if (this.buttonPressed_) {
 
          this.unpressButton();
 
        }
 
        event.preventDefault();
 
      }
 
  };
 

	
 
  /**
 
   * Makes changes based on button pressed
 
   *
 
   * @method pressButton
 
   */
 

	
 
  MenuButton.prototype.pressButton = function pressButton() {
 
    this.buttonPressed_ = true;
 
    this.menu.lockShowing();
 
    this.el_.setAttribute('aria-pressed', true);
 
    if (this.items && this.items.length > 0) {
 
      this.items[0].el().focus(); // set the focus to the title of the submenu
 
    }
 
  };
 

	
 
  /**
 
   * Makes changes based on button unpressed
 
   *
 
   * @method unpressButton
 
   */
 

	
 
  MenuButton.prototype.unpressButton = function unpressButton() {
 
    this.buttonPressed_ = false;
 
    this.menu.unlockShowing();
 
    this.el_.setAttribute('aria-pressed', false);
 
  };
 

	
 
  return MenuButton;
 
})(_buttonJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('MenuButton', MenuButton);
 
exports['default'] = MenuButton;
 
module.exports = exports['default'];
 

	
 
},{"../button.js":57,"../component.js":58,"../utils/dom.js":118,"../utils/fn.js":120,"../utils/to-title-case.js":127,"./menu.js":97}],96:[function(_dereq_,module,exports){
 
/**
 
 * @file menu-item.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _buttonJs = _dereq_('../button.js');
 

	
 
var _buttonJs2 = _interopRequireDefault(_buttonJs);
 

	
 
var _componentJs = _dereq_('../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
/**
 
 * The component for a menu item. `<li>`
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Button
 
 * @class MenuItem
 
 */
 

	
 
var MenuItem = (function (_Button) {
 
  _inherits(MenuItem, _Button);
 

	
 
  function MenuItem(player, options) {
 
    _classCallCheck(this, MenuItem);
 

	
 
    _Button.call(this, player, options);
 
    this.selected(options['selected']);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @param {String=} type Desc
 
   * @param {Object=} props Desc
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  MenuItem.prototype.createEl = function createEl(type, props, attrs) {
 
    return _Button.prototype.createEl.call(this, 'li', _objectAssign2['default']({
 
      className: 'vjs-menu-item',
 
      innerHTML: this.localize(this.options_['label'])
 
    }, props), attrs);
 
  };
 

	
 
  /**
 
   * Handle a click on the menu item, and set it to selected
 
   *
 
   * @method handleClick
 
   */
 

	
 
  MenuItem.prototype.handleClick = function handleClick() {
 
    this.selected(true);
 
  };
 

	
 
  /**
 
   * Set this menu item as selected or not
 
   *
 
   * @param  {Boolean} selected
 
   * @method selected
 
   */
 

	
 
  MenuItem.prototype.selected = function selected(_selected) {
 
    if (_selected) {
 
      this.addClass('vjs-selected');
 
      this.el_.setAttribute('aria-selected', true);
 
    } else {
 
      this.removeClass('vjs-selected');
 
      this.el_.setAttribute('aria-selected', false);
 
    }
 
  };
 

	
 
  return MenuItem;
 
})(_buttonJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('MenuItem', MenuItem);
 
exports['default'] = MenuItem;
 
module.exports = exports['default'];
 

	
 
},{"../button.js":57,"../component.js":58,"object.assign":43}],97:[function(_dereq_,module,exports){
 
/**
 
 * @file menu.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsDomJs = _dereq_('../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFnJs = _dereq_('../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsEventsJs = _dereq_('../utils/events.js');
 

	
 
var Events = _interopRequireWildcard(_utilsEventsJs);
 

	
 
/**
 
 * The Menu component is used to build pop up menus, including subtitle and
 
 * captions selection menus.
 
 *
 
 * @extends Component
 
 * @class Menu
 
 */
 

	
 
var Menu = (function (_Component) {
 
  _inherits(Menu, _Component);
 

	
 
  function Menu() {
 
    _classCallCheck(this, Menu);
 

	
 
    _Component.apply(this, arguments);
 
  }
 

	
 
  /**
 
   * Add a menu item to the menu
 
   *
 
   * @param {Object|String} component Component or component type to add
 
   * @method addItem
 
   */
 

	
 
  Menu.prototype.addItem = function addItem(component) {
 
    this.addChild(component);
 
    component.on('click', Fn.bind(this, function () {
 
      this.unlockShowing();
 
    }));
 
  };
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  Menu.prototype.createEl = function createEl() {
 
    var contentElType = this.options_.contentElType || 'ul';
 
    this.contentEl_ = Dom.createEl(contentElType, {
 
      className: 'vjs-menu-content'
 
    });
 
    var el = _Component.prototype.createEl.call(this, 'div', {
 
      append: this.contentEl_,
 
      className: 'vjs-menu'
 
    });
 
    el.appendChild(this.contentEl_);
 

	
 
    // Prevent clicks from bubbling up. Needed for Menu Buttons,
 
    // where a click on the parent is significant
 
    Events.on(el, 'click', function (event) {
 
      event.preventDefault();
 
      event.stopImmediatePropagation();
 
    });
 

	
 
    return el;
 
  };
 

	
 
  return Menu;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('Menu', Menu);
 
exports['default'] = Menu;
 
module.exports = exports['default'];
 

	
 
},{"../component.js":58,"../utils/dom.js":118,"../utils/events.js":119,"../utils/fn.js":120}],98:[function(_dereq_,module,exports){
 
/**
 
 * @file player.js
 
 */
 
// Subclasses Component
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('./component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _utilsEventsJs = _dereq_('./utils/events.js');
 

	
 
var Events = _interopRequireWildcard(_utilsEventsJs);
 

	
 
var _utilsDomJs = _dereq_('./utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsFnJs = _dereq_('./utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsGuidJs = _dereq_('./utils/guid.js');
 

	
 
var Guid = _interopRequireWildcard(_utilsGuidJs);
 

	
 
var _utilsBrowserJs = _dereq_('./utils/browser.js');
 

	
 
var browser = _interopRequireWildcard(_utilsBrowserJs);
 

	
 
var _utilsLogJs = _dereq_('./utils/log.js');
 

	
 
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
 

	
 
var _utilsToTitleCaseJs = _dereq_('./utils/to-title-case.js');
 

	
 
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
 

	
 
var _utilsTimeRangesJs = _dereq_('./utils/time-ranges.js');
 

	
 
var _utilsBufferJs = _dereq_('./utils/buffer.js');
 

	
 
var _utilsStylesheetJs = _dereq_('./utils/stylesheet.js');
 

	
 
var stylesheet = _interopRequireWildcard(_utilsStylesheetJs);
 

	
 
var _fullscreenApiJs = _dereq_('./fullscreen-api.js');
 

	
 
var _fullscreenApiJs2 = _interopRequireDefault(_fullscreenApiJs);
 

	
 
var _mediaErrorJs = _dereq_('./media-error.js');
 

	
 
var _mediaErrorJs2 = _interopRequireDefault(_mediaErrorJs);
 

	
 
var _safeJsonParseTuple = _dereq_('safe-json-parse/tuple');
 

	
 
var _safeJsonParseTuple2 = _interopRequireDefault(_safeJsonParseTuple);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
var _utilsMergeOptionsJs = _dereq_('./utils/merge-options.js');
 

	
 
var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs);
 

	
 
var _tracksTextTrackListConverterJs = _dereq_('./tracks/text-track-list-converter.js');
 

	
 
var _tracksTextTrackListConverterJs2 = _interopRequireDefault(_tracksTextTrackListConverterJs);
 

	
 
// Include required child components (importing also registers them)
 

	
 
var _techLoaderJs = _dereq_('./tech/loader.js');
 

	
 
var _techLoaderJs2 = _interopRequireDefault(_techLoaderJs);
 

	
 
var _posterImageJs = _dereq_('./poster-image.js');
 

	
 
var _posterImageJs2 = _interopRequireDefault(_posterImageJs);
 

	
 
var _tracksTextTrackDisplayJs = _dereq_('./tracks/text-track-display.js');
 

	
 
var _tracksTextTrackDisplayJs2 = _interopRequireDefault(_tracksTextTrackDisplayJs);
 

	
 
var _loadingSpinnerJs = _dereq_('./loading-spinner.js');
 

	
 
var _loadingSpinnerJs2 = _interopRequireDefault(_loadingSpinnerJs);
 

	
 
var _bigPlayButtonJs = _dereq_('./big-play-button.js');
 

	
 
var _bigPlayButtonJs2 = _interopRequireDefault(_bigPlayButtonJs);
 

	
 
var _controlBarControlBarJs = _dereq_('./control-bar/control-bar.js');
 

	
 
var _controlBarControlBarJs2 = _interopRequireDefault(_controlBarControlBarJs);
 

	
 
var _errorDisplayJs = _dereq_('./error-display.js');
 

	
 
var _errorDisplayJs2 = _interopRequireDefault(_errorDisplayJs);
 

	
 
var _tracksTextTrackSettingsJs = _dereq_('./tracks/text-track-settings.js');
 

	
 
var _tracksTextTrackSettingsJs2 = _interopRequireDefault(_tracksTextTrackSettingsJs);
 

	
 
// Require html5 tech, at least for disposing the original video tag
 

	
 
var _techHtml5Js = _dereq_('./tech/html5.js');
 

	
 
var _techHtml5Js2 = _interopRequireDefault(_techHtml5Js);
 

	
 
/**
 
 * An instance of the `Player` class is created when any of the Video.js setup methods are used to initialize a video.
 
 * ```js
 
 * var myPlayer = videojs('example_video_1');
 
 * ```
 
 * In the following example, the `data-setup` attribute tells the Video.js library to create a player instance when the library is ready.
 
 * ```html
 
 * <video id="example_video_1" data-setup='{}' controls>
 
 *   <source src="my-source.mp4" type="video/mp4">
 
 * </video>
 
 * ```
 
 * After an instance has been created it can be accessed globally using `Video('example_video_1')`.
 
 *
 
 * @param {Element} tag        The original video tag used for configuring options
 
 * @param {Object=} options    Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends Component
 
 * @class Player
 
 */
 

	
 
var Player = (function (_Component) {
 
  _inherits(Player, _Component);
 

	
 
  /**
 
   * player's constructor function
 
   *
 
   * @constructs
 
   * @method init
 
   * @param {Element} tag        The original video tag used for configuring options
 
   * @param {Object=} options    Player options
 
   * @param {Function=} ready    Ready callback function
 
   */
 

	
 
  function Player(tag, options, ready) {
 
    var _this = this;
 

	
 
    _classCallCheck(this, Player);
 

	
 
    // Make sure tag ID exists
 
    tag.id = tag.id || 'vjs_video_' + Guid.newGUID();
 

	
 
    // Set Options
 
    // The options argument overrides options set in the video tag
 
    // which overrides globally set options.
 
    // This latter part coincides with the load order
 
    // (tag must exist before Player)
 
    options = _objectAssign2['default'](Player.getTagSettings(tag), options);
 

	
 
    // Delay the initialization of children because we need to set up
 
    // player properties first, and can't use `this` before `super()`
 
    options.initChildren = false;
 

	
 
    // Same with creating the element
 
    options.createEl = false;
 

	
 
    // we don't want the player to report touch activity on itself
 
    // see enableTouchActivity in Component
 
    options.reportTouchActivity = false;
 

	
 
    // Run base component initializing with new options
 
    _Component.call(this, null, options, ready);
 

	
 
    // if the global option object was accidentally blown away by
 
    // someone, bail early with an informative error
 
    if (!this.options_ || !this.options_.techOrder || !this.options_.techOrder.length) {
 
      throw new Error('No techOrder specified. Did you overwrite ' + 'videojs.options instead of just changing the ' + 'properties you want to override?');
 
    }
 

	
 
    this.tag = tag; // Store the original tag used to set options
 

	
 
    // Store the tag attributes used to restore html5 element
 
    this.tagAttributes = tag && Dom.getElAttributes(tag);
 

	
 
    // Update current language
 
    this.language(this.options_.language);
 

	
 
    // Update Supported Languages
 
    if (options.languages) {
 
      (function () {
 
        // Normalise player option languages to lowercase
 
        var languagesToLower = {};
 

	
 
        Object.getOwnPropertyNames(options.languages).forEach(function (name) {
 
          languagesToLower[name.toLowerCase()] = options.languages[name];
 
        });
 
        _this.languages_ = languagesToLower;
 
      })();
 
    } else {
 
      this.languages_ = Player.prototype.options_.languages;
 
    }
 

	
 
    // Cache for video property values.
 
    this.cache_ = {};
 

	
 
    // Set poster
 
    this.poster_ = options.poster || '';
 

	
 
    // Set controls
 
    this.controls_ = !!options.controls;
 

	
 
    // Original tag settings stored in options
 
    // now remove immediately so native controls don't flash.
 
    // May be turned back on by HTML5 tech if nativeControlsForTouch is true
 
    tag.controls = false;
 

	
 
    /*
 
     * Store the internal state of scrubbing
 
     *
 
     * @private
 
     * @return {Boolean} True if the user is scrubbing
 
     */
 
    this.scrubbing_ = false;
 

	
 
    this.el_ = this.createEl();
 

	
 
    // We also want to pass the original player options to each component and plugin
 
    // as well so they don't need to reach back into the player for options later.
 
    // We also need to do another copy of this.options_ so we don't end up with
 
    // an infinite loop.
 
    var playerOptionsCopy = _utilsMergeOptionsJs2['default'](this.options_);
 

	
 
    // Load plugins
 
    if (options.plugins) {
 
      (function () {
 
        var plugins = options.plugins;
 

	
 
        Object.getOwnPropertyNames(plugins).forEach(function (name) {
 
          if (typeof this[name] === 'function') {
 
            this[name](plugins[name]);
 
          } else {
 
            _utilsLogJs2['default'].error('Unable to find plugin:', name);
 
          }
 
        }, _this);
 
      })();
 
    }
 

	
 
    this.options_.playerOptions = playerOptionsCopy;
 

	
 
    this.initChildren();
 

	
 
    // Set isAudio based on whether or not an audio tag was used
 
    this.isAudio(tag.nodeName.toLowerCase() === 'audio');
 

	
 
    // Update controls className. Can't do this when the controls are initially
 
    // set because the element doesn't exist yet.
 
    if (this.controls()) {
 
      this.addClass('vjs-controls-enabled');
 
    } else {
 
      this.addClass('vjs-controls-disabled');
 
    }
 

	
 
    if (this.isAudio()) {
 
      this.addClass('vjs-audio');
 
    }
 

	
 
    if (this.flexNotSupported_()) {
 
      this.addClass('vjs-no-flex');
 
    }
 

	
 
    // TODO: Make this smarter. Toggle user state between touching/mousing
 
    // using events, since devices can have both touch and mouse events.
 
    // if (browser.TOUCH_ENABLED) {
 
    //   this.addClass('vjs-touch-enabled');
 
    // }
 

	
 
    // Make player easily findable by ID
 
    Player.players[this.id_] = this;
 

	
 
    // When the player is first initialized, trigger activity so components
 
    // like the control bar show themselves if needed
 
    this.userActive(true);
 
    this.reportUserActivity();
 
    this.listenForUserActivity_();
 

	
 
    this.on('fullscreenchange', this.handleFullscreenChange_);
 
    this.on('stageclick', this.handleStageClick_);
 
  }
 

	
 
  /*
 
   * Global player list
 
   *
 
   * @type {Object}
 
   */
 

	
 
  /**
 
   * Destroys the video player and does any necessary cleanup
 
   * ```js
 
   *     myPlayer.dispose();
 
   * ```
 
   * This is especially helpful if you are dynamically adding and removing videos
 
   * to/from the DOM.
 
   *
 
   * @method dispose
 
   */
 

	
 
  Player.prototype.dispose = function dispose() {
 
    this.trigger('dispose');
 
    // prevent dispose from being called twice
 
    this.off('dispose');
 

	
 
    if (this.styleEl_) {
 
      this.styleEl_.parentNode.removeChild(this.styleEl_);
 
    }
 

	
 
    // Kill reference to this player
 
    Player.players[this.id_] = null;
 
    if (this.tag && this.tag.player) {
 
      this.tag.player = null;
 
    }
 
    if (this.el_ && this.el_.player) {
 
      this.el_.player = null;
 
    }
 

	
 
    if (this.tech_) {
 
      this.tech_.dispose();
 
    }
 

	
 
    _Component.prototype.dispose.call(this);
 
  };
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  Player.prototype.createEl = function createEl() {
 
    var el = this.el_ = _Component.prototype.createEl.call(this, 'div');
 
    var tag = this.tag;
 

	
 
    // Remove width/height attrs from tag so CSS can make it 100% width/height
 
    tag.removeAttribute('width');
 
    tag.removeAttribute('height');
 

	
 
    // Copy over all the attributes from the tag, including ID and class
 
    // ID will now reference player box, not the video tag
 
    var attrs = Dom.getElAttributes(tag);
 

	
 
    Object.getOwnPropertyNames(attrs).forEach(function (attr) {
 
      // workaround so we don't totally break IE7
 
      // http://stackoverflow.com/questions/3653444/css-styles-not-applied-on-dynamic-elements-in-internet-explorer-7
 
      if (attr === 'class') {
 
        el.className = attrs[attr];
 
      } else {
 
        el.setAttribute(attr, attrs[attr]);
 
      }
 
    });
 

	
 
    // Update tag id/class for use as HTML5 playback tech
 
    // Might think we should do this after embedding in container so .vjs-tech class
 
    // doesn't flash 100% width/height, but class only applies with .video-js parent
 
    tag.id += '_html5_api';
 
    tag.className = 'vjs-tech';
 

	
 
    // Make player findable on elements
 
    tag.player = el.player = this;
 
    // Default state of video is paused
 
    this.addClass('vjs-paused');
 

	
 
    // Add a style element in the player that we'll use to set the width/height
 
    // of the player in a way that's still overrideable by CSS, just like the
 
    // video element
 
    this.styleEl_ = stylesheet.createStyleElement('vjs-styles-dimensions');
 
    var defaultsStyleEl = _globalDocument2['default'].querySelector('.vjs-styles-defaults');
 
    var head = _globalDocument2['default'].querySelector('head');
 
    head.insertBefore(this.styleEl_, defaultsStyleEl ? defaultsStyleEl.nextSibling : head.firstChild);
 

	
 
    // Pass in the width/height/aspectRatio options which will update the style el
 
    this.width(this.options_.width);
 
    this.height(this.options_.height);
 
    this.fluid(this.options_.fluid);
 
    this.aspectRatio(this.options_.aspectRatio);
 

	
 
    // insertElFirst seems to cause the networkState to flicker from 3 to 2, so
 
    // keep track of the original for later so we can know if the source originally failed
 
    tag.initNetworkState_ = tag.networkState;
 

	
 
    // Wrap video tag in div (el/box) container
 
    if (tag.parentNode) {
 
      tag.parentNode.insertBefore(el, tag);
 
    }
 
    Dom.insertElFirst(tag, el); // Breaks iPhone, fixed in HTML5 setup.
 

	
 
    this.el_ = el;
 

	
 
    return el;
 
  };
 

	
 
  /**
 
   * Get/set player width
 
   *
 
   * @param {Number=} value Value for width
 
   * @return {Number} Width when getting
 
   * @method width
 
   */
 

	
 
  Player.prototype.width = function width(value) {
 
    return this.dimension('width', value);
 
  };
 

	
 
  /**
 
   * Get/set player height
 
   *
 
   * @param {Number=} value Value for height
 
   * @return {Number} Height when getting
 
   * @method height
 
   */
 

	
 
  Player.prototype.height = function height(value) {
 
    return this.dimension('height', value);
 
  };
 

	
 
  /**
 
   * Get/set dimension for player
 
   *
 
   * @param {String} dimension Either width or height
 
   * @param {Number=} value Value for dimension
 
   * @return {Component}
 
   * @method dimension
 
   */
 

	
 
  Player.prototype.dimension = function dimension(_dimension, value) {
 
    var privDimension = _dimension + '_';
 

	
 
    if (value === undefined) {
 
      return this[privDimension] || 0;
 
    }
 

	
 
    if (value === '') {
 
      // If an empty string is given, reset the dimension to be automatic
 
      this[privDimension] = undefined;
 
    } else {
 
      var parsedVal = parseFloat(value);
 

	
 
      if (isNaN(parsedVal)) {
 
        _utilsLogJs2['default'].error('Improper value "' + value + '" supplied for for ' + _dimension);
 
        return this;
 
      }
 

	
 
      this[privDimension] = parsedVal;
 
    }
 

	
 
    this.updateStyleEl_();
 
    return this;
 
  };
 

	
 
  /**
 
   * Add/remove the vjs-fluid class
 
   *
 
   * @param {Boolean} bool Value of true adds the class, value of false removes the class
 
   * @method fluid
 
   */
 

	
 
  Player.prototype.fluid = function fluid(bool) {
 
    if (bool === undefined) {
 
      return !!this.fluid_;
 
    }
 

	
 
    this.fluid_ = !!bool;
 

	
 
    if (bool) {
 
      this.addClass('vjs-fluid');
 
    } else {
 
      this.removeClass('vjs-fluid');
 
    }
 
  };
 

	
 
  /**
 
   * Get/Set the aspect ratio
 
   *
 
   * @param {String=} ratio Aspect ratio for player
 
   * @return aspectRatio
 
   * @method aspectRatio
 
   */
 

	
 
  Player.prototype.aspectRatio = function aspectRatio(ratio) {
 
    if (ratio === undefined) {
 
      return this.aspectRatio_;
 
    }
 

	
 
    // Check for width:height format
 
    if (!/^\d+\:\d+$/.test(ratio)) {
 
      throw new Error('Improper value supplied for aspect ratio. The format should be width:height, for example 16:9.');
 
    }
 
    this.aspectRatio_ = ratio;
 

	
 
    // We're assuming if you set an aspect ratio you want fluid mode,
 
    // because in fixed mode you could calculate width and height yourself.
 
    this.fluid(true);
 

	
 
    this.updateStyleEl_();
 
  };
 

	
 
  /**
 
   * Update styles of the player element (height, width and aspect ratio)
 
   *
 
   * @method updateStyleEl_
 
   */
 

	
 
  Player.prototype.updateStyleEl_ = function updateStyleEl_() {
 
    var width = undefined;
 
    var height = undefined;
 
    var aspectRatio = undefined;
 

	
 
    // The aspect ratio is either used directly or to calculate width and height.
 
    if (this.aspectRatio_ !== undefined && this.aspectRatio_ !== 'auto') {
 
      // Use any aspectRatio that's been specifically set
 
      aspectRatio = this.aspectRatio_;
 
    } else if (this.videoWidth()) {
 
      // Otherwise try to get the aspect ratio from the video metadata
 
      aspectRatio = this.videoWidth() + ':' + this.videoHeight();
 
    } else {
 
      // Or use a default. The video element's is 2:1, but 16:9 is more common.
 
      aspectRatio = '16:9';
 
    }
 

	
 
    // Get the ratio as a decimal we can use to calculate dimensions
 
    var ratioParts = aspectRatio.split(':');
 
    var ratioMultiplier = ratioParts[1] / ratioParts[0];
 

	
 
    if (this.width_ !== undefined) {
 
      // Use any width that's been specifically set
 
      width = this.width_;
 
    } else if (this.height_ !== undefined) {
 
      // Or calulate the width from the aspect ratio if a height has been set
 
      width = this.height_ / ratioMultiplier;
 
    } else {
 
      // Or use the video's metadata, or use the video el's default of 300
 
      width = this.videoWidth() || 300;
 
    }
 

	
 
    if (this.height_ !== undefined) {
 
      // Use any height that's been specifically set
 
      height = this.height_;
 
    } else {
 
      // Otherwise calculate the height from the ratio and the width
 
      height = width * ratioMultiplier;
 
    }
 

	
 
    var idClass = this.id() + '-dimensions';
 

	
 
    // Ensure the right class is still on the player for the style element
 
    this.addClass(idClass);
 

	
 
    stylesheet.setTextContent(this.styleEl_, '\n      .' + idClass + ' {\n        width: ' + width + 'px;\n        height: ' + height + 'px;\n      }\n\n      .' + idClass + '.vjs-fluid {\n        padding-top: ' + ratioMultiplier * 100 + '%;\n      }\n    ');
 
  };
 

	
 
  /**
 
   * Load the Media Playback Technology (tech)
 
   * Load/Create an instance of playback technology including element and API methods
 
   * And append playback element in player div.
 
   *
 
   * @param {String} techName Name of the playback technology
 
   * @param {String} source Video source
 
   * @method loadTech_
 
   * @private
 
   */
 

	
 
  Player.prototype.loadTech_ = function loadTech_(techName, source) {
 

	
 
    // Pause and remove current playback technology
 
    if (this.tech_) {
 
      this.unloadTech_();
 
    }
 

	
 
    // get rid of the HTML5 video tag as soon as we are using another tech
 
    if (techName !== 'Html5' && this.tag) {
 
      _componentJs2['default'].getComponent('Html5').disposeMediaElement(this.tag);
 
      this.tag.player = null;
 
      this.tag = null;
 
    }
 

	
 
    this.techName_ = techName;
 

	
 
    // Turn off API access because we're loading a new tech that might load asynchronously
 
    this.isReady_ = false;
 

	
 
    // Grab tech-specific options from player options and add source and parent element to use.
 
    var techOptions = _objectAssign2['default']({
 
      'nativeControlsForTouch': this.options_.nativeControlsForTouch,
 
      'source': source,
 
      'playerId': this.id(),
 
      'techId': this.id() + '_' + techName + '_api',
 
      'textTracks': this.textTracks_,
 
      'autoplay': this.options_.autoplay,
 
      'preload': this.options_.preload,
 
      'loop': this.options_.loop,
 
      'muted': this.options_.muted,
 
      'poster': this.poster(),
 
      'language': this.language(),
 
      'vtt.js': this.options_['vtt.js']
 
    }, this.options_[techName.toLowerCase()]);
 

	
 
    if (this.tag) {
 
      techOptions.tag = this.tag;
 
    }
 

	
 
    if (source) {
 
      this.currentType_ = source.type;
 
      if (source.src === this.cache_.src && this.cache_.currentTime > 0) {
 
        techOptions.startTime = this.cache_.currentTime;
 
      }
 

	
 
      this.cache_.src = source.src;
 
    }
 

	
 
    // Initialize tech instance
 
    var techComponent = _componentJs2['default'].getComponent(techName);
 
    this.tech_ = new techComponent(techOptions);
 

	
 
    // player.triggerReady is always async, so don't need this to be async
 
    this.tech_.ready(Fn.bind(this, this.handleTechReady_), true);
 

	
 
    _tracksTextTrackListConverterJs2['default'].jsonToTextTracks(this.textTracksJson_ || [], this.tech_);
 

	
 
    // Listen to all HTML5-defined events and trigger them on the player
 
    this.on(this.tech_, 'loadstart', this.handleTechLoadStart_);
 
    this.on(this.tech_, 'waiting', this.handleTechWaiting_);
 
    this.on(this.tech_, 'canplay', this.handleTechCanPlay_);
 
    this.on(this.tech_, 'canplaythrough', this.handleTechCanPlayThrough_);
 
    this.on(this.tech_, 'playing', this.handleTechPlaying_);
 
    this.on(this.tech_, 'ended', this.handleTechEnded_);
 
    this.on(this.tech_, 'seeking', this.handleTechSeeking_);
 
    this.on(this.tech_, 'seeked', this.handleTechSeeked_);
 
    this.on(this.tech_, 'play', this.handleTechPlay_);
 
    this.on(this.tech_, 'firstplay', this.handleTechFirstPlay_);
 
    this.on(this.tech_, 'pause', this.handleTechPause_);
 
    this.on(this.tech_, 'progress', this.handleTechProgress_);
 
    this.on(this.tech_, 'durationchange', this.handleTechDurationChange_);
 
    this.on(this.tech_, 'fullscreenchange', this.handleTechFullscreenChange_);
 
    this.on(this.tech_, 'error', this.handleTechError_);
 
    this.on(this.tech_, 'suspend', this.handleTechSuspend_);
 
    this.on(this.tech_, 'abort', this.handleTechAbort_);
 
    this.on(this.tech_, 'emptied', this.handleTechEmptied_);
 
    this.on(this.tech_, 'stalled', this.handleTechStalled_);
 
    this.on(this.tech_, 'loadedmetadata', this.handleTechLoadedMetaData_);
 
    this.on(this.tech_, 'loadeddata', this.handleTechLoadedData_);
 
    this.on(this.tech_, 'timeupdate', this.handleTechTimeUpdate_);
 
    this.on(this.tech_, 'ratechange', this.handleTechRateChange_);
 
    this.on(this.tech_, 'volumechange', this.handleTechVolumeChange_);
 
    this.on(this.tech_, 'texttrackchange', this.handleTechTextTrackChange_);
 
    this.on(this.tech_, 'loadedmetadata', this.updateStyleEl_);
 
    this.on(this.tech_, 'posterchange', this.handleTechPosterChange_);
 

	
 
    this.usingNativeControls(this.techGet_('controls'));
 

	
 
    if (this.controls() && !this.usingNativeControls()) {
 
      this.addTechControlsListeners_();
 
    }
 

	
 
    // Add the tech element in the DOM if it was not already there
 
    // Make sure to not insert the original video element if using Html5
 
    if (this.tech_.el().parentNode !== this.el() && (techName !== 'Html5' || !this.tag)) {
 
      Dom.insertElFirst(this.tech_.el(), this.el());
 
    }
 

	
 
    // Get rid of the original video tag reference after the first tech is loaded
 
    if (this.tag) {
 
      this.tag.player = null;
 
      this.tag = null;
 
    }
 
  };
 

	
 
  /**
 
   * Unload playback technology
 
   *
 
   * @method unloadTech_
 
   * @private
 
   */
 

	
 
  Player.prototype.unloadTech_ = function unloadTech_() {
 
    // Save the current text tracks so that we can reuse the same text tracks with the next tech
 
    this.textTracks_ = this.textTracks();
 
    this.textTracksJson_ = _tracksTextTrackListConverterJs2['default'].textTracksToJson(this);
 

	
 
    this.isReady_ = false;
 

	
 
    this.tech_.dispose();
 

	
 
    this.tech_ = false;
 
  };
 

	
 
  /**
 
   * Set up click and touch listeners for the playback element
 
   *
 
   * On desktops, a click on the video itself will toggle playback,
 
   * on a mobile device a click on the video toggles controls.
 
   * (toggling controls is done by toggling the user state between active and
 
   * inactive)
 
   * A tap can signal that a user has become active, or has become inactive
 
   * e.g. a quick tap on an iPhone movie should reveal the controls. Another
 
   * quick tap should hide them again (signaling the user is in an inactive
 
   * viewing state)
 
   * In addition to this, we still want the user to be considered inactive after
 
   * a few seconds of inactivity.
 
   * Note: the only part of iOS interaction we can't mimic with this setup
 
   * is a touch and hold on the video element counting as activity in order to
 
   * keep the controls showing, but that shouldn't be an issue. A touch and hold
 
   * on any controls will still keep the user active
 
   *
 
   * @private
 
   * @method addTechControlsListeners_
 
   */
 

	
 
  Player.prototype.addTechControlsListeners_ = function addTechControlsListeners_() {
 
    // Make sure to remove all the previous listeners in case we are called multiple times.
 
    this.removeTechControlsListeners_();
 

	
 
    // Some browsers (Chrome & IE) don't trigger a click on a flash swf, but do
 
    // trigger mousedown/up.
 
    // http://stackoverflow.com/questions/1444562/javascript-onclick-event-over-flash-object
 
    // Any touch events are set to block the mousedown event from happening
 
    this.on(this.tech_, 'mousedown', this.handleTechClick_);
 

	
 
    // If the controls were hidden we don't want that to change without a tap event
 
    // so we'll check if the controls were already showing before reporting user
 
    // activity
 
    this.on(this.tech_, 'touchstart', this.handleTechTouchStart_);
 
    this.on(this.tech_, 'touchmove', this.handleTechTouchMove_);
 
    this.on(this.tech_, 'touchend', this.handleTechTouchEnd_);
 

	
 
    // The tap listener needs to come after the touchend listener because the tap
 
    // listener cancels out any reportedUserActivity when setting userActive(false)
 
    this.on(this.tech_, 'tap', this.handleTechTap_);
 
  };
 

	
 
  /**
 
   * Remove the listeners used for click and tap controls. This is needed for
 
   * toggling to controls disabled, where a tap/touch should do nothing.
 
   *
 
   * @method removeTechControlsListeners_
 
   * @private
 
   */
 

	
 
  Player.prototype.removeTechControlsListeners_ = function removeTechControlsListeners_() {
 
    // We don't want to just use `this.off()` because there might be other needed
 
    // listeners added by techs that extend this.
 
    this.off(this.tech_, 'tap', this.handleTechTap_);
 
    this.off(this.tech_, 'touchstart', this.handleTechTouchStart_);
 
    this.off(this.tech_, 'touchmove', this.handleTechTouchMove_);
 
    this.off(this.tech_, 'touchend', this.handleTechTouchEnd_);
 
    this.off(this.tech_, 'mousedown', this.handleTechClick_);
 
  };
 

	
 
  /**
 
   * Player waits for the tech to be ready
 
   *
 
   * @method handleTechReady_
 
   * @private
 
   */
 

	
 
  Player.prototype.handleTechReady_ = function handleTechReady_() {
 
    this.triggerReady();
 

	
 
    // Keep the same volume as before
 
    if (this.cache_.volume) {
 
      this.techCall_('setVolume', this.cache_.volume);
 
    }
 

	
 
    // Look if the tech found a higher resolution poster while loading
 
    this.handleTechPosterChange_();
 

	
 
    // Update the duration if available
 
    this.handleTechDurationChange_();
 

	
 
    // Chrome and Safari both have issues with autoplay.
 
    // In Safari (5.1.1), when we move the video element into the container div, autoplay doesn't work.
 
    // In Chrome (15), if you have autoplay + a poster + no controls, the video gets hidden (but audio plays)
 
    // This fixes both issues. Need to wait for API, so it updates displays correctly
 
    if (this.tag && this.options_.autoplay && this.paused()) {
 
      delete this.tag.poster; // Chrome Fix. Fixed in Chrome v16.
 
      this.play();
 
    }
 
  };
 

	
 
  /**
 
   * Fired when the user agent begins looking for media data
 
   *
 
   * @private
 
   * @method handleTechLoadStart_
 
   */
 

	
 
  Player.prototype.handleTechLoadStart_ = function handleTechLoadStart_() {
 
    // TODO: Update to use `emptied` event instead. See #1277.
 

	
 
    this.removeClass('vjs-ended');
 

	
 
    // reset the error state
 
    this.error(null);
 

	
 
    // If it's already playing we want to trigger a firstplay event now.
 
    // The firstplay event relies on both the play and loadstart events
 
    // which can happen in any order for a new source
 
    if (!this.paused()) {
 
      this.trigger('loadstart');
 
      this.trigger('firstplay');
 
    } else {
 
      // reset the hasStarted state
 
      this.hasStarted(false);
 
      this.trigger('loadstart');
 
    }
 
  };
 

	
 
  /**
 
   * Add/remove the vjs-has-started class
 
   *
 
   * @param {Boolean} hasStarted The value of true adds the class the value of false remove the class
 
   * @return {Boolean} Boolean value if has started
 
   * @private
 
   * @method hasStarted
 
   */
 

	
 
  Player.prototype.hasStarted = function hasStarted(_hasStarted) {
 
    if (_hasStarted !== undefined) {
 
      // only update if this is a new value
 
      if (this.hasStarted_ !== _hasStarted) {
 
        this.hasStarted_ = _hasStarted;
 
        if (_hasStarted) {
 
          this.addClass('vjs-has-started');
 
          // trigger the firstplay event if this newly has played
 
          this.trigger('firstplay');
 
        } else {
 
          this.removeClass('vjs-has-started');
 
        }
 
      }
 
      return this;
 
    }
 
    return !!this.hasStarted_;
 
  };
 

	
 
  /**
 
   * Fired whenever the media begins or resumes playback
 
   *
 
   * @private
 
   * @method handleTechPlay_
 
   */
 

	
 
  Player.prototype.handleTechPlay_ = function handleTechPlay_() {
 
    this.removeClass('vjs-ended');
 
    this.removeClass('vjs-paused');
 
    this.addClass('vjs-playing');
 

	
 
    // hide the poster when the user hits play
 
    // https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-play
 
    this.hasStarted(true);
 

	
 
    this.trigger('play');
 
  };
 

	
 
  /**
 
   * Fired whenever the media begins waiting
 
   *
 
   * @private
 
   * @method handleTechWaiting_
 
   */
 

	
 
  Player.prototype.handleTechWaiting_ = function handleTechWaiting_() {
 
    this.addClass('vjs-waiting');
 
    this.trigger('waiting');
 
  };
 

	
 
  /**
 
   * A handler for events that signal that waiting has ended
 
   * which is not consistent between browsers. See #1351
 
   *
 
   * @private
 
   * @method handleTechCanPlay_
 
   */
 

	
 
  Player.prototype.handleTechCanPlay_ = function handleTechCanPlay_() {
 
    this.removeClass('vjs-waiting');
 
    this.trigger('canplay');
 
  };
 

	
 
  /**
 
   * A handler for events that signal that waiting has ended
 
   * which is not consistent between browsers. See #1351
 
   *
 
   * @private
 
   * @method handleTechCanPlayThrough_
 
   */
 

	
 
  Player.prototype.handleTechCanPlayThrough_ = function handleTechCanPlayThrough_() {
 
    this.removeClass('vjs-waiting');
 
    this.trigger('canplaythrough');
 
  };
 

	
 
  /**
 
   * A handler for events that signal that waiting has ended
 
   * which is not consistent between browsers. See #1351
 
   *
 
   * @private
 
   * @method handleTechPlaying_
 
   */
 

	
 
  Player.prototype.handleTechPlaying_ = function handleTechPlaying_() {
 
    this.removeClass('vjs-waiting');
 
    this.trigger('playing');
 
  };
 

	
 
  /**
 
   * Fired whenever the player is jumping to a new time
 
   *
 
   * @private
 
   * @method handleTechSeeking_
 
   */
 

	
 
  Player.prototype.handleTechSeeking_ = function handleTechSeeking_() {
 
    this.addClass('vjs-seeking');
 
    this.trigger('seeking');
 
  };
 

	
 
  /**
 
   * Fired when the player has finished jumping to a new time
 
   *
 
   * @private
 
   * @method handleTechSeeked_
 
   */
 

	
 
  Player.prototype.handleTechSeeked_ = function handleTechSeeked_() {
 
    this.removeClass('vjs-seeking');
 
    this.trigger('seeked');
 
  };
 

	
 
  /**
 
   * Fired the first time a video is played
 
   * Not part of the HLS spec, and we're not sure if this is the best
 
   * implementation yet, so use sparingly. If you don't have a reason to
 
   * prevent playback, use `myPlayer.one('play');` instead.
 
   *
 
   * @private
 
   * @method handleTechFirstPlay_
 
   */
 

	
 
  Player.prototype.handleTechFirstPlay_ = function handleTechFirstPlay_() {
 
    //If the first starttime attribute is specified
 
    //then we will start at the given offset in seconds
 
    if (this.options_.starttime) {
 
      this.currentTime(this.options_.starttime);
 
    }
 

	
 
    this.addClass('vjs-has-started');
 
    this.trigger('firstplay');
 
  };
 

	
 
  /**
 
   * Fired whenever the media has been paused
 
   *
 
   * @private
 
   * @method handleTechPause_
 
   */
 

	
 
  Player.prototype.handleTechPause_ = function handleTechPause_() {
 
    this.removeClass('vjs-playing');
 
    this.addClass('vjs-paused');
 
    this.trigger('pause');
 
  };
 

	
 
  /**
 
   * Fired while the user agent is downloading media data
 
   *
 
   * @private
 
   * @method handleTechProgress_
 
   */
 

	
 
  Player.prototype.handleTechProgress_ = function handleTechProgress_() {
 
    this.trigger('progress');
 
  };
 

	
 
  /**
 
   * Fired when the end of the media resource is reached (currentTime == duration)
 
   *
 
   * @private
 
   * @method handleTechEnded_
 
   */
 

	
 
  Player.prototype.handleTechEnded_ = function handleTechEnded_() {
 
    this.addClass('vjs-ended');
 
    if (this.options_.loop) {
 
      this.currentTime(0);
 
      this.play();
 
    } else if (!this.paused()) {
 
      this.pause();
 
    }
 

	
 
    this.trigger('ended');
 
  };
 

	
 
  /**
 
   * Fired when the duration of the media resource is first known or changed
 
   *
 
   * @private
 
   * @method handleTechDurationChange_
 
   */
 

	
 
  Player.prototype.handleTechDurationChange_ = function handleTechDurationChange_() {
 
    this.duration(this.techGet_('duration'));
 
  };
 

	
 
  /**
 
   * Handle a click on the media element to play/pause
 
   *
 
   * @param {Object=} event Event object
 
   * @private
 
   * @method handleTechClick_
 
   */
 

	
 
  Player.prototype.handleTechClick_ = function handleTechClick_(event) {
 
    // We're using mousedown to detect clicks thanks to Flash, but mousedown
 
    // will also be triggered with right-clicks, so we need to prevent that
 
    if (event.button !== 0) return;
 

	
 
    // When controls are disabled a click should not toggle playback because
 
    // the click is considered a control
 
    if (this.controls()) {
 
      if (this.paused()) {
 
        this.play();
 
      } else {
 
        this.pause();
 
      }
 
    }
 
  };
 

	
 
  /**
 
   * Handle a tap on the media element. It will toggle the user
 
   * activity state, which hides and shows the controls.
 
   *
 
   * @private
 
   * @method handleTechTap_
 
   */
 

	
 
  Player.prototype.handleTechTap_ = function handleTechTap_() {
 
    this.userActive(!this.userActive());
 
  };
 

	
 
  /**
 
   * Handle touch to start
 
   *
 
   * @private
 
   * @method handleTechTouchStart_
 
   */
 

	
 
  Player.prototype.handleTechTouchStart_ = function handleTechTouchStart_() {
 
    this.userWasActive = this.userActive();
 
  };
 

	
 
  /**
 
   * Handle touch to move
 
   *
 
   * @private
 
   * @method handleTechTouchMove_
 
   */
 

	
 
  Player.prototype.handleTechTouchMove_ = function handleTechTouchMove_() {
 
    if (this.userWasActive) {
 
      this.reportUserActivity();
 
    }
 
  };
 

	
 
  /**
 
   * Handle touch to end
 
   *
 
   * @private
 
   * @method handleTechTouchEnd_
 
   */
 

	
 
  Player.prototype.handleTechTouchEnd_ = function handleTechTouchEnd_(event) {
 
    // Stop the mouse events from also happening
 
    event.preventDefault();
 
  };
 

	
 
  /**
 
   * Fired when the player switches in or out of fullscreen mode
 
   *
 
   * @private
 
   * @method handleFullscreenChange_
 
   */
 

	
 
  Player.prototype.handleFullscreenChange_ = function handleFullscreenChange_() {
 
    if (this.isFullscreen()) {
 
      this.addClass('vjs-fullscreen');
 
    } else {
 
      this.removeClass('vjs-fullscreen');
 
    }
 
  };
 

	
 
  /**
 
   * native click events on the SWF aren't triggered on IE11, Win8.1RT
 
   * use stageclick events triggered from inside the SWF instead
 
   *
 
   * @private
 
   * @method handleStageClick_
 
   */
 

	
 
  Player.prototype.handleStageClick_ = function handleStageClick_() {
 
    this.reportUserActivity();
 
  };
 

	
 
  /**
 
   * Handle Tech Fullscreen Change
 
   *
 
   * @private
 
   * @method handleTechFullscreenChange_
 
   */
 

	
 
  Player.prototype.handleTechFullscreenChange_ = function handleTechFullscreenChange_(event, data) {
 
    if (data) {
 
      this.isFullscreen(data.isFullscreen);
 
    }
 
    this.trigger('fullscreenchange');
 
  };
 

	
 
  /**
 
   * Fires when an error occurred during the loading of an audio/video
 
   *
 
   * @private
 
   * @method handleTechError_
 
   */
 

	
 
  Player.prototype.handleTechError_ = function handleTechError_() {
 
    var error = this.tech_.error();
 
    this.error(error && error.code);
 
  };
 

	
 
  /**
 
   * Fires when the browser is intentionally not getting media data
 
   *
 
   * @private
 
   * @method handleTechSuspend_
 
   */
 

	
 
  Player.prototype.handleTechSuspend_ = function handleTechSuspend_() {
 
    this.trigger('suspend');
 
  };
 

	
 
  /**
 
   * Fires when the loading of an audio/video is aborted
 
   *
 
   * @private
 
   * @method handleTechAbort_
 
   */
 

	
 
  Player.prototype.handleTechAbort_ = function handleTechAbort_() {
 
    this.trigger('abort');
 
  };
 

	
 
  /**
 
   * Fires when the current playlist is empty
 
   *
 
   * @private
 
   * @method handleTechEmptied_
 
   */
 

	
 
  Player.prototype.handleTechEmptied_ = function handleTechEmptied_() {
 
    this.trigger('emptied');
 
  };
 

	
 
  /**
 
   * Fires when the browser is trying to get media data, but data is not available
 
   *
 
   * @private
 
   * @method handleTechStalled_
 
   */
 

	
 
  Player.prototype.handleTechStalled_ = function handleTechStalled_() {
 
    this.trigger('stalled');
 
  };
 

	
 
  /**
 
   * Fires when the browser has loaded meta data for the audio/video
 
   *
 
   * @private
 
   * @method handleTechLoadedMetaData_
 
   */
 

	
 
  Player.prototype.handleTechLoadedMetaData_ = function handleTechLoadedMetaData_() {
 
    this.trigger('loadedmetadata');
 
  };
 

	
 
  /**
 
   * Fires when the browser has loaded the current frame of the audio/video
 
   *
 
   * @private
 
   * @method handleTechLoadedData_
 
   */
 

	
 
  Player.prototype.handleTechLoadedData_ = function handleTechLoadedData_() {
 
    this.trigger('loadeddata');
 
  };
 

	
 
  /**
 
   * Fires when the current playback position has changed
 
   *
 
   * @private
 
   * @method handleTechTimeUpdate_
 
   */
 

	
 
  Player.prototype.handleTechTimeUpdate_ = function handleTechTimeUpdate_() {
 
    this.trigger('timeupdate');
 
  };
 

	
 
  /**
 
   * Fires when the playing speed of the audio/video is changed
 
   *
 
   * @private
 
   * @method handleTechRateChange_
 
   */
 

	
 
  Player.prototype.handleTechRateChange_ = function handleTechRateChange_() {
 
    this.trigger('ratechange');
 
  };
 

	
 
  /**
 
   * Fires when the volume has been changed
 
   *
 
   * @private
 
   * @method handleTechVolumeChange_
 
   */
 

	
 
  Player.prototype.handleTechVolumeChange_ = function handleTechVolumeChange_() {
 
    this.trigger('volumechange');
 
  };
 

	
 
  /**
 
   * Fires when the text track has been changed
 
   *
 
   * @private
 
   * @method handleTechTextTrackChange_
 
   */
 

	
 
  Player.prototype.handleTechTextTrackChange_ = function handleTechTextTrackChange_() {
 
    this.trigger('texttrackchange');
 
  };
 

	
 
  /**
 
   * Get object for cached values.
 
   *
 
   * @return {Object}
 
   * @method getCache
 
   */
 

	
 
  Player.prototype.getCache = function getCache() {
 
    return this.cache_;
 
  };
 

	
 
  /**
 
   * Pass values to the playback tech
 
   *
 
   * @param {String=} method Method
 
   * @param {Object=} arg Argument
 
   * @private
 
   * @method techCall_
 
   */
 

	
 
  Player.prototype.techCall_ = function techCall_(method, arg) {
 
    // If it's not ready yet, call method when it is
 
    if (this.tech_ && !this.tech_.isReady_) {
 
      this.tech_.ready(function () {
 
        this[method](arg);
 
      }, true);
 

	
 
      // Otherwise call method now
 
    } else {
 
        try {
 
          this.tech_[method](arg);
 
        } catch (e) {
 
          _utilsLogJs2['default'](e);
 
          throw e;
 
        }
 
      }
 
  };
 

	
 
  /**
 
   * Get calls can't wait for the tech, and sometimes don't need to.
 
   *
 
   * @param {String} method Tech method
 
   * @return {Method}
 
   * @private
 
   * @method techGet_
 
   */
 

	
 
  Player.prototype.techGet_ = function techGet_(method) {
 
    if (this.tech_ && this.tech_.isReady_) {
 

	
 
      // Flash likes to die and reload when you hide or reposition it.
 
      // In these cases the object methods go away and we get errors.
 
      // When that happens we'll catch the errors and inform tech that it's not ready any more.
 
      try {
 
        return this.tech_[method]();
 
      } catch (e) {
 
        // When building additional tech libs, an expected method may not be defined yet
 
        if (this.tech_[method] === undefined) {
 
          _utilsLogJs2['default']('Video.js: ' + method + ' method not defined for ' + this.techName_ + ' playback technology.', e);
 
        } else {
 
          // When a method isn't available on the object it throws a TypeError
 
          if (e.name === 'TypeError') {
 
            _utilsLogJs2['default']('Video.js: ' + method + ' unavailable on ' + this.techName_ + ' playback technology element.', e);
 
            this.tech_.isReady_ = false;
 
          } else {
 
            _utilsLogJs2['default'](e);
 
          }
 
        }
 
        throw e;
 
      }
 
    }
 

	
 
    return;
 
  };
 

	
 
  /**
 
   * start media playback
 
   * ```js
 
   *     myPlayer.play();
 
   * ```
 
   *
 
   * @return {Player} self
 
   * @method play
 
   */
 

	
 
  Player.prototype.play = function play() {
 
    this.techCall_('play');
 
    return this;
 
  };
 

	
 
  /**
 
   * Pause the video playback
 
   * ```js
 
   *     myPlayer.pause();
 
   * ```
 
   *
 
   * @return {Player} self
 
   * @method pause
 
   */
 

	
 
  Player.prototype.pause = function pause() {
 
    this.techCall_('pause');
 
    return this;
 
  };
 

	
 
  /**
 
   * Check if the player is paused
 
   * ```js
 
   *     var isPaused = myPlayer.paused();
 
   *     var isPlaying = !myPlayer.paused();
 
   * ```
 
   *
 
   * @return {Boolean} false if the media is currently playing, or true otherwise
 
   * @method paused
 
   */
 

	
 
  Player.prototype.paused = function paused() {
 
    // The initial state of paused should be true (in Safari it's actually false)
 
    return this.techGet_('paused') === false ? false : true;
 
  };
 

	
 
  /**
 
   * Returns whether or not the user is "scrubbing". Scrubbing is when the user
 
   * has clicked the progress bar handle and is dragging it along the progress bar.
 
   *
 
   * @param  {Boolean} isScrubbing   True/false the user is scrubbing
 
   * @return {Boolean}               The scrubbing status when getting
 
   * @return {Object}                The player when setting
 
   * @method scrubbing
 
   */
 

	
 
  Player.prototype.scrubbing = function scrubbing(isScrubbing) {
 
    if (isScrubbing !== undefined) {
 
      this.scrubbing_ = !!isScrubbing;
 

	
 
      if (isScrubbing) {
 
        this.addClass('vjs-scrubbing');
 
      } else {
 
        this.removeClass('vjs-scrubbing');
 
      }
 

	
 
      return this;
 
    }
 

	
 
    return this.scrubbing_;
 
  };
 

	
 
  /**
 
   * Get or set the current time (in seconds)
 
   * ```js
 
   *     // get
 
   *     var whereYouAt = myPlayer.currentTime();
 
   *     // set
 
   *     myPlayer.currentTime(120); // 2 minutes into the video
 
   * ```
 
   *
 
   * @param  {Number|String=} seconds The time to seek to
 
   * @return {Number}        The time in seconds, when not setting
 
   * @return {Player}    self, when the current time is set
 
   * @method currentTime
 
   */
 

	
 
  Player.prototype.currentTime = function currentTime(seconds) {
 
    if (seconds !== undefined) {
 

	
 
      this.techCall_('setCurrentTime', seconds);
 

	
 
      return this;
 
    }
 

	
 
    // cache last currentTime and return. default to 0 seconds
 
    //
 
    // Caching the currentTime is meant to prevent a massive amount of reads on the tech's
 
    // currentTime when scrubbing, but may not provide much performance benefit afterall.
 
    // Should be tested. Also something has to read the actual current time or the cache will
 
    // never get updated.
 
    return this.cache_.currentTime = this.techGet_('currentTime') || 0;
 
  };
 

	
 
  /**
 
   * Get the length in time of the video in seconds
 
   * ```js
 
   *     var lengthOfVideo = myPlayer.duration();
 
   * ```
 
   * **NOTE**: The video must have started loading before the duration can be
 
   * known, and in the case of Flash, may not be known until the video starts
 
   * playing.
 
   *
 
   * @param {Number} seconds Duration when setting
 
   * @return {Number} The duration of the video in seconds when getting
 
   * @method duration
 
   */
 

	
 
  Player.prototype.duration = function duration(seconds) {
 
    if (seconds === undefined) {
 
      return this.cache_.duration || 0;
 
    }
 

	
 
    seconds = parseFloat(seconds) || 0;
 

	
 
    // Standardize on Inifity for signaling video is live
 
    if (seconds < 0) {
 
      seconds = Infinity;
 
    }
 

	
 
    if (seconds !== this.cache_.duration) {
 
      // Cache the last set value for optimized scrubbing (esp. Flash)
 
      this.cache_.duration = seconds;
 

	
 
      if (seconds === Infinity) {
 
        this.addClass('vjs-live');
 
      } else {
 
        this.removeClass('vjs-live');
 
      }
 

	
 
      this.trigger('durationchange');
 
    }
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Calculates how much time is left.
 
   * ```js
 
   *     var timeLeft = myPlayer.remainingTime();
 
   * ```
 
   * Not a native video element function, but useful
 
   *
 
   * @return {Number} The time remaining in seconds
 
   * @method remainingTime
 
   */
 

	
 
  Player.prototype.remainingTime = function remainingTime() {
 
    return this.duration() - this.currentTime();
 
  };
 

	
 
  // http://dev.w3.org/html5/spec/video.html#dom-media-buffered
 
  // Buffered returns a timerange object.
 
  // Kind of like an array of portions of the video that have been downloaded.
 

	
 
  /**
 
   * Get a TimeRange object with the times of the video that have been downloaded
 
   * If you just want the percent of the video that's been downloaded,
 
   * use bufferedPercent.
 
   * ```js
 
   *     // Number of different ranges of time have been buffered. Usually 1.
 
   *     numberOfRanges = bufferedTimeRange.length,
 
   *     // Time in seconds when the first range starts. Usually 0.
 
   *     firstRangeStart = bufferedTimeRange.start(0),
 
   *     // Time in seconds when the first range ends
 
   *     firstRangeEnd = bufferedTimeRange.end(0),
 
   *     // Length in seconds of the first time range
 
   *     firstRangeLength = firstRangeEnd - firstRangeStart;
 
   * ```
 
   *
 
   * @return {Object} A mock TimeRange object (following HTML spec)
 
   * @method buffered
 
   */
 

	
 
  Player.prototype.buffered = function buffered() {
 
    var buffered = this.techGet_('buffered');
 

	
 
    if (!buffered || !buffered.length) {
 
      buffered = _utilsTimeRangesJs.createTimeRange(0, 0);
 
    }
 

	
 
    return buffered;
 
  };
 

	
 
  /**
 
   * Get the percent (as a decimal) of the video that's been downloaded
 
   * ```js
 
   *     var howMuchIsDownloaded = myPlayer.bufferedPercent();
 
   * ```
 
   * 0 means none, 1 means all.
 
   * (This method isn't in the HTML5 spec, but it's very convenient)
 
   *
 
   * @return {Number} A decimal between 0 and 1 representing the percent
 
   * @method bufferedPercent
 
   */
 

	
 
  Player.prototype.bufferedPercent = function bufferedPercent() {
 
    return _utilsBufferJs.bufferedPercent(this.buffered(), this.duration());
 
  };
 

	
 
  /**
 
   * Get the ending time of the last buffered time range
 
   * This is used in the progress bar to encapsulate all time ranges.
 
   *
 
   * @return {Number} The end of the last buffered time range
 
   * @method bufferedEnd
 
   */
 

	
 
  Player.prototype.bufferedEnd = function bufferedEnd() {
 
    var buffered = this.buffered(),
 
        duration = this.duration(),
 
        end = buffered.end(buffered.length - 1);
 

	
 
    if (end > duration) {
 
      end = duration;
 
    }
 

	
 
    return end;
 
  };
 

	
 
  /**
 
   * Get or set the current volume of the media
 
   * ```js
 
   *     // get
 
   *     var howLoudIsIt = myPlayer.volume();
 
   *     // set
 
   *     myPlayer.volume(0.5); // Set volume to half
 
   * ```
 
   * 0 is off (muted), 1.0 is all the way up, 0.5 is half way.
 
   *
 
   * @param  {Number} percentAsDecimal The new volume as a decimal percent
 
   * @return {Number}              The current volume when getting
 
   * @return {Player}              self when setting
 
   * @method volume
 
   */
 

	
 
  Player.prototype.volume = function volume(percentAsDecimal) {
 
    var vol = undefined;
 

	
 
    if (percentAsDecimal !== undefined) {
 
      vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal))); // Force value to between 0 and 1
 
      this.cache_.volume = vol;
 
      this.techCall_('setVolume', vol);
 

	
 
      return this;
 
    }
 

	
 
    // Default to 1 when returning current volume.
 
    vol = parseFloat(this.techGet_('volume'));
 
    return isNaN(vol) ? 1 : vol;
 
  };
 

	
 
  /**
 
   * Get the current muted state, or turn mute on or off
 
   * ```js
 
   *     // get
 
   *     var isVolumeMuted = myPlayer.muted();
 
   *     // set
 
   *     myPlayer.muted(true); // mute the volume
 
   * ```
 
   *
 
   * @param  {Boolean=} muted True to mute, false to unmute
 
   * @return {Boolean} True if mute is on, false if not when getting
 
   * @return {Player} self when setting mute
 
   * @method muted
 
   */
 

	
 
  Player.prototype.muted = function muted(_muted) {
 
    if (_muted !== undefined) {
 
      this.techCall_('setMuted', _muted);
 
      return this;
 
    }
 
    return this.techGet_('muted') || false; // Default to false
 
  };
 

	
 
  // Check if current tech can support native fullscreen
 
  // (e.g. with built in controls like iOS, so not our flash swf)
 
  /**
 
   * Check to see if fullscreen is supported
 
   *
 
   * @return {Boolean}
 
   * @method supportsFullScreen
 
   */
 

	
 
  Player.prototype.supportsFullScreen = function supportsFullScreen() {
 
    return this.techGet_('supportsFullScreen') || false;
 
  };
 

	
 
  /**
 
   * Check if the player is in fullscreen mode
 
   * ```js
 
   *     // get
 
   *     var fullscreenOrNot = myPlayer.isFullscreen();
 
   *     // set
 
   *     myPlayer.isFullscreen(true); // tell the player it's in fullscreen
 
   * ```
 
   * NOTE: As of the latest HTML5 spec, isFullscreen is no longer an official
 
   * property and instead document.fullscreenElement is used. But isFullscreen is
 
   * still a valuable property for internal player workings.
 
   *
 
   * @param  {Boolean=} isFS Update the player's fullscreen state
 
   * @return {Boolean} true if fullscreen false if not when getting
 
   * @return {Player} self when setting
 
   * @method isFullscreen
 
   */
 

	
 
  Player.prototype.isFullscreen = function isFullscreen(isFS) {
 
    if (isFS !== undefined) {
 
      this.isFullscreen_ = !!isFS;
 
      return this;
 
    }
 
    return !!this.isFullscreen_;
 
  };
 

	
 
  /**
 
   * Increase the size of the video to full screen
 
   * ```js
 
   *     myPlayer.requestFullscreen();
 
   * ```
 
   * In some browsers, full screen is not supported natively, so it enters
 
   * "full window mode", where the video fills the browser window.
 
   * In browsers and devices that support native full screen, sometimes the
 
   * browser's default controls will be shown, and not the Video.js custom skin.
 
   * This includes most mobile devices (iOS, Android) and older versions of
 
   * Safari.
 
   *
 
   * @return {Player} self
 
   * @method requestFullscreen
 
   */
 

	
 
  Player.prototype.requestFullscreen = function requestFullscreen() {
 
    var fsApi = _fullscreenApiJs2['default'];
 

	
 
    this.isFullscreen(true);
 

	
 
    if (fsApi.requestFullscreen) {
 
      // the browser supports going fullscreen at the element level so we can
 
      // take the controls fullscreen as well as the video
 

	
 
      // Trigger fullscreenchange event after change
 
      // We have to specifically add this each time, and remove
 
      // when canceling fullscreen. Otherwise if there's multiple
 
      // players on a page, they would all be reacting to the same fullscreen
 
      // events
 
      Events.on(_globalDocument2['default'], fsApi.fullscreenchange, Fn.bind(this, function documentFullscreenChange(e) {
 
        this.isFullscreen(_globalDocument2['default'][fsApi.fullscreenElement]);
 

	
 
        // If cancelling fullscreen, remove event listener.
 
        if (this.isFullscreen() === false) {
 
          Events.off(_globalDocument2['default'], fsApi.fullscreenchange, documentFullscreenChange);
 
        }
 

	
 
        this.trigger('fullscreenchange');
 
      }));
 

	
 
      this.el_[fsApi.requestFullscreen]();
 
    } else if (this.tech_.supportsFullScreen()) {
 
      // we can't take the video.js controls fullscreen but we can go fullscreen
 
      // with native controls
 
      this.techCall_('enterFullScreen');
 
    } else {
 
      // fullscreen isn't supported so we'll just stretch the video element to
 
      // fill the viewport
 
      this.enterFullWindow();
 
      this.trigger('fullscreenchange');
 
    }
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Return the video to its normal size after having been in full screen mode
 
   * ```js
 
   *     myPlayer.exitFullscreen();
 
   * ```
 
   *
 
   * @return {Player} self
 
   * @method exitFullscreen
 
   */
 

	
 
  Player.prototype.exitFullscreen = function exitFullscreen() {
 
    var fsApi = _fullscreenApiJs2['default'];
 
    this.isFullscreen(false);
 

	
 
    // Check for browser element fullscreen support
 
    if (fsApi.requestFullscreen) {
 
      _globalDocument2['default'][fsApi.exitFullscreen]();
 
    } else if (this.tech_.supportsFullScreen()) {
 
      this.techCall_('exitFullScreen');
 
    } else {
 
      this.exitFullWindow();
 
      this.trigger('fullscreenchange');
 
    }
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * When fullscreen isn't supported we can stretch the video container to as wide as the browser will let us.
 
   *
 
   * @method enterFullWindow
 
   */
 

	
 
  Player.prototype.enterFullWindow = function enterFullWindow() {
 
    this.isFullWindow = true;
 

	
 
    // Storing original doc overflow value to return to when fullscreen is off
 
    this.docOrigOverflow = _globalDocument2['default'].documentElement.style.overflow;
 

	
 
    // Add listener for esc key to exit fullscreen
 
    Events.on(_globalDocument2['default'], 'keydown', Fn.bind(this, this.fullWindowOnEscKey));
 

	
 
    // Hide any scroll bars
 
    _globalDocument2['default'].documentElement.style.overflow = 'hidden';
 

	
 
    // Apply fullscreen styles
 
    Dom.addElClass(_globalDocument2['default'].body, 'vjs-full-window');
 

	
 
    this.trigger('enterFullWindow');
 
  };
 

	
 
  /**
 
   * Check for call to either exit full window or full screen on ESC key
 
   *
 
   * @param {String} event Event to check for key press
 
   * @method fullWindowOnEscKey
 
   */
 

	
 
  Player.prototype.fullWindowOnEscKey = function fullWindowOnEscKey(event) {
 
    if (event.keyCode === 27) {
 
      if (this.isFullscreen() === true) {
 
        this.exitFullscreen();
 
      } else {
 
        this.exitFullWindow();
 
      }
 
    }
 
  };
 

	
 
  /**
 
   * Exit full window
 
   *
 
   * @method exitFullWindow
 
   */
 

	
 
  Player.prototype.exitFullWindow = function exitFullWindow() {
 
    this.isFullWindow = false;
 
    Events.off(_globalDocument2['default'], 'keydown', this.fullWindowOnEscKey);
 

	
 
    // Unhide scroll bars.
 
    _globalDocument2['default'].documentElement.style.overflow = this.docOrigOverflow;
 

	
 
    // Remove fullscreen styles
 
    Dom.removeElClass(_globalDocument2['default'].body, 'vjs-full-window');
 

	
 
    // Resize the box, controller, and poster to original sizes
 
    // this.positionAll();
 
    this.trigger('exitFullWindow');
 
  };
 

	
 
  /**
 
   * Select source based on tech order
 
   *
 
   * @param {Array} sources The sources for a media asset
 
   * @return {Object|Boolean} Object of source and tech order, otherwise false
 
   * @method selectSource
 
   */
 

	
 
  Player.prototype.selectSource = function selectSource(sources) {
 
    // Loop through each playback technology in the options order
 
    for (var i = 0, j = this.options_.techOrder; i < j.length; i++) {
 
      var techName = _utilsToTitleCaseJs2['default'](j[i]);
 
      var tech = _componentJs2['default'].getComponent(techName);
 

	
 
      // Check if the current tech is defined before continuing
 
      if (!tech) {
 
        _utilsLogJs2['default'].error('The "' + techName + '" tech is undefined. Skipped browser support check for that tech.');
 
        continue;
 
      }
 

	
 
      // Check if the browser supports this technology
 
      if (tech.isSupported()) {
 
        // Loop through each source object
 
        for (var a = 0, b = sources; a < b.length; a++) {
 
          var source = b[a];
 

	
 
          // Check if source can be played with this technology
 
          if (tech.canPlaySource(source)) {
 
            return { source: source, tech: techName };
 
          }
 
        }
 
      }
 
    }
 

	
 
    return false;
 
  };
 

	
 
  /**
 
   * The source function updates the video source
 
   * There are three types of variables you can pass as the argument.
 
   * **URL String**: A URL to the the video file. Use this method if you are sure
 
   * the current playback technology (HTML5/Flash) can support the source you
 
   * provide. Currently only MP4 files can be used in both HTML5 and Flash.
 
   * ```js
 
   *     myPlayer.src("http://www.example.com/path/to/video.mp4");
 
   * ```
 
   * **Source Object (or element):* * A javascript object containing information
 
   * about the source file. Use this method if you want the player to determine if
 
   * it can support the file using the type information.
 
   * ```js
 
   *     myPlayer.src({ type: "video/mp4", src: "http://www.example.com/path/to/video.mp4" });
 
   * ```
 
   * **Array of Source Objects:* * To provide multiple versions of the source so
 
   * that it can be played using HTML5 across browsers you can use an array of
 
   * source objects. Video.js will detect which version is supported and load that
 
   * file.
 
   * ```js
 
   *     myPlayer.src([
 
   *       { type: "video/mp4", src: "http://www.example.com/path/to/video.mp4" },
 
   *       { type: "video/webm", src: "http://www.example.com/path/to/video.webm" },
 
   *       { type: "video/ogg", src: "http://www.example.com/path/to/video.ogv" }
 
   *     ]);
 
   * ```
 
   *
 
   * @param  {String|Object|Array=} source The source URL, object, or array of sources
 
   * @return {String} The current video source when getting
 
   * @return {String} The player when setting
 
   * @method src
 
   */
 

	
 
  Player.prototype.src = function src(source) {
 
    if (source === undefined) {
 
      return this.techGet_('src');
 
    }
 

	
 
    var currentTech = _componentJs2['default'].getComponent(this.techName_);
 

	
 
    // case: Array of source objects to choose from and pick the best to play
 
    if (Array.isArray(source)) {
 
      this.sourceList_(source);
 

	
 
      // case: URL String (http://myvideo...)
 
    } else if (typeof source === 'string') {
 
        // create a source object from the string
 
        this.src({ src: source });
 

	
 
        // case: Source object { src: '', type: '' ... }
 
      } else if (source instanceof Object) {
 
          // check if the source has a type and the loaded tech cannot play the source
 
          // if there's no type we'll just try the current tech
 
          if (source.type && !currentTech.canPlaySource(source)) {
 
            // create a source list with the current source and send through
 
            // the tech loop to check for a compatible technology
 
            this.sourceList_([source]);
 
          } else {
 
            this.cache_.src = source.src;
 
            this.currentType_ = source.type || '';
 

	
 
            // wait until the tech is ready to set the source
 
            this.ready(function () {
 

	
 
              // The setSource tech method was added with source handlers
 
              // so older techs won't support it
 
              // We need to check the direct prototype for the case where subclasses
 
              // of the tech do not support source handlers
 
              if (currentTech.prototype.hasOwnProperty('setSource')) {
 
                this.techCall_('setSource', source);
 
              } else {
 
                this.techCall_('src', source.src);
 
              }
 

	
 
              if (this.options_.preload === 'auto') {
 
                this.load();
 
              }
 

	
 
              if (this.options_.autoplay) {
 
                this.play();
 
              }
 

	
 
              // Set the source synchronously if possible (#2326)
 
            }, true);
 
          }
 
        }
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Handle an array of source objects
 
   *
 
   * @param  {Array} sources Array of source objects
 
   * @private
 
   * @method sourceList_
 
   */
 

	
 
  Player.prototype.sourceList_ = function sourceList_(sources) {
 
    var sourceTech = this.selectSource(sources);
 

	
 
    if (sourceTech) {
 
      if (sourceTech.tech === this.techName_) {
 
        // if this technology is already loaded, set the source
 
        this.src(sourceTech.source);
 
      } else {
 
        // load this technology with the chosen source
 
        this.loadTech_(sourceTech.tech, sourceTech.source);
 
      }
 
    } else {
 
      // We need to wrap this in a timeout to give folks a chance to add error event handlers
 
      this.setTimeout(function () {
 
        this.error({ code: 4, message: this.localize(this.options_.notSupportedMessage) });
 
      }, 0);
 

	
 
      // we could not find an appropriate tech, but let's still notify the delegate that this is it
 
      // this needs a better comment about why this is needed
 
      this.triggerReady();
 
    }
 
  };
 

	
 
  /**
 
   * Begin loading the src data.
 
   *
 
   * @return {Player} Returns the player
 
   * @method load
 
   */
 

	
 
  Player.prototype.load = function load() {
 
    this.techCall_('load');
 
    return this;
 
  };
 

	
 
  /**
 
   * Returns the fully qualified URL of the current source value e.g. http://mysite.com/video.mp4
 
   * Can be used in conjuction with `currentType` to assist in rebuilding the current source object.
 
   *
 
   * @return {String} The current source
 
   * @method currentSrc
 
   */
 

	
 
  Player.prototype.currentSrc = function currentSrc() {
 
    return this.techGet_('currentSrc') || this.cache_.src || '';
 
  };
 

	
 
  /**
 
   * Get the current source type e.g. video/mp4
 
   * This can allow you rebuild the current source object so that you could load the same
 
   * source and tech later
 
   *
 
   * @return {String} The source MIME type
 
   * @method currentType
 
   */
 

	
 
  Player.prototype.currentType = function currentType() {
 
    return this.currentType_ || '';
 
  };
 

	
 
  /**
 
   * Get or set the preload attribute
 
   *
 
   * @param {Boolean} value Boolean to determine if preload should be used
 
   * @return {String} The preload attribute value when getting
 
   * @return {Player} Returns the player when setting
 
   * @method preload
 
   */
 

	
 
  Player.prototype.preload = function preload(value) {
 
    if (value !== undefined) {
 
      this.techCall_('setPreload', value);
 
      this.options_.preload = value;
 
      return this;
 
    }
 
    return this.techGet_('preload');
 
  };
 

	
 
  /**
 
   * Get or set the autoplay attribute.
 
   *
 
   * @param {Boolean} value Boolean to determine if preload should be used
 
   * @return {String} The autoplay attribute value when getting
 
   * @return {Player} Returns the player when setting
 
   * @method autoplay
 
   */
 

	
 
  Player.prototype.autoplay = function autoplay(value) {
 
    if (value !== undefined) {
 
      this.techCall_('setAutoplay', value);
 
      this.options_.autoplay = value;
 
      return this;
 
    }
 
    return this.techGet_('autoplay', value);
 
  };
 

	
 
  /**
 
   * Get or set the loop attribute on the video element.
 
   *
 
   * @param {Boolean} value Boolean to determine if preload should be used
 
   * @return {String} The loop attribute value when getting
 
   * @return {Player} Returns the player when setting
 
   * @method loop
 
   */
 

	
 
  Player.prototype.loop = function loop(value) {
 
    if (value !== undefined) {
 
      this.techCall_('setLoop', value);
 
      this.options_['loop'] = value;
 
      return this;
 
    }
 
    return this.techGet_('loop');
 
  };
 

	
 
  /**
 
   * Get or set the poster image source url
 
   *
 
   * ##### EXAMPLE:
 
   * ```js
 
   *     // get
 
   *     var currentPoster = myPlayer.poster();
 
   *     // set
 
   *     myPlayer.poster('http://example.com/myImage.jpg');
 
   * ```
 
   *
 
   * @param  {String=} src Poster image source URL
 
   * @return {String} poster URL when getting
 
   * @return {Player} self when setting
 
   * @method poster
 
   */
 

	
 
  Player.prototype.poster = function poster(src) {
 
    if (src === undefined) {
 
      return this.poster_;
 
    }
 

	
 
    // The correct way to remove a poster is to set as an empty string
 
    // other falsey values will throw errors
 
    if (!src) {
 
      src = '';
 
    }
 

	
 
    // update the internal poster variable
 
    this.poster_ = src;
 

	
 
    // update the tech's poster
 
    this.techCall_('setPoster', src);
 

	
 
    // alert components that the poster has been set
 
    this.trigger('posterchange');
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Some techs (e.g. YouTube) can provide a poster source in an
 
   * asynchronous way. We want the poster component to use this
 
   * poster source so that it covers up the tech's controls.
 
   * (YouTube's play button). However we only want to use this
 
   * soruce if the player user hasn't set a poster through
 
   * the normal APIs.
 
   *
 
   * @private
 
   * @method handleTechPosterChange_
 
   */
 

	
 
  Player.prototype.handleTechPosterChange_ = function handleTechPosterChange_() {
 
    if (!this.poster_ && this.tech_ && this.tech_.poster) {
 
      this.poster_ = this.tech_.poster() || '';
 

	
 
      // Let components know the poster has changed
 
      this.trigger('posterchange');
 
    }
 
  };
 

	
 
  /**
 
   * Get or set whether or not the controls are showing.
 
   *
 
   * @param  {Boolean} bool Set controls to showing or not
 
   * @return {Boolean}    Controls are showing
 
   * @method controls
 
   */
 

	
 
  Player.prototype.controls = function controls(bool) {
 
    if (bool !== undefined) {
 
      bool = !!bool; // force boolean
 
      // Don't trigger a change event unless it actually changed
 
      if (this.controls_ !== bool) {
 
        this.controls_ = bool;
 

	
 
        if (this.usingNativeControls()) {
 
          this.techCall_('setControls', bool);
 
        }
 

	
 
        if (bool) {
 
          this.removeClass('vjs-controls-disabled');
 
          this.addClass('vjs-controls-enabled');
 
          this.trigger('controlsenabled');
 

	
 
          if (!this.usingNativeControls()) {
 
            this.addTechControlsListeners_();
 
          }
 
        } else {
 
          this.removeClass('vjs-controls-enabled');
 
          this.addClass('vjs-controls-disabled');
 
          this.trigger('controlsdisabled');
 

	
 
          if (!this.usingNativeControls()) {
 
            this.removeTechControlsListeners_();
 
          }
 
        }
 
      }
 
      return this;
 
    }
 
    return !!this.controls_;
 
  };
 

	
 
  /**
 
   * Toggle native controls on/off. Native controls are the controls built into
 
   * devices (e.g. default iPhone controls), Flash, or other techs
 
   * (e.g. Vimeo Controls)
 
   * **This should only be set by the current tech, because only the tech knows
 
   * if it can support native controls**
 
   *
 
   * @param  {Boolean} bool    True signals that native controls are on
 
   * @return {Player}      Returns the player
 
   * @private
 
   * @method usingNativeControls
 
   */
 

	
 
  Player.prototype.usingNativeControls = function usingNativeControls(bool) {
 
    if (bool !== undefined) {
 
      bool = !!bool; // force boolean
 
      // Don't trigger a change event unless it actually changed
 
      if (this.usingNativeControls_ !== bool) {
 
        this.usingNativeControls_ = bool;
 
        if (bool) {
 
          this.addClass('vjs-using-native-controls');
 

	
 
          /**
 
            * player is using the native device controls
 
           *
 
            * @event usingnativecontrols
 
            * @memberof Player
 
            * @instance
 
            * @private
 
            */
 
          this.trigger('usingnativecontrols');
 
        } else {
 
          this.removeClass('vjs-using-native-controls');
 

	
 
          /**
 
            * player is using the custom HTML controls
 
           *
 
            * @event usingcustomcontrols
 
            * @memberof Player
 
            * @instance
 
            * @private
 
            */
 
          this.trigger('usingcustomcontrols');
 
        }
 
      }
 
      return this;
 
    }
 
    return !!this.usingNativeControls_;
 
  };
 

	
 
  /**
 
   * Set or get the current MediaError
 
   *
 
   * @param  {*} err A MediaError or a String/Number to be turned into a MediaError
 
   * @return {MediaError|null}     when getting
 
   * @return {Player}              when setting
 
   * @method error
 
   */
 

	
 
  Player.prototype.error = function error(err) {
 
    if (err === undefined) {
 
      return this.error_ || null;
 
    }
 

	
 
    // restoring to default
 
    if (err === null) {
 
      this.error_ = err;
 
      this.removeClass('vjs-error');
 
      return this;
 
    }
 

	
 
    // error instance
 
    if (err instanceof _mediaErrorJs2['default']) {
 
      this.error_ = err;
 
    } else {
 
      this.error_ = new _mediaErrorJs2['default'](err);
 
    }
 

	
 
    // fire an error event on the player
 
    this.trigger('error');
 

	
 
    // add the vjs-error classname to the player
 
    this.addClass('vjs-error');
 

	
 
    // log the name of the error type and any message
 
    // ie8 just logs "[object object]" if you just log the error object
 
    _utilsLogJs2['default'].error('(CODE:' + this.error_.code + ' ' + _mediaErrorJs2['default'].errorTypes[this.error_.code] + ')', this.error_.message, this.error_);
 

	
 
    return this;
 
  };
 

	
 
  /**
 
   * Returns whether or not the player is in the "ended" state.
 
   *
 
   * @return {Boolean} True if the player is in the ended state, false if not.
 
   * @method ended
 
   */
 

	
 
  Player.prototype.ended = function ended() {
 
    return this.techGet_('ended');
 
  };
 

	
 
  /**
 
   * Returns whether or not the player is in the "seeking" state.
 
   *
 
   * @return {Boolean} True if the player is in the seeking state, false if not.
 
   * @method seeking
 
   */
 

	
 
  Player.prototype.seeking = function seeking() {
 
    return this.techGet_('seeking');
 
  };
 

	
 
  /**
 
   * Returns the TimeRanges of the media that are currently available
 
   * for seeking to.
 
   *
 
   * @return {TimeRanges} the seekable intervals of the media timeline
 
   * @method seekable
 
   */
 

	
 
  Player.prototype.seekable = function seekable() {
 
    return this.techGet_('seekable');
 
  };
 

	
 
  /**
 
   * Report user activity
 
   *
 
   * @param {Object} event Event object
 
   * @method reportUserActivity
 
   */
 

	
 
  Player.prototype.reportUserActivity = function reportUserActivity(event) {
 
    this.userActivity_ = true;
 
  };
 

	
 
  /**
 
   * Get/set if user is active
 
   *
 
   * @param {Boolean} bool Value when setting
 
   * @return {Boolean} Value if user is active user when getting
 
   * @method userActive
 
   */
 

	
 
  Player.prototype.userActive = function userActive(bool) {
 
    if (bool !== undefined) {
 
      bool = !!bool;
 
      if (bool !== this.userActive_) {
 
        this.userActive_ = bool;
 
        if (bool) {
 
          // If the user was inactive and is now active we want to reset the
 
          // inactivity timer
 
          this.userActivity_ = true;
 
          this.removeClass('vjs-user-inactive');
 
          this.addClass('vjs-user-active');
 
          this.trigger('useractive');
 
        } else {
 
          // We're switching the state to inactive manually, so erase any other
 
          // activity
 
          this.userActivity_ = false;
 

	
 
          // Chrome/Safari/IE have bugs where when you change the cursor it can
 
          // trigger a mousemove event. This causes an issue when you're hiding
 
          // the cursor when the user is inactive, and a mousemove signals user
 
          // activity. Making it impossible to go into inactive mode. Specifically
 
          // this happens in fullscreen when we really need to hide the cursor.
 
          //
 
          // When this gets resolved in ALL browsers it can be removed
 
          // https://code.google.com/p/chromium/issues/detail?id=103041
 
          if (this.tech_) {
 
            this.tech_.one('mousemove', function (e) {
 
              e.stopPropagation();
 
              e.preventDefault();
 
            });
 
          }
 

	
 
          this.removeClass('vjs-user-active');
 
          this.addClass('vjs-user-inactive');
 
          this.trigger('userinactive');
 
        }
 
      }
 
      return this;
 
    }
 
    return this.userActive_;
 
  };
 

	
 
  /**
 
   * Listen for user activity based on timeout value
 
   *
 
   * @private
 
   * @method listenForUserActivity_
 
   */
 

	
 
  Player.prototype.listenForUserActivity_ = function listenForUserActivity_() {
 
    var mouseInProgress = undefined,
 
        lastMoveX = undefined,
 
        lastMoveY = undefined;
 

	
 
    var handleActivity = Fn.bind(this, this.reportUserActivity);
 

	
 
    var handleMouseMove = function handleMouseMove(e) {
 
      // #1068 - Prevent mousemove spamming
 
      // Chrome Bug: https://code.google.com/p/chromium/issues/detail?id=366970
 
      if (e.screenX !== lastMoveX || e.screenY !== lastMoveY) {
 
        lastMoveX = e.screenX;
 
        lastMoveY = e.screenY;
 
        handleActivity();
 
      }
 
    };
 

	
 
    var handleMouseDown = function handleMouseDown() {
 
      handleActivity();
 
      // For as long as the they are touching the device or have their mouse down,
 
      // we consider them active even if they're not moving their finger or mouse.
 
      // So we want to continue to update that they are active
 
      this.clearInterval(mouseInProgress);
 
      // Setting userActivity=true now and setting the interval to the same time
 
      // as the activityCheck interval (250) should ensure we never miss the
 
      // next activityCheck
 
      mouseInProgress = this.setInterval(handleActivity, 250);
 
    };
 

	
 
    var handleMouseUp = function handleMouseUp(event) {
 
      handleActivity();
 
      // Stop the interval that maintains activity if the mouse/touch is down
 
      this.clearInterval(mouseInProgress);
 
    };
 

	
 
    // Any mouse movement will be considered user activity
 
    this.on('mousedown', handleMouseDown);
 
    this.on('mousemove', handleMouseMove);
 
    this.on('mouseup', handleMouseUp);
 

	
 
    // Listen for keyboard navigation
 
    // Shouldn't need to use inProgress interval because of key repeat
 
    this.on('keydown', handleActivity);
 
    this.on('keyup', handleActivity);
 

	
 
    // Run an interval every 250 milliseconds instead of stuffing everything into
 
    // the mousemove/touchmove function itself, to prevent performance degradation.
 
    // `this.reportUserActivity` simply sets this.userActivity_ to true, which
 
    // then gets picked up by this loop
 
    // http://ejohn.org/blog/learning-from-twitter/
 
    var inactivityTimeout = undefined;
 
    var activityCheck = this.setInterval(function () {
 
      // Check to see if mouse/touch activity has happened
 
      if (this.userActivity_) {
 
        // Reset the activity tracker
 
        this.userActivity_ = false;
 

	
 
        // If the user state was inactive, set the state to active
 
        this.userActive(true);
 

	
 
        // Clear any existing inactivity timeout to start the timer over
 
        this.clearTimeout(inactivityTimeout);
 

	
 
        var timeout = this.options_['inactivityTimeout'];
 
        if (timeout > 0) {
 
          // In <timeout> milliseconds, if no more activity has occurred the
 
          // user will be considered inactive
 
          inactivityTimeout = this.setTimeout(function () {
 
            // Protect against the case where the inactivityTimeout can trigger just
 
            // before the next user activity is picked up by the activityCheck loop
 
            // causing a flicker
 
            if (!this.userActivity_) {
 
              this.userActive(false);
 
            }
 
          }, timeout);
 
        }
 
      }
 
    }, 250);
 
  };
 

	
 
  /**
 
   * Gets or sets the current playback rate.  A playback rate of
 
   * 1.0 represents normal speed and 0.5 would indicate half-speed
 
   * playback, for instance.
 
   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-playbackrate
 
   *
 
   * @param  {Number} rate    New playback rate to set.
 
   * @return {Number}         Returns the new playback rate when setting
 
   * @return {Number}         Returns the current playback rate when getting
 
   * @method playbackRate
 
   */
 

	
 
  Player.prototype.playbackRate = function playbackRate(rate) {
 
    if (rate !== undefined) {
 
      this.techCall_('setPlaybackRate', rate);
 
      return this;
 
    }
 

	
 
    if (this.tech_ && this.tech_['featuresPlaybackRate']) {
 
      return this.techGet_('playbackRate');
 
    } else {
 
      return 1.0;
 
    }
 
  };
 

	
 
  /**
 
   * Gets or sets the audio flag
 
   *
 
   * @param  {Boolean} bool    True signals that this is an audio player.
 
   * @return {Boolean}         Returns true if player is audio, false if not when getting
 
   * @return {Player}      Returns the player if setting
 
   * @private
 
   * @method isAudio
 
   */
 

	
 
  Player.prototype.isAudio = function isAudio(bool) {
 
    if (bool !== undefined) {
 
      this.isAudio_ = !!bool;
 
      return this;
 
    }
 

	
 
    return !!this.isAudio_;
 
  };
 

	
 
  /**
 
   * Returns the current state of network activity for the element, from
 
   * the codes in the list below.
 
   * - NETWORK_EMPTY (numeric value 0)
 
   *   The element has not yet been initialised. All attributes are in
 
   *   their initial states.
 
   * - NETWORK_IDLE (numeric value 1)
 
   *   The element's resource selection algorithm is active and has
 
   *   selected a resource, but it is not actually using the network at
 
   *   this time.
 
   * - NETWORK_LOADING (numeric value 2)
 
   *   The user agent is actively trying to download data.
 
   * - NETWORK_NO_SOURCE (numeric value 3)
 
   *   The element's resource selection algorithm is active, but it has
 
   *   not yet found a resource to use.
 
   *
 
   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#network-states
 
   * @return {Number} the current network activity state
 
   * @method networkState
 
   */
 

	
 
  Player.prototype.networkState = function networkState() {
 
    return this.techGet_('networkState');
 
  };
 

	
 
  /**
 
   * Returns a value that expresses the current state of the element
 
   * with respect to rendering the current playback position, from the
 
   * codes in the list below.
 
   * - HAVE_NOTHING (numeric value 0)
 
   *   No information regarding the media resource is available.
 
   * - HAVE_METADATA (numeric value 1)
 
   *   Enough of the resource has been obtained that the duration of the
 
   *   resource is available.
 
   * - HAVE_CURRENT_DATA (numeric value 2)
 
   *   Data for the immediate current playback position is available.
 
   * - HAVE_FUTURE_DATA (numeric value 3)
 
   *   Data for the immediate current playback position is available, as
 
   *   well as enough data for the user agent to advance the current
 
   *   playback position in the direction of playback.
 
   * - HAVE_ENOUGH_DATA (numeric value 4)
 
   *   The user agent estimates that enough data is available for
 
   *   playback to proceed uninterrupted.
 
   *
 
   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-readystate
 
   * @return {Number} the current playback rendering state
 
   * @method readyState
 
   */
 

	
 
  Player.prototype.readyState = function readyState() {
 
    return this.techGet_('readyState');
 
  };
 

	
 
  /*
 
    * Text tracks are tracks of timed text events.
 
    * Captions - text displayed over the video for the hearing impaired
 
    * Subtitles - text displayed over the video for those who don't understand language in the video
 
    * Chapters - text displayed in a menu allowing the user to jump to particular points (chapters) in the video
 
    * Descriptions (not supported yet) - audio descriptions that are read back to the user by a screen reading device
 
    */
 

	
 
  /**
 
   * Get an array of associated text tracks. captions, subtitles, chapters, descriptions
 
   * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-texttracks
 
   *
 
   * @return {Array}           Array of track objects
 
   * @method textTracks
 
   */
 

	
 
  Player.prototype.textTracks = function textTracks() {
 
    // cannot use techGet_ directly because it checks to see whether the tech is ready.
 
    // Flash is unlikely to be ready in time but textTracks should still work.
 
    return this.tech_ && this.tech_['textTracks']();
 
  };
 

	
 
  /**
 
   * Get an array of remote text tracks
 
   *
 
   * @return {Array}
 
   * @method remoteTextTracks
 
   */
 

	
 
  Player.prototype.remoteTextTracks = function remoteTextTracks() {
 
    return this.tech_ && this.tech_['remoteTextTracks']();
 
  };
 

	
 
  /**
 
   * Add a text track
 
   * In addition to the W3C settings we allow adding additional info through options.
 
   * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-addtexttrack
 
   *
 
   * @param {String}  kind        Captions, subtitles, chapters, descriptions, or metadata
 
   * @param {String=} label       Optional label
 
   * @param {String=} language    Optional language
 
   * @method addTextTrack
 
   */
 

	
 
  Player.prototype.addTextTrack = function addTextTrack(kind, label, language) {
 
    return this.tech_ && this.tech_['addTextTrack'](kind, label, language);
 
  };
 

	
 
  /**
 
   * Add a remote text track
 
   *
 
   * @param {Object} options    Options for remote text track
 
   * @method addRemoteTextTrack
 
   */
 

	
 
  Player.prototype.addRemoteTextTrack = function addRemoteTextTrack(options) {
 
    return this.tech_ && this.tech_['addRemoteTextTrack'](options);
 
  };
 

	
 
  /**
 
   * Remove a remote text track
 
   *
 
   * @param {Object} track    Remote text track to remove
 
   * @method removeRemoteTextTrack
 
   */
 

	
 
  Player.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) {
 
    this.tech_ && this.tech_['removeRemoteTextTrack'](track);
 
  };
 

	
 
  /**
 
   * Get video width
 
   *
 
   * @return {Number} Video width
 
   * @method videoWidth
 
   */
 

	
 
  Player.prototype.videoWidth = function videoWidth() {
 
    return this.tech_ && this.tech_.videoWidth && this.tech_.videoWidth() || 0;
 
  };
 

	
 
  /**
 
   * Get video height
 
   *
 
   * @return {Number} Video height
 
   * @method videoHeight
 
   */
 

	
 
  Player.prototype.videoHeight = function videoHeight() {
 
    return this.tech_ && this.tech_.videoHeight && this.tech_.videoHeight() || 0;
 
  };
 

	
 
  // Methods to add support for
 
  // initialTime: function(){ return this.techCall_('initialTime'); },
 
  // startOffsetTime: function(){ return this.techCall_('startOffsetTime'); },
 
  // played: function(){ return this.techCall_('played'); },
 
  // videoTracks: function(){ return this.techCall_('videoTracks'); },
 
  // audioTracks: function(){ return this.techCall_('audioTracks'); },
 
  // defaultPlaybackRate: function(){ return this.techCall_('defaultPlaybackRate'); },
 
  // defaultMuted: function(){ return this.techCall_('defaultMuted'); }
 

	
 
  /**
 
   * The player's language code
 
   * NOTE: The language should be set in the player options if you want the
 
   * the controls to be built with a specific language. Changing the lanugage
 
   * later will not update controls text.
 
   *
 
   * @param {String} code  The locale string
 
   * @return {String}      The locale string when getting
 
   * @return {Player}      self when setting
 
   * @method language
 
   */
 

	
 
  Player.prototype.language = function language(code) {
 
    if (code === undefined) {
 
      return this.language_;
 
    }
 

	
 
    this.language_ = ('' + code).toLowerCase();
 
    return this;
 
  };
 

	
 
  /**
 
   * Get the player's language dictionary
 
   * Merge every time, because a newly added plugin might call videojs.addLanguage() at any time
 
   * Languages specified directly in the player options have precedence
 
   *
 
   * @return {Array} Array of languages
 
   * @method languages
 
   */
 

	
 
  Player.prototype.languages = function languages() {
 
    return _utilsMergeOptionsJs2['default'](Player.prototype.options_.languages, this.languages_);
 
  };
 

	
 
  /**
 
   * Converts track info to JSON
 
   *
 
   * @return {Object} JSON object of options
 
   * @method toJSON
 
   */
 

	
 
  Player.prototype.toJSON = function toJSON() {
 
    var options = _utilsMergeOptionsJs2['default'](this.options_);
 
    var tracks = options.tracks;
 

	
 
    options.tracks = [];
 

	
 
    for (var i = 0; i < tracks.length; i++) {
 
      var track = tracks[i];
 

	
 
      // deep merge tracks and null out player so no circular references
 
      track = _utilsMergeOptionsJs2['default'](track);
 
      track.player = undefined;
 
      options.tracks[i] = track;
 
    }
 

	
 
    return options;
 
  };
 

	
 
  /**
 
   * Gets tag settings
 
   *
 
   * @param {Element} tag The player tag
 
   * @return {Array} An array of sources and track objects
 
   * @static
 
   * @method getTagSettings
 
   */
 

	
 
  Player.getTagSettings = function getTagSettings(tag) {
 
    var baseOptions = {
 
      'sources': [],
 
      'tracks': []
 
    };
 

	
 
    var tagOptions = Dom.getElAttributes(tag);
 
    var dataSetup = tagOptions['data-setup'];
 

	
 
    // Check if data-setup attr exists.
 
    if (dataSetup !== null) {
 
      // Parse options JSON
 

	
 
      var _safeParseTuple = _safeJsonParseTuple2['default'](dataSetup || '{}');
 

	
 
      var err = _safeParseTuple[0];
 
      var data = _safeParseTuple[1];
 

	
 
      if (err) {
 
        _utilsLogJs2['default'].error(err);
 
      }
 
      _objectAssign2['default'](tagOptions, data);
 
    }
 

	
 
    _objectAssign2['default'](baseOptions, tagOptions);
 

	
 
    // Get tag children settings
 
    if (tag.hasChildNodes()) {
 
      var children = tag.childNodes;
 

	
 
      for (var i = 0, j = children.length; i < j; i++) {
 
        var child = children[i];
 
        // Change case needed: http://ejohn.org/blog/nodename-case-sensitivity/
 
        var childName = child.nodeName.toLowerCase();
 
        if (childName === 'source') {
 
          baseOptions.sources.push(Dom.getElAttributes(child));
 
        } else if (childName === 'track') {
 
          baseOptions.tracks.push(Dom.getElAttributes(child));
 
        }
 
      }
 
    }
 

	
 
    return baseOptions;
 
  };
 

	
 
  return Player;
 
})(_componentJs2['default']);
 

	
 
Player.players = {};
 

	
 
var navigator = _globalWindow2['default'].navigator;
 
/*
 
 * Player instance options, surfaced using options
 
 * options = Player.prototype.options_
 
 * Make changes in options, not here.
 
 *
 
 * @type {Object}
 
 * @private
 
 */
 
Player.prototype.options_ = {
 
  // Default order of fallback technology
 
  techOrder: ['html5', 'flash'],
 
  // techOrder: ['flash','html5'],
 

	
 
  html5: {},
 
  flash: {},
 

	
 
  // defaultVolume: 0.85,
 
  defaultVolume: 0.00, // The freakin seaguls are driving me crazy!
 

	
 
  // default inactivity timeout
 
  inactivityTimeout: 2000,
 

	
 
  // default playback rates
 
  playbackRates: [],
 
  // Add playback rate selection by adding rates
 
  // 'playbackRates': [0.5, 1, 1.5, 2],
 

	
 
  // Included control sets
 
  children: ['mediaLoader', 'posterImage', 'textTrackDisplay', 'loadingSpinner', 'bigPlayButton', 'controlBar', 'errorDisplay', 'textTrackSettings'],
 

	
 
  language: _globalDocument2['default'].getElementsByTagName('html')[0].getAttribute('lang') || navigator.languages && navigator.languages[0] || navigator.userLanguage || navigator.language || 'en',
 

	
 
  // locales and their language translations
 
  languages: {},
 

	
 
  // Default message to show when a video cannot be played.
 
  notSupportedMessage: 'No compatible source was found for this video.'
 
};
 

	
 
/**
 
 * Fired when the player has initial duration and dimension information
 
 *
 
 * @event loadedmetadata
 
 */
 
Player.prototype.handleLoadedMetaData_;
 

	
 
/**
 
 * Fired when the player has downloaded data at the current playback position
 
 *
 
 * @event loadeddata
 
 */
 
Player.prototype.handleLoadedData_;
 

	
 
/**
 
 * Fired when the user is active, e.g. moves the mouse over the player
 
 *
 
 * @event useractive
 
 */
 
Player.prototype.handleUserActive_;
 

	
 
/**
 
 * Fired when the user is inactive, e.g. a short delay after the last mouse move or control interaction
 
 *
 
 * @event userinactive
 
 */
 
Player.prototype.handleUserInactive_;
 

	
 
/**
 
 * Fired when the current playback position has changed *
 
 * During playback this is fired every 15-250 milliseconds, depending on the
 
 * playback technology in use.
 
 *
 
 * @event timeupdate
 
 */
 
Player.prototype.handleTimeUpdate_;
 

	
 
/**
 
 * Fired when the volume changes
 
 *
 
 * @event volumechange
 
 */
 
Player.prototype.handleVolumeChange_;
 

	
 
/**
 
 * Fired when an error occurs
 
 *
 
 * @event error
 
 */
 
Player.prototype.handleError_;
 

	
 
Player.prototype.flexNotSupported_ = function () {
 
  var elem = _globalDocument2['default'].createElement('i');
 

	
 
  // Note: We don't actually use flexBasis (or flexOrder), but it's one of the more
 
  // common flex features that we can rely on when checking for flex support.
 
  return !('flexBasis' in elem.style || 'webkitFlexBasis' in elem.style || 'mozFlexBasis' in elem.style || 'msFlexBasis' in elem.style || 'msFlexOrder' in elem.style) /* IE10-specific (2012 flex spec)  */;
 
};
 

	
 
_componentJs2['default'].registerComponent('Player', Player);
 
exports['default'] = Player;
 
module.exports = exports['default'];
 
// If empty string, make it a parsable json object.
 

	
 
},{"./big-play-button.js":56,"./component.js":58,"./control-bar/control-bar.js":59,"./error-display.js":89,"./fullscreen-api.js":92,"./loading-spinner.js":93,"./media-error.js":94,"./poster-image.js":100,"./tech/html5.js":105,"./tech/loader.js":106,"./tracks/text-track-display.js":109,"./tracks/text-track-list-converter.js":111,"./tracks/text-track-settings.js":113,"./utils/browser.js":115,"./utils/buffer.js":116,"./utils/dom.js":118,"./utils/events.js":119,"./utils/fn.js":120,"./utils/guid.js":122,"./utils/log.js":123,"./utils/merge-options.js":124,"./utils/stylesheet.js":125,"./utils/time-ranges.js":126,"./utils/to-title-case.js":127,"global/document":1,"global/window":2,"object.assign":43,"safe-json-parse/tuple":48}],99:[function(_dereq_,module,exports){
 
/**
 
 * @file plugins.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _playerJs = _dereq_('./player.js');
 

	
 
var _playerJs2 = _interopRequireDefault(_playerJs);
 

	
 
/**
 
 * The method for registering a video.js plugin
 
 *
 
 * @param  {String} name The name of the plugin
 
 * @param  {Function} init The function that is run when the player inits
 
 * @method plugin
 
 */
 
var plugin = function plugin(name, init) {
 
  _playerJs2['default'].prototype[name] = init;
 
};
 

	
 
exports['default'] = plugin;
 
module.exports = exports['default'];
 

	
 
},{"./player.js":98}],100:[function(_dereq_,module,exports){
 
/**
 
 * @file poster-image.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _buttonJs = _dereq_('./button.js');
 

	
 
var _buttonJs2 = _interopRequireDefault(_buttonJs);
 

	
 
var _componentJs = _dereq_('./component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsFnJs = _dereq_('./utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsDomJs = _dereq_('./utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsBrowserJs = _dereq_('./utils/browser.js');
 

	
 
var browser = _interopRequireWildcard(_utilsBrowserJs);
 

	
 
/**
 
 * The component that handles showing the poster image.
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Button
 
 * @class PosterImage
 
 */
 

	
 
var PosterImage = (function (_Button) {
 
  _inherits(PosterImage, _Button);
 

	
 
  function PosterImage(player, options) {
 
    _classCallCheck(this, PosterImage);
 

	
 
    _Button.call(this, player, options);
 

	
 
    this.update();
 
    player.on('posterchange', Fn.bind(this, this.update));
 
  }
 

	
 
  /**
 
   * Clean up the poster image
 
   *
 
   * @method dispose
 
   */
 

	
 
  PosterImage.prototype.dispose = function dispose() {
 
    this.player().off('posterchange', this.update);
 
    _Button.prototype.dispose.call(this);
 
  };
 

	
 
  /**
 
   * Create the poster's image element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  PosterImage.prototype.createEl = function createEl() {
 
    var el = Dom.createEl('div', {
 
      className: 'vjs-poster',
 

	
 
      // Don't want poster to be tabbable.
 
      tabIndex: -1
 
    });
 

	
 
    // To ensure the poster image resizes while maintaining its original aspect
 
    // ratio, use a div with `background-size` when available. For browsers that
 
    // do not support `background-size` (e.g. IE8), fall back on using a regular
 
    // img element.
 
    if (!browser.BACKGROUND_SIZE_SUPPORTED) {
 
      this.fallbackImg_ = Dom.createEl('img');
 
      el.appendChild(this.fallbackImg_);
 
    }
 

	
 
    return el;
 
  };
 

	
 
  /**
 
   * Event handler for updates to the player's poster source
 
   *
 
   * @method update
 
   */
 

	
 
  PosterImage.prototype.update = function update() {
 
    var url = this.player().poster();
 

	
 
    this.setSrc(url);
 

	
 
    // If there's no poster source we should display:none on this component
 
    // so it's not still clickable or right-clickable
 
    if (url) {
 
      this.show();
 
    } else {
 
      this.hide();
 
    }
 
  };
 

	
 
  /**
 
   * Set the poster source depending on the display method
 
   *
 
   * @param {String} url The URL to the poster source
 
   * @method setSrc
 
   */
 

	
 
  PosterImage.prototype.setSrc = function setSrc(url) {
 
    if (this.fallbackImg_) {
 
      this.fallbackImg_.src = url;
 
    } else {
 
      var backgroundImage = '';
 
      // Any falsey values should stay as an empty string, otherwise
 
      // this will throw an extra error
 
      if (url) {
 
        backgroundImage = 'url("' + url + '")';
 
      }
 

	
 
      this.el_.style.backgroundImage = backgroundImage;
 
    }
 
  };
 

	
 
  /**
 
   * Event handler for clicks on the poster image
 
   *
 
   * @method handleClick
 
   */
 

	
 
  PosterImage.prototype.handleClick = function handleClick() {
 
    // We don't want a click to trigger playback when controls are disabled
 
    // but CSS should be hiding the poster to prevent that from happening
 
    if (this.player_.paused()) {
 
      this.player_.play();
 
    } else {
 
      this.player_.pause();
 
    }
 
  };
 

	
 
  return PosterImage;
 
})(_buttonJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('PosterImage', PosterImage);
 
exports['default'] = PosterImage;
 
module.exports = exports['default'];
 

	
 
},{"./button.js":57,"./component.js":58,"./utils/browser.js":115,"./utils/dom.js":118,"./utils/fn.js":120}],101:[function(_dereq_,module,exports){
 
/**
 
 * @file setup.js
 
 *
 
 * Functions for automatically setting up a player
 
 * based on the data-setup attribute of the video tag
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
var _utilsEventsJs = _dereq_('./utils/events.js');
 

	
 
var Events = _interopRequireWildcard(_utilsEventsJs);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _windowLoaded = false;
 
var videojs = undefined;
 

	
 
// Automatically set up any tags that have a data-setup attribute
 
var autoSetup = function autoSetup() {
 
  // One day, when we stop supporting IE8, go back to this, but in the meantime...*hack hack hack*
 
  // var vids = Array.prototype.slice.call(document.getElementsByTagName('video'));
 
  // var audios = Array.prototype.slice.call(document.getElementsByTagName('audio'));
 
  // var mediaEls = vids.concat(audios);
 

	
 
  // Because IE8 doesn't support calling slice on a node list, we need to loop through each list of elements
 
  // to build up a new, combined list of elements.
 
  var vids = _globalDocument2['default'].getElementsByTagName('video');
 
  var audios = _globalDocument2['default'].getElementsByTagName('audio');
 
  var mediaEls = [];
 
  if (vids && vids.length > 0) {
 
    for (var i = 0, e = vids.length; i < e; i++) {
 
      mediaEls.push(vids[i]);
 
    }
 
  }
 
  if (audios && audios.length > 0) {
 
    for (var i = 0, e = audios.length; i < e; i++) {
 
      mediaEls.push(audios[i]);
 
    }
 
  }
 

	
 
  // Check if any media elements exist
 
  if (mediaEls && mediaEls.length > 0) {
 

	
 
    for (var i = 0, e = mediaEls.length; i < e; i++) {
 
      var mediaEl = mediaEls[i];
 

	
 
      // Check if element exists, has getAttribute func.
 
      // IE seems to consider typeof el.getAttribute == 'object' instead of 'function' like expected, at least when loading the player immediately.
 
      if (mediaEl && mediaEl.getAttribute) {
 

	
 
        // Make sure this player hasn't already been set up.
 
        if (mediaEl['player'] === undefined) {
 
          var options = mediaEl.getAttribute('data-setup');
 

	
 
          // Check if data-setup attr exists.
 
          // We only auto-setup if they've added the data-setup attr.
 
          if (options !== null) {
 
            // Create new video.js instance.
 
            var player = videojs(mediaEl);
 
          }
 
        }
 

	
 
        // If getAttribute isn't defined, we need to wait for the DOM.
 
      } else {
 
          autoSetupTimeout(1);
 
          break;
 
        }
 
    }
 

	
 
    // No videos were found, so keep looping unless page is finished loading.
 
  } else if (!_windowLoaded) {
 
      autoSetupTimeout(1);
 
    }
 
};
 

	
 
// Pause to let the DOM keep processing
 
var autoSetupTimeout = function autoSetupTimeout(wait, vjs) {
 
  videojs = vjs;
 
  setTimeout(autoSetup, wait);
 
};
 

	
 
if (_globalDocument2['default'].readyState === 'complete') {
 
  _windowLoaded = true;
 
} else {
 
  Events.one(_globalWindow2['default'], 'load', function () {
 
    _windowLoaded = true;
 
  });
 
}
 

	
 
var hasLoaded = function hasLoaded() {
 
  return _windowLoaded;
 
};
 

	
 
exports.autoSetup = autoSetup;
 
exports.autoSetupTimeout = autoSetupTimeout;
 
exports.hasLoaded = hasLoaded;
 

	
 
},{"./utils/events.js":119,"global/document":1,"global/window":2}],102:[function(_dereq_,module,exports){
 
/**
 
 * @file slider.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _componentJs = _dereq_('../component.js');
 

	
 
var _componentJs2 = _interopRequireDefault(_componentJs);
 

	
 
var _utilsDomJs = _dereq_('../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
/**
 
 * The base functionality for sliders like the volume bar and seek bar
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class Slider
 
 */
 

	
 
var Slider = (function (_Component) {
 
  _inherits(Slider, _Component);
 

	
 
  function Slider(player, options) {
 
    _classCallCheck(this, Slider);
 

	
 
    _Component.call(this, player, options);
 

	
 
    // Set property names to bar to match with the child Slider class is looking for
 
    this.bar = this.getChild(this.options_.barName);
 

	
 
    // Set a horizontal or vertical class on the slider depending on the slider type
 
    this.vertical(!!this.options_.vertical);
 

	
 
    this.on('mousedown', this.handleMouseDown);
 
    this.on('touchstart', this.handleMouseDown);
 
    this.on('focus', this.handleFocus);
 
    this.on('blur', this.handleBlur);
 
    this.on('click', this.handleClick);
 

	
 
    this.on(player, 'controlsvisible', this.update);
 
    this.on(player, this.playerEvent, this.update);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @param {String} type Type of element to create
 
   * @param {Object=} props List of properties in Object form
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  Slider.prototype.createEl = function createEl(type) {
 
    var props = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
 
    var attributes = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
 

	
 
    // Add the slider element class to all sub classes
 
    props.className = props.className + ' vjs-slider';
 
    props = _objectAssign2['default']({
 
      tabIndex: 0
 
    }, props);
 

	
 
    attributes = _objectAssign2['default']({
 
      'role': 'slider',
 
      'aria-valuenow': 0,
 
      'aria-valuemin': 0,
 
      'aria-valuemax': 100,
 
      tabIndex: 0
 
    }, attributes);
 

	
 
    return _Component.prototype.createEl.call(this, type, props, attributes);
 
  };
 

	
 
  /**
 
   * Handle mouse down on slider
 
   *
 
   * @param {Object} event Mouse down event object
 
   * @method handleMouseDown
 
   */
 

	
 
  Slider.prototype.handleMouseDown = function handleMouseDown(event) {
 
    event.preventDefault();
 
    Dom.blockTextSelection();
 

	
 
    this.addClass('vjs-sliding');
 
    this.trigger('slideractive');
 

	
 
    this.on(_globalDocument2['default'], 'mousemove', this.handleMouseMove);
 
    this.on(_globalDocument2['default'], 'mouseup', this.handleMouseUp);
 
    this.on(_globalDocument2['default'], 'touchmove', this.handleMouseMove);
 
    this.on(_globalDocument2['default'], 'touchend', this.handleMouseUp);
 

	
 
    this.handleMouseMove(event);
 
  };
 

	
 
  /**
 
   * To be overridden by a subclass
 
   *
 
   * @method handleMouseMove
 
   */
 

	
 
  Slider.prototype.handleMouseMove = function handleMouseMove() {};
 

	
 
  /**
 
   * Handle mouse up on Slider
 
   *
 
   * @method handleMouseUp
 
   */
 

	
 
  Slider.prototype.handleMouseUp = function handleMouseUp() {
 
    Dom.unblockTextSelection();
 

	
 
    this.removeClass('vjs-sliding');
 
    this.trigger('sliderinactive');
 

	
 
    this.off(_globalDocument2['default'], 'mousemove', this.handleMouseMove);
 
    this.off(_globalDocument2['default'], 'mouseup', this.handleMouseUp);
 
    this.off(_globalDocument2['default'], 'touchmove', this.handleMouseMove);
 
    this.off(_globalDocument2['default'], 'touchend', this.handleMouseUp);
 

	
 
    this.update();
 
  };
 

	
 
  /**
 
   * Update slider
 
   *
 
   * @method update
 
   */
 

	
 
  Slider.prototype.update = function update() {
 
    // In VolumeBar init we have a setTimeout for update that pops and update to the end of the
 
    // execution stack. The player is destroyed before then update will cause an error
 
    if (!this.el_) return;
 

	
 
    // If scrubbing, we could use a cached value to make the handle keep up with the user's mouse.
 
    // On HTML5 browsers scrubbing is really smooth, but some flash players are slow, so we might want to utilize this later.
 
    // var progress =  (this.player_.scrubbing()) ? this.player_.getCache().currentTime / this.player_.duration() : this.player_.currentTime() / this.player_.duration();
 
    var progress = this.getPercent();
 
    var bar = this.bar;
 

	
 
    // If there's no bar...
 
    if (!bar) return;
 

	
 
    // Protect against no duration and other division issues
 
    if (typeof progress !== 'number' || progress !== progress || progress < 0 || progress === Infinity) {
 
      progress = 0;
 
    }
 

	
 
    // Convert to a percentage for setting
 
    var percentage = (progress * 100).toFixed(2) + '%';
 

	
 
    // Set the new bar width or height
 
    if (this.vertical()) {
 
      bar.el().style.height = percentage;
 
    } else {
 
      bar.el().style.width = percentage;
 
    }
 
  };
 

	
 
  /**
 
   * Calculate distance for slider
 
   *
 
   * @param {Object} event Event object
 
   * @method calculateDistance
 
   */
 

	
 
  Slider.prototype.calculateDistance = function calculateDistance(event) {
 
    var position = Dom.getPointerPosition(this.el_, event);
 
    if (this.vertical()) {
 
      return position.y;
 
    }
 
    return position.x;
 
  };
 

	
 
  /**
 
   * Handle on focus for slider
 
   *
 
   * @method handleFocus
 
   */
 

	
 
  Slider.prototype.handleFocus = function handleFocus() {
 
    this.on(_globalDocument2['default'], 'keydown', this.handleKeyPress);
 
  };
 

	
 
  /**
 
   * Handle key press for slider
 
   *
 
   * @param {Object} event Event object
 
   * @method handleKeyPress
 
   */
 

	
 
  Slider.prototype.handleKeyPress = function handleKeyPress(event) {
 
    if (event.which === 37 || event.which === 40) {
 
      // Left and Down Arrows
 
      event.preventDefault();
 
      this.stepBack();
 
    } else if (event.which === 38 || event.which === 39) {
 
      // Up and Right Arrows
 
      event.preventDefault();
 
      this.stepForward();
 
    }
 
  };
 

	
 
  /**
 
   * Handle on blur for slider
 
   *
 
   * @method handleBlur
 
   */
 

	
 
  Slider.prototype.handleBlur = function handleBlur() {
 
    this.off(_globalDocument2['default'], 'keydown', this.handleKeyPress);
 
  };
 

	
 
  /**
 
   * Listener for click events on slider, used to prevent clicks
 
   *   from bubbling up to parent elements like button menus.
 
   *
 
   * @param {Object} event Event object
 
   * @method handleClick
 
   */
 

	
 
  Slider.prototype.handleClick = function handleClick(event) {
 
    event.stopImmediatePropagation();
 
    event.preventDefault();
 
  };
 

	
 
  /**
 
   * Get/set if slider is horizontal for vertical
 
   *
 
   * @param {Boolean} bool True if slider is vertical, false is horizontal
 
   * @return {Boolean} True if slider is vertical, false is horizontal
 
   * @method vertical
 
   */
 

	
 
  Slider.prototype.vertical = function vertical(bool) {
 
    if (bool === undefined) {
 
      return this.vertical_ || false;
 
    }
 

	
 
    this.vertical_ = !!bool;
 

	
 
    if (this.vertical_) {
 
      this.addClass('vjs-slider-vertical');
 
    } else {
 
      this.addClass('vjs-slider-horizontal');
 
    }
 

	
 
    return this;
 
  };
 

	
 
  return Slider;
 
})(_componentJs2['default']);
 

	
 
_componentJs2['default'].registerComponent('Slider', Slider);
 
exports['default'] = Slider;
 
module.exports = exports['default'];
 

	
 
},{"../component.js":58,"../utils/dom.js":118,"global/document":1,"object.assign":43}],103:[function(_dereq_,module,exports){
 
/**
 
 * @file flash-rtmp.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 
function FlashRtmpDecorator(Flash) {
 
  Flash.streamingFormats = {
 
    'rtmp/mp4': 'MP4',
 
    'rtmp/flv': 'FLV'
 
  };
 

	
 
  Flash.streamFromParts = function (connection, stream) {
 
    return connection + '&' + stream;
 
  };
 

	
 
  Flash.streamToParts = function (src) {
 
    var parts = {
 
      connection: '',
 
      stream: ''
 
    };
 

	
 
    if (!src) return parts;
 

	
 
    // Look for the normal URL separator we expect, '&'.
 
    // If found, we split the URL into two pieces around the
 
    // first '&'.
 
    var connEnd = src.indexOf('&');
 
    var streamBegin = undefined;
 
    if (connEnd !== -1) {
 
      streamBegin = connEnd + 1;
 
    } else {
 
      // If there's not a '&', we use the last '/' as the delimiter.
 
      connEnd = streamBegin = src.lastIndexOf('/') + 1;
 
      if (connEnd === 0) {
 
        // really, there's not a '/'?
 
        connEnd = streamBegin = src.length;
 
      }
 
    }
 
    parts.connection = src.substring(0, connEnd);
 
    parts.stream = src.substring(streamBegin, src.length);
 

	
 
    return parts;
 
  };
 

	
 
  Flash.isStreamingType = function (srcType) {
 
    return srcType in Flash.streamingFormats;
 
  };
 

	
 
  // RTMP has four variations, any string starting
 
  // with one of these protocols should be valid
 
  Flash.RTMP_RE = /^rtmp[set]?:\/\//i;
 

	
 
  Flash.isStreamingSrc = function (src) {
 
    return Flash.RTMP_RE.test(src);
 
  };
 

	
 
  /**
 
   * A source handler for RTMP urls
 
   * @type {Object}
 
   */
 
  Flash.rtmpSourceHandler = {};
 

	
 
  /**
 
   * Check Flash can handle the source natively
 
   * @param  {Object} source  The source object
 
   * @return {String}         'probably', 'maybe', or '' (empty string)
 
   */
 
  Flash.rtmpSourceHandler.canHandleSource = function (source) {
 
    if (Flash.isStreamingType(source.type) || Flash.isStreamingSrc(source.src)) {
 
      return 'maybe';
 
    }
 

	
 
    return '';
 
  };
 

	
 
  /**
 
   * Pass the source to the flash object
 
   * Adaptive source handlers will have more complicated workflows before passing
 
   * video data to the video element
 
   * @param  {Object} source    The source object
 
   * @param  {Flash} tech   The instance of the Flash tech
 
   */
 
  Flash.rtmpSourceHandler.handleSource = function (source, tech) {
 
    var srcParts = Flash.streamToParts(source.src);
 

	
 
    tech['setRtmpConnection'](srcParts.connection);
 
    tech['setRtmpStream'](srcParts.stream);
 
  };
 

	
 
  // Register the native source handler
 
  Flash.registerSourceHandler(Flash.rtmpSourceHandler);
 

	
 
  return Flash;
 
}
 

	
 
exports['default'] = FlashRtmpDecorator;
 
module.exports = exports['default'];
 

	
 
},{}],104:[function(_dereq_,module,exports){
 
/**
 
 * @file flash.js
 
 * VideoJS-SWF - Custom Flash Player with HTML5-ish API
 
 * https://github.com/zencoder/video-js-swf
 
 * Not using setupTriggers. Using global onEvent func to distribute events
 
 */
 

	
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _tech = _dereq_('./tech');
 

	
 
var _tech2 = _interopRequireDefault(_tech);
 

	
 
var _utilsDomJs = _dereq_('../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsUrlJs = _dereq_('../utils/url.js');
 

	
 
var Url = _interopRequireWildcard(_utilsUrlJs);
 

	
 
var _utilsTimeRangesJs = _dereq_('../utils/time-ranges.js');
 

	
 
var _flashRtmp = _dereq_('./flash-rtmp');
 

	
 
var _flashRtmp2 = _interopRequireDefault(_flashRtmp);
 

	
 
var _component = _dereq_('../component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
var navigator = _globalWindow2['default'].navigator;
 
/**
 
 * Flash Media Controller - Wrapper for fallback SWF API
 
 *
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready Ready callback function
 
 * @extends Tech
 
 * @class Flash
 
 */
 

	
 
var Flash = (function (_Tech) {
 
  _inherits(Flash, _Tech);
 

	
 
  function Flash(options, ready) {
 
    _classCallCheck(this, Flash);
 

	
 
    _Tech.call(this, options, ready);
 

	
 
    // Set the source when ready
 
    if (options.source) {
 
      this.ready(function () {
 
        this.setSource(options.source);
 
      }, true);
 
    }
 

	
 
    // Having issues with Flash reloading on certain page actions (hide/resize/fullscreen) in certain browsers
 
    // This allows resetting the playhead when we catch the reload
 
    if (options.startTime) {
 
      this.ready(function () {
 
        this.load();
 
        this.play();
 
        this.currentTime(options.startTime);
 
      }, true);
 
    }
 

	
 
    // Add global window functions that the swf expects
 
    // A 4.x workflow we weren't able to solve for in 5.0
 
    // because of the need to hard code these functions
 
    // into the swf for security reasons
 
    _globalWindow2['default'].videojs = _globalWindow2['default'].videojs || {};
 
    _globalWindow2['default'].videojs.Flash = _globalWindow2['default'].videojs.Flash || {};
 
    _globalWindow2['default'].videojs.Flash.onReady = Flash.onReady;
 
    _globalWindow2['default'].videojs.Flash.onEvent = Flash.onEvent;
 
    _globalWindow2['default'].videojs.Flash.onError = Flash.onError;
 

	
 
    this.on('seeked', function () {
 
      this.lastSeekTarget_ = undefined;
 
    });
 
  }
 

	
 
  // Create setters and getters for attributes
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  Flash.prototype.createEl = function createEl() {
 
    var options = this.options_;
 

	
 
    // If video.js is hosted locally you should also set the location
 
    // for the hosted swf, which should be relative to the page (not video.js)
 
    // Otherwise this adds a CDN url.
 
    // The CDN also auto-adds a swf URL for that specific version.
 
    if (!options.swf) {
 
      options.swf = '//vjs.zencdn.net/swf/5.0.0-rc1/video-js.swf';
 
    }
 

	
 
    // Generate ID for swf object
 
    var objId = options.techId;
 

	
 
    // Merge default flashvars with ones passed in to init
 
    var flashVars = _objectAssign2['default']({
 

	
 
      // SWF Callback Functions
 
      'readyFunction': 'videojs.Flash.onReady',
 
      'eventProxyFunction': 'videojs.Flash.onEvent',
 
      'errorEventProxyFunction': 'videojs.Flash.onError',
 

	
 
      // Player Settings
 
      'autoplay': options.autoplay,
 
      'preload': options.preload,
 
      'loop': options.loop,
 
      'muted': options.muted
 

	
 
    }, options.flashVars);
 

	
 
    // Merge default parames with ones passed in
 
    var params = _objectAssign2['default']({
 
      'wmode': 'opaque', // Opaque is needed to overlay controls, but can affect playback performance
 
      'bgcolor': '#000000' // Using bgcolor prevents a white flash when the object is loading
 
    }, options.params);
 

	
 
    // Merge default attributes with ones passed in
 
    var attributes = _objectAssign2['default']({
 
      'id': objId,
 
      'name': objId, // Both ID and Name needed or swf to identify itself
 
      'class': 'vjs-tech'
 
    }, options.attributes);
 

	
 
    this.el_ = Flash.embed(options.swf, flashVars, params, attributes);
 
    this.el_.tech = this;
 

	
 
    return this.el_;
 
  };
 

	
 
  /**
 
   * Play for flash tech
 
   *
 
   * @method play
 
   */
 

	
 
  Flash.prototype.play = function play() {
 
    if (this.ended()) {
 
      this.setCurrentTime(0);
 
    }
 
    this.el_.vjs_play();
 
  };
 

	
 
  /**
 
   * Pause for flash tech
 
   *
 
   * @method pause
 
   */
 

	
 
  Flash.prototype.pause = function pause() {
 
    this.el_.vjs_pause();
 
  };
 

	
 
  /**
 
   * Get/set video
 
   *
 
   * @param {Object=} src Source object
 
   * @return {Object}
 
   * @method src
 
   */
 

	
 
  Flash.prototype.src = function src(_src) {
 
    if (_src === undefined) {
 
      return this.currentSrc();
 
    }
 

	
 
    // Setting src through `src` not `setSrc` will be deprecated
 
    return this.setSrc(_src);
 
  };
 

	
 
  /**
 
   * Set video
 
   *
 
   * @param {Object=} src Source object
 
   * @deprecated
 
   * @method setSrc
 
   */
 

	
 
  Flash.prototype.setSrc = function setSrc(src) {
 
    // Make sure source URL is absolute.
 
    src = Url.getAbsoluteURL(src);
 
    this.el_.vjs_src(src);
 

	
 
    // Currently the SWF doesn't autoplay if you load a source later.
 
    // e.g. Load player w/ no source, wait 2s, set src.
 
    if (this.autoplay()) {
 
      var tech = this;
 
      this.setTimeout(function () {
 
        tech.play();
 
      }, 0);
 
    }
 
  };
 

	
 
  /**
 
   * Returns true if the tech is currently seeking.
 
   * @return {boolean} true if seeking
 
   */
 

	
 
  Flash.prototype.seeking = function seeking() {
 
    return this.lastSeekTarget_ !== undefined;
 
  };
 

	
 
  /**
 
   * Set current time
 
   *
 
   * @param {Number} time Current time of video
 
   * @method setCurrentTime
 
   */
 

	
 
  Flash.prototype.setCurrentTime = function setCurrentTime(time) {
 
    var seekable = this.seekable();
 
    if (seekable.length) {
 
      // clamp to the current seekable range
 
      time = time > seekable.start(0) ? time : seekable.start(0);
 
      time = time < seekable.end(seekable.length - 1) ? time : seekable.end(seekable.length - 1);
 

	
 
      this.lastSeekTarget_ = time;
 
      this.trigger('seeking');
 
      this.el_.vjs_setProperty('currentTime', time);
 
      _Tech.prototype.setCurrentTime.call(this);
 
    }
 
  };
 

	
 
  /**
 
   * Get current time
 
   *
 
   * @param {Number=} time Current time of video
 
   * @return {Number} Current time
 
   * @method currentTime
 
   */
 

	
 
  Flash.prototype.currentTime = function currentTime(time) {
 
    // when seeking make the reported time keep up with the requested time
 
    // by reading the time we're seeking to
 
    if (this.seeking()) {
 
      return this.lastSeekTarget_ || 0;
 
    }
 
    return this.el_.vjs_getProperty('currentTime');
 
  };
 

	
 
  /**
 
   * Get current source
 
   *
 
   * @method currentSrc
 
   */
 

	
 
  Flash.prototype.currentSrc = function currentSrc() {
 
    if (this.currentSource_) {
 
      return this.currentSource_.src;
 
    } else {
 
      return this.el_.vjs_getProperty('currentSrc');
 
    }
 
  };
 

	
 
  /**
 
   * Load media into player
 
   *
 
   * @method load
 
   */
 

	
 
  Flash.prototype.load = function load() {
 
    this.el_.vjs_load();
 
  };
 

	
 
  /**
 
   * Get poster
 
   *
 
   * @method poster
 
   */
 

	
 
  Flash.prototype.poster = function poster() {
 
    this.el_.vjs_getProperty('poster');
 
  };
 

	
 
  /**
 
   * Poster images are not handled by the Flash tech so make this a no-op
 
   *
 
   * @method setPoster
 
   */
 

	
 
  Flash.prototype.setPoster = function setPoster() {};
 

	
 
  /**
 
   * Determine if can seek in media
 
   *
 
   * @return {TimeRangeObject}
 
   * @method seekable
 
   */
 

	
 
  Flash.prototype.seekable = function seekable() {
 
    var duration = this.duration();
 
    if (duration === 0) {
 
      return _utilsTimeRangesJs.createTimeRange();
 
    }
 
    return _utilsTimeRangesJs.createTimeRange(0, duration);
 
  };
 

	
 
  /**
 
   * Get buffered time range
 
   *
 
   * @return {TimeRangeObject}
 
   * @method buffered
 
   */
 

	
 
  Flash.prototype.buffered = function buffered() {
 
    var ranges = this.el_.vjs_getProperty('buffered');
 
    if (ranges.length === 0) {
 
      return _utilsTimeRangesJs.createTimeRange();
 
    }
 
    return _utilsTimeRangesJs.createTimeRange(ranges[0][0], ranges[0][1]);
 
  };
 

	
 
  /**
 
   * Get fullscreen support -
 
   * Flash does not allow fullscreen through javascript
 
   * so always returns false
 
   *
 
   * @return {Boolean} false
 
   * @method supportsFullScreen
 
   */
 

	
 
  Flash.prototype.supportsFullScreen = function supportsFullScreen() {
 
    return false; // Flash does not allow fullscreen through javascript
 
  };
 

	
 
  /**
 
   * Request to enter fullscreen
 
   * Flash does not allow fullscreen through javascript
 
   * so always returns false
 
   *
 
   * @return {Boolean} false
 
   * @method enterFullScreen
 
   */
 

	
 
  Flash.prototype.enterFullScreen = function enterFullScreen() {
 
    return false;
 
  };
 

	
 
  return Flash;
 
})(_tech2['default']);
 

	
 
var _api = Flash.prototype;
 
var _readWrite = 'rtmpConnection,rtmpStream,preload,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted'.split(',');
 
var _readOnly = 'networkState,readyState,initialTime,duration,startOffsetTime,paused,ended,videoTracks,audioTracks,videoWidth,videoHeight'.split(',');
 

	
 
function _createSetter(attr) {
 
  var attrUpper = attr.charAt(0).toUpperCase() + attr.slice(1);
 
  _api['set' + attrUpper] = function (val) {
 
    return this.el_.vjs_setProperty(attr, val);
 
  };
 
}
 
function _createGetter(attr) {
 
  _api[attr] = function () {
 
    return this.el_.vjs_getProperty(attr);
 
  };
 
}
 

	
 
// Create getter and setters for all read/write attributes
 
for (var i = 0; i < _readWrite.length; i++) {
 
  _createGetter(_readWrite[i]);
 
  _createSetter(_readWrite[i]);
 
}
 

	
 
// Create getters for read-only attributes
 
for (var i = 0; i < _readOnly.length; i++) {
 
  _createGetter(_readOnly[i]);
 
}
 

	
 
/* Flash Support Testing -------------------------------------------------------- */
 

	
 
Flash.isSupported = function () {
 
  return Flash.version()[0] >= 10;
 
  // return swfobject.hasFlashPlayerVersion('10');
 
};
 

	
 
// Add Source Handler pattern functions to this tech
 
_tech2['default'].withSourceHandlers(Flash);
 

	
 
/*
 
 * The default native source handler.
 
 * This simply passes the source to the video element. Nothing fancy.
 
 *
 
 * @param  {Object} source   The source object
 
 * @param  {Flash} tech  The instance of the Flash tech
 
 */
 
Flash.nativeSourceHandler = {};
 

	
 
/*
 
 * Check Flash can handle the source natively
 
 *
 
 * @param  {Object} source  The source object
 
 * @return {String}         'probably', 'maybe', or '' (empty string)
 
 */
 
Flash.nativeSourceHandler.canHandleSource = function (source) {
 
  var type;
 

	
 
  function guessMimeType(src) {
 
    var ext = Url.getFileExtension(src);
 
    if (ext) {
 
      return 'video/' + ext;
 
    }
 
    return '';
 
  }
 

	
 
  if (!source.type) {
 
    type = guessMimeType(source.src);
 
  } else {
 
    // Strip code information from the type because we don't get that specific
 
    type = source.type.replace(/;.*/, '').toLowerCase();
 
  }
 

	
 
  if (type in Flash.formats) {
 
    return 'maybe';
 
  }
 

	
 
  return '';
 
};
 

	
 
/*
 
 * Pass the source to the flash object
 
 * Adaptive source handlers will have more complicated workflows before passing
 
 * video data to the video element
 
 *
 
 * @param  {Object} source    The source object
 
 * @param  {Flash} tech   The instance of the Flash tech
 
 */
 
Flash.nativeSourceHandler.handleSource = function (source, tech) {
 
  tech.setSrc(source.src);
 
};
 

	
 
/*
 
 * Clean up the source handler when disposing the player or switching sources..
 
 * (no cleanup is needed when supporting the format natively)
 
 */
 
Flash.nativeSourceHandler.dispose = function () {};
 

	
 
// Register the native source handler
 
Flash.registerSourceHandler(Flash.nativeSourceHandler);
 

	
 
Flash.formats = {
 
  'video/flv': 'FLV',
 
  'video/x-flv': 'FLV',
 
  'video/mp4': 'MP4',
 
  'video/m4v': 'MP4'
 
};
 

	
 
Flash.onReady = function (currSwf) {
 
  var el = Dom.getEl(currSwf);
 
  var tech = el && el.tech;
 

	
 
  // if there is no el then the tech has been disposed
 
  // and the tech element was removed from the player div
 
  if (tech && tech.el()) {
 
    // check that the flash object is really ready
 
    Flash.checkReady(tech);
 
  }
 
};
 

	
 
// The SWF isn't always ready when it says it is. Sometimes the API functions still need to be added to the object.
 
// If it's not ready, we set a timeout to check again shortly.
 
Flash.checkReady = function (tech) {
 
  // stop worrying if the tech has been disposed
 
  if (!tech.el()) {
 
    return;
 
  }
 

	
 
  // check if API property exists
 
  if (tech.el().vjs_getProperty) {
 
    // tell tech it's ready
 
    tech.triggerReady();
 
  } else {
 
    // wait longer
 
    this.setTimeout(function () {
 
      Flash['checkReady'](tech);
 
    }, 50);
 
  }
 
};
 

	
 
// Trigger events from the swf on the player
 
Flash.onEvent = function (swfID, eventName) {
 
  var tech = Dom.getEl(swfID).tech;
 
  tech.trigger(eventName);
 
};
 

	
 
// Log errors from the swf
 
Flash.onError = function (swfID, err) {
 
  var tech = Dom.getEl(swfID).tech;
 

	
 
  // trigger MEDIA_ERR_SRC_NOT_SUPPORTED
 
  if (err === 'srcnotfound') {
 
    return tech.error(4);
 
  }
 

	
 
  // trigger a custom error
 
  tech.error('FLASH: ' + err);
 
};
 

	
 
// Flash Version Check
 
Flash.version = function () {
 
  var version = '0,0,0';
 

	
 
  // IE
 
  try {
 
    version = new _globalWindow2['default'].ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
 

	
 
    // other browsers
 
  } catch (e) {
 
    try {
 
      if (navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin) {
 
        version = (navigator.plugins['Shockwave Flash 2.0'] || navigator.plugins['Shockwave Flash']).description.replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
 
      }
 
    } catch (err) {}
 
  }
 
  return version.split(',');
 
};
 

	
 
// Flash embedding method. Only used in non-iframe mode
 
Flash.embed = function (swf, flashVars, params, attributes) {
 
  var code = Flash.getEmbedCode(swf, flashVars, params, attributes);
 

	
 
  // Get element by embedding code and retrieving created element
 
  var obj = Dom.createEl('div', { innerHTML: code }).childNodes[0];
 

	
 
  return obj;
 
};
 

	
 
Flash.getEmbedCode = function (swf, flashVars, params, attributes) {
 
  var objTag = '<object type="application/x-shockwave-flash" ';
 
  var flashVarsString = '';
 
  var paramsString = '';
 
  var attrsString = '';
 

	
 
  // Convert flash vars to string
 
  if (flashVars) {
 
    Object.getOwnPropertyNames(flashVars).forEach(function (key) {
 
      flashVarsString += key + '=' + flashVars[key] + '&amp;';
 
    });
 
  }
 

	
 
  // Add swf, flashVars, and other default params
 
  params = _objectAssign2['default']({
 
    'movie': swf,
 
    'flashvars': flashVarsString,
 
    'allowScriptAccess': 'always', // Required to talk to swf
 
    'allowNetworking': 'all' // All should be default, but having security issues.
 
  }, params);
 

	
 
  // Create param tags string
 
  Object.getOwnPropertyNames(params).forEach(function (key) {
 
    paramsString += '<param name="' + key + '" value="' + params[key] + '" />';
 
  });
 

	
 
  attributes = _objectAssign2['default']({
 
    // Add swf to attributes (need both for IE and Others to work)
 
    'data': swf,
 

	
 
    // Default to 100% width/height
 
    'width': '100%',
 
    'height': '100%'
 

	
 
  }, attributes);
 

	
 
  // Create Attributes string
 
  Object.getOwnPropertyNames(attributes).forEach(function (key) {
 
    attrsString += key + '="' + attributes[key] + '" ';
 
  });
 

	
 
  return '' + objTag + attrsString + '>' + paramsString + '</object>';
 
};
 

	
 
// Run Flash through the RTMP decorator
 
_flashRtmp2['default'](Flash);
 

	
 
_component2['default'].registerComponent('Flash', Flash);
 
exports['default'] = Flash;
 
module.exports = exports['default'];
 

	
 
},{"../component":58,"../utils/dom.js":118,"../utils/time-ranges.js":126,"../utils/url.js":128,"./flash-rtmp":103,"./tech":107,"global/window":2,"object.assign":43}],105:[function(_dereq_,module,exports){
 
/**
 
 * @file html5.js
 
 * HTML5 Media Controller - Wrapper for HTML5 Media API
 
 */
 

	
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _techJs = _dereq_('./tech.js');
 

	
 
var _techJs2 = _interopRequireDefault(_techJs);
 

	
 
var _component = _dereq_('../component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _utilsDomJs = _dereq_('../utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsUrlJs = _dereq_('../utils/url.js');
 

	
 
var Url = _interopRequireWildcard(_utilsUrlJs);
 

	
 
var _utilsFnJs = _dereq_('../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsLogJs = _dereq_('../utils/log.js');
 

	
 
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
 

	
 
var _utilsBrowserJs = _dereq_('../utils/browser.js');
 

	
 
var browser = _interopRequireWildcard(_utilsBrowserJs);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
var _utilsMergeOptionsJs = _dereq_('../utils/merge-options.js');
 

	
 
var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs);
 

	
 
/**
 
 * HTML5 Media Controller - Wrapper for HTML5 Media API
 
 *
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready Ready callback function
 
 * @extends Tech
 
 * @class Html5
 
 */
 

	
 
var Html5 = (function (_Tech) {
 
  _inherits(Html5, _Tech);
 

	
 
  function Html5(options, ready) {
 
    _classCallCheck(this, Html5);
 

	
 
    _Tech.call(this, options, ready);
 

	
 
    var source = options.source;
 

	
 
    // Set the source if one is provided
 
    // 1) Check if the source is new (if not, we want to keep the original so playback isn't interrupted)
 
    // 2) Check to see if the network state of the tag was failed at init, and if so, reset the source
 
    // anyway so the error gets fired.
 
    if (source && (this.el_.currentSrc !== source.src || options.tag && options.tag.initNetworkState_ === 3)) {
 
      this.setSource(source);
 
    } else {
 
      this.handleLateInit_(this.el_);
 
    }
 

	
 
    if (this.el_.hasChildNodes()) {
 

	
 
      var nodes = this.el_.childNodes;
 
      var nodesLength = nodes.length;
 
      var removeNodes = [];
 

	
 
      while (nodesLength--) {
 
        var node = nodes[nodesLength];
 
        var nodeName = node.nodeName.toLowerCase();
 
        if (nodeName === 'track') {
 
          if (!this.featuresNativeTextTracks) {
 
            // Empty video tag tracks so the built-in player doesn't use them also.
 
            // This may not be fast enough to stop HTML5 browsers from reading the tags
 
            // so we'll need to turn off any default tracks if we're manually doing
 
            // captions and subtitles. videoElement.textTracks
 
            removeNodes.push(node);
 
          } else {
 
            this.remoteTextTracks().addTrack_(node.track);
 
          }
 
        }
 
      }
 

	
 
      for (var i = 0; i < removeNodes.length; i++) {
 
        this.el_.removeChild(removeNodes[i]);
 
      }
 
    }
 

	
 
    if (this.featuresNativeTextTracks) {
 
      this.handleTextTrackChange_ = Fn.bind(this, this.handleTextTrackChange);
 
      this.handleTextTrackAdd_ = Fn.bind(this, this.handleTextTrackAdd);
 
      this.handleTextTrackRemove_ = Fn.bind(this, this.handleTextTrackRemove);
 
      this.proxyNativeTextTracks_();
 
    }
 

	
 
    // Determine if native controls should be used
 
    // Our goal should be to get the custom controls on mobile solid everywhere
 
    // so we can remove this all together. Right now this will block custom
 
    // controls on touch enabled laptops like the Chrome Pixel
 
    if (browser.TOUCH_ENABLED && options.nativeControlsForTouch === true || browser.IS_IPHONE || browser.IS_NATIVE_ANDROID) {
 
      this.setControls(true);
 
    }
 

	
 
    this.triggerReady();
 
  }
 

	
 
  /* HTML5 Support Testing ---------------------------------------------------- */
 

	
 
  /*
 
  * Element for testing browser HTML5 video capabilities
 
  *
 
  * @type {Element}
 
  * @constant
 
  * @private
 
  */
 

	
 
  /**
 
   * Dispose of html5 media element
 
   *
 
   * @method dispose
 
   */
 

	
 
  Html5.prototype.dispose = function dispose() {
 
    var tt = this.el().textTracks;
 
    var emulatedTt = this.textTracks();
 

	
 
    // remove native event listeners
 
    if (tt && tt.removeEventListener) {
 
      tt.removeEventListener('change', this.handleTextTrackChange_);
 
      tt.removeEventListener('addtrack', this.handleTextTrackAdd_);
 
      tt.removeEventListener('removetrack', this.handleTextTrackRemove_);
 
    }
 

	
 
    // clearout the emulated text track list.
 
    var i = emulatedTt.length;
 

	
 
    while (i--) {
 
      emulatedTt.removeTrack_(emulatedTt[i]);
 
    }
 

	
 
    Html5.disposeMediaElement(this.el_);
 
    _Tech.prototype.dispose.call(this);
 
  };
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  Html5.prototype.createEl = function createEl() {
 
    var el = this.options_.tag;
 

	
 
    // Check if this browser supports moving the element into the box.
 
    // On the iPhone video will break if you move the element,
 
    // So we have to create a brand new element.
 
    if (!el || this['movingMediaElementInDOM'] === false) {
 

	
 
      // If the original tag is still there, clone and remove it.
 
      if (el) {
 
        var clone = el.cloneNode(true);
 
        el.parentNode.insertBefore(clone, el);
 
        Html5.disposeMediaElement(el);
 
        el = clone;
 
      } else {
 
        el = _globalDocument2['default'].createElement('video');
 

	
 
        // determine if native controls should be used
 
        var tagAttributes = this.options_.tag && Dom.getElAttributes(this.options_.tag);
 
        var attributes = _utilsMergeOptionsJs2['default']({}, tagAttributes);
 
        if (!browser.TOUCH_ENABLED || this.options_.nativeControlsForTouch !== true) {
 
          delete attributes.controls;
 
        }
 

	
 
        Dom.setElAttributes(el, _objectAssign2['default'](attributes, {
 
          id: this.options_.techId,
 
          'class': 'vjs-tech'
 
        }));
 
      }
 
    }
 

	
 
    // Update specific tag settings, in case they were overridden
 
    var settingsAttrs = ['autoplay', 'preload', 'loop', 'muted'];
 
    for (var i = settingsAttrs.length - 1; i >= 0; i--) {
 
      var attr = settingsAttrs[i];
 
      var overwriteAttrs = {};
 
      if (typeof this.options_[attr] !== 'undefined') {
 
        overwriteAttrs[attr] = this.options_[attr];
 
      }
 
      Dom.setElAttributes(el, overwriteAttrs);
 
    }
 

	
 
    return el;
 
    // jenniisawesome = true;
 
  };
 

	
 
  // If we're loading the playback object after it has started loading
 
  // or playing the video (often with autoplay on) then the loadstart event
 
  // has already fired and we need to fire it manually because many things
 
  // rely on it.
 

	
 
  Html5.prototype.handleLateInit_ = function handleLateInit_(el) {
 
    var _this = this;
 

	
 
    if (el.networkState === 0 || el.networkState === 3) {
 
      // The video element hasn't started loading the source yet
 
      // or didn't find a source
 
      return;
 
    }
 

	
 
    if (el.readyState === 0) {
 
      var _ret = (function () {
 
        // NetworkState is set synchronously BUT loadstart is fired at the
 
        // end of the current stack, usually before setInterval(fn, 0).
 
        // So at this point we know loadstart may have already fired or is
 
        // about to fire, and either way the player hasn't seen it yet.
 
        // We don't want to fire loadstart prematurely here and cause a
 
        // double loadstart so we'll wait and see if it happens between now
 
        // and the next loop, and fire it if not.
 
        // HOWEVER, we also want to make sure it fires before loadedmetadata
 
        // which could also happen between now and the next loop, so we'll
 
        // watch for that also.
 
        var loadstartFired = false;
 
        var setLoadstartFired = function setLoadstartFired() {
 
          loadstartFired = true;
 
        };
 
        _this.on('loadstart', setLoadstartFired);
 

	
 
        var triggerLoadstart = function triggerLoadstart() {
 
          // We did miss the original loadstart. Make sure the player
 
          // sees loadstart before loadedmetadata
 
          if (!loadstartFired) {
 
            this.trigger('loadstart');
 
          }
 
        };
 
        _this.on('loadedmetadata', triggerLoadstart);
 

	
 
        _this.ready(function () {
 
          this.off('loadstart', setLoadstartFired);
 
          this.off('loadedmetadata', triggerLoadstart);
 

	
 
          if (!loadstartFired) {
 
            // We did miss the original native loadstart. Fire it now.
 
            this.trigger('loadstart');
 
          }
 
        });
 

	
 
        return {
 
          v: undefined
 
        };
 
      })();
 

	
 
      if (typeof _ret === 'object') return _ret.v;
 
    }
 

	
 
    // From here on we know that loadstart already fired and we missed it.
 
    // The other readyState events aren't as much of a problem if we double
 
    // them, so not going to go to as much trouble as loadstart to prevent
 
    // that unless we find reason to.
 
    var eventsToTrigger = ['loadstart'];
 

	
 
    // loadedmetadata: newly equal to HAVE_METADATA (1) or greater
 
    eventsToTrigger.push('loadedmetadata');
 

	
 
    // loadeddata: newly increased to HAVE_CURRENT_DATA (2) or greater
 
    if (el.readyState >= 2) {
 
      eventsToTrigger.push('loadeddata');
 
    }
 

	
 
    // canplay: newly increased to HAVE_FUTURE_DATA (3) or greater
 
    if (el.readyState >= 3) {
 
      eventsToTrigger.push('canplay');
 
    }
 

	
 
    // canplaythrough: newly equal to HAVE_ENOUGH_DATA (4)
 
    if (el.readyState >= 4) {
 
      eventsToTrigger.push('canplaythrough');
 
    }
 

	
 
    // We still need to give the player time to add event listeners
 
    this.ready(function () {
 
      eventsToTrigger.forEach(function (type) {
 
        this.trigger(type);
 
      }, this);
 
    });
 
  };
 

	
 
  Html5.prototype.proxyNativeTextTracks_ = function proxyNativeTextTracks_() {
 
    var tt = this.el().textTracks;
 

	
 
    if (tt && tt.addEventListener) {
 
      tt.addEventListener('change', this.handleTextTrackChange_);
 
      tt.addEventListener('addtrack', this.handleTextTrackAdd_);
 
      tt.addEventListener('removetrack', this.handleTextTrackRemove_);
 
    }
 
  };
 

	
 
  Html5.prototype.handleTextTrackChange = function handleTextTrackChange(e) {
 
    var tt = this.textTracks();
 
    this.textTracks().trigger({
 
      type: 'change',
 
      target: tt,
 
      currentTarget: tt,
 
      srcElement: tt
 
    });
 
  };
 

	
 
  Html5.prototype.handleTextTrackAdd = function handleTextTrackAdd(e) {
 
    this.textTracks().addTrack_(e.track);
 
  };
 

	
 
  Html5.prototype.handleTextTrackRemove = function handleTextTrackRemove(e) {
 
    this.textTracks().removeTrack_(e.track);
 
  };
 

	
 
  /**
 
   * Play for html5 tech
 
   *
 
   * @method play
 
   */
 

	
 
  Html5.prototype.play = function play() {
 
    this.el_.play();
 
  };
 

	
 
  /**
 
   * Pause for html5 tech
 
   *
 
   * @method pause
 
   */
 

	
 
  Html5.prototype.pause = function pause() {
 
    this.el_.pause();
 
  };
 

	
 
  /**
 
   * Paused for html5 tech
 
   *
 
   * @return {Boolean}
 
   * @method paused
 
   */
 

	
 
  Html5.prototype.paused = function paused() {
 
    return this.el_.paused;
 
  };
 

	
 
  /**
 
   * Get current time
 
   *
 
   * @return {Number}
 
   * @method currentTime
 
   */
 

	
 
  Html5.prototype.currentTime = function currentTime() {
 
    return this.el_.currentTime;
 
  };
 

	
 
  /**
 
   * Set current time
 
   *
 
   * @param {Number} seconds Current time of video
 
   * @method setCurrentTime
 
   */
 

	
 
  Html5.prototype.setCurrentTime = function setCurrentTime(seconds) {
 
    try {
 
      this.el_.currentTime = seconds;
 
    } catch (e) {
 
      _utilsLogJs2['default'](e, 'Video is not ready. (Video.js)');
 
      // this.warning(VideoJS.warnings.videoNotReady);
 
    }
 
  };
 

	
 
  /**
 
   * Get duration
 
   *
 
   * @return {Number}
 
   * @method duration
 
   */
 

	
 
  Html5.prototype.duration = function duration() {
 
    return this.el_.duration || 0;
 
  };
 

	
 
  /**
 
   * Get a TimeRange object that represents the intersection
 
   * of the time ranges for which the user agent has all
 
   * relevant media
 
   *
 
   * @return {TimeRangeObject}
 
   * @method buffered
 
   */
 

	
 
  Html5.prototype.buffered = function buffered() {
 
    return this.el_.buffered;
 
  };
 

	
 
  /**
 
   * Get volume level
 
   *
 
   * @return {Number}
 
   * @method volume
 
   */
 

	
 
  Html5.prototype.volume = function volume() {
 
    return this.el_.volume;
 
  };
 

	
 
  /**
 
   * Set volume level
 
   *
 
   * @param {Number} percentAsDecimal Volume percent as a decimal
 
   * @method setVolume
 
   */
 

	
 
  Html5.prototype.setVolume = function setVolume(percentAsDecimal) {
 
    this.el_.volume = percentAsDecimal;
 
  };
 

	
 
  /**
 
   * Get if muted
 
   *
 
   * @return {Boolean}
 
   * @method muted
 
   */
 

	
 
  Html5.prototype.muted = function muted() {
 
    return this.el_.muted;
 
  };
 

	
 
  /**
 
   * Set muted
 
   *
 
   * @param {Boolean} If player is to be muted or note
 
   * @method setMuted
 
   */
 

	
 
  Html5.prototype.setMuted = function setMuted(muted) {
 
    this.el_.muted = muted;
 
  };
 

	
 
  /**
 
   * Get player width
 
   *
 
   * @return {Number}
 
   * @method width
 
   */
 

	
 
  Html5.prototype.width = function width() {
 
    return this.el_.offsetWidth;
 
  };
 

	
 
  /**
 
   * Get player height
 
   *
 
   * @return {Number}
 
   * @method height
 
   */
 

	
 
  Html5.prototype.height = function height() {
 
    return this.el_.offsetHeight;
 
  };
 

	
 
  /**
 
   * Get if there is fullscreen support
 
   *
 
   * @return {Boolean}
 
   * @method supportsFullScreen
 
   */
 

	
 
  Html5.prototype.supportsFullScreen = function supportsFullScreen() {
 
    if (typeof this.el_.webkitEnterFullScreen === 'function') {
 
      var userAgent = _globalWindow2['default'].navigator.userAgent;
 
      // Seems to be broken in Chromium/Chrome && Safari in Leopard
 
      if (/Android/.test(userAgent) || !/Chrome|Mac OS X 10.5/.test(userAgent)) {
 
        return true;
 
      }
 
    }
 
    return false;
 
  };
 

	
 
  /**
 
   * Request to enter fullscreen
 
   *
 
   * @method enterFullScreen
 
   */
 

	
 
  Html5.prototype.enterFullScreen = function enterFullScreen() {
 
    var video = this.el_;
 

	
 
    if ('webkitDisplayingFullscreen' in video) {
 
      this.one('webkitbeginfullscreen', function () {
 
        this.one('webkitendfullscreen', function () {
 
          this.trigger('fullscreenchange', { isFullscreen: false });
 
        });
 

	
 
        this.trigger('fullscreenchange', { isFullscreen: true });
 
      });
 
    }
 

	
 
    if (video.paused && video.networkState <= video.HAVE_METADATA) {
 
      // attempt to prime the video element for programmatic access
 
      // this isn't necessary on the desktop but shouldn't hurt
 
      this.el_.play();
 

	
 
      // playing and pausing synchronously during the transition to fullscreen
 
      // can get iOS ~6.1 devices into a play/pause loop
 
      this.setTimeout(function () {
 
        video.pause();
 
        video.webkitEnterFullScreen();
 
      }, 0);
 
    } else {
 
      video.webkitEnterFullScreen();
 
    }
 
  };
 

	
 
  /**
 
   * Request to exit fullscreen
 
   *
 
   * @method exitFullScreen
 
   */
 

	
 
  Html5.prototype.exitFullScreen = function exitFullScreen() {
 
    this.el_.webkitExitFullScreen();
 
  };
 

	
 
  /**
 
   * Get/set video
 
   *
 
   * @param {Object=} src Source object
 
   * @return {Object}
 
   * @method src
 
   */
 

	
 
  Html5.prototype.src = function src(_src) {
 
    if (_src === undefined) {
 
      return this.el_.src;
 
    } else {
 
      // Setting src through `src` instead of `setSrc` will be deprecated
 
      this.setSrc(_src);
 
    }
 
  };
 

	
 
  /**
 
   * Set video
 
   *
 
   * @param {Object} src Source object
 
   * @deprecated
 
   * @method setSrc
 
   */
 

	
 
  Html5.prototype.setSrc = function setSrc(src) {
 
    this.el_.src = src;
 
  };
 

	
 
  /**
 
   * Load media into player
 
   *
 
   * @method load
 
   */
 

	
 
  Html5.prototype.load = function load() {
 
    this.el_.load();
 
  };
 

	
 
  /**
 
   * Get current source
 
   *
 
   * @return {Object}
 
   * @method currentSrc
 
   */
 

	
 
  Html5.prototype.currentSrc = function currentSrc() {
 
    return this.el_.currentSrc;
 
  };
 

	
 
  /**
 
   * Get poster
 
   *
 
   * @return {String}
 
   * @method poster
 
   */
 

	
 
  Html5.prototype.poster = function poster() {
 
    return this.el_.poster;
 
  };
 

	
 
  /**
 
   * Set poster
 
   *
 
   * @param {String} val URL to poster image
 
   * @method
 
   */
 

	
 
  Html5.prototype.setPoster = function setPoster(val) {
 
    this.el_.poster = val;
 
  };
 

	
 
  /**
 
   * Get preload attribute
 
   *
 
   * @return {String}
 
   * @method preload
 
   */
 

	
 
  Html5.prototype.preload = function preload() {
 
    return this.el_.preload;
 
  };
 

	
 
  /**
 
   * Set preload attribute
 
   *
 
   * @param {String} val Value for preload attribute
 
   * @method setPreload
 
   */
 

	
 
  Html5.prototype.setPreload = function setPreload(val) {
 
    this.el_.preload = val;
 
  };
 

	
 
  /**
 
   * Get autoplay attribute
 
   *
 
   * @return {String}
 
   * @method autoplay
 
   */
 

	
 
  Html5.prototype.autoplay = function autoplay() {
 
    return this.el_.autoplay;
 
  };
 

	
 
  /**
 
   * Set autoplay attribute
 
   *
 
   * @param {String} val Value for preload attribute
 
   * @method setAutoplay
 
   */
 

	
 
  Html5.prototype.setAutoplay = function setAutoplay(val) {
 
    this.el_.autoplay = val;
 
  };
 

	
 
  /**
 
   * Get controls attribute
 
   *
 
   * @return {String}
 
   * @method controls
 
   */
 

	
 
  Html5.prototype.controls = function controls() {
 
    return this.el_.controls;
 
  };
 

	
 
  /**
 
   * Set controls attribute
 
   *
 
   * @param {String} val Value for controls attribute
 
   * @method setControls
 
   */
 

	
 
  Html5.prototype.setControls = function setControls(val) {
 
    this.el_.controls = !!val;
 
  };
 

	
 
  /**
 
   * Get loop attribute
 
   *
 
   * @return {String}
 
   * @method loop
 
   */
 

	
 
  Html5.prototype.loop = function loop() {
 
    return this.el_.loop;
 
  };
 

	
 
  /**
 
   * Set loop attribute
 
   *
 
   * @param {String} val Value for loop attribute
 
   * @method setLoop
 
   */
 

	
 
  Html5.prototype.setLoop = function setLoop(val) {
 
    this.el_.loop = val;
 
  };
 

	
 
  /**
 
   * Get error value
 
   *
 
   * @return {String}
 
   * @method error
 
   */
 

	
 
  Html5.prototype.error = function error() {
 
    return this.el_.error;
 
  };
 

	
 
  /**
 
   * Get whether or not the player is in the "seeking" state
 
   *
 
   * @return {Boolean}
 
   * @method seeking
 
   */
 

	
 
  Html5.prototype.seeking = function seeking() {
 
    return this.el_.seeking;
 
  };
 

	
 
  /**
 
   * Get a TimeRanges object that represents the
 
   * ranges of the media resource to which it is possible
 
   * for the user agent to seek.
 
   *
 
   * @return {TimeRangeObject}
 
   * @method seekable
 
   */
 

	
 
  Html5.prototype.seekable = function seekable() {
 
    return this.el_.seekable;
 
  };
 

	
 
  /**
 
   * Get if video ended
 
   *
 
   * @return {Boolean}
 
   * @method ended
 
   */
 

	
 
  Html5.prototype.ended = function ended() {
 
    return this.el_.ended;
 
  };
 

	
 
  /**
 
   * Get the value of the muted content attribute
 
   * This attribute has no dynamic effect, it only
 
   * controls the default state of the element
 
   *
 
   * @return {Boolean}
 
   * @method defaultMuted
 
   */
 

	
 
  Html5.prototype.defaultMuted = function defaultMuted() {
 
    return this.el_.defaultMuted;
 
  };
 

	
 
  /**
 
   * Get desired speed at which the media resource is to play
 
   *
 
   * @return {Number}
 
   * @method playbackRate
 
   */
 

	
 
  Html5.prototype.playbackRate = function playbackRate() {
 
    return this.el_.playbackRate;
 
  };
 

	
 
  /**
 
   * Returns a TimeRanges object that represents the ranges of the
 
   * media resource that the user agent has played.
 
   * @return {TimeRangeObject} the range of points on the media
 
   * timeline that has been reached through normal playback
 
   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-played
 
   */
 

	
 
  Html5.prototype.played = function played() {
 
    return this.el_.played;
 
  };
 

	
 
  /**
 
   * Set desired speed at which the media resource is to play
 
   *
 
   * @param {Number} val Speed at which the media resource is to play
 
   * @method setPlaybackRate
 
   */
 

	
 
  Html5.prototype.setPlaybackRate = function setPlaybackRate(val) {
 
    this.el_.playbackRate = val;
 
  };
 

	
 
  /**
 
   * Get the current state of network activity for the element, from
 
   * the list below
 
   * NETWORK_EMPTY (numeric value 0)
 
   * NETWORK_IDLE (numeric value 1)
 
   * NETWORK_LOADING (numeric value 2)
 
   * NETWORK_NO_SOURCE (numeric value 3)
 
   *
 
   * @return {Number}
 
   * @method networkState
 
   */
 

	
 
  Html5.prototype.networkState = function networkState() {
 
    return this.el_.networkState;
 
  };
 

	
 
  /**
 
   * Get a value that expresses the current state of the element
 
   * with respect to rendering the current playback position, from
 
   * the codes in the list below
 
   * HAVE_NOTHING (numeric value 0)
 
   * HAVE_METADATA (numeric value 1)
 
   * HAVE_CURRENT_DATA (numeric value 2)
 
   * HAVE_FUTURE_DATA (numeric value 3)
 
   * HAVE_ENOUGH_DATA (numeric value 4)
 
   *
 
   * @return {Number}
 
   * @method readyState
 
   */
 

	
 
  Html5.prototype.readyState = function readyState() {
 
    return this.el_.readyState;
 
  };
 

	
 
  /**
 
   * Get width of video
 
   *
 
   * @return {Number}
 
   * @method videoWidth
 
   */
 

	
 
  Html5.prototype.videoWidth = function videoWidth() {
 
    return this.el_.videoWidth;
 
  };
 

	
 
  /**
 
   * Get height of video
 
   *
 
   * @return {Number}
 
   * @method videoHeight
 
   */
 

	
 
  Html5.prototype.videoHeight = function videoHeight() {
 
    return this.el_.videoHeight;
 
  };
 

	
 
  /**
 
   * Get text tracks
 
   *
 
   * @return {TextTrackList}
 
   * @method textTracks
 
   */
 

	
 
  Html5.prototype.textTracks = function textTracks() {
 
    return _Tech.prototype.textTracks.call(this);
 
  };
 

	
 
  /**
 
   * Creates and returns a text track object
 
   *
 
   * @param {String} kind Text track kind (subtitles, captions, descriptions
 
   *                                       chapters and metadata)
 
   * @param {String=} label Label to identify the text track
 
   * @param {String=} language Two letter language abbreviation
 
   * @return {TextTrackObject}
 
   * @method addTextTrack
 
   */
 

	
 
  Html5.prototype.addTextTrack = function addTextTrack(kind, label, language) {
 
    if (!this['featuresNativeTextTracks']) {
 
      return _Tech.prototype.addTextTrack.call(this, kind, label, language);
 
    }
 

	
 
    return this.el_.addTextTrack(kind, label, language);
 
  };
 

	
 
  /**
 
   * Creates and returns a remote text track object
 
   *
 
   * @param {Object} options The object should contain values for
 
   * kind, language, label and src (location of the WebVTT file)
 
   * @return {TextTrackObject}
 
   * @method addRemoteTextTrack
 
   */
 

	
 
  Html5.prototype.addRemoteTextTrack = function addRemoteTextTrack() {
 
    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
 

	
 
    if (!this['featuresNativeTextTracks']) {
 
      return _Tech.prototype.addRemoteTextTrack.call(this, options);
 
    }
 

	
 
    var track = _globalDocument2['default'].createElement('track');
 

	
 
    if (options['kind']) {
 
      track['kind'] = options['kind'];
 
    }
 
    if (options['label']) {
 
      track['label'] = options['label'];
 
    }
 
    if (options['language'] || options['srclang']) {
 
      track['srclang'] = options['language'] || options['srclang'];
 
    }
 
    if (options['default']) {
 
      track['default'] = options['default'];
 
    }
 
    if (options['id']) {
 
      track['id'] = options['id'];
 
    }
 
    if (options['src']) {
 
      track['src'] = options['src'];
 
    }
 

	
 
    this.el().appendChild(track);
 

	
 
    this.remoteTextTracks().addTrack_(track.track);
 

	
 
    return track;
 
  };
 

	
 
  /**
 
   * Remove remote text track from TextTrackList object
 
   *
 
   * @param {TextTrackObject} track Texttrack object to remove
 
   * @method removeRemoteTextTrack
 
   */
 

	
 
  Html5.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) {
 
    if (!this['featuresNativeTextTracks']) {
 
      return _Tech.prototype.removeRemoteTextTrack.call(this, track);
 
    }
 

	
 
    var tracks, i;
 

	
 
    this.remoteTextTracks().removeTrack_(track);
 

	
 
    tracks = this.el().querySelectorAll('track');
 

	
 
    i = tracks.length;
 
    while (i--) {
 
      if (track === tracks[i] || track === tracks[i].track) {
 
        this.el().removeChild(tracks[i]);
 
      }
 
    }
 
  };
 

	
 
  return Html5;
 
})(_techJs2['default']);
 

	
 
Html5.TEST_VID = _globalDocument2['default'].createElement('video');
 
var track = _globalDocument2['default'].createElement('track');
 
track.kind = 'captions';
 
track.srclang = 'en';
 
track.label = 'English';
 
Html5.TEST_VID.appendChild(track);
 

	
 
/*
 
 * Check if HTML5 video is supported by this browser/device
 
 *
 
 * @return {Boolean}
 
 */
 
Html5.isSupported = function () {
 
  // IE9 with no Media Player is a LIAR! (#984)
 
  try {
 
    Html5.TEST_VID['volume'] = 0.5;
 
  } catch (e) {
 
    return false;
 
  }
 

	
 
  return !!Html5.TEST_VID.canPlayType;
 
};
 

	
 
// Add Source Handler pattern functions to this tech
 
_techJs2['default'].withSourceHandlers(Html5);
 

	
 
/*
 
 * The default native source handler.
 
 * This simply passes the source to the video element. Nothing fancy.
 
 *
 
 * @param  {Object} source   The source object
 
 * @param  {Html5} tech  The instance of the HTML5 tech
 
 */
 
Html5.nativeSourceHandler = {};
 

	
 
/*
 
 * Check if the video element can handle the source natively
 
 *
 
 * @param  {Object} source  The source object
 
 * @return {String}         'probably', 'maybe', or '' (empty string)
 
 */
 
Html5.nativeSourceHandler.canHandleSource = function (source) {
 
  var match, ext;
 

	
 
  function canPlayType(type) {
 
    // IE9 on Windows 7 without MediaPlayer throws an error here
 
    // https://github.com/videojs/video.js/issues/519
 
    try {
 
      return Html5.TEST_VID.canPlayType(type);
 
    } catch (e) {
 
      return '';
 
    }
 
  }
 

	
 
  // If a type was provided we should rely on that
 
  if (source.type) {
 
    return canPlayType(source.type);
 
  } else if (source.src) {
 
    // If no type, fall back to checking 'video/[EXTENSION]'
 
    ext = Url.getFileExtension(source.src);
 

	
 
    return canPlayType('video/' + ext);
 
  }
 

	
 
  return '';
 
};
 

	
 
/*
 
 * Pass the source to the video element
 
 * Adaptive source handlers will have more complicated workflows before passing
 
 * video data to the video element
 
 *
 
 * @param  {Object} source    The source object
 
 * @param  {Html5} tech   The instance of the Html5 tech
 
 */
 
Html5.nativeSourceHandler.handleSource = function (source, tech) {
 
  tech.setSrc(source.src);
 
};
 

	
 
/*
 
* Clean up the source handler when disposing the player or switching sources..
 
* (no cleanup is needed when supporting the format natively)
 
*/
 
Html5.nativeSourceHandler.dispose = function () {};
 

	
 
// Register the native source handler
 
Html5.registerSourceHandler(Html5.nativeSourceHandler);
 

	
 
/*
 
 * Check if the volume can be changed in this browser/device.
 
 * Volume cannot be changed in a lot of mobile devices.
 
 * Specifically, it can't be changed from 1 on iOS.
 
 *
 
 * @return {Boolean}
 
 */
 
Html5.canControlVolume = function () {
 
  var volume = Html5.TEST_VID.volume;
 
  Html5.TEST_VID.volume = volume / 2 + 0.1;
 
  return volume !== Html5.TEST_VID.volume;
 
};
 

	
 
/*
 
 * Check if playbackRate is supported in this browser/device.
 
 *
 
 * @return {Number} [description]
 
 */
 
Html5.canControlPlaybackRate = function () {
 
  var playbackRate = Html5.TEST_VID.playbackRate;
 
  Html5.TEST_VID.playbackRate = playbackRate / 2 + 0.1;
 
  return playbackRate !== Html5.TEST_VID.playbackRate;
 
};
 

	
 
/*
 
 * Check to see if native text tracks are supported by this browser/device
 
 *
 
 * @return {Boolean}
 
 */
 
Html5.supportsNativeTextTracks = function () {
 
  var supportsTextTracks;
 

	
 
  // Figure out native text track support
 
  // If mode is a number, we cannot change it because it'll disappear from view.
 
  // Browsers with numeric modes include IE10 and older (<=2013) samsung android models.
 
  // Firefox isn't playing nice either with modifying the mode
 
  // TODO: Investigate firefox: https://github.com/videojs/video.js/issues/1862
 
  supportsTextTracks = !!Html5.TEST_VID.textTracks;
 
  if (supportsTextTracks && Html5.TEST_VID.textTracks.length > 0) {
 
    supportsTextTracks = typeof Html5.TEST_VID.textTracks[0]['mode'] !== 'number';
 
  }
 
  if (supportsTextTracks && browser.IS_FIREFOX) {
 
    supportsTextTracks = false;
 
  }
 
  if (supportsTextTracks && !('onremovetrack' in Html5.TEST_VID.textTracks)) {
 
    supportsTextTracks = false;
 
  }
 

	
 
  return supportsTextTracks;
 
};
 

	
 
/**
 
 * An array of events available on the Html5 tech.
 
 *
 
 * @private
 
 * @type {Array}
 
 */
 
Html5.Events = ['loadstart', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'loadedmetadata', 'loadeddata', 'canplay', 'canplaythrough', 'playing', 'waiting', 'seeking', 'seeked', 'ended', 'durationchange', 'timeupdate', 'progress', 'play', 'pause', 'ratechange', 'volumechange'];
 

	
 
/*
 
 * Set the tech's volume control support status
 
 *
 
 * @type {Boolean}
 
 */
 
Html5.prototype['featuresVolumeControl'] = Html5.canControlVolume();
 

	
 
/*
 
 * Set the tech's playbackRate support status
 
 *
 
 * @type {Boolean}
 
 */
 
Html5.prototype['featuresPlaybackRate'] = Html5.canControlPlaybackRate();
 

	
 
/*
 
 * Set the tech's status on moving the video element.
 
 * In iOS, if you move a video element in the DOM, it breaks video playback.
 
 *
 
 * @type {Boolean}
 
 */
 
Html5.prototype['movingMediaElementInDOM'] = !browser.IS_IOS;
 

	
 
/*
 
 * Set the the tech's fullscreen resize support status.
 
 * HTML video is able to automatically resize when going to fullscreen.
 
 * (No longer appears to be used. Can probably be removed.)
 
 */
 
Html5.prototype['featuresFullscreenResize'] = true;
 

	
 
/*
 
 * Set the tech's progress event support status
 
 * (this disables the manual progress events of the Tech)
 
 */
 
Html5.prototype['featuresProgressEvents'] = true;
 

	
 
/*
 
 * Sets the tech's status on native text track support
 
 *
 
 * @type {Boolean}
 
 */
 
Html5.prototype['featuresNativeTextTracks'] = Html5.supportsNativeTextTracks();
 

	
 
// HTML5 Feature detection and Device Fixes --------------------------------- //
 
var canPlayType = undefined;
 
var mpegurlRE = /^application\/(?:x-|vnd\.apple\.)mpegurl/i;
 
var mp4RE = /^video\/mp4/i;
 

	
 
Html5.patchCanPlayType = function () {
 
  // Android 4.0 and above can play HLS to some extent but it reports being unable to do so
 
  if (browser.ANDROID_VERSION >= 4.0) {
 
    if (!canPlayType) {
 
      canPlayType = Html5.TEST_VID.constructor.prototype.canPlayType;
 
    }
 

	
 
    Html5.TEST_VID.constructor.prototype.canPlayType = function (type) {
 
      if (type && mpegurlRE.test(type)) {
 
        return 'maybe';
 
      }
 
      return canPlayType.call(this, type);
 
    };
 
  }
 

	
 
  // Override Android 2.2 and less canPlayType method which is broken
 
  if (browser.IS_OLD_ANDROID) {
 
    if (!canPlayType) {
 
      canPlayType = Html5.TEST_VID.constructor.prototype.canPlayType;
 
    }
 

	
 
    Html5.TEST_VID.constructor.prototype.canPlayType = function (type) {
 
      if (type && mp4RE.test(type)) {
 
        return 'maybe';
 
      }
 
      return canPlayType.call(this, type);
 
    };
 
  }
 
};
 

	
 
Html5.unpatchCanPlayType = function () {
 
  var r = Html5.TEST_VID.constructor.prototype.canPlayType;
 
  Html5.TEST_VID.constructor.prototype.canPlayType = canPlayType;
 
  canPlayType = null;
 
  return r;
 
};
 

	
 
// by default, patch the video element
 
Html5.patchCanPlayType();
 

	
 
Html5.disposeMediaElement = function (el) {
 
  if (!el) {
 
    return;
 
  }
 

	
 
  if (el.parentNode) {
 
    el.parentNode.removeChild(el);
 
  }
 

	
 
  // remove any child track or source nodes to prevent their loading
 
  while (el.hasChildNodes()) {
 
    el.removeChild(el.firstChild);
 
  }
 

	
 
  // remove any src reference. not setting `src=''` because that causes a warning
 
  // in firefox
 
  el.removeAttribute('src');
 

	
 
  // force the media element to update its loading state by calling load()
 
  // however IE on Windows 7N has a bug that throws an error so need a try/catch (#793)
 
  if (typeof el.load === 'function') {
 
    // wrapping in an iife so it's not deoptimized (#1060#discussion_r10324473)
 
    (function () {
 
      try {
 
        el.load();
 
      } catch (e) {
 
        // not supported
 
      }
 
    })();
 
  }
 
};
 

	
 
_component2['default'].registerComponent('Html5', Html5);
 
exports['default'] = Html5;
 
module.exports = exports['default'];
 

	
 
},{"../component":58,"../utils/browser.js":115,"../utils/dom.js":118,"../utils/fn.js":120,"../utils/log.js":123,"../utils/merge-options.js":124,"../utils/url.js":128,"./tech.js":107,"global/document":1,"global/window":2,"object.assign":43}],106:[function(_dereq_,module,exports){
 
/**
 
 * @file loader.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _component = _dereq_('../component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _utilsToTitleCaseJs = _dereq_('../utils/to-title-case.js');
 

	
 
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
 

	
 
/**
 
 * The Media Loader is the component that decides which playback technology to load
 
 * when the player is initialized.
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends Component
 
 * @class MediaLoader
 
 */
 

	
 
var MediaLoader = (function (_Component) {
 
  _inherits(MediaLoader, _Component);
 

	
 
  function MediaLoader(player, options, ready) {
 
    _classCallCheck(this, MediaLoader);
 

	
 
    _Component.call(this, player, options, ready);
 

	
 
    // If there are no sources when the player is initialized,
 
    // load the first supported playback technology.
 

	
 
    if (!options.playerOptions['sources'] || options.playerOptions['sources'].length === 0) {
 
      for (var i = 0, j = options.playerOptions['techOrder']; i < j.length; i++) {
 
        var techName = _utilsToTitleCaseJs2['default'](j[i]);
 
        var tech = _component2['default'].getComponent(techName);
 

	
 
        // Check if the browser supports this technology
 
        if (tech && tech.isSupported()) {
 
          player.loadTech_(techName);
 
          break;
 
        }
 
      }
 
    } else {
 
      // // Loop through playback technologies (HTML5, Flash) and check for support.
 
      // // Then load the best source.
 
      // // A few assumptions here:
 
      // //   All playback technologies respect preload false.
 
      player.src(options.playerOptions['sources']);
 
    }
 
  }
 

	
 
  return MediaLoader;
 
})(_component2['default']);
 

	
 
_component2['default'].registerComponent('MediaLoader', MediaLoader);
 
exports['default'] = MediaLoader;
 
module.exports = exports['default'];
 

	
 
},{"../component":58,"../utils/to-title-case.js":127,"global/window":2}],107:[function(_dereq_,module,exports){
 
/**
 
 * @file tech.js
 
 * Media Technology Controller - Base class for media playback
 
 * technology controllers like Flash and HTML5
 
 */
 

	
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _component = _dereq_('../component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _tracksTextTrack = _dereq_('../tracks/text-track');
 

	
 
var _tracksTextTrack2 = _interopRequireDefault(_tracksTextTrack);
 

	
 
var _tracksTextTrackList = _dereq_('../tracks/text-track-list');
 

	
 
var _tracksTextTrackList2 = _interopRequireDefault(_tracksTextTrackList);
 

	
 
var _utilsFnJs = _dereq_('../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsLogJs = _dereq_('../utils/log.js');
 

	
 
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
 

	
 
var _utilsTimeRangesJs = _dereq_('../utils/time-ranges.js');
 

	
 
var _utilsBufferJs = _dereq_('../utils/buffer.js');
 

	
 
var _mediaErrorJs = _dereq_('../media-error.js');
 

	
 
var _mediaErrorJs2 = _interopRequireDefault(_mediaErrorJs);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
/**
 
 * Base class for media (HTML5 Video, Flash) controllers
 
 *
 
 * @param {Object=} options Options object
 
 * @param {Function=} ready Ready callback function
 
 * @extends Component
 
 * @class Tech
 
 */
 

	
 
var Tech = (function (_Component) {
 
  _inherits(Tech, _Component);
 

	
 
  function Tech() {
 
    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
 
    var ready = arguments.length <= 1 || arguments[1] === undefined ? function () {} : arguments[1];
 

	
 
    _classCallCheck(this, Tech);
 

	
 
    // we don't want the tech to report user activity automatically.
 
    // This is done manually in addControlsListeners
 
    options.reportTouchActivity = false;
 
    _Component.call(this, null, options, ready);
 

	
 
    // keep track of whether the current source has played at all to
 
    // implement a very limited played()
 
    this.hasStarted_ = false;
 
    this.on('playing', function () {
 
      this.hasStarted_ = true;
 
    });
 
    this.on('loadstart', function () {
 
      this.hasStarted_ = false;
 
    });
 

	
 
    this.textTracks_ = options.textTracks;
 

	
 
    // Manually track progress in cases where the browser/flash player doesn't report it.
 
    if (!this.featuresProgressEvents) {
 
      this.manualProgressOn();
 
    }
 

	
 
    // Manually track timeupdates in cases where the browser/flash player doesn't report it.
 
    if (!this.featuresTimeupdateEvents) {
 
      this.manualTimeUpdatesOn();
 
    }
 

	
 
    if (options.nativeCaptions === false || options.nativeTextTracks === false) {
 
      this.featuresNativeTextTracks = false;
 
    }
 

	
 
    if (!this.featuresNativeTextTracks) {
 
      this.emulateTextTracks();
 
    }
 

	
 
    this.initTextTrackListeners();
 

	
 
    // Turn on component tap events
 
    this.emitTapEvents();
 
  }
 

	
 
  /*
 
   * List of associated text tracks
 
   *
 
   * @type {Array}
 
   * @private
 
   */
 

	
 
  /* Fallbacks for unsupported event types
 
  ================================================================================ */
 
  // Manually trigger progress events based on changes to the buffered amount
 
  // Many flash players and older HTML5 browsers don't send progress or progress-like events
 
  /**
 
   * Turn on progress events
 
   *
 
   * @method manualProgressOn
 
   */
 

	
 
  Tech.prototype.manualProgressOn = function manualProgressOn() {
 
    this.on('durationchange', this.onDurationChange);
 

	
 
    this.manualProgress = true;
 

	
 
    // Trigger progress watching when a source begins loading
 
    this.one('ready', this.trackProgress);
 
  };
 

	
 
  /**
 
   * Turn off progress events
 
   *
 
   * @method manualProgressOff
 
   */
 

	
 
  Tech.prototype.manualProgressOff = function manualProgressOff() {
 
    this.manualProgress = false;
 
    this.stopTrackingProgress();
 

	
 
    this.off('durationchange', this.onDurationChange);
 
  };
 

	
 
  /**
 
   * Track progress
 
   *
 
   * @method trackProgress
 
   */
 

	
 
  Tech.prototype.trackProgress = function trackProgress() {
 
    this.stopTrackingProgress();
 
    this.progressInterval = this.setInterval(Fn.bind(this, function () {
 
      // Don't trigger unless buffered amount is greater than last time
 

	
 
      var numBufferedPercent = this.bufferedPercent();
 

	
 
      if (this.bufferedPercent_ !== numBufferedPercent) {
 
        this.trigger('progress');
 
      }
 

	
 
      this.bufferedPercent_ = numBufferedPercent;
 

	
 
      if (numBufferedPercent === 1) {
 
        this.stopTrackingProgress();
 
      }
 
    }), 500);
 
  };
 

	
 
  /**
 
   * Update duration
 
   *
 
   * @method onDurationChange
 
   */
 

	
 
  Tech.prototype.onDurationChange = function onDurationChange() {
 
    this.duration_ = this.duration();
 
  };
 

	
 
  /**
 
   * Create and get TimeRange object for buffering
 
   *
 
   * @return {TimeRangeObject}
 
   * @method buffered
 
   */
 

	
 
  Tech.prototype.buffered = function buffered() {
 
    return _utilsTimeRangesJs.createTimeRange(0, 0);
 
  };
 

	
 
  /**
 
   * Get buffered percent
 
   *
 
   * @return {Number}
 
   * @method bufferedPercent
 
   */
 

	
 
  Tech.prototype.bufferedPercent = function bufferedPercent() {
 
    return _utilsBufferJs.bufferedPercent(this.buffered(), this.duration_);
 
  };
 

	
 
  /**
 
   * Stops tracking progress by clearing progress interval
 
   *
 
   * @method stopTrackingProgress
 
   */
 

	
 
  Tech.prototype.stopTrackingProgress = function stopTrackingProgress() {
 
    this.clearInterval(this.progressInterval);
 
  };
 

	
 
  /*! Time Tracking -------------------------------------------------------------- */
 
  /**
 
   * Set event listeners for on play and pause and tracking current time
 
   *
 
   * @method manualTimeUpdatesOn
 
   */
 

	
 
  Tech.prototype.manualTimeUpdatesOn = function manualTimeUpdatesOn() {
 
    this.manualTimeUpdates = true;
 

	
 
    this.on('play', this.trackCurrentTime);
 
    this.on('pause', this.stopTrackingCurrentTime);
 
  };
 

	
 
  /**
 
   * Remove event listeners for on play and pause and tracking current time
 
   *
 
   * @method manualTimeUpdatesOff
 
   */
 

	
 
  Tech.prototype.manualTimeUpdatesOff = function manualTimeUpdatesOff() {
 
    this.manualTimeUpdates = false;
 
    this.stopTrackingCurrentTime();
 
    this.off('play', this.trackCurrentTime);
 
    this.off('pause', this.stopTrackingCurrentTime);
 
  };
 

	
 
  /**
 
   * Tracks current time
 
   *
 
   * @method trackCurrentTime
 
   */
 

	
 
  Tech.prototype.trackCurrentTime = function trackCurrentTime() {
 
    if (this.currentTimeInterval) {
 
      this.stopTrackingCurrentTime();
 
    }
 
    this.currentTimeInterval = this.setInterval(function () {
 
      this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });
 
    }, 250); // 42 = 24 fps // 250 is what Webkit uses // FF uses 15
 
  };
 

	
 
  /**
 
   * Turn off play progress tracking (when paused or dragging)
 
   *
 
   * @method stopTrackingCurrentTime
 
   */
 

	
 
  Tech.prototype.stopTrackingCurrentTime = function stopTrackingCurrentTime() {
 
    this.clearInterval(this.currentTimeInterval);
 

	
 
    // #1002 - if the video ends right before the next timeupdate would happen,
 
    // the progress bar won't make it all the way to the end
 
    this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });
 
  };
 

	
 
  /**
 
   * Turn off any manual progress or timeupdate tracking
 
   *
 
   * @method dispose
 
   */
 

	
 
  Tech.prototype.dispose = function dispose() {
 
    // clear out text tracks because we can't reuse them between techs
 
    var textTracks = this.textTracks();
 

	
 
    if (textTracks) {
 
      var i = textTracks.length;
 
      while (i--) {
 
        this.removeRemoteTextTrack(textTracks[i]);
 
      }
 
    }
 

	
 
    // Turn off any manual progress or timeupdate tracking
 
    if (this.manualProgress) {
 
      this.manualProgressOff();
 
    }
 

	
 
    if (this.manualTimeUpdates) {
 
      this.manualTimeUpdatesOff();
 
    }
 

	
 
    _Component.prototype.dispose.call(this);
 
  };
 

	
 
  /**
 
   * When invoked without an argument, returns a MediaError object
 
   * representing the current error state of the player or null if
 
   * there is no error. When invoked with an argument, set the current
 
   * error state of the player.
 
   * @param {MediaError=} err    Optional an error object
 
   * @return {MediaError}        the current error object or null
 
   * @method error
 
   */
 

	
 
  Tech.prototype.error = function error(err) {
 
    if (err !== undefined) {
 
      if (err instanceof _mediaErrorJs2['default']) {
 
        this.error_ = err;
 
      } else {
 
        this.error_ = new _mediaErrorJs2['default'](err);
 
      }
 
      this.trigger('error');
 
    }
 
    return this.error_;
 
  };
 

	
 
  /**
 
   * Return the time ranges that have been played through for the
 
   * current source. This implementation is incomplete. It does not
 
   * track the played time ranges, only whether the source has played
 
   * at all or not.
 
   * @return {TimeRangeObject} a single time range if this video has
 
   * played or an empty set of ranges if not.
 
   * @method played
 
   */
 

	
 
  Tech.prototype.played = function played() {
 
    if (this.hasStarted_) {
 
      return _utilsTimeRangesJs.createTimeRange(0, 0);
 
    }
 
    return _utilsTimeRangesJs.createTimeRange();
 
  };
 

	
 
  /**
 
   * Set current time
 
   *
 
   * @method setCurrentTime
 
   */
 

	
 
  Tech.prototype.setCurrentTime = function setCurrentTime() {
 
    // improve the accuracy of manual timeupdates
 
    if (this.manualTimeUpdates) {
 
      this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });
 
    }
 
  };
 

	
 
  /**
 
   * Initialize texttrack listeners
 
   *
 
   * @method initTextTrackListeners
 
   */
 

	
 
  Tech.prototype.initTextTrackListeners = function initTextTrackListeners() {
 
    var textTrackListChanges = Fn.bind(this, function () {
 
      this.trigger('texttrackchange');
 
    });
 

	
 
    var tracks = this.textTracks();
 

	
 
    if (!tracks) return;
 

	
 
    tracks.addEventListener('removetrack', textTrackListChanges);
 
    tracks.addEventListener('addtrack', textTrackListChanges);
 

	
 
    this.on('dispose', Fn.bind(this, function () {
 
      tracks.removeEventListener('removetrack', textTrackListChanges);
 
      tracks.removeEventListener('addtrack', textTrackListChanges);
 
    }));
 
  };
 

	
 
  /**
 
   * Emulate texttracks
 
   *
 
   * @method emulateTextTracks
 
   */
 

	
 
  Tech.prototype.emulateTextTracks = function emulateTextTracks() {
 
    if (!_globalWindow2['default']['WebVTT'] && this.el().parentNode != null) {
 
      var script = _globalDocument2['default'].createElement('script');
 
      script.src = this.options_['vtt.js'] || '../node_modules/vtt.js/dist/vtt.js';
 
      this.el().parentNode.appendChild(script);
 
      _globalWindow2['default']['WebVTT'] = true;
 
    }
 

	
 
    var tracks = this.textTracks();
 
    if (!tracks) {
 
      return;
 
    }
 

	
 
    var textTracksChanges = Fn.bind(this, function () {
 
      var _this = this;
 

	
 
      var updateDisplay = function updateDisplay() {
 
        return _this.trigger('texttrackchange');
 
      };
 

	
 
      updateDisplay();
 

	
 
      for (var i = 0; i < tracks.length; i++) {
 
        var track = tracks[i];
 
        track.removeEventListener('cuechange', updateDisplay);
 
        if (track.mode === 'showing') {
 
          track.addEventListener('cuechange', updateDisplay);
 
        }
 
      }
 
    });
 

	
 
    tracks.addEventListener('change', textTracksChanges);
 

	
 
    this.on('dispose', function () {
 
      tracks.removeEventListener('change', textTracksChanges);
 
    });
 
  };
 

	
 
  /*
 
   * Provide default methods for text tracks.
 
   *
 
   * Html5 tech overrides these.
 
   */
 

	
 
  /**
 
   * Get texttracks
 
   *
 
   * @returns {TextTrackList}
 
   * @method textTracks
 
   */
 

	
 
  Tech.prototype.textTracks = function textTracks() {
 
    this.textTracks_ = this.textTracks_ || new _tracksTextTrackList2['default']();
 
    return this.textTracks_;
 
  };
 

	
 
  /**
 
   * Get remote texttracks
 
   *
 
   * @returns {TextTrackList}
 
   * @method remoteTextTracks
 
   */
 

	
 
  Tech.prototype.remoteTextTracks = function remoteTextTracks() {
 
    this.remoteTextTracks_ = this.remoteTextTracks_ || new _tracksTextTrackList2['default']();
 
    return this.remoteTextTracks_;
 
  };
 

	
 
  /**
 
   * Creates and returns a remote text track object
 
   *
 
   * @param {String} kind Text track kind (subtitles, captions, descriptions
 
   *                                       chapters and metadata)
 
   * @param {String=} label Label to identify the text track
 
   * @param {String=} language Two letter language abbreviation
 
   * @return {TextTrackObject}
 
   * @method addTextTrack
 
   */
 

	
 
  Tech.prototype.addTextTrack = function addTextTrack(kind, label, language) {
 
    if (!kind) {
 
      throw new Error('TextTrack kind is required but was not provided');
 
    }
 

	
 
    return createTrackHelper(this, kind, label, language);
 
  };
 

	
 
  /**
 
   * Creates and returns a remote text track object
 
   *
 
   * @param {Object} options The object should contain values for
 
   * kind, language, label and src (location of the WebVTT file)
 
   * @return {TextTrackObject}
 
   * @method addRemoteTextTrack
 
   */
 

	
 
  Tech.prototype.addRemoteTextTrack = function addRemoteTextTrack(options) {
 
    var track = createTrackHelper(this, options.kind, options.label, options.language, options);
 
    this.remoteTextTracks().addTrack_(track);
 
    return {
 
      track: track
 
    };
 
  };
 

	
 
  /**
 
   * Remove remote texttrack
 
   *
 
   * @param {TextTrackObject} track Texttrack to remove
 
   * @method removeRemoteTextTrack
 
   */
 

	
 
  Tech.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) {
 
    this.textTracks().removeTrack_(track);
 
    this.remoteTextTracks().removeTrack_(track);
 
  };
 

	
 
  /**
 
   * Provide a default setPoster method for techs
 
   * Poster support for techs should be optional, so we don't want techs to
 
   * break if they don't have a way to set a poster.
 
   *
 
   * @method setPoster
 
   */
 

	
 
  Tech.prototype.setPoster = function setPoster() {};
 

	
 
  return Tech;
 
})(_component2['default']);
 

	
 
Tech.prototype.textTracks_;
 

	
 
var createTrackHelper = function createTrackHelper(self, kind, label, language) {
 
  var options = arguments.length <= 4 || arguments[4] === undefined ? {} : arguments[4];
 

	
 
  var tracks = self.textTracks();
 

	
 
  options.kind = kind;
 

	
 
  if (label) {
 
    options.label = label;
 
  }
 
  if (language) {
 
    options.language = language;
 
  }
 
  options.tech = self;
 

	
 
  var track = new _tracksTextTrack2['default'](options);
 
  tracks.addTrack_(track);
 

	
 
  return track;
 
};
 

	
 
Tech.prototype.featuresVolumeControl = true;
 

	
 
// Resizing plugins using request fullscreen reloads the plugin
 
Tech.prototype.featuresFullscreenResize = false;
 
Tech.prototype.featuresPlaybackRate = false;
 

	
 
// Optional events that we can manually mimic with timers
 
// currently not triggered by video-js-swf
 
Tech.prototype.featuresProgressEvents = false;
 
Tech.prototype.featuresTimeupdateEvents = false;
 

	
 
Tech.prototype.featuresNativeTextTracks = false;
 

	
 
/*
 
 * A functional mixin for techs that want to use the Source Handler pattern.
 
 *
 
 * ##### EXAMPLE:
 
 *
 
 *   Tech.withSourceHandlers.call(MyTech);
 
 *
 
 */
 
Tech.withSourceHandlers = function (_Tech) {
 
  /*
 
   * Register a source handler
 
   * Source handlers are scripts for handling specific formats.
 
   * The source handler pattern is used for adaptive formats (HLS, DASH) that
 
   * manually load video data and feed it into a Source Buffer (Media Source Extensions)
 
   * @param  {Function} handler  The source handler
 
   * @param  {Boolean}  first    Register it before any existing handlers
 
   */
 
  _Tech.registerSourceHandler = function (handler, index) {
 
    var handlers = _Tech.sourceHandlers;
 

	
 
    if (!handlers) {
 
      handlers = _Tech.sourceHandlers = [];
 
    }
 

	
 
    if (index === undefined) {
 
      // add to the end of the list
 
      index = handlers.length;
 
    }
 

	
 
    handlers.splice(index, 0, handler);
 
  };
 

	
 
  /*
 
   * Return the first source handler that supports the source
 
   * TODO: Answer question: should 'probably' be prioritized over 'maybe'
 
   * @param  {Object} source The source object
 
   * @returns {Object}       The first source handler that supports the source
 
   * @returns {null}         Null if no source handler is found
 
   */
 
  _Tech.selectSourceHandler = function (source) {
 
    var handlers = _Tech.sourceHandlers || [];
 
    var can = undefined;
 

	
 
    for (var i = 0; i < handlers.length; i++) {
 
      can = handlers[i].canHandleSource(source);
 

	
 
      if (can) {
 
        return handlers[i];
 
      }
 
    }
 

	
 
    return null;
 
  };
 

	
 
  /*
 
   * Check if the tech can support the given source
 
   * @param  {Object} srcObj  The source object
 
   * @return {String}         'probably', 'maybe', or '' (empty string)
 
   */
 
  _Tech.canPlaySource = function (srcObj) {
 
    var sh = _Tech.selectSourceHandler(srcObj);
 

	
 
    if (sh) {
 
      return sh.canHandleSource(srcObj);
 
    }
 

	
 
    return '';
 
  };
 

	
 
  var originalSeekable = _Tech.prototype.seekable;
 

	
 
  // when a source handler is registered, prefer its implementation of
 
  // seekable when present.
 
  _Tech.prototype.seekable = function () {
 
    if (this.sourceHandler_ && this.sourceHandler_.seekable) {
 
      return this.sourceHandler_.seekable();
 
    }
 
    return originalSeekable.call(this);
 
  };
 

	
 
  /*
 
   * Create a function for setting the source using a source object
 
   * and source handlers.
 
   * Should never be called unless a source handler was found.
 
   * @param {Object} source  A source object with src and type keys
 
   * @return {Tech} self
 
   */
 
  _Tech.prototype.setSource = function (source) {
 
    var sh = _Tech.selectSourceHandler(source);
 

	
 
    if (!sh) {
 
      // Fall back to a native source hander when unsupported sources are
 
      // deliberately set
 
      if (_Tech.nativeSourceHandler) {
 
        sh = _Tech.nativeSourceHandler;
 
      } else {
 
        _utilsLogJs2['default'].error('No source hander found for the current source.');
 
      }
 
    }
 

	
 
    // Dispose any existing source handler
 
    this.disposeSourceHandler();
 
    this.off('dispose', this.disposeSourceHandler);
 

	
 
    this.currentSource_ = source;
 
    this.sourceHandler_ = sh.handleSource(source, this);
 
    this.on('dispose', this.disposeSourceHandler);
 

	
 
    return this;
 
  };
 

	
 
  /*
 
   * Clean up any existing source handler
 
   */
 
  _Tech.prototype.disposeSourceHandler = function () {
 
    if (this.sourceHandler_ && this.sourceHandler_.dispose) {
 
      this.sourceHandler_.dispose();
 
    }
 
  };
 
};
 

	
 
_component2['default'].registerComponent('Tech', Tech);
 
// Old name for Tech
 
_component2['default'].registerComponent('MediaTechController', Tech);
 
exports['default'] = Tech;
 
module.exports = exports['default'];
 

	
 
},{"../component":58,"../media-error.js":94,"../tracks/text-track":114,"../tracks/text-track-list":112,"../utils/buffer.js":116,"../utils/fn.js":120,"../utils/log.js":123,"../utils/time-ranges.js":126,"global/document":1,"global/window":2}],108:[function(_dereq_,module,exports){
 
/**
 
 * @file text-track-cue-list.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
var _utilsBrowserJs = _dereq_('../utils/browser.js');
 

	
 
var browser = _interopRequireWildcard(_utilsBrowserJs);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
/*
 
 * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcuelist
 
 *
 
 * interface TextTrackCueList {
 
 *   readonly attribute unsigned long length;
 
 *   getter TextTrackCue (unsigned long index);
 
 *   TextTrackCue? getCueById(DOMString id);
 
 * };
 
 */
 

	
 
var TextTrackCueList = function TextTrackCueList(cues) {
 
  var list = this;
 

	
 
  if (browser.IS_IE8) {
 
    list = _globalDocument2['default'].createElement('custom');
 

	
 
    for (var prop in TextTrackCueList.prototype) {
 
      list[prop] = TextTrackCueList.prototype[prop];
 
    }
 
  }
 

	
 
  TextTrackCueList.prototype.setCues_.call(list, cues);
 

	
 
  Object.defineProperty(list, 'length', {
 
    get: function get() {
 
      return this.length_;
 
    }
 
  });
 

	
 
  if (browser.IS_IE8) {
 
    return list;
 
  }
 
};
 

	
 
TextTrackCueList.prototype.setCues_ = function (cues) {
 
  var oldLength = this.length || 0;
 
  var i = 0;
 
  var l = cues.length;
 

	
 
  this.cues_ = cues;
 
  this.length_ = cues.length;
 

	
 
  var defineProp = function defineProp(i) {
 
    if (!('' + i in this)) {
 
      Object.defineProperty(this, '' + i, {
 
        get: function get() {
 
          return this.cues_[i];
 
        }
 
      });
 
    }
 
  };
 

	
 
  if (oldLength < l) {
 
    i = oldLength;
 

	
 
    for (; i < l; i++) {
 
      defineProp.call(this, i);
 
    }
 
  }
 
};
 

	
 
TextTrackCueList.prototype.getCueById = function (id) {
 
  var result = null;
 
  for (var i = 0, l = this.length; i < l; i++) {
 
    var cue = this[i];
 
    if (cue.id === id) {
 
      result = cue;
 
      break;
 
    }
 
  }
 

	
 
  return result;
 
};
 

	
 
exports['default'] = TextTrackCueList;
 
module.exports = exports['default'];
 

	
 
},{"../utils/browser.js":115,"global/document":1}],109:[function(_dereq_,module,exports){
 
/**
 
 * @file text-track-display.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _component = _dereq_('../component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _menuMenuJs = _dereq_('../menu/menu.js');
 

	
 
var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs);
 

	
 
var _menuMenuItemJs = _dereq_('../menu/menu-item.js');
 

	
 
var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs);
 

	
 
var _menuMenuButtonJs = _dereq_('../menu/menu-button.js');
 

	
 
var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs);
 

	
 
var _utilsFnJs = _dereq_('../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var darkGray = '#222';
 
var lightGray = '#ccc';
 
var fontMap = {
 
  monospace: 'monospace',
 
  sansSerif: 'sans-serif',
 
  serif: 'serif',
 
  monospaceSansSerif: '"Andale Mono", "Lucida Console", monospace',
 
  monospaceSerif: '"Courier New", monospace',
 
  proportionalSansSerif: 'sans-serif',
 
  proportionalSerif: 'serif',
 
  casual: '"Comic Sans MS", Impact, fantasy',
 
  script: '"Monotype Corsiva", cursive',
 
  smallcaps: '"Andale Mono", "Lucida Console", monospace, sans-serif'
 
};
 

	
 
/**
 
 * The component for displaying text track cues
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends Component
 
 * @class TextTrackDisplay
 
 */
 

	
 
var TextTrackDisplay = (function (_Component) {
 
  _inherits(TextTrackDisplay, _Component);
 

	
 
  function TextTrackDisplay(player, options, ready) {
 
    _classCallCheck(this, TextTrackDisplay);
 

	
 
    _Component.call(this, player, options, ready);
 

	
 
    player.on('loadstart', Fn.bind(this, this.toggleDisplay));
 
    player.on('texttrackchange', Fn.bind(this, this.updateDisplay));
 

	
 
    // This used to be called during player init, but was causing an error
 
    // if a track should show by default and the display hadn't loaded yet.
 
    // Should probably be moved to an external track loader when we support
 
    // tracks that don't need a display.
 
    player.ready(Fn.bind(this, function () {
 
      if (player.tech_ && player.tech_['featuresNativeTextTracks']) {
 
        this.hide();
 
        return;
 
      }
 

	
 
      player.on('fullscreenchange', Fn.bind(this, this.updateDisplay));
 

	
 
      var tracks = this.options_.playerOptions['tracks'] || [];
 
      for (var i = 0; i < tracks.length; i++) {
 
        var track = tracks[i];
 
        this.player_.addRemoteTextTrack(track);
 
      }
 
    }));
 
  }
 

	
 
  /**
 
  * Add cue HTML to display
 
  *
 
  * @param {Number} color Hex number for color, like #f0e
 
  * @param {Number} opacity Value for opacity,0.0 - 1.0
 
  * @return {RGBAColor} In the form 'rgba(255, 0, 0, 0.3)'
 
  * @method constructColor
 
  */
 

	
 
  /**
 
   * Toggle display texttracks
 
   *
 
   * @method toggleDisplay
 
   */
 

	
 
  TextTrackDisplay.prototype.toggleDisplay = function toggleDisplay() {
 
    if (this.player_.tech_ && this.player_.tech_['featuresNativeTextTracks']) {
 
      this.hide();
 
    } else {
 
      this.show();
 
    }
 
  };
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  TextTrackDisplay.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-text-track-display'
 
    });
 
  };
 

	
 
  /**
 
   * Clear display texttracks
 
   *
 
   * @method clearDisplay
 
   */
 

	
 
  TextTrackDisplay.prototype.clearDisplay = function clearDisplay() {
 
    if (typeof _globalWindow2['default']['WebVTT'] === 'function') {
 
      _globalWindow2['default']['WebVTT']['processCues'](_globalWindow2['default'], [], this.el_);
 
    }
 
  };
 

	
 
  /**
 
   * Update display texttracks
 
   *
 
   * @method updateDisplay
 
   */
 

	
 
  TextTrackDisplay.prototype.updateDisplay = function updateDisplay() {
 
    var tracks = this.player_.textTracks();
 

	
 
    this.clearDisplay();
 

	
 
    if (!tracks) {
 
      return;
 
    }
 

	
 
    for (var i = 0; i < tracks.length; i++) {
 
      var track = tracks[i];
 
      if (track['mode'] === 'showing') {
 
        this.updateForTrack(track);
 
      }
 
    }
 
  };
 

	
 
  /**
 
   * Add texttrack to texttrack list
 
   *
 
   * @param {TextTrackObject} track Texttrack object to be added to list
 
   * @method updateForTrack
 
   */
 

	
 
  TextTrackDisplay.prototype.updateForTrack = function updateForTrack(track) {
 
    if (typeof _globalWindow2['default']['WebVTT'] !== 'function' || !track['activeCues']) {
 
      return;
 
    }
 

	
 
    var overrides = this.player_['textTrackSettings'].getValues();
 

	
 
    var cues = [];
 
    for (var _i = 0; _i < track['activeCues'].length; _i++) {
 
      cues.push(track['activeCues'][_i]);
 
    }
 

	
 
    _globalWindow2['default']['WebVTT']['processCues'](_globalWindow2['default'], track['activeCues'], this.el_);
 

	
 
    var i = cues.length;
 
    while (i--) {
 
      var cueDiv = cues[i].displayState;
 
      if (overrides.color) {
 
        cueDiv.firstChild.style.color = overrides.color;
 
      }
 
      if (overrides.textOpacity) {
 
        tryUpdateStyle(cueDiv.firstChild, 'color', constructColor(overrides.color || '#fff', overrides.textOpacity));
 
      }
 
      if (overrides.backgroundColor) {
 
        cueDiv.firstChild.style.backgroundColor = overrides.backgroundColor;
 
      }
 
      if (overrides.backgroundOpacity) {
 
        tryUpdateStyle(cueDiv.firstChild, 'backgroundColor', constructColor(overrides.backgroundColor || '#000', overrides.backgroundOpacity));
 
      }
 
      if (overrides.windowColor) {
 
        if (overrides.windowOpacity) {
 
          tryUpdateStyle(cueDiv, 'backgroundColor', constructColor(overrides.windowColor, overrides.windowOpacity));
 
        } else {
 
          cueDiv.style.backgroundColor = overrides.windowColor;
 
        }
 
      }
 
      if (overrides.edgeStyle) {
 
        if (overrides.edgeStyle === 'dropshadow') {
 
          cueDiv.firstChild.style.textShadow = '2px 2px 3px ' + darkGray + ', 2px 2px 4px ' + darkGray + ', 2px 2px 5px ' + darkGray;
 
        } else if (overrides.edgeStyle === 'raised') {
 
          cueDiv.firstChild.style.textShadow = '1px 1px ' + darkGray + ', 2px 2px ' + darkGray + ', 3px 3px ' + darkGray;
 
        } else if (overrides.edgeStyle === 'depressed') {
 
          cueDiv.firstChild.style.textShadow = '1px 1px ' + lightGray + ', 0 1px ' + lightGray + ', -1px -1px ' + darkGray + ', 0 -1px ' + darkGray;
 
        } else if (overrides.edgeStyle === 'uniform') {
 
          cueDiv.firstChild.style.textShadow = '0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray;
 
        }
 
      }
 
      if (overrides.fontPercent && overrides.fontPercent !== 1) {
 
        var fontSize = _globalWindow2['default'].parseFloat(cueDiv.style.fontSize);
 
        cueDiv.style.fontSize = fontSize * overrides.fontPercent + 'px';
 
        cueDiv.style.height = 'auto';
 
        cueDiv.style.top = 'auto';
 
        cueDiv.style.bottom = '2px';
 
      }
 
      if (overrides.fontFamily && overrides.fontFamily !== 'default') {
 
        if (overrides.fontFamily === 'small-caps') {
 
          cueDiv.firstChild.style.fontVariant = 'small-caps';
 
        } else {
 
          cueDiv.firstChild.style.fontFamily = fontMap[overrides.fontFamily];
 
        }
 
      }
 
    }
 
  };
 

	
 
  return TextTrackDisplay;
 
})(_component2['default']);
 

	
 
function constructColor(color, opacity) {
 
  return 'rgba(' +
 
  // color looks like "#f0e"
 
  parseInt(color[1] + color[1], 16) + ',' + parseInt(color[2] + color[2], 16) + ',' + parseInt(color[3] + color[3], 16) + ',' + opacity + ')';
 
}
 

	
 
/**
 
 * Try to update style
 
 * Some style changes will throw an error, particularly in IE8. Those should be noops.
 
 *
 
 * @param {Element} el The element to be styles
 
 * @param {CSSProperty} style The CSS property to be styled
 
 * @param {CSSStyle} rule The actual style to be applied to the property
 
 * @method tryUpdateStyle
 
 */
 
function tryUpdateStyle(el, style, rule) {
 
  //
 
  try {
 
    el.style[style] = rule;
 
  } catch (e) {}
 
}
 

	
 
_component2['default'].registerComponent('TextTrackDisplay', TextTrackDisplay);
 
exports['default'] = TextTrackDisplay;
 
module.exports = exports['default'];
 

	
 
},{"../component":58,"../menu/menu-button.js":95,"../menu/menu-item.js":96,"../menu/menu.js":97,"../utils/fn.js":120,"global/document":1,"global/window":2}],110:[function(_dereq_,module,exports){
 
/**
 
 * @file text-track-enums.js
 
 *
 
 * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackmode
 
 *
 
 * enum TextTrackMode { "disabled",  "hidden",  "showing" };
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 
var TextTrackMode = {
 
  'disabled': 'disabled',
 
  'hidden': 'hidden',
 
  'showing': 'showing'
 
};
 

	
 
/*
 
 * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackkind
 
 *
 
 * enum TextTrackKind { "subtitles",  "captions",  "descriptions",  "chapters",  "metadata" };
 
 */
 
var TextTrackKind = {
 
  'subtitles': 'subtitles',
 
  'captions': 'captions',
 
  'descriptions': 'descriptions',
 
  'chapters': 'chapters',
 
  'metadata': 'metadata'
 
};
 

	
 
exports.TextTrackMode = TextTrackMode;
 
exports.TextTrackKind = TextTrackKind;
 

	
 
},{}],111:[function(_dereq_,module,exports){
 
/**
 
 * Utilities for capturing text track state and re-creating tracks
 
 * based on a capture.
 
 *
 
 * @file text-track-list-converter.js
 
 */
 

	
 
/**
 
 * Examine a single text track and return a JSON-compatible javascript
 
 * object that represents the text track's state.
 
 * @param track {TextTrackObject} the text track to query
 
 * @return {Object} a serializable javascript representation of the
 
 * @private
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 
var trackToJson_ = function trackToJson_(track) {
 
  return {
 
    kind: track.kind,
 
    label: track.label,
 
    language: track.language,
 
    id: track.id,
 
    inBandMetadataTrackDispatchType: track.inBandMetadataTrackDispatchType,
 
    mode: track.mode,
 
    cues: track.cues && Array.prototype.map.call(track.cues, function (cue) {
 
      return {
 
        startTime: cue.startTime,
 
        endTime: cue.endTime,
 
        text: cue.text,
 
        id: cue.id
 
      };
 
    }),
 
    src: track.src
 
  };
 
};
 

	
 
/**
 
 * Examine a tech and return a JSON-compatible javascript array that
 
 * represents the state of all text tracks currently configured. The
 
 * return array is compatible with `jsonToTextTracks`.
 
 * @param tech {tech} the tech object to query
 
 * @return {Array} a serializable javascript representation of the
 
 * @function textTracksToJson
 
 */
 
var textTracksToJson = function textTracksToJson(tech) {
 
  var trackEls = tech.el().querySelectorAll('track');
 

	
 
  var trackObjs = Array.prototype.map.call(trackEls, function (t) {
 
    return t.track;
 
  });
 
  var tracks = Array.prototype.map.call(trackEls, function (trackEl) {
 
    var json = trackToJson_(trackEl.track);
 
    json.src = trackEl.src;
 
    return json;
 
  });
 

	
 
  return tracks.concat(Array.prototype.filter.call(tech.textTracks(), function (track) {
 
    return trackObjs.indexOf(track) === -1;
 
  }).map(trackToJson_));
 
};
 

	
 
/**
 
 * Creates a set of remote text tracks on a tech based on an array of
 
 * javascript text track representations.
 
 * @param json {Array} an array of text track representation objects,
 
 * like those that would be produced by `textTracksToJson`
 
 * @param tech {tech} the tech to create text tracks on
 
 * @function jsonToTextTracks
 
 */
 
var jsonToTextTracks = function jsonToTextTracks(json, tech) {
 
  json.forEach(function (track) {
 
    var addedTrack = tech.addRemoteTextTrack(track).track;
 
    if (!track.src && track.cues) {
 
      track.cues.forEach(function (cue) {
 
        return addedTrack.addCue(cue);
 
      });
 
    }
 
  });
 

	
 
  return tech.textTracks();
 
};
 

	
 
exports['default'] = { textTracksToJson: textTracksToJson, jsonToTextTracks: jsonToTextTracks, trackToJson_: trackToJson_ };
 
module.exports = exports['default'];
 

	
 
},{}],112:[function(_dereq_,module,exports){
 
/**
 
 * @file text-track-list.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _eventTarget = _dereq_('../event-target');
 

	
 
var _eventTarget2 = _interopRequireDefault(_eventTarget);
 

	
 
var _utilsFnJs = _dereq_('../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsBrowserJs = _dereq_('../utils/browser.js');
 

	
 
var browser = _interopRequireWildcard(_utilsBrowserJs);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
/*
 
 * https://html.spec.whatwg.org/multipage/embedded-content.html#texttracklist
 
 *
 
 * interface TextTrackList : EventTarget {
 
 *   readonly attribute unsigned long length;
 
 *   getter TextTrack (unsigned long index);
 
 *   TextTrack? getTrackById(DOMString id);
 
 *
 
 *   attribute EventHandler onchange;
 
 *   attribute EventHandler onaddtrack;
 
 *   attribute EventHandler onremovetrack;
 
 * };
 
 */
 
var TextTrackList = function TextTrackList(tracks) {
 
  var list = this;
 

	
 
  if (browser.IS_IE8) {
 
    list = _globalDocument2['default'].createElement('custom');
 

	
 
    for (var prop in TextTrackList.prototype) {
 
      list[prop] = TextTrackList.prototype[prop];
 
    }
 
  }
 

	
 
  tracks = tracks || [];
 
  list.tracks_ = [];
 

	
 
  Object.defineProperty(list, 'length', {
 
    get: function get() {
 
      return this.tracks_.length;
 
    }
 
  });
 

	
 
  for (var i = 0; i < tracks.length; i++) {
 
    list.addTrack_(tracks[i]);
 
  }
 

	
 
  if (browser.IS_IE8) {
 
    return list;
 
  }
 
};
 

	
 
TextTrackList.prototype = Object.create(_eventTarget2['default'].prototype);
 
TextTrackList.prototype.constructor = TextTrackList;
 

	
 
/*
 
 * change - One or more tracks in the track list have been enabled or disabled.
 
 * addtrack - A track has been added to the track list.
 
 * removetrack - A track has been removed from the track list.
 
 */
 
TextTrackList.prototype.allowedEvents_ = {
 
  'change': 'change',
 
  'addtrack': 'addtrack',
 
  'removetrack': 'removetrack'
 
};
 

	
 
// emulate attribute EventHandler support to allow for feature detection
 
for (var _event in TextTrackList.prototype.allowedEvents_) {
 
  TextTrackList.prototype['on' + _event] = null;
 
}
 

	
 
TextTrackList.prototype.addTrack_ = function (track) {
 
  var index = this.tracks_.length;
 
  if (!('' + index in this)) {
 
    Object.defineProperty(this, index, {
 
      get: function get() {
 
        return this.tracks_[index];
 
      }
 
    });
 
  }
 

	
 
  track.addEventListener('modechange', Fn.bind(this, function () {
 
    this.trigger('change');
 
  }));
 
  this.tracks_.push(track);
 

	
 
  this.trigger({
 
    type: 'addtrack',
 
    track: track
 
  });
 
};
 

	
 
TextTrackList.prototype.removeTrack_ = function (rtrack) {
 
  var result = null;
 
  var track = undefined;
 

	
 
  for (var i = 0, l = this.length; i < l; i++) {
 
    track = this[i];
 
    if (track === rtrack) {
 
      this.tracks_.splice(i, 1);
 
      break;
 
    }
 
  }
 

	
 
  this.trigger({
 
    type: 'removetrack',
 
    track: track
 
  });
 
};
 

	
 
TextTrackList.prototype.getTrackById = function (id) {
 
  var result = null;
 

	
 
  for (var i = 0, l = this.length; i < l; i++) {
 
    var track = this[i];
 
    if (track.id === id) {
 
      result = track;
 
      break;
 
    }
 
  }
 

	
 
  return result;
 
};
 

	
 
exports['default'] = TextTrackList;
 
module.exports = exports['default'];
 

	
 
},{"../event-target":90,"../utils/browser.js":115,"../utils/fn.js":120,"global/document":1}],113:[function(_dereq_,module,exports){
 
/**
 
 * @file text-track-settings.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 

	
 
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 

	
 
var _component = _dereq_('../component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _utilsEventsJs = _dereq_('../utils/events.js');
 

	
 
var Events = _interopRequireWildcard(_utilsEventsJs);
 

	
 
var _utilsFnJs = _dereq_('../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsLogJs = _dereq_('../utils/log.js');
 

	
 
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
 

	
 
var _safeJsonParseTuple = _dereq_('safe-json-parse/tuple');
 

	
 
var _safeJsonParseTuple2 = _interopRequireDefault(_safeJsonParseTuple);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
/**
 
 * Manipulate settings of texttracks
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @extends Component
 
 * @class TextTrackSettings
 
 */
 

	
 
var TextTrackSettings = (function (_Component) {
 
  _inherits(TextTrackSettings, _Component);
 

	
 
  function TextTrackSettings(player, options) {
 
    _classCallCheck(this, TextTrackSettings);
 

	
 
    _Component.call(this, player, options);
 
    this.hide();
 

	
 
    // Grab `persistTextTrackSettings` from the player options if not passed in child options
 
    if (options.persistTextTrackSettings === undefined) {
 
      this.options_.persistTextTrackSettings = this.options_.playerOptions.persistTextTrackSettings;
 
    }
 

	
 
    Events.on(this.el().querySelector('.vjs-done-button'), 'click', Fn.bind(this, function () {
 
      this.saveSettings();
 
      this.hide();
 
    }));
 

	
 
    Events.on(this.el().querySelector('.vjs-default-button'), 'click', Fn.bind(this, function () {
 
      this.el().querySelector('.vjs-fg-color > select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-bg-color > select').selectedIndex = 0;
 
      this.el().querySelector('.window-color > select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-text-opacity > select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-bg-opacity > select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-window-opacity > select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-edge-style select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-font-family select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-font-percent select').selectedIndex = 2;
 
      this.updateDisplay();
 
    }));
 

	
 
    Events.on(this.el().querySelector('.vjs-fg-color > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-bg-color > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.window-color > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-text-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-bg-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-window-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-font-percent select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-edge-style select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-font-family select'), 'change', Fn.bind(this, this.updateDisplay));
 

	
 
    if (this.options_.persistTextTrackSettings) {
 
      this.restoreSettings();
 
    }
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 

	
 
  TextTrackSettings.prototype.createEl = function createEl() {
 
    return _Component.prototype.createEl.call(this, 'div', {
 
      className: 'vjs-caption-settings vjs-modal-overlay',
 
      innerHTML: captionOptionsMenuTemplate()
 
    });
 
  };
 

	
 
  /**
 
   * Get texttrack settings 
 
   * Settings are
 
   * .vjs-edge-style
 
   * .vjs-font-family
 
   * .vjs-fg-color
 
   * .vjs-text-opacity
 
   * .vjs-bg-color
 
   * .vjs-bg-opacity
 
   * .window-color
 
   * .vjs-window-opacity 
 
   *
 
   * @return {Object} 
 
   * @method getValues
 
   */
 

	
 
  TextTrackSettings.prototype.getValues = function getValues() {
 
    var el = this.el();
 

	
 
    var textEdge = getSelectedOptionValue(el.querySelector('.vjs-edge-style select'));
 
    var fontFamily = getSelectedOptionValue(el.querySelector('.vjs-font-family select'));
 
    var fgColor = getSelectedOptionValue(el.querySelector('.vjs-fg-color > select'));
 
    var textOpacity = getSelectedOptionValue(el.querySelector('.vjs-text-opacity > select'));
 
    var bgColor = getSelectedOptionValue(el.querySelector('.vjs-bg-color > select'));
 
    var bgOpacity = getSelectedOptionValue(el.querySelector('.vjs-bg-opacity > select'));
 
    var windowColor = getSelectedOptionValue(el.querySelector('.window-color > select'));
 
    var windowOpacity = getSelectedOptionValue(el.querySelector('.vjs-window-opacity > select'));
 
    var fontPercent = _globalWindow2['default']['parseFloat'](getSelectedOptionValue(el.querySelector('.vjs-font-percent > select')));
 

	
 
    var result = {
 
      'backgroundOpacity': bgOpacity,
 
      'textOpacity': textOpacity,
 
      'windowOpacity': windowOpacity,
 
      'edgeStyle': textEdge,
 
      'fontFamily': fontFamily,
 
      'color': fgColor,
 
      'backgroundColor': bgColor,
 
      'windowColor': windowColor,
 
      'fontPercent': fontPercent
 
    };
 
    for (var _name in result) {
 
      if (result[_name] === '' || result[_name] === 'none' || _name === 'fontPercent' && result[_name] === 1.00) {
 
        delete result[_name];
 
      }
 
    }
 
    return result;
 
  };
 

	
 
  /**
 
   * Set texttrack settings 
 
   * Settings are
 
   * .vjs-edge-style
 
   * .vjs-font-family
 
   * .vjs-fg-color
 
   * .vjs-text-opacity
 
   * .vjs-bg-color
 
   * .vjs-bg-opacity
 
   * .window-color
 
   * .vjs-window-opacity 
 
   *
 
   * @param {Object} values Object with texttrack setting values
 
   * @method setValues
 
   */
 

	
 
  TextTrackSettings.prototype.setValues = function setValues(values) {
 
    var el = this.el();
 

	
 
    setSelectedOption(el.querySelector('.vjs-edge-style select'), values.edgeStyle);
 
    setSelectedOption(el.querySelector('.vjs-font-family select'), values.fontFamily);
 
    setSelectedOption(el.querySelector('.vjs-fg-color > select'), values.color);
 
    setSelectedOption(el.querySelector('.vjs-text-opacity > select'), values.textOpacity);
 
    setSelectedOption(el.querySelector('.vjs-bg-color > select'), values.backgroundColor);
 
    setSelectedOption(el.querySelector('.vjs-bg-opacity > select'), values.backgroundOpacity);
 
    setSelectedOption(el.querySelector('.window-color > select'), values.windowColor);
 
    setSelectedOption(el.querySelector('.vjs-window-opacity > select'), values.windowOpacity);
 

	
 
    var fontPercent = values.fontPercent;
 

	
 
    if (fontPercent) {
 
      fontPercent = fontPercent.toFixed(2);
 
    }
 

	
 
    setSelectedOption(el.querySelector('.vjs-font-percent > select'), fontPercent);
 
  };
 

	
 
  /**
 
   * Restore texttrack settings 
 
   *
 
   * @method restoreSettings
 
   */
 

	
 
  TextTrackSettings.prototype.restoreSettings = function restoreSettings() {
 
    var _safeParseTuple = _safeJsonParseTuple2['default'](_globalWindow2['default'].localStorage.getItem('vjs-text-track-settings'));
 

	
 
    var err = _safeParseTuple[0];
 
    var values = _safeParseTuple[1];
 

	
 
    if (err) {
 
      _utilsLogJs2['default'].error(err);
 
    }
 

	
 
    if (values) {
 
      this.setValues(values);
 
    }
 
  };
 

	
 
  /**
 
   * Save texttrack settings to local storage 
 
   *
 
   * @method saveSettings
 
   */
 

	
 
  TextTrackSettings.prototype.saveSettings = function saveSettings() {
 
    if (!this.options_.persistTextTrackSettings) {
 
      return;
 
    }
 

	
 
    var values = this.getValues();
 
    try {
 
      if (Object.getOwnPropertyNames(values).length > 0) {
 
        _globalWindow2['default'].localStorage.setItem('vjs-text-track-settings', JSON.stringify(values));
 
      } else {
 
        _globalWindow2['default'].localStorage.removeItem('vjs-text-track-settings');
 
      }
 
    } catch (e) {}
 
  };
 

	
 
  /**
 
   * Update display of texttrack settings  
 
   *
 
   * @method updateDisplay
 
   */
 

	
 
  TextTrackSettings.prototype.updateDisplay = function updateDisplay() {
 
    var ttDisplay = this.player_.getChild('textTrackDisplay');
 
    if (ttDisplay) {
 
      ttDisplay.updateDisplay();
 
    }
 
  };
 

	
 
  return TextTrackSettings;
 
})(_component2['default']);
 

	
 
_component2['default'].registerComponent('TextTrackSettings', TextTrackSettings);
 

	
 
function getSelectedOptionValue(target) {
 
  var selectedOption = undefined;
 
  // not all browsers support selectedOptions, so, fallback to options
 
  if (target.selectedOptions) {
 
    selectedOption = target.selectedOptions[0];
 
  } else if (target.options) {
 
    selectedOption = target.options[target.options.selectedIndex];
 
  }
 

	
 
  return selectedOption.value;
 
}
 

	
 
function setSelectedOption(target, value) {
 
  if (!value) {
 
    return;
 
  }
 

	
 
  var i = undefined;
 
  for (i = 0; i < target.options.length; i++) {
 
    var option = target.options[i];
 
    if (option.value === value) {
 
      break;
 
    }
 
  }
 

	
 
  target.selectedIndex = i;
 
}
 

	
 
function captionOptionsMenuTemplate() {
 
  var template = '<div class="vjs-tracksettings">\n      <div class="vjs-tracksettings-colors">\n        <div class="vjs-fg-color vjs-tracksetting">\n            <label class="vjs-label">Foreground</label>\n            <select>\n              <option value="">---</option>\n              <option value="#FFF">White</option>\n              <option value="#000">Black</option>\n              <option value="#F00">Red</option>\n              <option value="#0F0">Green</option>\n              <option value="#00F">Blue</option>\n              <option value="#FF0">Yellow</option>\n              <option value="#F0F">Magenta</option>\n              <option value="#0FF">Cyan</option>\n            </select>\n            <span class="vjs-text-opacity vjs-opacity">\n              <select>\n                <option value="">---</option>\n                <option value="1">Opaque</option>\n                <option value="0.5">Semi-Opaque</option>\n              </select>\n            </span>\n        </div> <!-- vjs-fg-color -->\n        <div class="vjs-bg-color vjs-tracksetting">\n            <label class="vjs-label">Background</label>\n            <select>\n              <option value="">---</option>\n              <option value="#FFF">White</option>\n              <option value="#000">Black</option>\n              <option value="#F00">Red</option>\n              <option value="#0F0">Green</option>\n              <option value="#00F">Blue</option>\n              <option value="#FF0">Yellow</option>\n              <option value="#F0F">Magenta</option>\n              <option value="#0FF">Cyan</option>\n            </select>\n            <span class="vjs-bg-opacity vjs-opacity">\n                <select>\n                  <option value="">---</option>\n                  <option value="1">Opaque</option>\n                  <option value="0.5">Semi-Transparent</option>\n                  <option value="0">Transparent</option>\n                </select>\n            </span>\n        </div> <!-- vjs-bg-color -->\n        <div class="window-color vjs-tracksetting">\n            <label class="vjs-label">Window</label>\n            <select>\n              <option value="">---</option>\n              <option value="#FFF">White</option>\n              <option value="#000">Black</option>\n              <option value="#F00">Red</option>\n              <option value="#0F0">Green</option>\n              <option value="#00F">Blue</option>\n              <option value="#FF0">Yellow</option>\n              <option value="#F0F">Magenta</option>\n              <option value="#0FF">Cyan</option>\n            </select>\n            <span class="vjs-window-opacity vjs-opacity">\n                <select>\n                  <option value="">---</option>\n                  <option value="1">Opaque</option>\n                  <option value="0.5">Semi-Transparent</option>\n                  <option value="0">Transparent</option>\n                </select>\n            </span>\n        </div> <!-- vjs-window-color -->\n      </div> <!-- vjs-tracksettings -->\n      <div class="vjs-tracksettings-font">\n        <div class="vjs-font-percent vjs-tracksetting">\n          <label class="vjs-label">Font Size</label>\n          <select>\n            <option value="0.50">50%</option>\n            <option value="0.75">75%</option>\n            <option value="1.00" selected>100%</option>\n            <option value="1.25">125%</option>\n            <option value="1.50">150%</option>\n            <option value="1.75">175%</option>\n            <option value="2.00">200%</option>\n            <option value="3.00">300%</option>\n            <option value="4.00">400%</option>\n          </select>\n        </div> <!-- vjs-font-percent -->\n        <div class="vjs-edge-style vjs-tracksetting">\n          <label class="vjs-label">Text Edge Style</label>\n          <select>\n            <option value="none">None</option>\n            <option value="raised">Raised</option>\n            <option value="depressed">Depressed</option>\n            <option value="uniform">Uniform</option>\n            <option value="dropshadow">Dropshadow</option>\n          </select>\n        </div> <!-- vjs-edge-style -->\n        <div class="vjs-font-family vjs-tracksetting">\n          <label class="vjs-label">Font Family</label>\n          <select>\n            <option value="">Default</option>\n            <option value="monospaceSerif">Monospace Serif</option>\n            <option value="proportionalSerif">Proportional Serif</option>\n            <option value="monospaceSansSerif">Monospace Sans-Serif</option>\n            <option value="proportionalSansSerif">Proportional Sans-Serif</option>\n            <option value="casual">Casual</option>\n            <option value="script">Script</option>\n            <option value="small-caps">Small Caps</option>\n          </select>\n        </div> <!-- vjs-font-family -->\n      </div>\n    </div>\n    <div class="vjs-tracksettings-controls">\n      <button class="vjs-default-button">Defaults</button>\n      <button class="vjs-done-button">Done</button>\n    </div>';
 

	
 
  return template;
 
}
 

	
 
exports['default'] = TextTrackSettings;
 
module.exports = exports['default'];
 

	
 
},{"../component":58,"../utils/events.js":119,"../utils/fn.js":120,"../utils/log.js":123,"global/window":2,"safe-json-parse/tuple":48}],114:[function(_dereq_,module,exports){
 
/**
 
 * @file text-track.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _textTrackCueList = _dereq_('./text-track-cue-list');
 

	
 
var _textTrackCueList2 = _interopRequireDefault(_textTrackCueList);
 

	
 
var _utilsFnJs = _dereq_('../utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _utilsGuidJs = _dereq_('../utils/guid.js');
 

	
 
var Guid = _interopRequireWildcard(_utilsGuidJs);
 

	
 
var _utilsBrowserJs = _dereq_('../utils/browser.js');
 

	
 
var browser = _interopRequireWildcard(_utilsBrowserJs);
 

	
 
var _textTrackEnums = _dereq_('./text-track-enums');
 

	
 
var TextTrackEnum = _interopRequireWildcard(_textTrackEnums);
 

	
 
var _utilsLogJs = _dereq_('../utils/log.js');
 

	
 
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
 

	
 
var _eventTarget = _dereq_('../event-target');
 

	
 
var _eventTarget2 = _interopRequireDefault(_eventTarget);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _utilsUrlJs = _dereq_('../utils/url.js');
 

	
 
var _xhr = _dereq_('xhr');
 

	
 
var _xhr2 = _interopRequireDefault(_xhr);
 

	
 
/*
 
 * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrack
 
 *
 
 * interface TextTrack : EventTarget {
 
 *   readonly attribute TextTrackKind kind;
 
 *   readonly attribute DOMString label;
 
 *   readonly attribute DOMString language;
 
 *
 
 *   readonly attribute DOMString id;
 
 *   readonly attribute DOMString inBandMetadataTrackDispatchType;
 
 *
 
 *   attribute TextTrackMode mode;
 
 *
 
 *   readonly attribute TextTrackCueList? cues;
 
 *   readonly attribute TextTrackCueList? activeCues;
 
 *
 
 *   void addCue(TextTrackCue cue);
 
 *   void removeCue(TextTrackCue cue);
 
 *
 
 *   attribute EventHandler oncuechange;
 
 * };
 
 */
 
var TextTrack = function TextTrack() {
 
  var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
 

	
 
  if (!options.tech) {
 
    throw new Error('A tech was not provided.');
 
  }
 

	
 
  var tt = this;
 
  if (browser.IS_IE8) {
 
    tt = _globalDocument2['default'].createElement('custom');
 

	
 
    for (var prop in TextTrack.prototype) {
 
      tt[prop] = TextTrack.prototype[prop];
 
    }
 
  }
 

	
 
  tt.tech_ = options.tech;
 

	
 
  var mode = TextTrackEnum.TextTrackMode[options['mode']] || 'disabled';
 
  var kind = TextTrackEnum.TextTrackKind[options['kind']] || 'subtitles';
 
  var label = options['label'] || '';
 
  var language = options['language'] || options['srclang'] || '';
 
  var id = options['id'] || 'vjs_text_track_' + Guid.newGUID();
 

	
 
  if (kind === 'metadata' || kind === 'chapters') {
 
    mode = 'hidden';
 
  }
 

	
 
  tt.cues_ = [];
 
  tt.activeCues_ = [];
 

	
 
  var cues = new _textTrackCueList2['default'](tt.cues_);
 
  var activeCues = new _textTrackCueList2['default'](tt.activeCues_);
 

	
 
  var changed = false;
 
  var timeupdateHandler = Fn.bind(tt, function () {
 
    this['activeCues'];
 
    if (changed) {
 
      this['trigger']('cuechange');
 
      changed = false;
 
    }
 
  });
 
  if (mode !== 'disabled') {
 
    tt.tech_.on('timeupdate', timeupdateHandler);
 
  }
 

	
 
  Object.defineProperty(tt, 'kind', {
 
    get: function get() {
 
      return kind;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  Object.defineProperty(tt, 'label', {
 
    get: function get() {
 
      return label;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  Object.defineProperty(tt, 'language', {
 
    get: function get() {
 
      return language;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  Object.defineProperty(tt, 'id', {
 
    get: function get() {
 
      return id;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  Object.defineProperty(tt, 'mode', {
 
    get: function get() {
 
      return mode;
 
    },
 
    set: function set(newMode) {
 
      if (!TextTrackEnum.TextTrackMode[newMode]) {
 
        return;
 
      }
 
      mode = newMode;
 
      if (mode === 'showing') {
 
        this.tech_.on('timeupdate', timeupdateHandler);
 
      }
 
      this.trigger('modechange');
 
    }
 
  });
 

	
 
  Object.defineProperty(tt, 'cues', {
 
    get: function get() {
 
      if (!this.loaded_) {
 
        return null;
 
      }
 

	
 
      return cues;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  Object.defineProperty(tt, 'activeCues', {
 
    get: function get() {
 
      if (!this.loaded_) {
 
        return null;
 
      }
 

	
 
      if (this['cues'].length === 0) {
 
        return activeCues; // nothing to do
 
      }
 

	
 
      var ct = this.tech_.currentTime();
 
      var active = [];
 

	
 
      for (var i = 0, l = this['cues'].length; i < l; i++) {
 
        var cue = this['cues'][i];
 
        if (cue['startTime'] <= ct && cue['endTime'] >= ct) {
 
          active.push(cue);
 
        } else if (cue['startTime'] === cue['endTime'] && cue['startTime'] <= ct && cue['startTime'] + 0.5 >= ct) {
 
          active.push(cue);
 
        }
 
      }
 

	
 
      changed = false;
 

	
 
      if (active.length !== this.activeCues_.length) {
 
        changed = true;
 
      } else {
 
        for (var i = 0; i < active.length; i++) {
 
          if (indexOf.call(this.activeCues_, active[i]) === -1) {
 
            changed = true;
 
          }
 
        }
 
      }
 

	
 
      this.activeCues_ = active;
 
      activeCues.setCues_(this.activeCues_);
 

	
 
      return activeCues;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  if (options.src) {
 
    tt.src = options.src;
 
    loadTrack(options.src, tt);
 
  } else {
 
    tt.loaded_ = true;
 
  }
 

	
 
  if (browser.IS_IE8) {
 
    return tt;
 
  }
 
};
 

	
 
TextTrack.prototype = Object.create(_eventTarget2['default'].prototype);
 
TextTrack.prototype.constructor = TextTrack;
 

	
 
/*
 
 * cuechange - One or more cues in the track have become active or stopped being active.
 
 */
 
TextTrack.prototype.allowedEvents_ = {
 
  'cuechange': 'cuechange'
 
};
 

	
 
TextTrack.prototype.addCue = function (cue) {
 
  var tracks = this.tech_.textTracks();
 

	
 
  if (tracks) {
 
    for (var i = 0; i < tracks.length; i++) {
 
      if (tracks[i] !== this) {
 
        tracks[i].removeCue(cue);
 
      }
 
    }
 
  }
 

	
 
  this.cues_.push(cue);
 
  this['cues'].setCues_(this.cues_);
 
};
 

	
 
TextTrack.prototype.removeCue = function (removeCue) {
 
  var removed = false;
 

	
 
  for (var i = 0, l = this.cues_.length; i < l; i++) {
 
    var cue = this.cues_[i];
 
    if (cue === removeCue) {
 
      this.cues_.splice(i, 1);
 
      removed = true;
 
    }
 
  }
 

	
 
  if (removed) {
 
    this.cues.setCues_(this.cues_);
 
  }
 
};
 

	
 
/*
 
* Downloading stuff happens below this point
 
*/
 
var parseCues = function parseCues(srcContent, track) {
 
  if (typeof _globalWindow2['default']['WebVTT'] !== 'function') {
 
    //try again a bit later
 
    return _globalWindow2['default'].setTimeout(function () {
 
      parseCues(srcContent, track);
 
    }, 25);
 
  }
 

	
 
  var parser = new _globalWindow2['default']['WebVTT']['Parser'](_globalWindow2['default'], _globalWindow2['default']['vttjs'], _globalWindow2['default']['WebVTT']['StringDecoder']());
 

	
 
  parser['oncue'] = function (cue) {
 
    track.addCue(cue);
 
  };
 
  parser['onparsingerror'] = function (error) {
 
    _utilsLogJs2['default'].error(error);
 
  };
 

	
 
  parser['parse'](srcContent);
 
  parser['flush']();
 
};
 

	
 
var loadTrack = function loadTrack(src, track) {
 
  var opts = {
 
    uri: src
 
  };
 

	
 
  var crossOrigin = _utilsUrlJs.isCrossOrigin(src);
 
  if (crossOrigin) {
 
    opts.cors = crossOrigin;
 
  }
 

	
 
  _xhr2['default'](opts, Fn.bind(this, function (err, response, responseBody) {
 
    if (err) {
 
      return _utilsLogJs2['default'].error(err, response);
 
    }
 

	
 
    track.loaded_ = true;
 
    parseCues(responseBody, track);
 
  }));
 
};
 

	
 
var indexOf = function indexOf(searchElement, fromIndex) {
 
  if (this == null) {
 
    throw new TypeError('"this" is null or not defined');
 
  }
 

	
 
  var O = Object(this);
 

	
 
  var len = O.length >>> 0;
 

	
 
  if (len === 0) {
 
    return -1;
 
  }
 

	
 
  var n = +fromIndex || 0;
 

	
 
  if (Math.abs(n) === Infinity) {
 
    n = 0;
 
  }
 

	
 
  if (n >= len) {
 
    return -1;
 
  }
 

	
 
  var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
 

	
 
  while (k < len) {
 
    if (k in O && O[k] === searchElement) {
 
      return k;
 
    }
 
    k++;
 
  }
 
  return -1;
 
};
 

	
 
exports['default'] = TextTrack;
 
module.exports = exports['default'];
 

	
 
},{"../event-target":90,"../utils/browser.js":115,"../utils/fn.js":120,"../utils/guid.js":122,"../utils/log.js":123,"../utils/url.js":128,"./text-track-cue-list":108,"./text-track-enums":110,"global/document":1,"global/window":2,"xhr":50}],115:[function(_dereq_,module,exports){
 
/**
 
 * @file browser.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var USER_AGENT = _globalWindow2['default'].navigator.userAgent;
 
var webkitVersionMap = /AppleWebKit\/([\d.]+)/i.exec(USER_AGENT);
 
var appleWebkitVersion = webkitVersionMap ? parseFloat(webkitVersionMap.pop()) : null;
 

	
 
/*
 
 * Device is an iPhone
 
 *
 
 * @type {Boolean}
 
 * @constant
 
 * @private
 
 */
 
var IS_IPHONE = /iPhone/i.test(USER_AGENT);
 
exports.IS_IPHONE = IS_IPHONE;
 
var IS_IPAD = /iPad/i.test(USER_AGENT);
 
exports.IS_IPAD = IS_IPAD;
 
var IS_IPOD = /iPod/i.test(USER_AGENT);
 
exports.IS_IPOD = IS_IPOD;
 
var IS_IOS = IS_IPHONE || IS_IPAD || IS_IPOD;
 

	
 
exports.IS_IOS = IS_IOS;
 
var IOS_VERSION = (function () {
 
  var match = USER_AGENT.match(/OS (\d+)_/i);
 
  if (match && match[1]) {
 
    return match[1];
 
  }
 
})();
 

	
 
exports.IOS_VERSION = IOS_VERSION;
 
var IS_ANDROID = /Android/i.test(USER_AGENT);
 
exports.IS_ANDROID = IS_ANDROID;
 
var ANDROID_VERSION = (function () {
 
  // This matches Android Major.Minor.Patch versions
 
  // ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned
 
  var match = USER_AGENT.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i),
 
      major,
 
      minor;
 

	
 
  if (!match) {
 
    return null;
 
  }
 

	
 
  major = match[1] && parseFloat(match[1]);
 
  minor = match[2] && parseFloat(match[2]);
 

	
 
  if (major && minor) {
 
    return parseFloat(match[1] + '.' + match[2]);
 
  } else if (major) {
 
    return major;
 
  } else {
 
    return null;
 
  }
 
})();
 
exports.ANDROID_VERSION = ANDROID_VERSION;
 
// Old Android is defined as Version older than 2.3, and requiring a webkit version of the android browser
 
var IS_OLD_ANDROID = IS_ANDROID && /webkit/i.test(USER_AGENT) && ANDROID_VERSION < 2.3;
 
exports.IS_OLD_ANDROID = IS_OLD_ANDROID;
 
var IS_NATIVE_ANDROID = IS_ANDROID && ANDROID_VERSION < 5 && appleWebkitVersion < 537;
 

	
 
exports.IS_NATIVE_ANDROID = IS_NATIVE_ANDROID;
 
var IS_FIREFOX = /Firefox/i.test(USER_AGENT);
 
exports.IS_FIREFOX = IS_FIREFOX;
 
var IS_CHROME = /Chrome/i.test(USER_AGENT);
 
exports.IS_CHROME = IS_CHROME;
 
var IS_IE8 = /MSIE\s8\.0/.test(USER_AGENT);
 

	
 
exports.IS_IE8 = IS_IE8;
 
var TOUCH_ENABLED = !!('ontouchstart' in _globalWindow2['default'] || _globalWindow2['default'].DocumentTouch && _globalDocument2['default'] instanceof _globalWindow2['default'].DocumentTouch);
 
exports.TOUCH_ENABLED = TOUCH_ENABLED;
 
var BACKGROUND_SIZE_SUPPORTED = ('backgroundSize' in _globalDocument2['default'].createElement('video').style);
 
exports.BACKGROUND_SIZE_SUPPORTED = BACKGROUND_SIZE_SUPPORTED;
 

	
 
},{"global/document":1,"global/window":2}],116:[function(_dereq_,module,exports){
 
/**
 
 * @file buffer.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 
exports.bufferedPercent = bufferedPercent;
 

	
 
var _timeRangesJs = _dereq_('./time-ranges.js');
 

	
 
/**
 
 * Compute how much your video has been buffered
 
 *
 
 * @param  {Object} Buffered object
 
 * @param  {Number} Total duration
 
 * @return {Number} Percent buffered of the total duration
 
 * @private
 
 * @function bufferedPercent
 
 */
 

	
 
function bufferedPercent(buffered, duration) {
 
  var bufferedDuration = 0,
 
      start,
 
      end;
 

	
 
  if (!duration) {
 
    return 0;
 
  }
 

	
 
  if (!buffered || !buffered.length) {
 
    buffered = _timeRangesJs.createTimeRange(0, 0);
 
  }
 

	
 
  for (var i = 0; i < buffered.length; i++) {
 
    start = buffered.start(i);
 
    end = buffered.end(i);
 

	
 
    // buffered end can be bigger than duration by a very small fraction
 
    if (end > duration) {
 
      end = duration;
 
    }
 

	
 
    bufferedDuration += end - start;
 
  }
 

	
 
  return bufferedDuration / duration;
 
}
 

	
 
},{"./time-ranges.js":126}],117:[function(_dereq_,module,exports){
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _logJs = _dereq_('./log.js');
 

	
 
var _logJs2 = _interopRequireDefault(_logJs);
 

	
 
/**
 
 * Object containing the default behaviors for available handler methods.
 
 *
 
 * @private
 
 * @type {Object}
 
 */
 
var defaultBehaviors = {
 
  get: function get(obj, key) {
 
    return obj[key];
 
  },
 
  set: function set(obj, key, value) {
 
    obj[key] = value;
 
    return true;
 
  }
 
};
 

	
 
/**
 
 * Expose private objects publicly using a Proxy to log deprecation warnings.
 
 *
 
 * Browsers that do not support Proxy objects will simply return the `target`
 
 * object, so it can be directly exposed.
 
 *
 
 * @param {Object} target The target object.
 
 * @param {Object} messages Messages to display from a Proxy. Only operations
 
 *                          with an associated message will be proxied.
 
 * @param {String} [messages.get]
 
 * @param {String} [messages.set]
 
 * @return {Object} A Proxy if supported or the `target` argument.
 
 */
 

	
 
exports['default'] = function (target) {
 
  var messages = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
 

	
 
  if (typeof Proxy === 'function') {
 
    var _ret = (function () {
 
      var handler = {};
 

	
 
      // Build a handler object based on those keys that have both messages
 
      // and default behaviors.
 
      Object.keys(messages).forEach(function (key) {
 
        if (defaultBehaviors.hasOwnProperty(key)) {
 
          handler[key] = function () {
 
            _logJs2['default'].warn(messages[key]);
 
            return defaultBehaviors[key].apply(this, arguments);
 
          };
 
        }
 
      });
 

	
 
      return {
 
        v: new Proxy(target, handler)
 
      };
 
    })();
 

	
 
    if (typeof _ret === 'object') return _ret.v;
 
  }
 
  return target;
 
};
 

	
 
module.exports = exports['default'];
 

	
 
},{"./log.js":123}],118:[function(_dereq_,module,exports){
 
/**
 
 * @file dom.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 
exports.getEl = getEl;
 
exports.createEl = createEl;
 
exports.insertElFirst = insertElFirst;
 
exports.getElData = getElData;
 
exports.hasElData = hasElData;
 
exports.removeElData = removeElData;
 
exports.hasElClass = hasElClass;
 
exports.addElClass = addElClass;
 
exports.removeElClass = removeElClass;
 
exports.setElAttributes = setElAttributes;
 
exports.getElAttributes = getElAttributes;
 
exports.blockTextSelection = blockTextSelection;
 
exports.unblockTextSelection = unblockTextSelection;
 
exports.findElPosition = findElPosition;
 
exports.getPointerPosition = getPointerPosition;
 

	
 
var _templateObject = _taggedTemplateLiteralLoose(['Setting attributes in the second argument of createEl()\n                has been deprecated. Use the third argument instead.\n                createEl(type, properties, attributes). Attempting to set ', ' to ', '.'], ['Setting attributes in the second argument of createEl()\n                has been deprecated. Use the third argument instead.\n                createEl(type, properties, attributes). Attempting to set ', ' to ', '.']);
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _guidJs = _dereq_('./guid.js');
 

	
 
var Guid = _interopRequireWildcard(_guidJs);
 

	
 
var _logJs = _dereq_('./log.js');
 

	
 
var _logJs2 = _interopRequireDefault(_logJs);
 

	
 
var _tsml = _dereq_('tsml');
 

	
 
var _tsml2 = _interopRequireDefault(_tsml);
 

	
 
/**
 
 * Shorthand for document.getElementById()
 
 * Also allows for CSS (jQuery) ID syntax. But nothing other than IDs.
 
 *
 
 * @param  {String} id  Element ID
 
 * @return {Element}    Element with supplied ID
 
 * @function getEl
 
 */
 

	
 
function getEl(id) {
 
  if (id.indexOf('#') === 0) {
 
    id = id.slice(1);
 
  }
 

	
 
  return _globalDocument2['default'].getElementById(id);
 
}
 

	
 
/**
 
 * Creates an element and applies properties.
 
 *
 
 * @param  {String=} tagName    Name of tag to be created.
 
 * @param  {Object=} properties Element properties to be applied.
 
 * @return {Element}
 
 * @function createEl
 
 */
 

	
 
function createEl() {
 
  var tagName = arguments.length <= 0 || arguments[0] === undefined ? 'div' : arguments[0];
 
  var properties = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
 
  var attributes = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
 

	
 
  var el = _globalDocument2['default'].createElement(tagName);
 

	
 
  Object.getOwnPropertyNames(properties).forEach(function (propName) {
 
    var val = properties[propName];
 

	
 
    // See #2176
 
    // We originally were accepting both properties and attributes in the
 
    // same object, but that doesn't work so well.
 
    if (propName.indexOf('aria-') !== -1 || propName === 'role' || propName === 'type') {
 
      _logJs2['default'].warn(_tsml2['default'](_templateObject, propName, val));
 
      el.setAttribute(propName, val);
 
    } else {
 
      el[propName] = val;
 
    }
 
  });
 

	
 
  Object.getOwnPropertyNames(attributes).forEach(function (attrName) {
 
    var val = attributes[attrName];
 
    el.setAttribute(attrName, attributes[attrName]);
 
  });
 

	
 
  return el;
 
}
 

	
 
/**
 
 * Insert an element as the first child node of another
 
 *
 
 * @param  {Element} child   Element to insert
 
 * @param  {Element} parent Element to insert child into
 
 * @private
 
 * @function insertElFirst
 
 */
 

	
 
function insertElFirst(child, parent) {
 
  if (parent.firstChild) {
 
    parent.insertBefore(child, parent.firstChild);
 
  } else {
 
    parent.appendChild(child);
 
  }
 
}
 

	
 
/**
 
 * Element Data Store. Allows for binding data to an element without putting it directly on the element.
 
 * Ex. Event listeners are stored here.
 
 * (also from jsninja.com, slightly modified and updated for closure compiler)
 
 *
 
 * @type {Object}
 
 * @private
 
 */
 
var elData = {};
 

	
 
/*
 
 * Unique attribute name to store an element's guid in
 
 *
 
 * @type {String}
 
 * @constant
 
 * @private
 
 */
 
var elIdAttr = 'vdata' + new Date().getTime();
 

	
 
/**
 
 * Returns the cache object where data for an element is stored
 
 *
 
 * @param  {Element} el Element to store data for.
 
 * @return {Object}
 
 * @function getElData
 
 */
 

	
 
function getElData(el) {
 
  var id = el[elIdAttr];
 

	
 
  if (!id) {
 
    id = el[elIdAttr] = Guid.newGUID();
 
  }
 

	
 
  if (!elData[id]) {
 
    elData[id] = {};
 
  }
 

	
 
  return elData[id];
 
}
 

	
 
/**
 
 * Returns whether or not an element has cached data
 
 *
 
 * @param  {Element} el A dom element
 
 * @return {Boolean}
 
 * @private
 
 * @function hasElData
 
 */
 

	
 
function hasElData(el) {
 
  var id = el[elIdAttr];
 

	
 
  if (!id) {
 
    return false;
 
  }
 

	
 
  return !!Object.getOwnPropertyNames(elData[id]).length;
 
}
 

	
 
/**
 
 * Delete data for the element from the cache and the guid attr from getElementById
 
 *
 
 * @param  {Element} el Remove data for an element
 
 * @private
 
 * @function removeElData
 
 */
 

	
 
function removeElData(el) {
 
  var id = el[elIdAttr];
 

	
 
  if (!id) {
 
    return;
 
  }
 

	
 
  // Remove all stored data
 
  delete elData[id];
 

	
 
  // Remove the elIdAttr property from the DOM node
 
  try {
 
    delete el[elIdAttr];
 
  } catch (e) {
 
    if (el.removeAttribute) {
 
      el.removeAttribute(elIdAttr);
 
    } else {
 
      // IE doesn't appear to support removeAttribute on the document element
 
      el[elIdAttr] = null;
 
    }
 
  }
 
}
 

	
 
/**
 
 * Check if an element has a CSS class
 
 *
 
 * @param {Element} element Element to check
 
 * @param {String} classToCheck Classname to check
 
 * @function hasElClass
 
 */
 

	
 
function hasElClass(element, classToCheck) {
 
  return (' ' + element.className + ' ').indexOf(' ' + classToCheck + ' ') !== -1;
 
}
 

	
 
/**
 
 * Add a CSS class name to an element
 
 *
 
 * @param {Element} element    Element to add class name to
 
 * @param {String} classToAdd Classname to add
 
 * @function addElClass
 
 */
 

	
 
function addElClass(element, classToAdd) {
 
  if (!hasElClass(element, classToAdd)) {
 
    element.className = element.className === '' ? classToAdd : element.className + ' ' + classToAdd;
 
  }
 
}
 

	
 
/**
 
 * Remove a CSS class name from an element
 
 *
 
 * @param {Element} element    Element to remove from class name
 
 * @param {String} classToRemove Classname to remove
 
 * @function removeElClass
 
 */
 

	
 
function removeElClass(element, classToRemove) {
 
  if (!hasElClass(element, classToRemove)) {
 
    return;
 
  }
 

	
 
  var classNames = element.className.split(' ');
 

	
 
  // no arr.indexOf in ie8, and we don't want to add a big shim
 
  for (var i = classNames.length - 1; i >= 0; i--) {
 
    if (classNames[i] === classToRemove) {
 
      classNames.splice(i, 1);
 
    }
 
  }
 

	
 
  element.className = classNames.join(' ');
 
}
 

	
 
/**
 
 * Apply attributes to an HTML element.
 
 *
 
 * @param  {Element} el         Target element.
 
 * @param  {Object=} attributes Element attributes to be applied.
 
 * @private
 
 * @function setElAttributes
 
 */
 

	
 
function setElAttributes(el, attributes) {
 
  Object.getOwnPropertyNames(attributes).forEach(function (attrName) {
 
    var attrValue = attributes[attrName];
 

	
 
    if (attrValue === null || typeof attrValue === 'undefined' || attrValue === false) {
 
      el.removeAttribute(attrName);
 
    } else {
 
      el.setAttribute(attrName, attrValue === true ? '' : attrValue);
 
    }
 
  });
 
}
 

	
 
/**
 
 * Get an element's attribute values, as defined on the HTML tag
 
 * Attributes are not the same as properties. They're defined on the tag
 
 * or with setAttribute (which shouldn't be used with HTML)
 
 * This will return true or false for boolean attributes.
 
 *
 
 * @param  {Element} tag Element from which to get tag attributes
 
 * @return {Object}
 
 * @private
 
 * @function getElAttributes
 
 */
 

	
 
function getElAttributes(tag) {
 
  var obj, knownBooleans, attrs, attrName, attrVal;
 

	
 
  obj = {};
 

	
 
  // known boolean attributes
 
  // we can check for matching boolean properties, but older browsers
 
  // won't know about HTML5 boolean attributes that we still read from
 
  knownBooleans = ',' + 'autoplay,controls,loop,muted,default' + ',';
 

	
 
  if (tag && tag.attributes && tag.attributes.length > 0) {
 
    attrs = tag.attributes;
 

	
 
    for (var i = attrs.length - 1; i >= 0; i--) {
 
      attrName = attrs[i].name;
 
      attrVal = attrs[i].value;
 

	
 
      // check for known booleans
 
      // the matching element property will return a value for typeof
 
      if (typeof tag[attrName] === 'boolean' || knownBooleans.indexOf(',' + attrName + ',') !== -1) {
 
        // the value of an included boolean attribute is typically an empty
 
        // string ('') which would equal false if we just check for a false value.
 
        // we also don't want support bad code like autoplay='false'
 
        attrVal = attrVal !== null ? true : false;
 
      }
 

	
 
      obj[attrName] = attrVal;
 
    }
 
  }
 

	
 
  return obj;
 
}
 

	
 
/**
 
 * Attempt to block the ability to select text while dragging controls
 
 *
 
 * @return {Boolean}
 
 * @method blockTextSelection
 
 */
 

	
 
function blockTextSelection() {
 
  _globalDocument2['default'].body.focus();
 
  _globalDocument2['default'].onselectstart = function () {
 
    return false;
 
  };
 
}
 

	
 
/**
 
 * Turn off text selection blocking
 
 *
 
 * @return {Boolean}
 
 * @method unblockTextSelection
 
 */
 

	
 
function unblockTextSelection() {
 
  _globalDocument2['default'].onselectstart = function () {
 
    return true;
 
  };
 
}
 

	
 
/**
 
 * Offset Left
 
 * getBoundingClientRect technique from
 
 * John Resig http://ejohn.org/blog/getboundingclientrect-is-awesome/
 
 *
 
 * @param {Element} el Element from which to get offset
 
 * @return {Object=}
 
 * @method findElPosition
 
 */
 

	
 
function findElPosition(el) {
 
  var box = undefined;
 

	
 
  if (el.getBoundingClientRect && el.parentNode) {
 
    box = el.getBoundingClientRect();
 
  }
 

	
 
  if (!box) {
 
    return {
 
      left: 0,
 
      top: 0
 
    };
 
  }
 

	
 
  var docEl = _globalDocument2['default'].documentElement;
 
  var body = _globalDocument2['default'].body;
 

	
 
  var clientLeft = docEl.clientLeft || body.clientLeft || 0;
 
  var scrollLeft = _globalWindow2['default'].pageXOffset || body.scrollLeft;
 
  var left = box.left + scrollLeft - clientLeft;
 

	
 
  var clientTop = docEl.clientTop || body.clientTop || 0;
 
  var scrollTop = _globalWindow2['default'].pageYOffset || body.scrollTop;
 
  var top = box.top + scrollTop - clientTop;
 

	
 
  // Android sometimes returns slightly off decimal values, so need to round
 
  return {
 
    left: Math.round(left),
 
    top: Math.round(top)
 
  };
 
}
 

	
 
/**
 
 * Get pointer position in element
 
 * Returns an object with x and y coordinates.
 
 * The base on the coordinates are the bottom left of the element.
 
 *
 
 * @param {Element} el Element on which to get the pointer position on
 
 * @param {Event} event Event object
 
 * @return {Object=} position This object will have x and y coordinates corresponding to the mouse position
 
 * @metho getPointerPosition
 
 */
 

	
 
function getPointerPosition(el, event) {
 
  var position = {};
 
  var box = findElPosition(el);
 
  var boxW = el.offsetWidth;
 
  var boxH = el.offsetHeight;
 

	
 
  var boxY = box.top;
 
  var boxX = box.left;
 
  var pageY = event.pageY;
 
  var pageX = event.pageX;
 

	
 
  if (event.changedTouches) {
 
    pageX = event.changedTouches[0].pageX;
 
    pageY = event.changedTouches[0].pageY;
 
  }
 

	
 
  position.y = Math.max(0, Math.min(1, (boxY - pageY + boxH) / boxH));
 
  position.x = Math.max(0, Math.min(1, (pageX - boxX) / boxW));
 

	
 
  return position;
 
}
 

	
 
},{"./guid.js":122,"./log.js":123,"global/document":1,"global/window":2,"tsml":49}],119:[function(_dereq_,module,exports){
 
/**
 
 * @file events.js
 
 *
 
 * Event System (John Resig - Secrets of a JS Ninja http://jsninja.com/)
 
 * (Original book version wasn't completely usable, so fixed some things and made Closure Compiler compatible)
 
 * This should work very similarly to jQuery's events, however it's based off the book version which isn't as
 
 * robust as jquery's, so there's probably some differences.
 
 */
 

	
 
'use strict';
 

	
 
exports.__esModule = true;
 
exports.on = on;
 
exports.off = off;
 
exports.trigger = trigger;
 
exports.one = one;
 
exports.fixEvent = fixEvent;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
var _domJs = _dereq_('./dom.js');
 

	
 
var Dom = _interopRequireWildcard(_domJs);
 

	
 
var _guidJs = _dereq_('./guid.js');
 

	
 
var Guid = _interopRequireWildcard(_guidJs);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
/**
 
 * Add an event listener to element
 
 * It stores the handler function in a separate cache object
 
 * and adds a generic handler to the element's event,
 
 * along with a unique id (guid) to the element.
 
 *
 
 * @param  {Element|Object}   elem Element or object to bind listeners to
 
 * @param  {String|Array}   type Type of event to bind to.
 
 * @param  {Function} fn   Event listener.
 
 * @method on
 
 */
 

	
 
function on(elem, type, fn) {
 
  if (Array.isArray(type)) {
 
    return _handleMultipleEvents(on, elem, type, fn);
 
  }
 

	
 
  var data = Dom.getElData(elem);
 

	
 
  // We need a place to store all our handler data
 
  if (!data.handlers) data.handlers = {};
 

	
 
  if (!data.handlers[type]) data.handlers[type] = [];
 

	
 
  if (!fn.guid) fn.guid = Guid.newGUID();
 

	
 
  data.handlers[type].push(fn);
 

	
 
  if (!data.dispatcher) {
 
    data.disabled = false;
 

	
 
    data.dispatcher = function (event, hash) {
 

	
 
      if (data.disabled) return;
 
      event = fixEvent(event);
 

	
 
      var handlers = data.handlers[event.type];
 

	
 
      if (handlers) {
 
        // Copy handlers so if handlers are added/removed during the process it doesn't throw everything off.
 
        var handlersCopy = handlers.slice(0);
 

	
 
        for (var m = 0, n = handlersCopy.length; m < n; m++) {
 
          if (event.isImmediatePropagationStopped()) {
 
            break;
 
          } else {
 
            handlersCopy[m].call(elem, event, hash);
 
          }
 
        }
 
      }
 
    };
 
  }
 

	
 
  if (data.handlers[type].length === 1) {
 
    if (elem.addEventListener) {
 
      elem.addEventListener(type, data.dispatcher, false);
 
    } else if (elem.attachEvent) {
 
      elem.attachEvent('on' + type, data.dispatcher);
 
    }
 
  }
 
}
 

	
 
/**
 
 * Removes event listeners from an element
 
 *
 
 * @param  {Element|Object}   elem Object to remove listeners from
 
 * @param  {String|Array=}   type Type of listener to remove. Don't include to remove all events from element.
 
 * @param  {Function} fn   Specific listener to remove. Don't include to remove listeners for an event type.
 
 * @method off
 
 */
 

	
 
function off(elem, type, fn) {
 
  // Don't want to add a cache object through getElData if not needed
 
  if (!Dom.hasElData(elem)) return;
 

	
 
  var data = Dom.getElData(elem);
 

	
 
  // If no events exist, nothing to unbind
 
  if (!data.handlers) {
 
    return;
 
  }
 

	
 
  if (Array.isArray(type)) {
 
    return _handleMultipleEvents(off, elem, type, fn);
 
  }
 

	
 
  // Utility function
 
  var removeType = function removeType(t) {
 
    data.handlers[t] = [];
 
    _cleanUpEvents(elem, t);
 
  };
 

	
 
  // Are we removing all bound events?
 
  if (!type) {
 
    for (var t in data.handlers) {
 
      removeType(t);
 
    }return;
 
  }
 

	
 
  var handlers = data.handlers[type];
 

	
 
  // If no handlers exist, nothing to unbind
 
  if (!handlers) return;
 

	
 
  // If no listener was provided, remove all listeners for type
 
  if (!fn) {
 
    removeType(type);
 
    return;
 
  }
 

	
 
  // We're only removing a single handler
 
  if (fn.guid) {
 
    for (var n = 0; n < handlers.length; n++) {
 
      if (handlers[n].guid === fn.guid) {
 
        handlers.splice(n--, 1);
 
      }
 
    }
 
  }
 

	
 
  _cleanUpEvents(elem, type);
 
}
 

	
 
/**
 
 * Trigger an event for an element
 
 *
 
 * @param  {Element|Object}      elem  Element to trigger an event on
 
 * @param  {Event|Object|String} event A string (the type) or an event object with a type attribute
 
 * @param  {Object} [hash] data hash to pass along with the event
 
 * @return {Boolean=} Returned only if default was prevented
 
 * @method trigger
 
 */
 

	
 
function trigger(elem, event, hash) {
 
  // Fetches element data and a reference to the parent (for bubbling).
 
  // Don't want to add a data object to cache for every parent,
 
  // so checking hasElData first.
 
  var elemData = Dom.hasElData(elem) ? Dom.getElData(elem) : {};
 
  var parent = elem.parentNode || elem.ownerDocument;
 
  // type = event.type || event,
 
  // handler;
 

	
 
  // If an event name was passed as a string, creates an event out of it
 
  if (typeof event === 'string') {
 
    event = { type: event, target: elem };
 
  }
 
  // Normalizes the event properties.
 
  event = fixEvent(event);
 

	
 
  // If the passed element has a dispatcher, executes the established handlers.
 
  if (elemData.dispatcher) {
 
    elemData.dispatcher.call(elem, event, hash);
 
  }
 

	
 
  // Unless explicitly stopped or the event does not bubble (e.g. media events)
 
  // recursively calls this function to bubble the event up the DOM.
 
  if (parent && !event.isPropagationStopped() && event.bubbles === true) {
 
    trigger.call(null, parent, event, hash);
 

	
 
    // If at the top of the DOM, triggers the default action unless disabled.
 
  } else if (!parent && !event.defaultPrevented) {
 
      var targetData = Dom.getElData(event.target);
 

	
 
      // Checks if the target has a default action for this event.
 
      if (event.target[event.type]) {
 
        // Temporarily disables event dispatching on the target as we have already executed the handler.
 
        targetData.disabled = true;
 
        // Executes the default action.
 
        if (typeof event.target[event.type] === 'function') {
 
          event.target[event.type]();
 
        }
 
        // Re-enables event dispatching.
 
        targetData.disabled = false;
 
      }
 
    }
 

	
 
  // Inform the triggerer if the default was prevented by returning false
 
  return !event.defaultPrevented;
 
}
 

	
 
/**
 
 * Trigger a listener only once for an event
 
 *
 
 * @param  {Element|Object}   elem Element or object to
 
 * @param  {String|Array}   type Name/type of event
 
 * @param  {Function} fn Event handler function
 
 * @method one
 
 */
 

	
 
function one(elem, type, fn) {
 
  if (Array.isArray(type)) {
 
    return _handleMultipleEvents(one, elem, type, fn);
 
  }
 
  var func = function func() {
 
    off(elem, type, func);
 
    fn.apply(this, arguments);
 
  };
 
  // copy the guid to the new function so it can removed using the original function's ID
 
  func.guid = fn.guid = fn.guid || Guid.newGUID();
 
  on(elem, type, func);
 
}
 

	
 
/**
 
 * Fix a native event to have standard property values
 
 *
 
 * @param  {Object} event Event object to fix
 
 * @return {Object}
 
 * @private
 
 * @method fixEvent
 
 */
 

	
 
function fixEvent(event) {
 

	
 
  function returnTrue() {
 
    return true;
 
  }
 
  function returnFalse() {
 
    return false;
 
  }
 

	
 
  // Test if fixing up is needed
 
  // Used to check if !event.stopPropagation instead of isPropagationStopped
 
  // But native events return true for stopPropagation, but don't have
 
  // other expected methods like isPropagationStopped. Seems to be a problem
 
  // with the Javascript Ninja code. So we're just overriding all events now.
 
  if (!event || !event.isPropagationStopped) {
 
    var old = event || _globalWindow2['default'].event;
 

	
 
    event = {};
 
    // Clone the old object so that we can modify the values event = {};
 
    // IE8 Doesn't like when you mess with native event properties
 
    // Firefox returns false for event.hasOwnProperty('type') and other props
 
    //  which makes copying more difficult.
 
    // TODO: Probably best to create a whitelist of event props
 
    for (var key in old) {
 
      // Safari 6.0.3 warns you if you try to copy deprecated layerX/Y
 
      // Chrome warns you if you try to copy deprecated keyboardEvent.keyLocation
 
      // and webkitMovementX/Y
 
      if (key !== 'layerX' && key !== 'layerY' && key !== 'keyLocation' && key !== 'webkitMovementX' && key !== 'webkitMovementY') {
 
        // Chrome 32+ warns if you try to copy deprecated returnValue, but
 
        // we still want to if preventDefault isn't supported (IE8).
 
        if (!(key === 'returnValue' && old.preventDefault)) {
 
          event[key] = old[key];
 
        }
 
      }
 
    }
 

	
 
    // The event occurred on this element
 
    if (!event.target) {
 
      event.target = event.srcElement || _globalDocument2['default'];
 
    }
 

	
 
    // Handle which other element the event is related to
 
    if (!event.relatedTarget) {
 
      event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
 
    }
 

	
 
    // Stop the default browser action
 
    event.preventDefault = function () {
 
      if (old.preventDefault) {
 
        old.preventDefault();
 
      }
 
      event.returnValue = false;
 
      old.returnValue = false;
 
      event.defaultPrevented = true;
 
    };
 

	
 
    event.defaultPrevented = false;
 

	
 
    // Stop the event from bubbling
 
    event.stopPropagation = function () {
 
      if (old.stopPropagation) {
 
        old.stopPropagation();
 
      }
 
      event.cancelBubble = true;
 
      old.cancelBubble = true;
 
      event.isPropagationStopped = returnTrue;
 
    };
 

	
 
    event.isPropagationStopped = returnFalse;
 

	
 
    // Stop the event from bubbling and executing other handlers
 
    event.stopImmediatePropagation = function () {
 
      if (old.stopImmediatePropagation) {
 
        old.stopImmediatePropagation();
 
      }
 
      event.isImmediatePropagationStopped = returnTrue;
 
      event.stopPropagation();
 
    };
 

	
 
    event.isImmediatePropagationStopped = returnFalse;
 

	
 
    // Handle mouse position
 
    if (event.clientX != null) {
 
      var doc = _globalDocument2['default'].documentElement,
 
          body = _globalDocument2['default'].body;
 

	
 
      event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
 
      event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
 
    }
 

	
 
    // Handle key presses
 
    event.which = event.charCode || event.keyCode;
 

	
 
    // Fix button for mouse clicks:
 
    // 0 == left; 1 == middle; 2 == right
 
    if (event.button != null) {
 
      event.button = event.button & 1 ? 0 : event.button & 4 ? 1 : event.button & 2 ? 2 : 0;
 
    }
 
  }
 

	
 
  // Returns fixed-up instance
 
  return event;
 
}
 

	
 
/**
 
 * Clean up the listener cache and dispatchers
 
*
 
 * @param  {Element|Object} elem Element to clean up
 
 * @param  {String} type Type of event to clean up
 
 * @private
 
 * @method _cleanUpEvents
 
 */
 
function _cleanUpEvents(elem, type) {
 
  var data = Dom.getElData(elem);
 

	
 
  // Remove the events of a particular type if there are none left
 
  if (data.handlers[type].length === 0) {
 
    delete data.handlers[type];
 
    // data.handlers[type] = null;
 
    // Setting to null was causing an error with data.handlers
 

	
 
    // Remove the meta-handler from the element
 
    if (elem.removeEventListener) {
 
      elem.removeEventListener(type, data.dispatcher, false);
 
    } else if (elem.detachEvent) {
 
      elem.detachEvent('on' + type, data.dispatcher);
 
    }
 
  }
 

	
 
  // Remove the events object if there are no types left
 
  if (Object.getOwnPropertyNames(data.handlers).length <= 0) {
 
    delete data.handlers;
 
    delete data.dispatcher;
 
    delete data.disabled;
 
  }
 

	
 
  // Finally remove the element data if there is no data left
 
  if (Object.getOwnPropertyNames(data).length === 0) {
 
    Dom.removeElData(elem);
 
  }
 
}
 

	
 
/**
 
 * Loops through an array of event types and calls the requested method for each type.
 
 *
 
 * @param  {Function} fn   The event method we want to use.
 
 * @param  {Element|Object} elem Element or object to bind listeners to
 
 * @param  {String}   type Type of event to bind to.
 
 * @param  {Function} callback   Event listener.
 
 * @private
 
 * @function _handleMultipleEvents
 
 */
 
function _handleMultipleEvents(fn, elem, types, callback) {
 
  types.forEach(function (type) {
 
    //Call the event method for each one of the types
 
    fn(elem, type, callback);
 
  });
 
}
 

	
 
},{"./dom.js":118,"./guid.js":122,"global/document":1,"global/window":2}],120:[function(_dereq_,module,exports){
 
/**
 
 * @file fn.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
var _guidJs = _dereq_('./guid.js');
 

	
 
/**
 
 * Bind (a.k.a proxy or Context). A simple method for changing the context of a function
 
 * It also stores a unique id on the function so it can be easily removed from events
 
 *
 
 * @param  {*}   context The object to bind as scope
 
 * @param  {Function} fn      The function to be bound to a scope
 
 * @param  {Number=}   uid     An optional unique ID for the function to be set
 
 * @return {Function}
 
 * @private
 
 * @method bind
 
 */
 
var bind = function bind(context, fn, uid) {
 
  // Make sure the function has a unique ID
 
  if (!fn.guid) {
 
    fn.guid = _guidJs.newGUID();
 
  }
 

	
 
  // Create the new function that changes the context
 
  var ret = function ret() {
 
    return fn.apply(context, arguments);
 
  };
 

	
 
  // Allow for the ability to individualize this function
 
  // Needed in the case where multiple objects might share the same prototype
 
  // IF both items add an event listener with the same function, then you try to remove just one
 
  // it will remove both because they both have the same guid.
 
  // when using this, you need to use the bind method when you remove the listener as well.
 
  // currently used in text tracks
 
  ret.guid = uid ? uid + '_' + fn.guid : fn.guid;
 

	
 
  return ret;
 
};
 
exports.bind = bind;
 

	
 
},{"./guid.js":122}],121:[function(_dereq_,module,exports){
 
/**
 
 * @file format-time.js
 
 *
 
 * Format seconds as a time string, H:MM:SS or M:SS
 
 * Supplying a guide (in seconds) will force a number of leading zeros
 
 * to cover the length of the guide
 
 *
 
 * @param  {Number} seconds Number of seconds to be turned into a string
 
 * @param  {Number} guide   Number (in seconds) to model the string after
 
 * @return {String}         Time formatted as H:MM:SS or M:SS
 
 * @private
 
 * @function formatTime
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 
function formatTime(seconds) {
 
  var guide = arguments.length <= 1 || arguments[1] === undefined ? seconds : arguments[1];
 
  return (function () {
 
    var s = Math.floor(seconds % 60);
 
    var m = Math.floor(seconds / 60 % 60);
 
    var h = Math.floor(seconds / 3600);
 
    var gm = Math.floor(guide / 60 % 60);
 
    var gh = Math.floor(guide / 3600);
 

	
 
    // handle invalid times
 
    if (isNaN(seconds) || seconds === Infinity) {
 
      // '-' is false for all relational operators (e.g. <, >=) so this setting
 
      // will add the minimum number of fields specified by the guide
 
      h = m = s = '-';
 
    }
 

	
 
    // Check if we need to show hours
 
    h = h > 0 || gh > 0 ? h + ':' : '';
 

	
 
    // If hours are showing, we may need to add a leading zero.
 
    // Always show at least one digit of minutes.
 
    m = ((h || gm >= 10) && m < 10 ? '0' + m : m) + ':';
 

	
 
    // Check if leading zero is need for seconds
 
    s = s < 10 ? '0' + s : s;
 

	
 
    return h + m + s;
 
  })();
 
}
 

	
 
exports['default'] = formatTime;
 
module.exports = exports['default'];
 

	
 
},{}],122:[function(_dereq_,module,exports){
 
/**
 
 * @file guid.js
 
 *
 
 * Unique ID for an element or function
 
 * @type {Number}
 
 * @private
 
 */
 
"use strict";
 

	
 
exports.__esModule = true;
 
exports.newGUID = newGUID;
 
var _guid = 1;
 

	
 
/**
 
 * Get the next unique ID
 
 *
 
 * @return {String} 
 
 * @function newGUID
 
 */
 

	
 
function newGUID() {
 
  return _guid++;
 
}
 

	
 
},{}],123:[function(_dereq_,module,exports){
 
/**
 
 * @file log.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
/**
 
 * Log plain debug messages
 
 */
 
var log = function log() {
 
  _logType(null, arguments);
 
};
 

	
 
/**
 
 * Keep a history of log messages
 
 * @type {Array}
 
 */
 
log.history = [];
 

	
 
/**
 
 * Log error messages
 
 */
 
log.error = function () {
 
  _logType('error', arguments);
 
};
 

	
 
/**
 
 * Log warning messages
 
 */
 
log.warn = function () {
 
  _logType('warn', arguments);
 
};
 

	
 
/**
 
 * Log messages to the console and history based on the type of message
 
 *
 
 * @param  {String} type The type of message, or `null` for `log`
 
 * @param  {Object} args The args to be passed to the log
 
 * @private
 
 * @method _logType
 
 */
 
function _logType(type, args) {
 
  // convert args to an array to get array functions
 
  var argsArray = Array.prototype.slice.call(args);
 
  // if there's no console then don't try to output messages
 
  // they will still be stored in log.history
 
  // Was setting these once outside of this function, but containing them
 
  // in the function makes it easier to test cases where console doesn't exist
 
  var noop = function noop() {};
 

	
 
  var console = _globalWindow2['default']['console'] || {
 
    'log': noop,
 
    'warn': noop,
 
    'error': noop
 
  };
 

	
 
  if (type) {
 
    // add the type to the front of the message
 
    argsArray.unshift(type.toUpperCase() + ':');
 
  } else {
 
    // default to log with no prefix
 
    type = 'log';
 
  }
 

	
 
  // add to history
 
  log.history.push(argsArray);
 

	
 
  // add console prefix after adding to history
 
  argsArray.unshift('VIDEOJS:');
 

	
 
  // call appropriate log function
 
  if (console[type].apply) {
 
    console[type].apply(console, argsArray);
 
  } else {
 
    // ie8 doesn't allow error.apply, but it will just join() the array anyway
 
    console[type](argsArray.join(' '));
 
  }
 
}
 

	
 
exports['default'] = log;
 
module.exports = exports['default'];
 

	
 
},{"global/window":2}],124:[function(_dereq_,module,exports){
 
/**
 
 * @file merge-options.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 
exports['default'] = mergeOptions;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _lodashCompatObjectMerge = _dereq_('lodash-compat/object/merge');
 

	
 
var _lodashCompatObjectMerge2 = _interopRequireDefault(_lodashCompatObjectMerge);
 

	
 
function isPlain(obj) {
 
  return !!obj && typeof obj === 'object' && obj.toString() === '[object Object]' && obj.constructor === Object;
 
}
 

	
 
/**
 
 * Merge customizer. video.js simply overwrites non-simple objects
 
 * (like arrays) instead of attempting to overlay them.
 
 * @see https://lodash.com/docs#merge
 
 */
 
var customizer = function customizer(destination, source) {
 
  // If we're not working with a plain object, copy the value as is
 
  // If source is an array, for instance, it will replace destination
 
  if (!isPlain(source)) {
 
    return source;
 
  }
 

	
 
  // If the new value is a plain object but the first object value is not
 
  // we need to create a new object for the first object to merge with.
 
  // This makes it consistent with how merge() works by default
 
  // and also protects from later changes the to first object affecting
 
  // the second object's values.
 
  if (!isPlain(destination)) {
 
    return mergeOptions(source);
 
  }
 
};
 

	
 
/**
 
 * Merge one or more options objects, recursively merging **only**
 
 * plain object properties.  Previously `deepMerge`.
 
 *
 
 * @param  {...Object} source One or more objects to merge
 
 * @returns {Object}          a new object that is the union of all
 
 * provided objects
 
 * @function mergeOptions
 
 */
 

	
 
function mergeOptions() {
 
  // contruct the call dynamically to handle the variable number of
 
  // objects to merge
 
  var args = Array.prototype.slice.call(arguments);
 

	
 
  // unshift an empty object into the front of the call as the target
 
  // of the merge
 
  args.unshift({});
 

	
 
  // customize conflict resolution to match our historical merge behavior
 
  args.push(customizer);
 

	
 
  _lodashCompatObjectMerge2['default'].apply(null, args);
 

	
 
  // return the mutated result object
 
  return args[0];
 
}
 

	
 
module.exports = exports['default'];
 

	
 
},{"lodash-compat/object/merge":40}],125:[function(_dereq_,module,exports){
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var createStyleElement = function createStyleElement(className) {
 
  var style = _globalDocument2['default'].createElement('style');
 
  style.className = className;
 

	
 
  return style;
 
};
 

	
 
exports.createStyleElement = createStyleElement;
 
var setTextContent = function setTextContent(el, content) {
 
  if (el.styleSheet) {
 
    el.styleSheet.cssText = content;
 
  } else {
 
    el.textContent = content;
 
  }
 
};
 
exports.setTextContent = setTextContent;
 

	
 
},{"global/document":1}],126:[function(_dereq_,module,exports){
 
'use strict';
 

	
 
exports.__esModule = true;
 
exports.createTimeRanges = createTimeRanges;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _logJs = _dereq_('./log.js');
 

	
 
var _logJs2 = _interopRequireDefault(_logJs);
 

	
 
/**
 
 * @file time-ranges.js
 
 *
 
 * Should create a fake TimeRange object
 
 * Mimics an HTML5 time range instance, which has functions that
 
 * return the start and end times for a range
 
 * TimeRanges are returned by the buffered() method
 
 *
 
 * @param  {(Number|Array)} Start of a single range or an array of ranges
 
 * @param  {Number} End of a single range
 
 * @private
 
 * @method createTimeRanges
 
 */
 

	
 
function createTimeRanges(start, end) {
 
  if (Array.isArray(start)) {
 
    return createTimeRangesObj(start);
 
  } else if (start === undefined || end === undefined) {
 
    return createTimeRangesObj();
 
  }
 
  return createTimeRangesObj([[start, end]]);
 
}
 

	
 
exports.createTimeRange = createTimeRanges;
 

	
 
function createTimeRangesObj(ranges) {
 
  if (ranges === undefined || ranges.length === 0) {
 
    return {
 
      length: 0,
 
      start: function start() {
 
        throw new Error('This TimeRanges object is empty');
 
      },
 
      end: function end() {
 
        throw new Error('This TimeRanges object is empty');
 
      }
 
    };
 
  }
 
  return {
 
    length: ranges.length,
 
    start: getRange.bind(null, 'start', 0, ranges),
 
    end: getRange.bind(null, 'end', 1, ranges)
 
  };
 
}
 

	
 
function getRange(fnName, valueIndex, ranges, rangeIndex) {
 
  if (rangeIndex === undefined) {
 
    _logJs2['default'].warn('DEPRECATED: Function \'' + fnName + '\' on \'TimeRanges\' called without an index argument.');
 
    rangeIndex = 0;
 
  }
 
  rangeCheck(fnName, rangeIndex, ranges.length - 1);
 
  return ranges[rangeIndex][valueIndex];
 
}
 

	
 
function rangeCheck(fnName, index, maxIndex) {
 
  if (index < 0 || index > maxIndex) {
 
    throw new Error('Failed to execute \'' + fnName + '\' on \'TimeRanges\': The index provided (' + index + ') is greater than or equal to the maximum bound (' + maxIndex + ').');
 
  }
 
}
 

	
 
},{"./log.js":123}],127:[function(_dereq_,module,exports){
 
/**
 
 * @file to-title-case.js
 
 *
 
 * Uppercase the first letter of a string
 
 *
 
 * @param  {String} string String to be uppercased
 
 * @return {String}
 
 * @private
 
 * @method toTitleCase
 
 */
 
"use strict";
 

	
 
exports.__esModule = true;
 
function toTitleCase(string) {
 
  return string.charAt(0).toUpperCase() + string.slice(1);
 
}
 

	
 
exports["default"] = toTitleCase;
 
module.exports = exports["default"];
 

	
 
},{}],128:[function(_dereq_,module,exports){
 
/**
 
 * @file url.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _globalWindow = _dereq_('global/window');
 

	
 
var _globalWindow2 = _interopRequireDefault(_globalWindow);
 

	
 
/**
 
 * Resolve and parse the elements of a URL
 
 *
 
 * @param  {String} url The url to parse
 
 * @return {Object}     An object of url details
 
 * @method parseUrl
 
 */
 
var parseUrl = function parseUrl(url) {
 
  var props = ['protocol', 'hostname', 'port', 'pathname', 'search', 'hash', 'host'];
 

	
 
  // add the url to an anchor and let the browser parse the URL
 
  var a = _globalDocument2['default'].createElement('a');
 
  a.href = url;
 

	
 
  // IE8 (and 9?) Fix
 
  // ie8 doesn't parse the URL correctly until the anchor is actually
 
  // added to the body, and an innerHTML is needed to trigger the parsing
 
  var addToBody = a.host === '' && a.protocol !== 'file:';
 
  var div = undefined;
 
  if (addToBody) {
 
    div = _globalDocument2['default'].createElement('div');
 
    div.innerHTML = '<a href="' + url + '"></a>';
 
    a = div.firstChild;
 
    // prevent the div from affecting layout
 
    div.setAttribute('style', 'display:none; position:absolute;');
 
    _globalDocument2['default'].body.appendChild(div);
 
  }
 

	
 
  // Copy the specific URL properties to a new object
 
  // This is also needed for IE8 because the anchor loses its
 
  // properties when it's removed from the dom
 
  var details = {};
 
  for (var i = 0; i < props.length; i++) {
 
    details[props[i]] = a[props[i]];
 
  }
 

	
 
  // IE9 adds the port to the host property unlike everyone else. If
 
  // a port identifier is added for standard ports, strip it.
 
  if (details.protocol === 'http:') {
 
    details.host = details.host.replace(/:80$/, '');
 
  }
 
  if (details.protocol === 'https:') {
 
    details.host = details.host.replace(/:443$/, '');
 
  }
 

	
 
  if (addToBody) {
 
    _globalDocument2['default'].body.removeChild(div);
 
  }
 

	
 
  return details;
 
};
 

	
 
exports.parseUrl = parseUrl;
 
/**
 
 * Get absolute version of relative URL. Used to tell flash correct URL.
 
 * http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue
 
 *
 
 * @param  {String} url URL to make absolute
 
 * @return {String}     Absolute URL
 
 * @private
 
 * @method getAbsoluteURL
 
 */
 
var getAbsoluteURL = function getAbsoluteURL(url) {
 
  // Check if absolute URL
 
  if (!url.match(/^https?:\/\//)) {
 
    // Convert to absolute URL. Flash hosted off-site needs an absolute URL.
 
    var div = _globalDocument2['default'].createElement('div');
 
    div.innerHTML = '<a href="' + url + '">x</a>';
 
    url = div.firstChild.href;
 
  }
 

	
 
  return url;
 
};
 

	
 
exports.getAbsoluteURL = getAbsoluteURL;
 
/**
 
 * Returns the extension of the passed file name. It will return an empty string if you pass an invalid path
 
 *
 
 * @param {String}    path    The fileName path like '/path/to/file.mp4'
 
 * @returns {String}          The extension in lower case or an empty string if no extension could be found.
 
 * @method getFileExtension
 
 */
 
var getFileExtension = function getFileExtension(path) {
 
  if (typeof path === 'string') {
 
    var splitPathRe = /^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/\?]+)))(?:[\/]*|[\?].*)$/i;
 
    var pathParts = splitPathRe.exec(path);
 

	
 
    if (pathParts) {
 
      return pathParts.pop().toLowerCase();
 
    }
 
  }
 

	
 
  return '';
 
};
 

	
 
exports.getFileExtension = getFileExtension;
 
/**
 
 * Returns whether the url passed is a cross domain request or not.
 
 *
 
 * @param {String} url The url to check
 
 * @return {Boolean}   Whether it is a cross domain request or not
 
 * @method isCrossOrigin
 
 */
 
var isCrossOrigin = function isCrossOrigin(url) {
 
  var urlInfo = parseUrl(url);
 
  var winLoc = _globalWindow2['default'].location;
 

	
 
  // IE8 protocol relative urls will return ':' for protocol
 
  var srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol;
 

	
 
  // Check if url is for another domain/origin
 
  // IE8 doesn't know location.origin, so we won't rely on it here
 
  var crossOrigin = srcProtocol + urlInfo.host !== winLoc.protocol + winLoc.host;
 

	
 
  return crossOrigin;
 
};
 
exports.isCrossOrigin = isCrossOrigin;
 

	
 
},{"global/document":1,"global/window":2}],129:[function(_dereq_,module,exports){
 
/**
 
 * @file video.js
 
 */
 
'use strict';
 

	
 
exports.__esModule = true;
 

	
 
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
 

	
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 

	
 
var _globalDocument = _dereq_('global/document');
 

	
 
var _globalDocument2 = _interopRequireDefault(_globalDocument);
 

	
 
var _setup = _dereq_('./setup');
 

	
 
var setup = _interopRequireWildcard(_setup);
 

	
 
var _utilsStylesheetJs = _dereq_('./utils/stylesheet.js');
 

	
 
var stylesheet = _interopRequireWildcard(_utilsStylesheetJs);
 

	
 
var _component = _dereq_('./component');
 

	
 
var _component2 = _interopRequireDefault(_component);
 

	
 
var _eventTarget = _dereq_('./event-target');
 

	
 
var _eventTarget2 = _interopRequireDefault(_eventTarget);
 

	
 
var _utilsEventsJs = _dereq_('./utils/events.js');
 

	
 
var Events = _interopRequireWildcard(_utilsEventsJs);
 

	
 
var _player = _dereq_('./player');
 

	
 
var _player2 = _interopRequireDefault(_player);
 

	
 
var _pluginsJs = _dereq_('./plugins.js');
 

	
 
var _pluginsJs2 = _interopRequireDefault(_pluginsJs);
 

	
 
var _srcJsUtilsMergeOptionsJs = _dereq_('../../src/js/utils/merge-options.js');
 

	
 
var _srcJsUtilsMergeOptionsJs2 = _interopRequireDefault(_srcJsUtilsMergeOptionsJs);
 

	
 
var _utilsFnJs = _dereq_('./utils/fn.js');
 

	
 
var Fn = _interopRequireWildcard(_utilsFnJs);
 

	
 
var _tracksTextTrackJs = _dereq_('./tracks/text-track.js');
 

	
 
var _tracksTextTrackJs2 = _interopRequireDefault(_tracksTextTrackJs);
 

	
 
var _objectAssign = _dereq_('object.assign');
 

	
 
var _objectAssign2 = _interopRequireDefault(_objectAssign);
 

	
 
var _utilsTimeRangesJs = _dereq_('./utils/time-ranges.js');
 

	
 
var _utilsFormatTimeJs = _dereq_('./utils/format-time.js');
 

	
 
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
 

	
 
var _utilsLogJs = _dereq_('./utils/log.js');
 

	
 
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
 

	
 
var _utilsDomJs = _dereq_('./utils/dom.js');
 

	
 
var Dom = _interopRequireWildcard(_utilsDomJs);
 

	
 
var _utilsBrowserJs = _dereq_('./utils/browser.js');
 

	
 
var browser = _interopRequireWildcard(_utilsBrowserJs);
 

	
 
var _utilsUrlJs = _dereq_('./utils/url.js');
 

	
 
var Url = _interopRequireWildcard(_utilsUrlJs);
 

	
 
var _extendJs = _dereq_('./extend.js');
 

	
 
var _extendJs2 = _interopRequireDefault(_extendJs);
 

	
 
var _lodashCompatObjectMerge = _dereq_('lodash-compat/object/merge');
 

	
 
var _lodashCompatObjectMerge2 = _interopRequireDefault(_lodashCompatObjectMerge);
 

	
 
var _utilsCreateDeprecationProxyJs = _dereq_('./utils/create-deprecation-proxy.js');
 

	
 
var _utilsCreateDeprecationProxyJs2 = _interopRequireDefault(_utilsCreateDeprecationProxyJs);
 

	
 
var _xhr = _dereq_('xhr');
 

	
 
var _xhr2 = _interopRequireDefault(_xhr);
 

	
 
// Include the built-in techs
 

	
 
var _techHtml5Js = _dereq_('./tech/html5.js');
 

	
 
var _techHtml5Js2 = _interopRequireDefault(_techHtml5Js);
 

	
 
var _techFlashJs = _dereq_('./tech/flash.js');
 

	
 
var _techFlashJs2 = _interopRequireDefault(_techFlashJs);
 

	
 
// HTML5 Element Shim for IE8
 
if (typeof HTMLVideoElement === 'undefined') {
 
  _globalDocument2['default'].createElement('video');
 
  _globalDocument2['default'].createElement('audio');
 
  _globalDocument2['default'].createElement('track');
 
}
 

	
 
/**
 
 * Doubles as the main function for users to create a player instance and also
 
 * the main library object.
 
 * The `videojs` function can be used to initialize or retrieve a player.
 
 * ```js
 
 *     var myPlayer = videojs('my_video_id');
 
 * ```
 
 *
 
 * @param  {String|Element} id      Video element or video element ID
 
 * @param  {Object=} options        Optional options object for config/settings
 
 * @param  {Function=} ready        Optional ready callback
 
 * @return {Player}                 A player instance
 
 * @mixes videojs
 
 * @method videojs
 
 */
 
var videojs = function videojs(id, options, ready) {
 
  var tag; // Element of ID
 

	
 
  // Allow for element or ID to be passed in
 
  // String ID
 
  if (typeof id === 'string') {
 

	
 
    // Adjust for jQuery ID syntax
 
    if (id.indexOf('#') === 0) {
 
      id = id.slice(1);
 
    }
 

	
 
    // If a player instance has already been created for this ID return it.
 
    if (videojs.getPlayers()[id]) {
 

	
 
      // If options or ready funtion are passed, warn
 
      if (options) {
 
        _utilsLogJs2['default'].warn('Player "' + id + '" is already initialised. Options will not be applied.');
 
      }
 

	
 
      if (ready) {
 
        videojs.getPlayers()[id].ready(ready);
 
      }
 

	
 
      return videojs.getPlayers()[id];
 

	
 
      // Otherwise get element for ID
 
    } else {
 
        tag = Dom.getEl(id);
 
      }
 

	
 
    // ID is a media element
 
  } else {
 
      tag = id;
 
    }
 

	
 
  // Check for a useable element
 
  if (!tag || !tag.nodeName) {
 
    // re: nodeName, could be a box div also
 
    throw new TypeError('The element or ID supplied is not valid. (videojs)'); // Returns
 
  }
 

	
 
  // Element may have a player attr referring to an already created player instance.
 
  // If not, set up a new player and return the instance.
 
  return tag['player'] || new _player2['default'](tag, options, ready);
 
};
 

	
 
// Add default styles
 
var style = _globalDocument2['default'].querySelector('.vjs-styles-defaults');
 
if (!style) {
 
  style = stylesheet.createStyleElement('vjs-styles-defaults');
 
  var head = _globalDocument2['default'].querySelector('head');
 
  head.insertBefore(style, head.firstChild);
 
  stylesheet.setTextContent(style, '\n    .video-js {\n      width: 300px;\n      height: 150px;\n    }\n\n    .vjs-fluid {\n      padding-top: 56.25%\n    }\n  ');
 
}
 

	
 
// Run Auto-load players
 
// You have to wait at least once in case this script is loaded after your video in the DOM (weird behavior only with minified version)
 
setup.autoSetupTimeout(1, videojs);
 

	
 
/*
 
 * Current software version (semver)
 
 *
 
 * @type {String}
 
 */
 
videojs.VERSION = '5.0.0';
 

	
 
/**
 
 * The global options object. These are the settings that take effect
 
 * if no overrides are specified when the player is created.
 
 *
 
 * ```js
 
 *     videojs.options.autoplay = true
 
 *     // -> all players will autoplay by default
 
 * ```
 
 *
 
 * @type {Object}
 
 */
 
videojs.options = _player2['default'].prototype.options_;
 

	
 
/**
 
 * Get an object with the currently created players, keyed by player ID
 
 *
 
 * @return {Object} The created players
 
 * @mixes videojs
 
 * @method getPlayers
 
 */
 
videojs.getPlayers = function () {
 
  return _player2['default'].players;
 
};
 

	
 
/**
 
 * For backward compatibility, expose players object.
 
 *
 
 * @deprecated
 
 * @memberOf videojs
 
 * @property {Object|Proxy} players
 
 */
 
videojs.players = _utilsCreateDeprecationProxyJs2['default'](_player2['default'].players, {
 
  get: 'Access to videojs.players is deprecated; use videojs.getPlayers instead',
 
  set: 'Modification of videojs.players is deprecated'
 
});
 

	
 
/**
 
 * Get a component class object by name
 
 * ```js
 
 *     var VjsButton = videojs.getComponent('Button');
 
 *     // Create a new instance of the component
 
 *     var myButton = new VjsButton(myPlayer);
 
 * ```
 
 *
 
 * @return {Component} Component identified by name
 
 * @mixes videojs
 
 * @method getComponent
 
 */
 
videojs.getComponent = _component2['default'].getComponent;
 

	
 
/**
 
 * Register a component so it can referred to by name
 
 * Used when adding to other
 
 * components, either through addChild
 
 * `component.addChild('myComponent')`
 
 * or through default children options
 
 * `{ children: ['myComponent'] }`.
 
 * ```js
 
 *     // Get a component to subclass
 
 *     var VjsButton = videojs.getComponent('Button');
 
 *     // Subclass the component (see 'extend' doc for more info)
 
 *     var MySpecialButton = videojs.extend(VjsButton, {});
 
 *     // Register the new component
 
 *     VjsButton.registerComponent('MySepcialButton', MySepcialButton);
 
 *     // (optionally) add the new component as a default player child
 
 *     myPlayer.addChild('MySepcialButton');
 
 * ```
 
 * NOTE: You could also just initialize the component before adding.
 
 * `component.addChild(new MyComponent());`
 
 *
 
 * @param {String} The class name of the component
 
 * @param {Component} The component class
 
 * @return {Component} The newly registered component
 
 * @mixes videojs
 
 * @method registerComponent
 
 */
 
videojs.registerComponent = _component2['default'].registerComponent;
 

	
 
/**
 
 * A suite of browser and device tests
 
 *
 
 * @type {Object}
 
 * @private
 
 */
 
videojs.browser = browser;
 

	
 
/**
 
 * Whether or not the browser supports touch events. Included for backward
 
 * compatibility with 4.x, but deprecated. Use `videojs.browser.TOUCH_ENABLED`
 
 * instead going forward.
 
 *
 
 * @deprecated
 
 * @type {Boolean}
 
 */
 
videojs.TOUCH_ENABLED = browser.TOUCH_ENABLED;
 

	
 
/**
 
 * Subclass an existing class
 
 * Mimics ES6 subclassing with the `extend` keyword
 
 * ```js
 
 *     // Create a basic javascript 'class'
 
 *     function MyClass(name){
 
 *       // Set a property at initialization
 
 *       this.myName = name;
 
 *     }
 
 *     // Create an instance method
 
 *     MyClass.prototype.sayMyName = function(){
 
 *       alert(this.myName);
 
 *     };
 
 *     // Subclass the exisitng class and change the name
 
 *     // when initializing
 
 *     var MySubClass = videojs.extend(MyClass, {
 
 *       constructor: function(name) {
 
 *         // Call the super class constructor for the subclass
 
 *         MyClass.call(this, name)
 
 *       }
 
 *     });
 
 *     // Create an instance of the new sub class
 
 *     var myInstance = new MySubClass('John');
 
 *     myInstance.sayMyName(); // -> should alert "John"
 
 * ```
 
 *
 
 * @param {Function} The Class to subclass
 
 * @param {Object} An object including instace methods for the new class
 
 *                   Optionally including a `constructor` function
 
 * @return {Function} The newly created subclass
 
 * @mixes videojs
 
 * @method extend
 
 */
 
videojs.extend = _extendJs2['default'];
 

	
 
/**
 
 * Merge two options objects recursively
 
 * Performs a deep merge like lodash.merge but **only merges plain objects**
 
 * (not arrays, elements, anything else)
 
 * Other values will be copied directly from the second object.
 
 * ```js
 
 *     var defaultOptions = {
 
 *       foo: true,
 
 *       bar: {
 
 *         a: true,
 
 *         b: [1,2,3]
 
 *       }
 
 *     };
 
 *     var newOptions = {
 
 *       foo: false,
 
 *       bar: {
 
 *         b: [4,5,6]
 
 *       }
 
 *     };
 
 *     var result = videojs.mergeOptions(defaultOptions, newOptions);
 
 *     // result.foo = false;
 
 *     // result.bar.a = true;
 
 *     // result.bar.b = [4,5,6];
 
 * ```
 
 *
 
 * @param {Object} The options object whose values will be overriden
 
 * @param {Object} The options object with values to override the first
 
 * @param {Object} Any number of additional options objects
 
 *
 
 * @return {Object} a new object with the merged values
 
 * @mixes videojs
 
 * @method mergeOptions
 
 */
 
videojs.mergeOptions = _srcJsUtilsMergeOptionsJs2['default'];
 

	
 
/**
 
 * Change the context (this) of a function
 
 *
 
 *     videojs.bind(newContext, function(){
 
 *       this === newContext
 
 *     });
 
 *
 
 * NOTE: as of v5.0 we require an ES5 shim, so you should use the native
 
 * `function(){}.bind(newContext);` instead of this.
 
 *
 
 * @param  {*}        context The object to bind as scope
 
 * @param  {Function} fn      The function to be bound to a scope
 
 * @param  {Number=}  uid     An optional unique ID for the function to be set
 
 * @return {Function}
 
 */
 
videojs.bind = Fn.bind;
 

	
 
/**
 
 * Create a Video.js player plugin
 
 * Plugins are only initialized when options for the plugin are included
 
 * in the player options, or the plugin function on the player instance is
 
 * called.
 
 * **See the plugin guide in the docs for a more detailed example**
 
 * ```js
 
 *     // Make a plugin that alerts when the player plays
 
 *     videojs.plugin('myPlugin', function(myPluginOptions) {
 
 *       myPluginOptions = myPluginOptions || {};
 
 *
 
 *       var player = this;
 
 *       var alertText = myPluginOptions.text || 'Player is playing!'
 
 *
 
 *       player.on('play', function(){
 
 *         alert(alertText);
 
 *       });
 
 *     });
 
 *     // USAGE EXAMPLES
 
 *     // EXAMPLE 1: New player with plugin options, call plugin immediately
 
 *     var player1 = videojs('idOne', {
 
 *       myPlugin: {
 
 *         text: 'Custom text!'
 
 *       }
 
 *     });
 
 *     // Click play
 
 *     // --> Should alert 'Custom text!'
 
 *     // EXAMPLE 3: New player, initialize plugin later
 
 *     var player3 = videojs('idThree');
 
 *     // Click play
 
 *     // --> NO ALERT
 
 *     // Click pause
 
 *     // Initialize plugin using the plugin function on the player instance
 
 *     player3.myPlugin({
 
 *       text: 'Plugin added later!'
 
 *     });
 
 *     // Click play
 
 *     // --> Should alert 'Plugin added later!'
 
 * ```
 
 *
 
 * @param {String} The plugin name
 
 * @param {Function} The plugin function that will be called with options
 
 * @mixes videojs
 
 * @method plugin
 
 */
 
videojs.plugin = _pluginsJs2['default'];
 

	
 
/**
 
 * Adding languages so that they're available to all players.
 
 * ```js
 
 *     videojs.addLanguage('es', { 'Hello': 'Hola' });
 
 * ```
 
 *
 
 * @param  {String} code The language code or dictionary property
 
 * @param  {Object} data The data values to be translated
 
 * @return {Object} The resulting language dictionary object
 
 * @mixes videojs
 
 * @method addLanguage
 
 */
 
videojs.addLanguage = function (code, data) {
 
  var _merge;
 

	
 
  code = ('' + code).toLowerCase();
 
  return _lodashCompatObjectMerge2['default'](videojs.options.languages, (_merge = {}, _merge[code] = data, _merge))[code];
 
};
 

	
 
/**
 
 * Log debug messages.
 
 *
 
 * @param {...Object} messages One or more messages to log
 
 */
 
videojs.log = _utilsLogJs2['default'];
 

	
 
/**
 
 * Creates an emulated TimeRange object.
 
 *
 
 * @param  {Number|Array} start Start time in seconds or an array of ranges
 
 * @param  {Number} end   End time in seconds
 
 * @return {Object}       Fake TimeRange object
 
 * @method createTimeRange
 
 */
 
videojs.createTimeRange = videojs.createTimeRanges = _utilsTimeRangesJs.createTimeRanges;
 

	
 
/**
 
 * Format seconds as a time string, H:MM:SS or M:SS
 
 * Supplying a guide (in seconds) will force a number of leading zeros
 
 * to cover the length of the guide
 
 *
 
 * @param  {Number} seconds Number of seconds to be turned into a string
 
 * @param  {Number} guide   Number (in seconds) to model the string after
 
 * @return {String}         Time formatted as H:MM:SS or M:SS
 
 * @method formatTime
 
 */
 
videojs.formatTime = _utilsFormatTimeJs2['default'];
 

	
 
/**
 
 * Resolve and parse the elements of a URL
 
 *
 
 * @param  {String} url The url to parse
 
 * @return {Object}     An object of url details
 
 * @method parseUrl
 
 */
 
videojs.parseUrl = Url.parseUrl;
 

	
 
/**
 
 * Returns whether the url passed is a cross domain request or not.
 
 *
 
 * @param {String} url The url to check
 
 * @return {Boolean}   Whether it is a cross domain request or not
 
 * @method isCrossOrigin
 
 */
 
videojs.isCrossOrigin = Url.isCrossOrigin;
 

	
 
/**
 
 * Event target class.
 
 *
 
 * @type {Function}
 
 */
 
videojs.EventTarget = _eventTarget2['default'];
 

	
 
/**
 
 * Add an event listener to element
 
 * It stores the handler function in a separate cache object
 
 * and adds a generic handler to the element's event,
 
 * along with a unique id (guid) to the element.
 
 *
 
 * @param  {Element|Object}   elem Element or object to bind listeners to
 
 * @param  {String|Array}   type Type of event to bind to.
 
 * @param  {Function} fn   Event listener.
 
 * @method on
 
 */
 
videojs.on = Events.on;
 

	
 
/**
 
 * Trigger a listener only once for an event
 
 *
 
 * @param  {Element|Object}   elem Element or object to
 
 * @param  {String|Array}   type Name/type of event
 
 * @param  {Function} fn Event handler function
 
 * @method one
 
 */
 
videojs.one = Events.one;
 

	
 
/**
 
 * Removes event listeners from an element
 
 *
 
 * @param  {Element|Object}   elem Object to remove listeners from
 
 * @param  {String|Array=}   type Type of listener to remove. Don't include to remove all events from element.
 
 * @param  {Function} fn   Specific listener to remove. Don't include to remove listeners for an event type.
 
 * @method off
 
 */
 
videojs.off = Events.off;
 

	
 
/**
 
 * Trigger an event for an element
 
 *
 
 * @param  {Element|Object}      elem  Element to trigger an event on
 
 * @param  {Event|Object|String} event A string (the type) or an event object with a type attribute
 
 * @param  {Object} [hash] data hash to pass along with the event
 
 * @return {Boolean=} Returned only if default was prevented
 
 * @method trigger
 
 */
 
videojs.trigger = Events.trigger;
 

	
 
/**
 
 * A cross-browser XMLHttpRequest wrapper. Here's a simple example:
 
 *
 
 *     videojs.xhr({
 
 *       body: someJSONString,
 
 *       uri: "/foo",
 
 *       headers: {
 
 *         "Content-Type": "application/json"
 
 *       }
 
 *     }, function (err, resp, body) {
 
 *       // check resp.statusCode
 
 *     });
 
 *
 
 * Check out the [full
 
 * documentation](https://github.com/Raynos/xhr/blob/v2.1.0/README.md)
 
 * for more options.
 
 *
 
 * @param {Object} options settings for the request.
 
 * @return {XMLHttpRequest|XDomainRequest} the request object.
 
 * @see https://github.com/Raynos/xhr
 
 */
 
videojs.xhr = _xhr2['default'];
 

	
 
/**
 
 * TextTrack class
 
 *
 
 * @type {Function}
 
 */
 
videojs.TextTrack = _tracksTextTrackJs2['default'];
 

	
 
// REMOVING: We probably should add this to the migration plugin
 
// // Expose but deprecate the window[componentName] method for accessing components
 
// Object.getOwnPropertyNames(Component.components).forEach(function(name){
 
//   let component = Component.components[name];
 
//
 
//   // A deprecation warning as the constuctor
 
//   module.exports[name] = function(player, options, ready){
 
//     log.warn('Using videojs.'+name+' to access the '+name+' component has been deprecated. Please use videojs.getComponent("componentName")');
 
//
 
//     return new Component(player, options, ready);
 
//   };
 
//
 
//   // Allow the prototype and class methods to be accessible still this way
 
//   // Though anything that attempts to override class methods will no longer work
 
//   assign(module.exports[name], component);
 
// });
 

	
 
/*
 
 * Custom Universal Module Definition (UMD)
 
 *
 
 * Video.js will never be a non-browser lib so we can simplify UMD a bunch and
 
 * still support requirejs and browserify. This also needs to be closure
 
 * compiler compatible, so string keys are used.
 
 */
 
if (typeof define === 'function' && define['amd']) {
 
  define('videojs', [], function () {
 
    return videojs;
 
  });
 

	
 
  // checking that module is an object too because of umdjs/umd#35
 
} else if (typeof exports === 'object' && typeof module === 'object') {
 
    module['exports'] = videojs;
 
  }
 

	
 
exports['default'] = videojs;
 
module.exports = exports['default'];
 

	
 
},{"../../src/js/utils/merge-options.js":124,"./component":58,"./event-target":90,"./extend.js":91,"./player":98,"./plugins.js":99,"./setup":101,"./tech/flash.js":104,"./tech/html5.js":105,"./tracks/text-track.js":114,"./utils/browser.js":115,"./utils/create-deprecation-proxy.js":117,"./utils/dom.js":118,"./utils/events.js":119,"./utils/fn.js":120,"./utils/format-time.js":121,"./utils/log.js":123,"./utils/stylesheet.js":125,"./utils/time-ranges.js":126,"./utils/url.js":128,"global/document":1,"lodash-compat/object/merge":40,"object.assign":43,"xhr":50}]},{},[129])(129)
 
});
 

	
 

	
 
//# sourceMappingURL=video.js.map
 
/* vtt.js - v0.12.1 (https://github.com/mozilla/vtt.js) built on 08-07-2015 */
 

	
 
(function(root) {
 
  var vttjs = root.vttjs = {};
 
  var cueShim = vttjs.VTTCue;
 
  var regionShim = vttjs.VTTRegion;
 
  var oldVTTCue = root.VTTCue;
 
  var oldVTTRegion = root.VTTRegion;
 

	
 
  vttjs.shim = function() {
 
    vttjs.VTTCue = cueShim;
 
    vttjs.VTTRegion = regionShim;
 
  };
 

	
 
  vttjs.restore = function() {
 
    vttjs.VTTCue = oldVTTCue;
 
    vttjs.VTTRegion = oldVTTRegion;
 
  };
 
}(this));
 

	
 
/**
 
 * Copyright 2013 vtt.js Contributors
 
 *
 
 * Licensed under the Apache License, Version 2.0 (the "License");
 
 * you may not use this file except in compliance with the License.
 
 * You may obtain a copy of the License at
 
 *
 
 *   http://www.apache.org/licenses/LICENSE-2.0
 
 *
 
 * Unless required by applicable law or agreed to in writing, software
 
 * distributed under the License is distributed on an "AS IS" BASIS,
 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
 * See the License for the specific language governing permissions and
 
 * limitations under the License.
 
 */
 

	
 
(function(root, vttjs) {
 

	
 
  var autoKeyword = "auto";
 
  var directionSetting = {
 
    "": true,
 
    "lr": true,
 
    "rl": true
 
  };
 
  var alignSetting = {
 
    "start": true,
 
    "middle": true,
 
    "end": true,
 
    "left": true,
 
    "right": true
 
  };
 

	
 
  function findDirectionSetting(value) {
 
    if (typeof value !== "string") {
 
      return false;
 
    }
 
    var dir = directionSetting[value.toLowerCase()];
 
    return dir ? value.toLowerCase() : false;
 
  }
 

	
 
  function findAlignSetting(value) {
 
    if (typeof value !== "string") {
 
      return false;
 
    }
 
    var align = alignSetting[value.toLowerCase()];
 
    return align ? value.toLowerCase() : false;
 
  }
 

	
 
  function extend(obj) {
 
    var i = 1;
 
    for (; i < arguments.length; i++) {
 
      var cobj = arguments[i];
 
      for (var p in cobj) {
 
        obj[p] = cobj[p];
 
      }
 
    }
 

	
 
    return obj;
 
  }
 

	
 
  function VTTCue(startTime, endTime, text) {
 
    var cue = this;
 
    var isIE8 = (/MSIE\s8\.0/).test(navigator.userAgent);
 
    var baseObj = {};
 

	
 
    if (isIE8) {
 
      cue = document.createElement('custom');
 
    } else {
 
      baseObj.enumerable = true;
 
    }
 

	
 
    /**
 
     * Shim implementation specific properties. These properties are not in
 
     * the spec.
 
     */
 

	
 
    // Lets us know when the VTTCue's data has changed in such a way that we need
 
    // to recompute its display state. This lets us compute its display state
 
    // lazily.
 
    cue.hasBeenReset = false;
 

	
 
    /**
 
     * VTTCue and TextTrackCue properties
 
     * http://dev.w3.org/html5/webvtt/#vttcue-interface
 
     */
 

	
 
    var _id = "";
 
    var _pauseOnExit = false;
 
    var _startTime = startTime;
 
    var _endTime = endTime;
 
    var _text = text;
 
    var _region = null;
 
    var _vertical = "";
 
    var _snapToLines = true;
 
    var _line = "auto";
 
    var _lineAlign = "start";
 
    var _position = 50;
 
    var _positionAlign = "middle";
 
    var _size = 50;
 
    var _align = "middle";
 

	
 
    Object.defineProperty(cue,
 
      "id", extend({}, baseObj, {
 
        get: function() {
 
          return _id;
 
        },
 
        set: function(value) {
 
          _id = "" + value;
 
        }
 
      }));
 

	
 
    Object.defineProperty(cue,
 
      "pauseOnExit", extend({}, baseObj, {
 
        get: function() {
 
          return _pauseOnExit;
 
        },
 
        set: function(value) {
 
          _pauseOnExit = !!value;
 
        }
 
      }));
 

	
 
    Object.defineProperty(cue,
 
      "startTime", extend({}, baseObj, {
 
        get: function() {
 
          return _startTime;
 
        },
 
        set: function(value) {
 
          if (typeof value !== "number") {
 
            throw new TypeError("Start time must be set to a number.");
 
          }
 
          _startTime = value;
 
          this.hasBeenReset = true;
 
        }
 
      }));
 

	
 
    Object.defineProperty(cue,
 
      "endTime", extend({}, baseObj, {
 
        get: function() {
 
          return _endTime;
 
        },
 
        set: function(value) {
 
          if (typeof value !== "number") {
 
            throw new TypeError("End time must be set to a number.");
 
          }
 
          _endTime = value;
 
          this.hasBeenReset = true;
 
        }
 
      }));
 

	
 
    Object.defineProperty(cue,
 
      "text", extend({}, baseObj, {
 
        get: function() {
 
          return _text;
 
        },
 
        set: function(value) {
 
          _text = "" + value;
 
          this.hasBeenReset = true;
 
        }
 
      }));
 

	
 
    Object.defineProperty(cue,
 
      "region", extend({}, baseObj, {
 
        get: function() {
 
          return _region;
 
        },
 
        set: function(value) {
 
          _region = value;
 
          this.hasBeenReset = true;
 
        }
 
      }));
 

	
 
    Object.defineProperty(cue,
 
      "vertical", extend({}, baseObj, {
 
        get: function() {
 
          return _vertical;
 
        },
 
        set: function(value) {
 
          var setting = findDirectionSetting(value);
 
          // Have to check for false because the setting an be an empty string.
 
          if (setting === false) {
 
            throw new SyntaxError("An invalid or illegal string was specified.");
 
          }
 
          _vertical = setting;
 
          this.hasBeenReset = true;
 
        }
 
      }));
 

	
 
    Object.defineProperty(cue,
 
      "snapToLines", extend({}, baseObj, {
 
        get: function() {
 
          return _snapToLines;
 
        },
 
        set: function(value) {
 
          _snapToLines = !!value;
 
          this.hasBeenReset = true;
 
        }
 
      }));
 

	
 
    Object.defineProperty(cue,
 
      "line", extend({}, baseObj, {
 
        get: function() {
 
          return _line;
 
        },
 
        set: function(value) {
 
          if (typeof value !== "number" && value !== autoKeyword) {
 
            throw new SyntaxError("An invalid number or illegal string was specified.");
 
          }
 
          _line = value;
 
          this.hasBeenReset = true;
 
        }
 
      }));
 

	
 
    Object.defineProperty(cue,
 
      "lineAlign", extend({}, baseObj, {
 
        get: function() {
 
          return _lineAlign;
 
        },
 
        set: function(value) {
 
          var setting = findAlignSetting(value);
 
          if (!setting) {
 
            throw new SyntaxError("An invalid or illegal string was specified.");
 
          }
 
          _lineAlign = setting;
 
          this.hasBeenReset = true;
 
        }
 
      }));
 

	
 
    Object.defineProperty(cue,
 
      "position", extend({}, baseObj, {
 
        get: function() {
 
          return _position;
 
        },
 
        set: function(value) {
 
          if (value < 0 || value > 100) {
 
            throw new Error("Position must be between 0 and 100.");
 
          }
 
          _position = value;
 
          this.hasBeenReset = true;
 
        }
 
      }));
 

	
 
    Object.defineProperty(cue,
 
      "positionAlign", extend({}, baseObj, {
 
        get: function() {
 
          return _positionAlign;
 
        },
 
        set: function(value) {
 
          var setting = findAlignSetting(value);
 
          if (!setting) {
 
            throw new SyntaxError("An invalid or illegal string was specified.");
 
          }
 
          _positionAlign = setting;
 
          this.hasBeenReset = true;
 
        }
 
      }));
 

	
 
    Object.defineProperty(cue,
 
      "size", extend({}, baseObj, {
 
        get: function() {
 
          return _size;
 
        },
 
        set: function(value) {
 
          if (value < 0 || value > 100) {
 
            throw new Error("Size must be between 0 and 100.");
 
          }
 
          _size = value;
 
          this.hasBeenReset = true;
 
        }
 
      }));
 

	
 
    Object.defineProperty(cue,
 
      "align", extend({}, baseObj, {
 
        get: function() {
 
          return _align;
 
        },
 
        set: function(value) {
 
          var setting = findAlignSetting(value);
 
          if (!setting) {
 
            throw new SyntaxError("An invalid or illegal string was specified.");
 
          }
 
          _align = setting;
 
          this.hasBeenReset = true;
 
        }
 
      }));
 

	
 
    /**
 
     * Other <track> spec defined properties
 
     */
 

	
 
    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#text-track-cue-display-state
 
    cue.displayState = undefined;
 

	
 
    if (isIE8) {
 
      return cue;
 
    }
 
  }
 

	
 
  /**
 
   * VTTCue methods
 
   */
 

	
 
  VTTCue.prototype.getCueAsHTML = function() {
 
    // Assume WebVTT.convertCueToDOMTree is on the global.
 
    return WebVTT.convertCueToDOMTree(window, this.text);
 
  };
 

	
 
  root.VTTCue = root.VTTCue || VTTCue;
 
  vttjs.VTTCue = VTTCue;
 
}(this, (this.vttjs || {})));
 

	
 
/**
 
 * Copyright 2013 vtt.js Contributors
 
 *
 
 * Licensed under the Apache License, Version 2.0 (the "License");
 
 * you may not use this file except in compliance with the License.
 
 * You may obtain a copy of the License at
 
 *
 
 *   http://www.apache.org/licenses/LICENSE-2.0
 
 *
 
 * Unless required by applicable law or agreed to in writing, software
 
 * distributed under the License is distributed on an "AS IS" BASIS,
 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
 * See the License for the specific language governing permissions and
 
 * limitations under the License.
 
 */
 

	
 
(function(root, vttjs) {
 

	
 
  var scrollSetting = {
 
    "": true,
 
    "up": true
 
  };
 

	
 
  function findScrollSetting(value) {
 
    if (typeof value !== "string") {
 
      return false;
 
    }
 
    var scroll = scrollSetting[value.toLowerCase()];
 
    return scroll ? value.toLowerCase() : false;
 
  }
 

	
 
  function isValidPercentValue(value) {
 
    return typeof value === "number" && (value >= 0 && value <= 100);
 
  }
 

	
 
  // VTTRegion shim http://dev.w3.org/html5/webvtt/#vttregion-interface
 
  function VTTRegion() {
 
    var _width = 100;
 
    var _lines = 3;
 
    var _regionAnchorX = 0;
 
    var _regionAnchorY = 100;
 
    var _viewportAnchorX = 0;
 
    var _viewportAnchorY = 100;
 
    var _scroll = "";
 

	
 
    Object.defineProperties(this, {
 
      "width": {
 
        enumerable: true,
 
        get: function() {
 
          return _width;
 
        },
 
        set: function(value) {
 
          if (!isValidPercentValue(value)) {
 
            throw new Error("Width must be between 0 and 100.");
 
          }
 
          _width = value;
 
        }
 
      },
 
      "lines": {
 
        enumerable: true,
 
        get: function() {
 
          return _lines;
 
        },
 
        set: function(value) {
 
          if (typeof value !== "number") {
 
            throw new TypeError("Lines must be set to a number.");
 
          }
 
          _lines = value;
 
        }
 
      },
 
      "regionAnchorY": {
 
        enumerable: true,
 
        get: function() {
 
          return _regionAnchorY;
 
        },
 
        set: function(value) {
 
          if (!isValidPercentValue(value)) {
 
            throw new Error("RegionAnchorX must be between 0 and 100.");
 
          }
 
          _regionAnchorY = value;
 
        }
 
      },
 
      "regionAnchorX": {
 
        enumerable: true,
 
        get: function() {
 
          return _regionAnchorX;
 
        },
 
        set: function(value) {
 
          if(!isValidPercentValue(value)) {
 
            throw new Error("RegionAnchorY must be between 0 and 100.");
 
          }
 
          _regionAnchorX = value;
 
        }
 
      },
 
      "viewportAnchorY": {
 
        enumerable: true,
 
        get: function() {
 
          return _viewportAnchorY;
 
        },
 
        set: function(value) {
 
          if (!isValidPercentValue(value)) {
 
            throw new Error("ViewportAnchorY must be between 0 and 100.");
 
          }
 
          _viewportAnchorY = value;
 
        }
 
      },
 
      "viewportAnchorX": {
 
        enumerable: true,
 
        get: function() {
 
          return _viewportAnchorX;
 
        },
 
        set: function(value) {
 
          if (!isValidPercentValue(value)) {
 
            throw new Error("ViewportAnchorX must be between 0 and 100.");
 
          }
 
          _viewportAnchorX = value;
 
        }
 
      },
 
      "scroll": {
 
        enumerable: true,
 
        get: function() {
 
          return _scroll;
 
        },
 
        set: function(value) {
 
          var setting = findScrollSetting(value);
 
          // Have to check for false as an empty string is a legal value.
 
          if (setting === false) {
 
            throw new SyntaxError("An invalid or illegal string was specified.");
 
          }
 
          _scroll = setting;
 
        }
 
      }
 
    });
 
  }
 

	
 
  root.VTTRegion = root.VTTRegion || VTTRegion;
 
  vttjs.VTTRegion = VTTRegion;
 
}(this, (this.vttjs || {})));
 

	
 
/**
 
 * Copyright 2013 vtt.js Contributors
 
 *
 
 * Licensed under the Apache License, Version 2.0 (the "License");
 
 * you may not use this file except in compliance with the License.
 
 * You may obtain a copy of the License at
 
 *
 
 *   http://www.apache.org/licenses/LICENSE-2.0
 
 *
 
 * Unless required by applicable law or agreed to in writing, software
 
 * distributed under the License is distributed on an "AS IS" BASIS,
 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
 * See the License for the specific language governing permissions and
 
 * limitations under the License.
 
 */
 

	
 
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
 

	
 
(function(global) {
 

	
 
  var _objCreate = Object.create || (function() {
 
    function F() {}
 
    return function(o) {
 
      if (arguments.length !== 1) {
 
        throw new Error('Object.create shim only accepts one parameter.');
 
      }
 
      F.prototype = o;
 
      return new F();
 
    };
 
  })();
 

	
 
  // Creates a new ParserError object from an errorData object. The errorData
 
  // object should have default code and message properties. The default message
 
  // property can be overriden by passing in a message parameter.
 
  // See ParsingError.Errors below for acceptable errors.
 
  function ParsingError(errorData, message) {
 
    this.name = "ParsingError";
 
    this.code = errorData.code;
 
    this.message = message || errorData.message;
 
  }
 
  ParsingError.prototype = _objCreate(Error.prototype);
 
  ParsingError.prototype.constructor = ParsingError;
 

	
 
  // ParsingError metadata for acceptable ParsingErrors.
 
  ParsingError.Errors = {
 
    BadSignature: {
 
      code: 0,
 
      message: "Malformed WebVTT signature."
 
    },
 
    BadTimeStamp: {
 
      code: 1,
 
      message: "Malformed time stamp."
 
    }
 
  };
 

	
 
  // Try to parse input as a time stamp.
 
  function parseTimeStamp(input) {
 

	
 
    function computeSeconds(h, m, s, f) {
 
      return (h | 0) * 3600 + (m | 0) * 60 + (s | 0) + (f | 0) / 1000;
 
    }
 

	
 
    var m = input.match(/^(\d+):(\d{2})(:\d{2})?\.(\d{3})/);
 
    if (!m) {
 
      return null;
 
    }
 

	
 
    if (m[3]) {
 
      // Timestamp takes the form of [hours]:[minutes]:[seconds].[milliseconds]
 
      return computeSeconds(m[1], m[2], m[3].replace(":", ""), m[4]);
 
    } else if (m[1] > 59) {
 
      // Timestamp takes the form of [hours]:[minutes].[milliseconds]
 
      // First position is hours as it's over 59.
 
      return computeSeconds(m[1], m[2], 0,  m[4]);
 
    } else {
 
      // Timestamp takes the form of [minutes]:[seconds].[milliseconds]
 
      return computeSeconds(0, m[1], m[2], m[4]);
 
    }
 
  }
 

	
 
  // A settings object holds key/value pairs and will ignore anything but the first
 
  // assignment to a specific key.
 
  function Settings() {
 
    this.values = _objCreate(null);
 
  }
 

	
 
  Settings.prototype = {
 
    // Only accept the first assignment to any key.
 
    set: function(k, v) {
 
      if (!this.get(k) && v !== "") {
 
        this.values[k] = v;
 
      }
 
    },
 
    // Return the value for a key, or a default value.
 
    // If 'defaultKey' is passed then 'dflt' is assumed to be an object with
 
    // a number of possible default values as properties where 'defaultKey' is
 
    // the key of the property that will be chosen; otherwise it's assumed to be
 
    // a single value.
 
    get: function(k, dflt, defaultKey) {
 
      if (defaultKey) {
 
        return this.has(k) ? this.values[k] : dflt[defaultKey];
 
      }
 
      return this.has(k) ? this.values[k] : dflt;
 
    },
 
    // Check whether we have a value for a key.
 
    has: function(k) {
 
      return k in this.values;
 
    },
 
    // Accept a setting if its one of the given alternatives.
 
    alt: function(k, v, a) {
 
      for (var n = 0; n < a.length; ++n) {
 
        if (v === a[n]) {
 
          this.set(k, v);
 
          break;
 
        }
 
      }
 
    },
 
    // Accept a setting if its a valid (signed) integer.
 
    integer: function(k, v) {
 
      if (/^-?\d+$/.test(v)) { // integer
 
        this.set(k, parseInt(v, 10));
 
      }
 
    },
 
    // Accept a setting if its a valid percentage.
 
    percent: function(k, v) {
 
      var m;
 
      if ((m = v.match(/^([\d]{1,3})(\.[\d]*)?%$/))) {
 
        v = parseFloat(v);
 
        if (v >= 0 && v <= 100) {
 
          this.set(k, v);
 
          return true;
 
        }
 
      }
 
      return false;
 
    }
 
  };
 

	
 
  // Helper function to parse input into groups separated by 'groupDelim', and
 
  // interprete each group as a key/value pair separated by 'keyValueDelim'.
 
  function parseOptions(input, callback, keyValueDelim, groupDelim) {
 
    var groups = groupDelim ? input.split(groupDelim) : [input];
 
    for (var i in groups) {
 
      if (typeof groups[i] !== "string") {
 
        continue;
 
      }
 
      var kv = groups[i].split(keyValueDelim);
 
      if (kv.length !== 2) {
 
        continue;
 
      }
 
      var k = kv[0];
 
      var v = kv[1];
 
      callback(k, v);
 
    }
 
  }
 

	
 
  function parseCue(input, cue, regionList) {
 
    // Remember the original input if we need to throw an error.
 
    var oInput = input;
 
    // 4.1 WebVTT timestamp
 
    function consumeTimeStamp() {
 
      var ts = parseTimeStamp(input);
 
      if (ts === null) {
 
        throw new ParsingError(ParsingError.Errors.BadTimeStamp,
 
                              "Malformed timestamp: " + oInput);
 
      }
 
      // Remove time stamp from input.
 
      input = input.replace(/^[^\sa-zA-Z-]+/, "");
 
      return ts;
 
    }
 

	
 
    // 4.4.2 WebVTT cue settings
 
    function consumeCueSettings(input, cue) {
 
      var settings = new Settings();
 

	
 
      parseOptions(input, function (k, v) {
 
        switch (k) {
 
        case "region":
 
          // Find the last region we parsed with the same region id.
 
          for (var i = regionList.length - 1; i >= 0; i--) {
 
            if (regionList[i].id === v) {
 
              settings.set(k, regionList[i].region);
 
              break;
 
            }
 
          }
 
          break;
 
        case "vertical":
 
          settings.alt(k, v, ["rl", "lr"]);
 
          break;
 
        case "line":
 
          var vals = v.split(","),
 
              vals0 = vals[0];
 
          settings.integer(k, vals0);
 
          settings.percent(k, vals0) ? settings.set("snapToLines", false) : null;
 
          settings.alt(k, vals0, ["auto"]);
 
          if (vals.length === 2) {
 
            settings.alt("lineAlign", vals[1], ["start", "middle", "end"]);
 
          }
 
          break;
 
        case "position":
 
          vals = v.split(",");
 
          settings.percent(k, vals[0]);
 
          if (vals.length === 2) {
 
            settings.alt("positionAlign", vals[1], ["start", "middle", "end"]);
 
          }
 
          break;
 
        case "size":
 
          settings.percent(k, v);
 
          break;
 
        case "align":
 
          settings.alt(k, v, ["start", "middle", "end", "left", "right"]);
 
          break;
 
        }
 
      }, /:/, /\s/);
 

	
 
      // Apply default values for any missing fields.
 
      cue.region = settings.get("region", null);
 
      cue.vertical = settings.get("vertical", "");
 
      cue.line = settings.get("line", "auto");
 
      cue.lineAlign = settings.get("lineAlign", "start");
 
      cue.snapToLines = settings.get("snapToLines", true);
 
      cue.size = settings.get("size", 100);
 
      cue.align = settings.get("align", "middle");
 
      cue.position = settings.get("position", {
 
        start: 0,
 
        left: 0,
 
        middle: 50,
 
        end: 100,
 
        right: 100
 
      }, cue.align);
 
      cue.positionAlign = settings.get("positionAlign", {
 
        start: "start",
 
        left: "start",
 
        middle: "middle",
 
        end: "end",
 
        right: "end"
 
      }, cue.align);
 
    }
 

	
 
    function skipWhitespace() {
 
      input = input.replace(/^\s+/, "");
 
    }
 

	
 
    // 4.1 WebVTT cue timings.
 
    skipWhitespace();
 
    cue.startTime = consumeTimeStamp();   // (1) collect cue start time
 
    skipWhitespace();
 
    if (input.substr(0, 3) !== "-->") {     // (3) next characters must match "-->"
 
      throw new ParsingError(ParsingError.Errors.BadTimeStamp,
 
                             "Malformed time stamp (time stamps must be separated by '-->'): " +
 
                             oInput);
 
    }
 
    input = input.substr(3);
 
    skipWhitespace();
 
    cue.endTime = consumeTimeStamp();     // (5) collect cue end time
 

	
 
    // 4.1 WebVTT cue settings list.
 
    skipWhitespace();
 
    consumeCueSettings(input, cue);
 
  }
 

	
 
  var ESCAPE = {
 
    "&amp;": "&",
 
    "&lt;": "<",
 
    "&gt;": ">",
 
    "&lrm;": "\u200e",
 
    "&rlm;": "\u200f",
 
    "&nbsp;": "\u00a0"
 
  };
 

	
 
  var TAG_NAME = {
 
    c: "span",
 
    i: "i",
 
    b: "b",
 
    u: "u",
 
    ruby: "ruby",
 
    rt: "rt",
 
    v: "span",
 
    lang: "span"
 
  };
 

	
 
  var TAG_ANNOTATION = {
 
    v: "title",
 
    lang: "lang"
 
  };
 

	
 
  var NEEDS_PARENT = {
 
    rt: "ruby"
 
  };
 

	
 
  // Parse content into a document fragment.
 
  function parseContent(window, input) {
 
    function nextToken() {
 
      // Check for end-of-string.
 
      if (!input) {
 
        return null;
 
      }
 

	
 
      // Consume 'n' characters from the input.
 
      function consume(result) {
 
        input = input.substr(result.length);
 
        return result;
 
      }
 

	
 
      var m = input.match(/^([^<]*)(<[^>]+>?)?/);
 
      // If there is some text before the next tag, return it, otherwise return
 
      // the tag.
 
      return consume(m[1] ? m[1] : m[2]);
 
    }
 

	
 
    // Unescape a string 's'.
 
    function unescape1(e) {
 
      return ESCAPE[e];
 
    }
 
    function unescape(s) {
 
      while ((m = s.match(/&(amp|lt|gt|lrm|rlm|nbsp);/))) {
 
        s = s.replace(m[0], unescape1);
 
      }
 
      return s;
 
    }
 

	
 
    function shouldAdd(current, element) {
 
      return !NEEDS_PARENT[element.localName] ||
 
             NEEDS_PARENT[element.localName] === current.localName;
 
    }
 

	
 
    // Create an element for this tag.
 
    function createElement(type, annotation) {
 
      var tagName = TAG_NAME[type];
 
      if (!tagName) {
 
        return null;
 
      }
 
      var element = window.document.createElement(tagName);
 
      element.localName = tagName;
 
      var name = TAG_ANNOTATION[type];
 
      if (name && annotation) {
 
        element[name] = annotation.trim();
 
      }
 
      return element;
 
    }
 

	
 
    var rootDiv = window.document.createElement("div"),
 
        current = rootDiv,
 
        t,
 
        tagStack = [];
 

	
 
    while ((t = nextToken()) !== null) {
 
      if (t[0] === '<') {
 
        if (t[1] === "/") {
 
          // If the closing tag matches, move back up to the parent node.
 
          if (tagStack.length &&
 
              tagStack[tagStack.length - 1] === t.substr(2).replace(">", "")) {
 
            tagStack.pop();
 
            current = current.parentNode;
 
          }
 
          // Otherwise just ignore the end tag.
 
          continue;
 
        }
 
        var ts = parseTimeStamp(t.substr(1, t.length - 2));
 
        var node;
 
        if (ts) {
 
          // Timestamps are lead nodes as well.
 
          node = window.document.createProcessingInstruction("timestamp", ts);
 
          current.appendChild(node);
 
          continue;
 
        }
 
        var m = t.match(/^<([^.\s/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/);
 
        // If we can't parse the tag, skip to the next tag.
 
        if (!m) {
 
          continue;
 
        }
 
        // Try to construct an element, and ignore the tag if we couldn't.
 
        node = createElement(m[1], m[3]);
 
        if (!node) {
 
          continue;
 
        }
 
        // Determine if the tag should be added based on the context of where it
 
        // is placed in the cuetext.
 
        if (!shouldAdd(current, node)) {
 
          continue;
 
        }
 
        // Set the class list (as a list of classes, separated by space).
 
        if (m[2]) {
 
          node.className = m[2].substr(1).replace('.', ' ');
 
        }
 
        // Append the node to the current node, and enter the scope of the new
 
        // node.
 
        tagStack.push(m[1]);
 
        current.appendChild(node);
 
        current = node;
 
        continue;
 
      }
 

	
 
      // Text nodes are leaf nodes.
 
      current.appendChild(window.document.createTextNode(unescape(t)));
 
    }
 

	
 
    return rootDiv;
 
  }
 

	
 
  // This is a list of all the Unicode characters that have a strong
 
  // right-to-left category. What this means is that these characters are
 
  // written right-to-left for sure. It was generated by pulling all the strong
 
  // right-to-left characters out of the Unicode data table. That table can
 
  // found at: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt
 
  var strongRTLChars = [0x05BE, 0x05C0, 0x05C3, 0x05C6, 0x05D0, 0x05D1,
 
      0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA,
 
      0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, 0x05E0, 0x05E1, 0x05E2, 0x05E3,
 
      0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x05F0, 0x05F1,
 
      0x05F2, 0x05F3, 0x05F4, 0x0608, 0x060B, 0x060D, 0x061B, 0x061E, 0x061F,
 
      0x0620, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628,
 
      0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631,
 
      0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063A,
 
      0x063B, 0x063C, 0x063D, 0x063E, 0x063F, 0x0640, 0x0641, 0x0642, 0x0643,
 
      0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, 0x066D, 0x066E,
 
      0x066F, 0x0671, 0x0672, 0x0673, 0x0674, 0x0675, 0x0676, 0x0677, 0x0678,
 
      0x0679, 0x067A, 0x067B, 0x067C, 0x067D, 0x067E, 0x067F, 0x0680, 0x0681,
 
      0x0682, 0x0683, 0x0684, 0x0685, 0x0686, 0x0687, 0x0688, 0x0689, 0x068A,
 
      0x068B, 0x068C, 0x068D, 0x068E, 0x068F, 0x0690, 0x0691, 0x0692, 0x0693,
 
      0x0694, 0x0695, 0x0696, 0x0697, 0x0698, 0x0699, 0x069A, 0x069B, 0x069C,
 
      0x069D, 0x069E, 0x069F, 0x06A0, 0x06A1, 0x06A2, 0x06A3, 0x06A4, 0x06A5,
 
      0x06A6, 0x06A7, 0x06A8, 0x06A9, 0x06AA, 0x06AB, 0x06AC, 0x06AD, 0x06AE,
 
      0x06AF, 0x06B0, 0x06B1, 0x06B2, 0x06B3, 0x06B4, 0x06B5, 0x06B6, 0x06B7,
 
      0x06B8, 0x06B9, 0x06BA, 0x06BB, 0x06BC, 0x06BD, 0x06BE, 0x06BF, 0x06C0,
 
      0x06C1, 0x06C2, 0x06C3, 0x06C4, 0x06C5, 0x06C6, 0x06C7, 0x06C8, 0x06C9,
 
      0x06CA, 0x06CB, 0x06CC, 0x06CD, 0x06CE, 0x06CF, 0x06D0, 0x06D1, 0x06D2,
 
      0x06D3, 0x06D4, 0x06D5, 0x06E5, 0x06E6, 0x06EE, 0x06EF, 0x06FA, 0x06FB,
 
      0x06FC, 0x06FD, 0x06FE, 0x06FF, 0x0700, 0x0701, 0x0702, 0x0703, 0x0704,
 
      0x0705, 0x0706, 0x0707, 0x0708, 0x0709, 0x070A, 0x070B, 0x070C, 0x070D,
 
      0x070F, 0x0710, 0x0712, 0x0713, 0x0714, 0x0715, 0x0716, 0x0717, 0x0718,
 
      0x0719, 0x071A, 0x071B, 0x071C, 0x071D, 0x071E, 0x071F, 0x0720, 0x0721,
 
      0x0722, 0x0723, 0x0724, 0x0725, 0x0726, 0x0727, 0x0728, 0x0729, 0x072A,
 
      0x072B, 0x072C, 0x072D, 0x072E, 0x072F, 0x074D, 0x074E, 0x074F, 0x0750,
 
      0x0751, 0x0752, 0x0753, 0x0754, 0x0755, 0x0756, 0x0757, 0x0758, 0x0759,
 
      0x075A, 0x075B, 0x075C, 0x075D, 0x075E, 0x075F, 0x0760, 0x0761, 0x0762,
 
      0x0763, 0x0764, 0x0765, 0x0766, 0x0767, 0x0768, 0x0769, 0x076A, 0x076B,
 
      0x076C, 0x076D, 0x076E, 0x076F, 0x0770, 0x0771, 0x0772, 0x0773, 0x0774,
 
      0x0775, 0x0776, 0x0777, 0x0778, 0x0779, 0x077A, 0x077B, 0x077C, 0x077D,
 
      0x077E, 0x077F, 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0786,
 
      0x0787, 0x0788, 0x0789, 0x078A, 0x078B, 0x078C, 0x078D, 0x078E, 0x078F,
 
      0x0790, 0x0791, 0x0792, 0x0793, 0x0794, 0x0795, 0x0796, 0x0797, 0x0798,
 
      0x0799, 0x079A, 0x079B, 0x079C, 0x079D, 0x079E, 0x079F, 0x07A0, 0x07A1,
 
      0x07A2, 0x07A3, 0x07A4, 0x07A5, 0x07B1, 0x07C0, 0x07C1, 0x07C2, 0x07C3,
 
      0x07C4, 0x07C5, 0x07C6, 0x07C7, 0x07C8, 0x07C9, 0x07CA, 0x07CB, 0x07CC,
 
      0x07CD, 0x07CE, 0x07CF, 0x07D0, 0x07D1, 0x07D2, 0x07D3, 0x07D4, 0x07D5,
 
      0x07D6, 0x07D7, 0x07D8, 0x07D9, 0x07DA, 0x07DB, 0x07DC, 0x07DD, 0x07DE,
 
      0x07DF, 0x07E0, 0x07E1, 0x07E2, 0x07E3, 0x07E4, 0x07E5, 0x07E6, 0x07E7,
 
      0x07E8, 0x07E9, 0x07EA, 0x07F4, 0x07F5, 0x07FA, 0x0800, 0x0801, 0x0802,
 
      0x0803, 0x0804, 0x0805, 0x0806, 0x0807, 0x0808, 0x0809, 0x080A, 0x080B,
 
      0x080C, 0x080D, 0x080E, 0x080F, 0x0810, 0x0811, 0x0812, 0x0813, 0x0814,
 
      0x0815, 0x081A, 0x0824, 0x0828, 0x0830, 0x0831, 0x0832, 0x0833, 0x0834,
 
      0x0835, 0x0836, 0x0837, 0x0838, 0x0839, 0x083A, 0x083B, 0x083C, 0x083D,
 
      0x083E, 0x0840, 0x0841, 0x0842, 0x0843, 0x0844, 0x0845, 0x0846, 0x0847,
 
      0x0848, 0x0849, 0x084A, 0x084B, 0x084C, 0x084D, 0x084E, 0x084F, 0x0850,
 
      0x0851, 0x0852, 0x0853, 0x0854, 0x0855, 0x0856, 0x0857, 0x0858, 0x085E,
 
      0x08A0, 0x08A2, 0x08A3, 0x08A4, 0x08A5, 0x08A6, 0x08A7, 0x08A8, 0x08A9,
 
      0x08AA, 0x08AB, 0x08AC, 0x200F, 0xFB1D, 0xFB1F, 0xFB20, 0xFB21, 0xFB22,
 
      0xFB23, 0xFB24, 0xFB25, 0xFB26, 0xFB27, 0xFB28, 0xFB2A, 0xFB2B, 0xFB2C,
 
      0xFB2D, 0xFB2E, 0xFB2F, 0xFB30, 0xFB31, 0xFB32, 0xFB33, 0xFB34, 0xFB35,
 
      0xFB36, 0xFB38, 0xFB39, 0xFB3A, 0xFB3B, 0xFB3C, 0xFB3E, 0xFB40, 0xFB41,
 
      0xFB43, 0xFB44, 0xFB46, 0xFB47, 0xFB48, 0xFB49, 0xFB4A, 0xFB4B, 0xFB4C,
 
      0xFB4D, 0xFB4E, 0xFB4F, 0xFB50, 0xFB51, 0xFB52, 0xFB53, 0xFB54, 0xFB55,
 
      0xFB56, 0xFB57, 0xFB58, 0xFB59, 0xFB5A, 0xFB5B, 0xFB5C, 0xFB5D, 0xFB5E,
 
      0xFB5F, 0xFB60, 0xFB61, 0xFB62, 0xFB63, 0xFB64, 0xFB65, 0xFB66, 0xFB67,
 
      0xFB68, 0xFB69, 0xFB6A, 0xFB6B, 0xFB6C, 0xFB6D, 0xFB6E, 0xFB6F, 0xFB70,
 
      0xFB71, 0xFB72, 0xFB73, 0xFB74, 0xFB75, 0xFB76, 0xFB77, 0xFB78, 0xFB79,
 
      0xFB7A, 0xFB7B, 0xFB7C, 0xFB7D, 0xFB7E, 0xFB7F, 0xFB80, 0xFB81, 0xFB82,
 
      0xFB83, 0xFB84, 0xFB85, 0xFB86, 0xFB87, 0xFB88, 0xFB89, 0xFB8A, 0xFB8B,
 
      0xFB8C, 0xFB8D, 0xFB8E, 0xFB8F, 0xFB90, 0xFB91, 0xFB92, 0xFB93, 0xFB94,
 
      0xFB95, 0xFB96, 0xFB97, 0xFB98, 0xFB99, 0xFB9A, 0xFB9B, 0xFB9C, 0xFB9D,
 
      0xFB9E, 0xFB9F, 0xFBA0, 0xFBA1, 0xFBA2, 0xFBA3, 0xFBA4, 0xFBA5, 0xFBA6,
 
      0xFBA7, 0xFBA8, 0xFBA9, 0xFBAA, 0xFBAB, 0xFBAC, 0xFBAD, 0xFBAE, 0xFBAF,
 
      0xFBB0, 0xFBB1, 0xFBB2, 0xFBB3, 0xFBB4, 0xFBB5, 0xFBB6, 0xFBB7, 0xFBB8,
 
      0xFBB9, 0xFBBA, 0xFBBB, 0xFBBC, 0xFBBD, 0xFBBE, 0xFBBF, 0xFBC0, 0xFBC1,
 
      0xFBD3, 0xFBD4, 0xFBD5, 0xFBD6, 0xFBD7, 0xFBD8, 0xFBD9, 0xFBDA, 0xFBDB,
 
      0xFBDC, 0xFBDD, 0xFBDE, 0xFBDF, 0xFBE0, 0xFBE1, 0xFBE2, 0xFBE3, 0xFBE4,
 
      0xFBE5, 0xFBE6, 0xFBE7, 0xFBE8, 0xFBE9, 0xFBEA, 0xFBEB, 0xFBEC, 0xFBED,
 
      0xFBEE, 0xFBEF, 0xFBF0, 0xFBF1, 0xFBF2, 0xFBF3, 0xFBF4, 0xFBF5, 0xFBF6,
 
      0xFBF7, 0xFBF8, 0xFBF9, 0xFBFA, 0xFBFB, 0xFBFC, 0xFBFD, 0xFBFE, 0xFBFF,
 
      0xFC00, 0xFC01, 0xFC02, 0xFC03, 0xFC04, 0xFC05, 0xFC06, 0xFC07, 0xFC08,
 
      0xFC09, 0xFC0A, 0xFC0B, 0xFC0C, 0xFC0D, 0xFC0E, 0xFC0F, 0xFC10, 0xFC11,
 
      0xFC12, 0xFC13, 0xFC14, 0xFC15, 0xFC16, 0xFC17, 0xFC18, 0xFC19, 0xFC1A,
 
      0xFC1B, 0xFC1C, 0xFC1D, 0xFC1E, 0xFC1F, 0xFC20, 0xFC21, 0xFC22, 0xFC23,
 
      0xFC24, 0xFC25, 0xFC26, 0xFC27, 0xFC28, 0xFC29, 0xFC2A, 0xFC2B, 0xFC2C,
 
      0xFC2D, 0xFC2E, 0xFC2F, 0xFC30, 0xFC31, 0xFC32, 0xFC33, 0xFC34, 0xFC35,
 
      0xFC36, 0xFC37, 0xFC38, 0xFC39, 0xFC3A, 0xFC3B, 0xFC3C, 0xFC3D, 0xFC3E,
 
      0xFC3F, 0xFC40, 0xFC41, 0xFC42, 0xFC43, 0xFC44, 0xFC45, 0xFC46, 0xFC47,
 
      0xFC48, 0xFC49, 0xFC4A, 0xFC4B, 0xFC4C, 0xFC4D, 0xFC4E, 0xFC4F, 0xFC50,
 
      0xFC51, 0xFC52, 0xFC53, 0xFC54, 0xFC55, 0xFC56, 0xFC57, 0xFC58, 0xFC59,
 
      0xFC5A, 0xFC5B, 0xFC5C, 0xFC5D, 0xFC5E, 0xFC5F, 0xFC60, 0xFC61, 0xFC62,
 
      0xFC63, 0xFC64, 0xFC65, 0xFC66, 0xFC67, 0xFC68, 0xFC69, 0xFC6A, 0xFC6B,
 
      0xFC6C, 0xFC6D, 0xFC6E, 0xFC6F, 0xFC70, 0xFC71, 0xFC72, 0xFC73, 0xFC74,
 
      0xFC75, 0xFC76, 0xFC77, 0xFC78, 0xFC79, 0xFC7A, 0xFC7B, 0xFC7C, 0xFC7D,
 
      0xFC7E, 0xFC7F, 0xFC80, 0xFC81, 0xFC82, 0xFC83, 0xFC84, 0xFC85, 0xFC86,
 
      0xFC87, 0xFC88, 0xFC89, 0xFC8A, 0xFC8B, 0xFC8C, 0xFC8D, 0xFC8E, 0xFC8F,
 
      0xFC90, 0xFC91, 0xFC92, 0xFC93, 0xFC94, 0xFC95, 0xFC96, 0xFC97, 0xFC98,
 
      0xFC99, 0xFC9A, 0xFC9B, 0xFC9C, 0xFC9D, 0xFC9E, 0xFC9F, 0xFCA0, 0xFCA1,
 
      0xFCA2, 0xFCA3, 0xFCA4, 0xFCA5, 0xFCA6, 0xFCA7, 0xFCA8, 0xFCA9, 0xFCAA,
 
      0xFCAB, 0xFCAC, 0xFCAD, 0xFCAE, 0xFCAF, 0xFCB0, 0xFCB1, 0xFCB2, 0xFCB3,
 
      0xFCB4, 0xFCB5, 0xFCB6, 0xFCB7, 0xFCB8, 0xFCB9, 0xFCBA, 0xFCBB, 0xFCBC,
 
      0xFCBD, 0xFCBE, 0xFCBF, 0xFCC0, 0xFCC1, 0xFCC2, 0xFCC3, 0xFCC4, 0xFCC5,
 
      0xFCC6, 0xFCC7, 0xFCC8, 0xFCC9, 0xFCCA, 0xFCCB, 0xFCCC, 0xFCCD, 0xFCCE,
 
      0xFCCF, 0xFCD0, 0xFCD1, 0xFCD2, 0xFCD3, 0xFCD4, 0xFCD5, 0xFCD6, 0xFCD7,
 
      0xFCD8, 0xFCD9, 0xFCDA, 0xFCDB, 0xFCDC, 0xFCDD, 0xFCDE, 0xFCDF, 0xFCE0,
 
      0xFCE1, 0xFCE2, 0xFCE3, 0xFCE4, 0xFCE5, 0xFCE6, 0xFCE7, 0xFCE8, 0xFCE9,
 
      0xFCEA, 0xFCEB, 0xFCEC, 0xFCED, 0xFCEE, 0xFCEF, 0xFCF0, 0xFCF1, 0xFCF2,
 
      0xFCF3, 0xFCF4, 0xFCF5, 0xFCF6, 0xFCF7, 0xFCF8, 0xFCF9, 0xFCFA, 0xFCFB,
 
      0xFCFC, 0xFCFD, 0xFCFE, 0xFCFF, 0xFD00, 0xFD01, 0xFD02, 0xFD03, 0xFD04,
 
      0xFD05, 0xFD06, 0xFD07, 0xFD08, 0xFD09, 0xFD0A, 0xFD0B, 0xFD0C, 0xFD0D,
 
      0xFD0E, 0xFD0F, 0xFD10, 0xFD11, 0xFD12, 0xFD13, 0xFD14, 0xFD15, 0xFD16,
 
      0xFD17, 0xFD18, 0xFD19, 0xFD1A, 0xFD1B, 0xFD1C, 0xFD1D, 0xFD1E, 0xFD1F,
 
      0xFD20, 0xFD21, 0xFD22, 0xFD23, 0xFD24, 0xFD25, 0xFD26, 0xFD27, 0xFD28,
 
      0xFD29, 0xFD2A, 0xFD2B, 0xFD2C, 0xFD2D, 0xFD2E, 0xFD2F, 0xFD30, 0xFD31,
 
      0xFD32, 0xFD33, 0xFD34, 0xFD35, 0xFD36, 0xFD37, 0xFD38, 0xFD39, 0xFD3A,
 
      0xFD3B, 0xFD3C, 0xFD3D, 0xFD50, 0xFD51, 0xFD52, 0xFD53, 0xFD54, 0xFD55,
 
      0xFD56, 0xFD57, 0xFD58, 0xFD59, 0xFD5A, 0xFD5B, 0xFD5C, 0xFD5D, 0xFD5E,
 
      0xFD5F, 0xFD60, 0xFD61, 0xFD62, 0xFD63, 0xFD64, 0xFD65, 0xFD66, 0xFD67,
 
      0xFD68, 0xFD69, 0xFD6A, 0xFD6B, 0xFD6C, 0xFD6D, 0xFD6E, 0xFD6F, 0xFD70,
 
      0xFD71, 0xFD72, 0xFD73, 0xFD74, 0xFD75, 0xFD76, 0xFD77, 0xFD78, 0xFD79,
 
      0xFD7A, 0xFD7B, 0xFD7C, 0xFD7D, 0xFD7E, 0xFD7F, 0xFD80, 0xFD81, 0xFD82,
 
      0xFD83, 0xFD84, 0xFD85, 0xFD86, 0xFD87, 0xFD88, 0xFD89, 0xFD8A, 0xFD8B,
 
      0xFD8C, 0xFD8D, 0xFD8E, 0xFD8F, 0xFD92, 0xFD93, 0xFD94, 0xFD95, 0xFD96,
 
      0xFD97, 0xFD98, 0xFD99, 0xFD9A, 0xFD9B, 0xFD9C, 0xFD9D, 0xFD9E, 0xFD9F,
 
      0xFDA0, 0xFDA1, 0xFDA2, 0xFDA3, 0xFDA4, 0xFDA5, 0xFDA6, 0xFDA7, 0xFDA8,
 
      0xFDA9, 0xFDAA, 0xFDAB, 0xFDAC, 0xFDAD, 0xFDAE, 0xFDAF, 0xFDB0, 0xFDB1,
 
      0xFDB2, 0xFDB3, 0xFDB4, 0xFDB5, 0xFDB6, 0xFDB7, 0xFDB8, 0xFDB9, 0xFDBA,
 
      0xFDBB, 0xFDBC, 0xFDBD, 0xFDBE, 0xFDBF, 0xFDC0, 0xFDC1, 0xFDC2, 0xFDC3,
 
      0xFDC4, 0xFDC5, 0xFDC6, 0xFDC7, 0xFDF0, 0xFDF1, 0xFDF2, 0xFDF3, 0xFDF4,
 
      0xFDF5, 0xFDF6, 0xFDF7, 0xFDF8, 0xFDF9, 0xFDFA, 0xFDFB, 0xFDFC, 0xFE70,
 
      0xFE71, 0xFE72, 0xFE73, 0xFE74, 0xFE76, 0xFE77, 0xFE78, 0xFE79, 0xFE7A,
 
      0xFE7B, 0xFE7C, 0xFE7D, 0xFE7E, 0xFE7F, 0xFE80, 0xFE81, 0xFE82, 0xFE83,
 
      0xFE84, 0xFE85, 0xFE86, 0xFE87, 0xFE88, 0xFE89, 0xFE8A, 0xFE8B, 0xFE8C,
 
      0xFE8D, 0xFE8E, 0xFE8F, 0xFE90, 0xFE91, 0xFE92, 0xFE93, 0xFE94, 0xFE95,
 
      0xFE96, 0xFE97, 0xFE98, 0xFE99, 0xFE9A, 0xFE9B, 0xFE9C, 0xFE9D, 0xFE9E,
 
      0xFE9F, 0xFEA0, 0xFEA1, 0xFEA2, 0xFEA3, 0xFEA4, 0xFEA5, 0xFEA6, 0xFEA7,
 
      0xFEA8, 0xFEA9, 0xFEAA, 0xFEAB, 0xFEAC, 0xFEAD, 0xFEAE, 0xFEAF, 0xFEB0,
 
      0xFEB1, 0xFEB2, 0xFEB3, 0xFEB4, 0xFEB5, 0xFEB6, 0xFEB7, 0xFEB8, 0xFEB9,
 
      0xFEBA, 0xFEBB, 0xFEBC, 0xFEBD, 0xFEBE, 0xFEBF, 0xFEC0, 0xFEC1, 0xFEC2,
 
      0xFEC3, 0xFEC4, 0xFEC5, 0xFEC6, 0xFEC7, 0xFEC8, 0xFEC9, 0xFECA, 0xFECB,
 
      0xFECC, 0xFECD, 0xFECE, 0xFECF, 0xFED0, 0xFED1, 0xFED2, 0xFED3, 0xFED4,
 
      0xFED5, 0xFED6, 0xFED7, 0xFED8, 0xFED9, 0xFEDA, 0xFEDB, 0xFEDC, 0xFEDD,
 
      0xFEDE, 0xFEDF, 0xFEE0, 0xFEE1, 0xFEE2, 0xFEE3, 0xFEE4, 0xFEE5, 0xFEE6,
 
      0xFEE7, 0xFEE8, 0xFEE9, 0xFEEA, 0xFEEB, 0xFEEC, 0xFEED, 0xFEEE, 0xFEEF,
 
      0xFEF0, 0xFEF1, 0xFEF2, 0xFEF3, 0xFEF4, 0xFEF5, 0xFEF6, 0xFEF7, 0xFEF8,
 
      0xFEF9, 0xFEFA, 0xFEFB, 0xFEFC, 0x10800, 0x10801, 0x10802, 0x10803,
 
      0x10804, 0x10805, 0x10808, 0x1080A, 0x1080B, 0x1080C, 0x1080D, 0x1080E,
 
      0x1080F, 0x10810, 0x10811, 0x10812, 0x10813, 0x10814, 0x10815, 0x10816,
 
      0x10817, 0x10818, 0x10819, 0x1081A, 0x1081B, 0x1081C, 0x1081D, 0x1081E,
 
      0x1081F, 0x10820, 0x10821, 0x10822, 0x10823, 0x10824, 0x10825, 0x10826,
 
      0x10827, 0x10828, 0x10829, 0x1082A, 0x1082B, 0x1082C, 0x1082D, 0x1082E,
 
      0x1082F, 0x10830, 0x10831, 0x10832, 0x10833, 0x10834, 0x10835, 0x10837,
 
      0x10838, 0x1083C, 0x1083F, 0x10840, 0x10841, 0x10842, 0x10843, 0x10844,
 
      0x10845, 0x10846, 0x10847, 0x10848, 0x10849, 0x1084A, 0x1084B, 0x1084C,
 
      0x1084D, 0x1084E, 0x1084F, 0x10850, 0x10851, 0x10852, 0x10853, 0x10854,
 
      0x10855, 0x10857, 0x10858, 0x10859, 0x1085A, 0x1085B, 0x1085C, 0x1085D,
 
      0x1085E, 0x1085F, 0x10900, 0x10901, 0x10902, 0x10903, 0x10904, 0x10905,
 
      0x10906, 0x10907, 0x10908, 0x10909, 0x1090A, 0x1090B, 0x1090C, 0x1090D,
 
      0x1090E, 0x1090F, 0x10910, 0x10911, 0x10912, 0x10913, 0x10914, 0x10915,
 
      0x10916, 0x10917, 0x10918, 0x10919, 0x1091A, 0x1091B, 0x10920, 0x10921,
 
      0x10922, 0x10923, 0x10924, 0x10925, 0x10926, 0x10927, 0x10928, 0x10929,
 
      0x1092A, 0x1092B, 0x1092C, 0x1092D, 0x1092E, 0x1092F, 0x10930, 0x10931,
 
      0x10932, 0x10933, 0x10934, 0x10935, 0x10936, 0x10937, 0x10938, 0x10939,
 
      0x1093F, 0x10980, 0x10981, 0x10982, 0x10983, 0x10984, 0x10985, 0x10986,
 
      0x10987, 0x10988, 0x10989, 0x1098A, 0x1098B, 0x1098C, 0x1098D, 0x1098E,
 
      0x1098F, 0x10990, 0x10991, 0x10992, 0x10993, 0x10994, 0x10995, 0x10996,
 
      0x10997, 0x10998, 0x10999, 0x1099A, 0x1099B, 0x1099C, 0x1099D, 0x1099E,
 
      0x1099F, 0x109A0, 0x109A1, 0x109A2, 0x109A3, 0x109A4, 0x109A5, 0x109A6,
 
      0x109A7, 0x109A8, 0x109A9, 0x109AA, 0x109AB, 0x109AC, 0x109AD, 0x109AE,
 
      0x109AF, 0x109B0, 0x109B1, 0x109B2, 0x109B3, 0x109B4, 0x109B5, 0x109B6,
 
      0x109B7, 0x109BE, 0x109BF, 0x10A00, 0x10A10, 0x10A11, 0x10A12, 0x10A13,
 
      0x10A15, 0x10A16, 0x10A17, 0x10A19, 0x10A1A, 0x10A1B, 0x10A1C, 0x10A1D,
 
      0x10A1E, 0x10A1F, 0x10A20, 0x10A21, 0x10A22, 0x10A23, 0x10A24, 0x10A25,
 
      0x10A26, 0x10A27, 0x10A28, 0x10A29, 0x10A2A, 0x10A2B, 0x10A2C, 0x10A2D,
 
      0x10A2E, 0x10A2F, 0x10A30, 0x10A31, 0x10A32, 0x10A33, 0x10A40, 0x10A41,
 
      0x10A42, 0x10A43, 0x10A44, 0x10A45, 0x10A46, 0x10A47, 0x10A50, 0x10A51,
 
      0x10A52, 0x10A53, 0x10A54, 0x10A55, 0x10A56, 0x10A57, 0x10A58, 0x10A60,
 
      0x10A61, 0x10A62, 0x10A63, 0x10A64, 0x10A65, 0x10A66, 0x10A67, 0x10A68,
 
      0x10A69, 0x10A6A, 0x10A6B, 0x10A6C, 0x10A6D, 0x10A6E, 0x10A6F, 0x10A70,
 
      0x10A71, 0x10A72, 0x10A73, 0x10A74, 0x10A75, 0x10A76, 0x10A77, 0x10A78,
 
      0x10A79, 0x10A7A, 0x10A7B, 0x10A7C, 0x10A7D, 0x10A7E, 0x10A7F, 0x10B00,
 
      0x10B01, 0x10B02, 0x10B03, 0x10B04, 0x10B05, 0x10B06, 0x10B07, 0x10B08,
 
      0x10B09, 0x10B0A, 0x10B0B, 0x10B0C, 0x10B0D, 0x10B0E, 0x10B0F, 0x10B10,
 
      0x10B11, 0x10B12, 0x10B13, 0x10B14, 0x10B15, 0x10B16, 0x10B17, 0x10B18,
 
      0x10B19, 0x10B1A, 0x10B1B, 0x10B1C, 0x10B1D, 0x10B1E, 0x10B1F, 0x10B20,
 
      0x10B21, 0x10B22, 0x10B23, 0x10B24, 0x10B25, 0x10B26, 0x10B27, 0x10B28,
 
      0x10B29, 0x10B2A, 0x10B2B, 0x10B2C, 0x10B2D, 0x10B2E, 0x10B2F, 0x10B30,
 
      0x10B31, 0x10B32, 0x10B33, 0x10B34, 0x10B35, 0x10B40, 0x10B41, 0x10B42,
 
      0x10B43, 0x10B44, 0x10B45, 0x10B46, 0x10B47, 0x10B48, 0x10B49, 0x10B4A,
 
      0x10B4B, 0x10B4C, 0x10B4D, 0x10B4E, 0x10B4F, 0x10B50, 0x10B51, 0x10B52,
 
      0x10B53, 0x10B54, 0x10B55, 0x10B58, 0x10B59, 0x10B5A, 0x10B5B, 0x10B5C,
 
      0x10B5D, 0x10B5E, 0x10B5F, 0x10B60, 0x10B61, 0x10B62, 0x10B63, 0x10B64,
 
      0x10B65, 0x10B66, 0x10B67, 0x10B68, 0x10B69, 0x10B6A, 0x10B6B, 0x10B6C,
 
      0x10B6D, 0x10B6E, 0x10B6F, 0x10B70, 0x10B71, 0x10B72, 0x10B78, 0x10B79,
 
      0x10B7A, 0x10B7B, 0x10B7C, 0x10B7D, 0x10B7E, 0x10B7F, 0x10C00, 0x10C01,
 
      0x10C02, 0x10C03, 0x10C04, 0x10C05, 0x10C06, 0x10C07, 0x10C08, 0x10C09,
 
      0x10C0A, 0x10C0B, 0x10C0C, 0x10C0D, 0x10C0E, 0x10C0F, 0x10C10, 0x10C11,
 
      0x10C12, 0x10C13, 0x10C14, 0x10C15, 0x10C16, 0x10C17, 0x10C18, 0x10C19,
 
      0x10C1A, 0x10C1B, 0x10C1C, 0x10C1D, 0x10C1E, 0x10C1F, 0x10C20, 0x10C21,
 
      0x10C22, 0x10C23, 0x10C24, 0x10C25, 0x10C26, 0x10C27, 0x10C28, 0x10C29,
 
      0x10C2A, 0x10C2B, 0x10C2C, 0x10C2D, 0x10C2E, 0x10C2F, 0x10C30, 0x10C31,
 
      0x10C32, 0x10C33, 0x10C34, 0x10C35, 0x10C36, 0x10C37, 0x10C38, 0x10C39,
 
      0x10C3A, 0x10C3B, 0x10C3C, 0x10C3D, 0x10C3E, 0x10C3F, 0x10C40, 0x10C41,
 
      0x10C42, 0x10C43, 0x10C44, 0x10C45, 0x10C46, 0x10C47, 0x10C48, 0x1EE00,
 
      0x1EE01, 0x1EE02, 0x1EE03, 0x1EE05, 0x1EE06, 0x1EE07, 0x1EE08, 0x1EE09,
 
      0x1EE0A, 0x1EE0B, 0x1EE0C, 0x1EE0D, 0x1EE0E, 0x1EE0F, 0x1EE10, 0x1EE11,
 
      0x1EE12, 0x1EE13, 0x1EE14, 0x1EE15, 0x1EE16, 0x1EE17, 0x1EE18, 0x1EE19,
 
      0x1EE1A, 0x1EE1B, 0x1EE1C, 0x1EE1D, 0x1EE1E, 0x1EE1F, 0x1EE21, 0x1EE22,
 
      0x1EE24, 0x1EE27, 0x1EE29, 0x1EE2A, 0x1EE2B, 0x1EE2C, 0x1EE2D, 0x1EE2E,
 
      0x1EE2F, 0x1EE30, 0x1EE31, 0x1EE32, 0x1EE34, 0x1EE35, 0x1EE36, 0x1EE37,
 
      0x1EE39, 0x1EE3B, 0x1EE42, 0x1EE47, 0x1EE49, 0x1EE4B, 0x1EE4D, 0x1EE4E,
 
      0x1EE4F, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE57, 0x1EE59, 0x1EE5B, 0x1EE5D,
 
      0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE67, 0x1EE68, 0x1EE69, 0x1EE6A,
 
      0x1EE6C, 0x1EE6D, 0x1EE6E, 0x1EE6F, 0x1EE70, 0x1EE71, 0x1EE72, 0x1EE74,
 
      0x1EE75, 0x1EE76, 0x1EE77, 0x1EE79, 0x1EE7A, 0x1EE7B, 0x1EE7C, 0x1EE7E,
 
      0x1EE80, 0x1EE81, 0x1EE82, 0x1EE83, 0x1EE84, 0x1EE85, 0x1EE86, 0x1EE87,
 
      0x1EE88, 0x1EE89, 0x1EE8B, 0x1EE8C, 0x1EE8D, 0x1EE8E, 0x1EE8F, 0x1EE90,
 
      0x1EE91, 0x1EE92, 0x1EE93, 0x1EE94, 0x1EE95, 0x1EE96, 0x1EE97, 0x1EE98,
 
      0x1EE99, 0x1EE9A, 0x1EE9B, 0x1EEA1, 0x1EEA2, 0x1EEA3, 0x1EEA5, 0x1EEA6,
 
      0x1EEA7, 0x1EEA8, 0x1EEA9, 0x1EEAB, 0x1EEAC, 0x1EEAD, 0x1EEAE, 0x1EEAF,
 
      0x1EEB0, 0x1EEB1, 0x1EEB2, 0x1EEB3, 0x1EEB4, 0x1EEB5, 0x1EEB6, 0x1EEB7,
 
      0x1EEB8, 0x1EEB9, 0x1EEBA, 0x1EEBB, 0x10FFFD];
 

	
 
  function determineBidi(cueDiv) {
 
    var nodeStack = [],
 
        text = "",
 
        charCode;
 

	
 
    if (!cueDiv || !cueDiv.childNodes) {
 
      return "ltr";
 
    }
 

	
 
    function pushNodes(nodeStack, node) {
 
      for (var i = node.childNodes.length - 1; i >= 0; i--) {
 
        nodeStack.push(node.childNodes[i]);
 
      }
 
    }
 

	
 
    function nextTextNode(nodeStack) {
 
      if (!nodeStack || !nodeStack.length) {
 
        return null;
 
      }
 

	
 
      var node = nodeStack.pop(),
 
          text = node.textContent || node.innerText;
 
      if (text) {
 
        // TODO: This should match all unicode type B characters (paragraph
 
        // separator characters). See issue #115.
 
        var m = text.match(/^.*(\n|\r)/);
 
        if (m) {
 
          nodeStack.length = 0;
 
          return m[0];
 
        }
 
        return text;
 
      }
 
      if (node.tagName === "ruby") {
 
        return nextTextNode(nodeStack);
 
      }
 
      if (node.childNodes) {
 
        pushNodes(nodeStack, node);
 
        return nextTextNode(nodeStack);
 
      }
 
    }
 

	
 
    pushNodes(nodeStack, cueDiv);
 
    while ((text = nextTextNode(nodeStack))) {
 
      for (var i = 0; i < text.length; i++) {
 
        charCode = text.charCodeAt(i);
 
        for (var j = 0; j < strongRTLChars.length; j++) {
 
          if (strongRTLChars[j] === charCode) {
 
            return "rtl";
 
          }
 
        }
 
      }
 
    }
 
    return "ltr";
 
  }
 

	
 
  function computeLinePos(cue) {
 
    if (typeof cue.line === "number" &&
 
        (cue.snapToLines || (cue.line >= 0 && cue.line <= 100))) {
 
      return cue.line;
 
    }
 
    if (!cue.track || !cue.track.textTrackList ||
 
        !cue.track.textTrackList.mediaElement) {
 
      return -1;
 
    }
 
    var track = cue.track,
 
        trackList = track.textTrackList,
 
        count = 0;
 
    for (var i = 0; i < trackList.length && trackList[i] !== track; i++) {
 
      if (trackList[i].mode === "showing") {
 
        count++;
 
      }
 
    }
 
    return ++count * -1;
 
  }
 

	
 
  function StyleBox() {
 
  }
 

	
 
  // Apply styles to a div. If there is no div passed then it defaults to the
 
  // div on 'this'.
 
  StyleBox.prototype.applyStyles = function(styles, div) {
 
    div = div || this.div;
 
    for (var prop in styles) {
 
      if (styles.hasOwnProperty(prop)) {
 
        div.style[prop] = styles[prop];
 
      }
 
    }
 
  };
 

	
 
  StyleBox.prototype.formatStyle = function(val, unit) {
 
    return val === 0 ? 0 : val + unit;
 
  };
 

	
 
  // Constructs the computed display state of the cue (a div). Places the div
 
  // into the overlay which should be a block level element (usually a div).
 
  function CueStyleBox(window, cue, styleOptions) {
 
    var isIE8 = (/MSIE\s8\.0/).test(navigator.userAgent);
 
    var color = "rgba(255, 255, 255, 1)";
 
    var backgroundColor = "rgba(0, 0, 0, 0.8)";
 

	
 
    if (isIE8) {
 
      color = "rgb(255, 255, 255)";
 
      backgroundColor = "rgb(0, 0, 0)";
 
    }
 

	
 
    StyleBox.call(this);
 
    this.cue = cue;
 

	
 
    // Parse our cue's text into a DOM tree rooted at 'cueDiv'. This div will
 
    // have inline positioning and will function as the cue background box.
 
    this.cueDiv = parseContent(window, cue.text);
 
    var styles = {
 
      color: color,
 
      backgroundColor: backgroundColor,
 
      position: "relative",
 
      left: 0,
 
      right: 0,
 
      top: 0,
 
      bottom: 0,
 
      display: "inline"
 
    };
 

	
 
    if (!isIE8) {
 
      styles.writingMode = cue.vertical === "" ? "horizontal-tb"
 
                                               : cue.vertical === "lr" ? "vertical-lr"
 
                                                                       : "vertical-rl";
 
      styles.unicodeBidi = "plaintext";
 
    }
 
    this.applyStyles(styles, this.cueDiv);
 

	
 
    // Create an absolutely positioned div that will be used to position the cue
 
    // div. Note, all WebVTT cue-setting alignments are equivalent to the CSS
 
    // mirrors of them except "middle" which is "center" in CSS.
 
    this.div = window.document.createElement("div");
 
    styles = {
 
      textAlign: cue.align === "middle" ? "center" : cue.align,
 
      font: styleOptions.font,
 
      whiteSpace: "pre-line",
 
      position: "absolute"
 
    };
 

	
 
    if (!isIE8) {
 
      styles.direction = determineBidi(this.cueDiv);
 
      styles.writingMode = cue.vertical === "" ? "horizontal-tb"
 
                                               : cue.vertical === "lr" ? "vertical-lr"
 
                                                                       : "vertical-rl".
 
      stylesunicodeBidi =  "plaintext";
 
    }
 

	
 
    this.applyStyles(styles);
 

	
 
    this.div.appendChild(this.cueDiv);
 

	
 
    // Calculate the distance from the reference edge of the viewport to the text
 
    // position of the cue box. The reference edge will be resolved later when
 
    // the box orientation styles are applied.
 
    var textPos = 0;
 
    switch (cue.positionAlign) {
 
    case "start":
 
      textPos = cue.position;
 
      break;
 
    case "middle":
 
      textPos = cue.position - (cue.size / 2);
 
      break;
 
    case "end":
 
      textPos = cue.position - cue.size;
 
      break;
 
    }
 

	
 
    // Horizontal box orientation; textPos is the distance from the left edge of the
 
    // area to the left edge of the box and cue.size is the distance extending to
 
    // the right from there.
 
    if (cue.vertical === "") {
 
      this.applyStyles({
 
        left:  this.formatStyle(textPos, "%"),
 
        width: this.formatStyle(cue.size, "%")
 
      });
 
    // Vertical box orientation; textPos is the distance from the top edge of the
 
    // area to the top edge of the box and cue.size is the height extending
 
    // downwards from there.
 
    } else {
 
      this.applyStyles({
 
        top: this.formatStyle(textPos, "%"),
 
        height: this.formatStyle(cue.size, "%")
 
      });
 
    }
 

	
 
    this.move = function(box) {
 
      this.applyStyles({
 
        top: this.formatStyle(box.top, "px"),
 
        bottom: this.formatStyle(box.bottom, "px"),
 
        left: this.formatStyle(box.left, "px"),
 
        right: this.formatStyle(box.right, "px"),
 
        height: this.formatStyle(box.height, "px"),
 
        width: this.formatStyle(box.width, "px")
 
      });
 
    };
 
  }
 
  CueStyleBox.prototype = _objCreate(StyleBox.prototype);
 
  CueStyleBox.prototype.constructor = CueStyleBox;
 

	
 
  // Represents the co-ordinates of an Element in a way that we can easily
 
  // compute things with such as if it overlaps or intersects with another Element.
 
  // Can initialize it with either a StyleBox or another BoxPosition.
 
  function BoxPosition(obj) {
 
    var isIE8 = (/MSIE\s8\.0/).test(navigator.userAgent);
 

	
 
    // Either a BoxPosition was passed in and we need to copy it, or a StyleBox
 
    // was passed in and we need to copy the results of 'getBoundingClientRect'
 
    // as the object returned is readonly. All co-ordinate values are in reference
 
    // to the viewport origin (top left).
 
    var lh, height, width, top;
 
    if (obj.div) {
 
      height = obj.div.offsetHeight;
 
      width = obj.div.offsetWidth;
 
      top = obj.div.offsetTop;
 

	
 
      var rects = (rects = obj.div.childNodes) && (rects = rects[0]) &&
 
                  rects.getClientRects && rects.getClientRects();
 
      obj = obj.div.getBoundingClientRect();
 
      // In certain cases the outter div will be slightly larger then the sum of
 
      // the inner div's lines. This could be due to bold text, etc, on some platforms.
 
      // In this case we should get the average line height and use that. This will
 
      // result in the desired behaviour.
 
      lh = rects ? Math.max((rects[0] && rects[0].height) || 0, obj.height / rects.length)
 
                 : 0;
 

	
 
    }
 
    this.left = obj.left;
 
    this.right = obj.right;
 
    this.top = obj.top || top;
 
    this.height = obj.height || height;
 
    this.bottom = obj.bottom || (top + (obj.height || height));
 
    this.width = obj.width || width;
 
    this.lineHeight = lh !== undefined ? lh : obj.lineHeight;
 

	
 
    if (isIE8 && !this.lineHeight) {
 
      this.lineHeight = 13;
 
    }
 
  }
 

	
 
  // Move the box along a particular axis. Optionally pass in an amount to move
 
  // the box. If no amount is passed then the default is the line height of the
 
  // box.
 
  BoxPosition.prototype.move = function(axis, toMove) {
 
    toMove = toMove !== undefined ? toMove : this.lineHeight;
 
    switch (axis) {
 
    case "+x":
 
      this.left += toMove;
 
      this.right += toMove;
 
      break;
 
    case "-x":
 
      this.left -= toMove;
 
      this.right -= toMove;
 
      break;
 
    case "+y":
 
      this.top += toMove;
 
      this.bottom += toMove;
 
      break;
 
    case "-y":
 
      this.top -= toMove;
 
      this.bottom -= toMove;
 
      break;
 
    }
 
  };
 

	
 
  // Check if this box overlaps another box, b2.
 
  BoxPosition.prototype.overlaps = function(b2) {
 
    return this.left < b2.right &&
 
           this.right > b2.left &&
 
           this.top < b2.bottom &&
 
           this.bottom > b2.top;
 
  };
 

	
 
  // Check if this box overlaps any other boxes in boxes.
 
  BoxPosition.prototype.overlapsAny = function(boxes) {
 
    for (var i = 0; i < boxes.length; i++) {
 
      if (this.overlaps(boxes[i])) {
 
        return true;
 
      }
 
    }
 
    return false;
 
  };
 

	
 
  // Check if this box is within another box.
 
  BoxPosition.prototype.within = function(container) {
 
    return this.top >= container.top &&
 
           this.bottom <= container.bottom &&
 
           this.left >= container.left &&
 
           this.right <= container.right;
 
  };
 

	
 
  // Check if this box is entirely within the container or it is overlapping
 
  // on the edge opposite of the axis direction passed. For example, if "+x" is
 
  // passed and the box is overlapping on the left edge of the container, then
 
  // return true.
 
  BoxPosition.prototype.overlapsOppositeAxis = function(container, axis) {
 
    switch (axis) {
 
    case "+x":
 
      return this.left < container.left;
 
    case "-x":
 
      return this.right > container.right;
 
    case "+y":
 
      return this.top < container.top;
 
    case "-y":
 
      return this.bottom > container.bottom;
 
    }
 
  };
 

	
 
  // Find the percentage of the area that this box is overlapping with another
 
  // box.
 
  BoxPosition.prototype.intersectPercentage = function(b2) {
 
    var x = Math.max(0, Math.min(this.right, b2.right) - Math.max(this.left, b2.left)),
 
        y = Math.max(0, Math.min(this.bottom, b2.bottom) - Math.max(this.top, b2.top)),
 
        intersectArea = x * y;
 
    return intersectArea / (this.height * this.width);
 
  };
 

	
 
  // Convert the positions from this box to CSS compatible positions using
 
  // the reference container's positions. This has to be done because this
 
  // box's positions are in reference to the viewport origin, whereas, CSS
 
  // values are in referecne to their respective edges.
 
  BoxPosition.prototype.toCSSCompatValues = function(reference) {
 
    return {
 
      top: this.top - reference.top,
 
      bottom: reference.bottom - this.bottom,
 
      left: this.left - reference.left,
 
      right: reference.right - this.right,
 
      height: this.height,
 
      width: this.width
 
    };
 
  };
 

	
 
  // Get an object that represents the box's position without anything extra.
 
  // Can pass a StyleBox, HTMLElement, or another BoxPositon.
 
  BoxPosition.getSimpleBoxPosition = function(obj) {
 
    var height = obj.div ? obj.div.offsetHeight : obj.tagName ? obj.offsetHeight : 0;
 
    var width = obj.div ? obj.div.offsetWidth : obj.tagName ? obj.offsetWidth : 0;
 
    var top = obj.div ? obj.div.offsetTop : obj.tagName ? obj.offsetTop : 0;
 

	
 
    obj = obj.div ? obj.div.getBoundingClientRect() :
 
                  obj.tagName ? obj.getBoundingClientRect() : obj;
 
    var ret = {
 
      left: obj.left,
 
      right: obj.right,
 
      top: obj.top || top,
 
      height: obj.height || height,
 
      bottom: obj.bottom || (top + (obj.height || height)),
 
      width: obj.width || width
 
    };
 
    return ret;
 
  };
 

	
 
  // Move a StyleBox to its specified, or next best, position. The containerBox
 
  // is the box that contains the StyleBox, such as a div. boxPositions are
 
  // a list of other boxes that the styleBox can't overlap with.
 
  function moveBoxToLinePosition(window, styleBox, containerBox, boxPositions) {
 

	
 
    // Find the best position for a cue box, b, on the video. The axis parameter
 
    // is a list of axis, the order of which, it will move the box along. For example:
 
    // Passing ["+x", "-x"] will move the box first along the x axis in the positive
 
    // direction. If it doesn't find a good position for it there it will then move
 
    // it along the x axis in the negative direction.
 
    function findBestPosition(b, axis) {
 
      var bestPosition,
 
          specifiedPosition = new BoxPosition(b),
 
          percentage = 1; // Highest possible so the first thing we get is better.
 

	
 
      for (var i = 0; i < axis.length; i++) {
 
        while (b.overlapsOppositeAxis(containerBox, axis[i]) ||
 
               (b.within(containerBox) && b.overlapsAny(boxPositions))) {
 
          b.move(axis[i]);
 
        }
 
        // We found a spot where we aren't overlapping anything. This is our
 
        // best position.
 
        if (b.within(containerBox)) {
 
          return b;
 
        }
 
        var p = b.intersectPercentage(containerBox);
 
        // If we're outside the container box less then we were on our last try
 
        // then remember this position as the best position.
 
        if (percentage > p) {
 
          bestPosition = new BoxPosition(b);
 
          percentage = p;
 
        }
 
        // Reset the box position to the specified position.
 
        b = new BoxPosition(specifiedPosition);
 
      }
 
      return bestPosition || specifiedPosition;
 
    }
 

	
 
    var boxPosition = new BoxPosition(styleBox),
 
        cue = styleBox.cue,
 
        linePos = computeLinePos(cue),
 
        axis = [];
 

	
 
    // If we have a line number to align the cue to.
 
    if (cue.snapToLines) {
 
      var size;
 
      switch (cue.vertical) {
 
      case "":
 
        axis = [ "+y", "-y" ];
 
        size = "height";
 
        break;
 
      case "rl":
 
        axis = [ "+x", "-x" ];
 
        size = "width";
 
        break;
 
      case "lr":
 
        axis = [ "-x", "+x" ];
 
        size = "width";
 
        break;
 
      }
 

	
 
      var step = boxPosition.lineHeight,
 
          position = step * Math.round(linePos),
 
          maxPosition = containerBox[size] + step,
 
          initialAxis = axis[0];
 

	
 
      // If the specified intial position is greater then the max position then
 
      // clamp the box to the amount of steps it would take for the box to
 
      // reach the max position.
 
      if (Math.abs(position) > maxPosition) {
 
        position = position < 0 ? -1 : 1;
 
        position *= Math.ceil(maxPosition / step) * step;
 
      }
 

	
 
      // If computed line position returns negative then line numbers are
 
      // relative to the bottom of the video instead of the top. Therefore, we
 
      // need to increase our initial position by the length or width of the
 
      // video, depending on the writing direction, and reverse our axis directions.
 
      if (linePos < 0) {
 
        position += cue.vertical === "" ? containerBox.height : containerBox.width;
 
        axis = axis.reverse();
 
      }
 

	
 
      // Move the box to the specified position. This may not be its best
 
      // position.
 
      boxPosition.move(initialAxis, position);
 

	
 
    } else {
 
      // If we have a percentage line value for the cue.
 
      var calculatedPercentage = (boxPosition.lineHeight / containerBox.height) * 100;
 

	
 
      switch (cue.lineAlign) {
 
      case "middle":
 
        linePos -= (calculatedPercentage / 2);
 
        break;
 
      case "end":
 
        linePos -= calculatedPercentage;
 
        break;
 
      }
 

	
 
      // Apply initial line position to the cue box.
 
      switch (cue.vertical) {
 
      case "":
 
        styleBox.applyStyles({
 
          top: styleBox.formatStyle(linePos, "%")
 
        });
 
        break;
 
      case "rl":
 
        styleBox.applyStyles({
 
          left: styleBox.formatStyle(linePos, "%")
 
        });
 
        break;
 
      case "lr":
 
        styleBox.applyStyles({
 
          right: styleBox.formatStyle(linePos, "%")
 
        });
 
        break;
 
      }
 

	
 
      axis = [ "+y", "-x", "+x", "-y" ];
 

	
 
      // Get the box position again after we've applied the specified positioning
 
      // to it.
 
      boxPosition = new BoxPosition(styleBox);
 
    }
 

	
 
    var bestPosition = findBestPosition(boxPosition, axis);
 
    styleBox.move(bestPosition.toCSSCompatValues(containerBox));
 
  }
 

	
 
  function WebVTT() {
 
    // Nothing
 
  }
 

	
 
  // Helper to allow strings to be decoded instead of the default binary utf8 data.
 
  WebVTT.StringDecoder = function() {
 
    return {
 
      decode: function(data) {
 
        if (!data) {
 
          return "";
 
        }
 
        if (typeof data !== "string") {
 
          throw new Error("Error - expected string data.");
 
        }
 
        return decodeURIComponent(encodeURIComponent(data));
 
      }
 
    };
 
  };
 

	
 
  WebVTT.convertCueToDOMTree = function(window, cuetext) {
 
    if (!window || !cuetext) {
 
      return null;
 
    }
 
    return parseContent(window, cuetext);
 
  };
 

	
 
  var FONT_SIZE_PERCENT = 0.05;
 
  var FONT_STYLE = "sans-serif";
 
  var CUE_BACKGROUND_PADDING = "1.5%";
 

	
 
  // Runs the processing model over the cues and regions passed to it.
 
  // @param overlay A block level element (usually a div) that the computed cues
 
  //                and regions will be placed into.
 
  WebVTT.processCues = function(window, cues, overlay) {
 
    if (!window || !cues || !overlay) {
 
      return null;
 
    }
 

	
 
    // Remove all previous children.
 
    while (overlay.firstChild) {
 
      overlay.removeChild(overlay.firstChild);
 
    }
 

	
 
    var paddedOverlay = window.document.createElement("div");
 
    paddedOverlay.style.position = "absolute";
 
    paddedOverlay.style.left = "0";
 
    paddedOverlay.style.right = "0";
 
    paddedOverlay.style.top = "0";
 
    paddedOverlay.style.bottom = "0";
 
    paddedOverlay.style.margin = CUE_BACKGROUND_PADDING;
 
    overlay.appendChild(paddedOverlay);
 

	
 
    // Determine if we need to compute the display states of the cues. This could
 
    // be the case if a cue's state has been changed since the last computation or
 
    // if it has not been computed yet.
 
    function shouldCompute(cues) {
 
      for (var i = 0; i < cues.length; i++) {
 
        if (cues[i].hasBeenReset || !cues[i].displayState) {
 
          return true;
 
        }
 
      }
 
      return false;
 
    }
 

	
 
    // We don't need to recompute the cues' display states. Just reuse them.
 
    if (!shouldCompute(cues)) {
 
      for (var i = 0; i < cues.length; i++) {
 
        paddedOverlay.appendChild(cues[i].displayState);
 
      }
 
      return;
 
    }
 

	
 
    var boxPositions = [],
 
        containerBox = BoxPosition.getSimpleBoxPosition(paddedOverlay),
 
        fontSize = Math.round(containerBox.height * FONT_SIZE_PERCENT * 100) / 100;
 
    var styleOptions = {
 
      font: fontSize + "px " + FONT_STYLE
 
    };
 

	
 
    (function() {
 
      var styleBox, cue;
 

	
 
      for (var i = 0; i < cues.length; i++) {
 
        cue = cues[i];
 

	
 
        // Compute the intial position and styles of the cue div.
 
        styleBox = new CueStyleBox(window, cue, styleOptions);
 
        paddedOverlay.appendChild(styleBox.div);
 

	
 
        // Move the cue div to it's correct line position.
 
        moveBoxToLinePosition(window, styleBox, containerBox, boxPositions);
 

	
 
        // Remember the computed div so that we don't have to recompute it later
 
        // if we don't have too.
 
        cue.displayState = styleBox.div;
 

	
 
        boxPositions.push(BoxPosition.getSimpleBoxPosition(styleBox));
 
      }
 
    })();
 
  };
 

	
 
  WebVTT.Parser = function(window, vttjs, decoder) {
 
    if (!decoder) {
 
      decoder = vttjs;
 
      vttjs = {};
 
    }
 
    if (!vttjs) {
 
      vttjs = {};
 
    }
 

	
 
    this.window = window;
 
    this.vttjs = vttjs;
 
    this.state = "INITIAL";
 
    this.buffer = "";
 
    this.decoder = decoder || new TextDecoder("utf8");
 
    this.regionList = [];
 
  };
 

	
 
  WebVTT.Parser.prototype = {
 
    // If the error is a ParsingError then report it to the consumer if
 
    // possible. If it's not a ParsingError then throw it like normal.
 
    reportOrThrowError: function(e) {
 
      if (e instanceof ParsingError) {
 
        this.onparsingerror && this.onparsingerror(e);
 
      } else {
 
        throw e;
 
      }
 
    },
 
    parse: function (data) {
 
      var self = this;
 

	
 
      // If there is no data then we won't decode it, but will just try to parse
 
      // whatever is in buffer already. This may occur in circumstances, for
 
      // example when flush() is called.
 
      if (data) {
 
        // Try to decode the data that we received.
 
        self.buffer += self.decoder.decode(data, {stream: true});
 
      }
 

	
 
      function collectNextLine() {
 
        var buffer = self.buffer;
 
        var pos = 0;
 
        while (pos < buffer.length && buffer[pos] !== '\r' && buffer[pos] !== '\n') {
 
          ++pos;
 
        }
 
        var line = buffer.substr(0, pos);
 
        // Advance the buffer early in case we fail below.
 
        if (buffer[pos] === '\r') {
 
          ++pos;
 
        }
 
        if (buffer[pos] === '\n') {
 
          ++pos;
 
        }
 
        self.buffer = buffer.substr(pos);
 
        return line;
 
      }
 

	
 
      // 3.4 WebVTT region and WebVTT region settings syntax
 
      function parseRegion(input) {
 
        var settings = new Settings();
 

	
 
        parseOptions(input, function (k, v) {
 
          switch (k) {
 
          case "id":
 
            settings.set(k, v);
 
            break;
 
          case "width":
 
            settings.percent(k, v);
 
            break;
 
          case "lines":
 
            settings.integer(k, v);
 
            break;
 
          case "regionanchor":
 
          case "viewportanchor":
 
            var xy = v.split(',');
 
            if (xy.length !== 2) {
 
              break;
 
            }
 
            // We have to make sure both x and y parse, so use a temporary
 
            // settings object here.
 
            var anchor = new Settings();
 
            anchor.percent("x", xy[0]);
 
            anchor.percent("y", xy[1]);
 
            if (!anchor.has("x") || !anchor.has("y")) {
 
              break;
 
            }
 
            settings.set(k + "X", anchor.get("x"));
 
            settings.set(k + "Y", anchor.get("y"));
 
            break;
 
          case "scroll":
 
            settings.alt(k, v, ["up"]);
 
            break;
 
          }
 
        }, /=/, /\s/);
 

	
 
        // Create the region, using default values for any values that were not
 
        // specified.
 
        if (settings.has("id")) {
 
          var region = new (self.vttjs.VTTRegion || self.window.VTTRegion)();
 
          region.width = settings.get("width", 100);
 
          region.lines = settings.get("lines", 3);
 
          region.regionAnchorX = settings.get("regionanchorX", 0);
 
          region.regionAnchorY = settings.get("regionanchorY", 100);
 
          region.viewportAnchorX = settings.get("viewportanchorX", 0);
 
          region.viewportAnchorY = settings.get("viewportanchorY", 100);
 
          region.scroll = settings.get("scroll", "");
 
          // Register the region.
 
          self.onregion && self.onregion(region);
 
          // Remember the VTTRegion for later in case we parse any VTTCues that
 
          // reference it.
 
          self.regionList.push({
 
            id: settings.get("id"),
 
            region: region
 
          });
 
        }
 
      }
 

	
 
      // 3.2 WebVTT metadata header syntax
 
      function parseHeader(input) {
 
        parseOptions(input, function (k, v) {
 
          switch (k) {
 
          case "Region":
 
            // 3.3 WebVTT region metadata header syntax
 
            parseRegion(v);
 
            break;
 
          }
 
        }, /:/);
 
      }
 

	
 
      // 5.1 WebVTT file parsing.
 
      try {
 
        var line;
 
        if (self.state === "INITIAL") {
 
          // We can't start parsing until we have the first line.
 
          if (!/\r\n|\n/.test(self.buffer)) {
 
            return this;
 
          }
 

	
 
          line = collectNextLine();
 

	
 
          var m = line.match(/^WEBVTT([ \t].*)?$/);
 
          if (!m || !m[0]) {
 
            throw new ParsingError(ParsingError.Errors.BadSignature);
 
          }
 

	
 
          self.state = "HEADER";
 
        }
 

	
 
        var alreadyCollectedLine = false;
 
        while (self.buffer) {
 
          // We can't parse a line until we have the full line.
 
          if (!/\r\n|\n/.test(self.buffer)) {
 
            return this;
 
          }
 

	
 
          if (!alreadyCollectedLine) {
 
            line = collectNextLine();
 
          } else {
 
            alreadyCollectedLine = false;
 
          }
 

	
 
          switch (self.state) {
 
          case "HEADER":
 
            // 13-18 - Allow a header (metadata) under the WEBVTT line.
 
            if (/:/.test(line)) {
 
              parseHeader(line);
 
            } else if (!line) {
 
              // An empty line terminates the header and starts the body (cues).
 
              self.state = "ID";
 
            }
 
            continue;
 
          case "NOTE":
 
            // Ignore NOTE blocks.
 
            if (!line) {
 
              self.state = "ID";
 
            }
 
            continue;
 
          case "ID":
 
            // Check for the start of NOTE blocks.
 
            if (/^NOTE($|[ \t])/.test(line)) {
 
              self.state = "NOTE";
 
              break;
 
            }
 
            // 19-29 - Allow any number of line terminators, then initialize new cue values.
 
            if (!line) {
 
              continue;
 
            }
 
            self.cue = new (self.vttjs.VTTCue || self.window.VTTCue)(0, 0, "");
 
            self.state = "CUE";
 
            // 30-39 - Check if self line contains an optional identifier or timing data.
 
            if (line.indexOf("-->") === -1) {
 
              self.cue.id = line;
 
              continue;
 
            }
 
            // Process line as start of a cue.
 
            /*falls through*/
 
          case "CUE":
 
            // 40 - Collect cue timings and settings.
 
            try {
 
              parseCue(line, self.cue, self.regionList);
 
            } catch (e) {
 
              self.reportOrThrowError(e);
 
              // In case of an error ignore rest of the cue.
 
              self.cue = null;
 
              self.state = "BADCUE";
 
              continue;
 
            }
 
            self.state = "CUETEXT";
 
            continue;
 
          case "CUETEXT":
 
            var hasSubstring = line.indexOf("-->") !== -1;
 
            // 34 - If we have an empty line then report the cue.
 
            // 35 - If we have the special substring '-->' then report the cue,
 
            // but do not collect the line as we need to process the current
 
            // one as a new cue.
 
            if (!line || hasSubstring && (alreadyCollectedLine = true)) {
 
              // We are done parsing self cue.
 
              self.oncue && self.oncue(self.cue);
 
              self.cue = null;
 
              self.state = "ID";
 
              continue;
 
            }
 
            if (self.cue.text) {
 
              self.cue.text += "\n";
 
            }
 
            self.cue.text += line;
 
            continue;
 
          case "BADCUE": // BADCUE
 
            // 54-62 - Collect and discard the remaining cue.
 
            if (!line) {
 
              self.state = "ID";
 
            }
 
            continue;
 
          }
 
        }
 
      } catch (e) {
 
        self.reportOrThrowError(e);
 

	
 
        // If we are currently parsing a cue, report what we have.
 
        if (self.state === "CUETEXT" && self.cue && self.oncue) {
 
          self.oncue(self.cue);
 
        }
 
        self.cue = null;
 
        // Enter BADWEBVTT state if header was not parsed correctly otherwise
 
        // another exception occurred so enter BADCUE state.
 
        self.state = self.state === "INITIAL" ? "BADWEBVTT" : "BADCUE";
 
      }
 
      return this;
 
    },
 
    flush: function () {
 
      var self = this;
 
      try {
 
        // Finish decoding the stream.
 
        self.buffer += self.decoder.decode();
 
        // Synthesize the end of the current cue or region.
 
        if (self.cue || self.state === "HEADER") {
 
          self.buffer += "\n\n";
 
          self.parse();
 
        }
 
        // If we've flushed, parsed, and we're still on the INITIAL state then
 
        // that means we don't have enough of the stream to parse the first
 
        // line.
 
        if (self.state === "INITIAL") {
 
          throw new ParsingError(ParsingError.Errors.BadSignature);
 
        }
 
      } catch(e) {
 
        self.reportOrThrowError(e);
 
      }
 
      self.onflush && self.onflush();
 
      return this;
 
    }
 
  };
 

	
 
  global.WebVTT = WebVTT;
 

	
 
}(this, (this.vttjs || {})));
ennstatus/static/js/video.js/dist/video.js.map
Show inline comments
 
new file 100644
 
{
 
  "version": 3,
 
  "sources": [
 
    "node_modules/grunt-browserify/node_modules/browserify/node_modules/browser-pack/_prelude.js",
 
    "node_modules/global/document.js",
 
    "node_modules/global/window.js",
 
    "node_modules/grunt-browserify/node_modules/browserify/node_modules/browser-resolve/empty.js",
 
    "node_modules/lodash-compat/date/now.js",
 
    "node_modules/lodash-compat/function/debounce.js",
 
    "node_modules/lodash-compat/function/restParam.js",
 
    "node_modules/lodash-compat/function/throttle.js",
 
    "node_modules/lodash-compat/internal/arrayCopy.js",
 
    "node_modules/lodash-compat/internal/arrayEach.js",
 
    "node_modules/lodash-compat/internal/baseCopy.js",
 
    "node_modules/lodash-compat/internal/baseFor.js",
 
    "node_modules/lodash-compat/internal/baseForIn.js",
 
    "node_modules/lodash-compat/internal/baseMerge.js",
 
    "node_modules/lodash-compat/internal/baseMergeDeep.js",
 
    "node_modules/lodash-compat/internal/baseProperty.js",
 
    "node_modules/lodash-compat/internal/bindCallback.js",
 
    "node_modules/lodash-compat/internal/createAssigner.js",
 
    "node_modules/lodash-compat/internal/createBaseFor.js",
 
    "node_modules/lodash-compat/internal/getLength.js",
 
    "node_modules/lodash-compat/internal/getNative.js",
 
    "node_modules/lodash-compat/internal/isArrayLike.js",
 
    "node_modules/lodash-compat/internal/isHostObject.js",
 
    "node_modules/lodash-compat/internal/isIndex.js",
 
    "node_modules/lodash-compat/internal/isIterateeCall.js",
 
    "node_modules/lodash-compat/internal/isLength.js",
 
    "node_modules/lodash-compat/internal/isObjectLike.js",
 
    "node_modules/lodash-compat/internal/shimKeys.js",
 
    "node_modules/lodash-compat/internal/toObject.js",
 
    "node_modules/lodash-compat/lang/isArguments.js",
 
    "node_modules/lodash-compat/lang/isArray.js",
 
    "node_modules/lodash-compat/lang/isFunction.js",
 
    "node_modules/lodash-compat/lang/isNative.js",
 
    "node_modules/lodash-compat/lang/isObject.js",
 
    "node_modules/lodash-compat/lang/isPlainObject.js",
 
    "node_modules/lodash-compat/lang/isString.js",
 
    "node_modules/lodash-compat/lang/isTypedArray.js",
 
    "node_modules/lodash-compat/lang/toPlainObject.js",
 
    "node_modules/lodash-compat/object/keys.js",
 
    "node_modules/lodash-compat/object/keysIn.js",
 
    "node_modules/lodash-compat/object/merge.js",
 
    "node_modules/lodash-compat/support.js",
 
    "node_modules/lodash-compat/utility/identity.js",
 
    "node_modules/object.assign/index.js",
 
    "node_modules/object.assign/node_modules/define-properties/index.js",
 
    "node_modules/object.assign/node_modules/define-properties/node_modules/foreach/index.js",
 
    "node_modules/object.assign/node_modules/object-keys/index.js",
 
    "node_modules/object.assign/node_modules/object-keys/isArguments.js",
 
    "node_modules/safe-json-parse/tuple.js",
 
    "node_modules/tsml/tsml.js",
 
    "node_modules/xhr/index.js",
 
    "node_modules/xhr/node_modules/once/once.js",
 
    "node_modules/xhr/node_modules/parse-headers/node_modules/for-each/index.js",
 
    "node_modules/xhr/node_modules/parse-headers/node_modules/for-each/node_modules/is-function/index.js",
 
    "node_modules/xhr/node_modules/parse-headers/node_modules/trim/index.js",
 
    "node_modules/xhr/node_modules/parse-headers/parse-headers.js",
 
    "src/js/big-play-button.js",
 
    "src/js/button.js",
 
    "src/js/component.js",
 
    "src/js/control-bar/control-bar.js",
 
    "src/js/control-bar/fullscreen-toggle.js",
 
    "src/js/control-bar/live-display.js",
 
    "src/js/control-bar/mute-toggle.js",
 
    "src/js/control-bar/play-toggle.js",
 
    "src/js/control-bar/playback-rate-menu/playback-rate-menu-button.js",
 
    "src/js/control-bar/playback-rate-menu/playback-rate-menu-item.js",
 
    "src/js/control-bar/progress-control/load-progress-bar.js",
 
    "src/js/control-bar/progress-control/mouse-time-display.js",
 
    "src/js/control-bar/progress-control/play-progress-bar.js",
 
    "src/js/control-bar/progress-control/progress-control.js",
 
    "src/js/control-bar/progress-control/seek-bar.js",
 
    "src/js/control-bar/spacer-controls/custom-control-spacer.js",
 
    "src/js/control-bar/spacer-controls/spacer.js",
 
    "src/js/control-bar/text-track-controls/caption-settings-menu-item.js",
 
    "src/js/control-bar/text-track-controls/captions-button.js",
 
    "src/js/control-bar/text-track-controls/chapters-button.js",
 
    "src/js/control-bar/text-track-controls/chapters-track-menu-item.js",
 
    "src/js/control-bar/text-track-controls/off-text-track-menu-item.js",
 
    "src/js/control-bar/text-track-controls/subtitles-button.js",
 
    "src/js/control-bar/text-track-controls/text-track-button.js",
 
    "src/js/control-bar/text-track-controls/text-track-menu-item.js",
 
    "src/js/control-bar/time-controls/current-time-display.js",
 
    "src/js/control-bar/time-controls/duration-display.js",
 
    "src/js/control-bar/time-controls/remaining-time-display.js",
 
    "src/js/control-bar/time-controls/time-divider.js",
 
    "src/js/control-bar/volume-control/volume-bar.js",
 
    "src/js/control-bar/volume-control/volume-control.js",
 
    "src/js/control-bar/volume-control/volume-level.js",
 
    "src/js/control-bar/volume-menu-button.js",
 
    "src/js/error-display.js",
 
    "src/js/event-target.js",
 
    "src/js/extend.js",
 
    "src/js/fullscreen-api.js",
 
    "src/js/loading-spinner.js",
 
    "src/js/media-error.js",
 
    "src/js/menu/menu-button.js",
 
    "src/js/menu/menu-item.js",
 
    "src/js/menu/menu.js",
 
    "src/js/player.js",
 
    "src/js/plugins.js",
 
    "src/js/poster-image.js",
 
    "src/js/setup.js",
 
    "src/js/slider/slider.js",
 
    "src/js/tech/flash-rtmp.js",
 
    "src/js/tech/flash.js",
 
    "src/js/tech/html5.js",
 
    "src/js/tech/loader.js",
 
    "src/js/tech/tech.js",
 
    "src/js/tracks/text-track-cue-list.js",
 
    "src/js/tracks/text-track-display.js",
 
    "src/js/tracks/text-track-enums.js",
 
    "src/js/tracks/text-track-list-converter.js",
 
    "src/js/tracks/text-track-list.js",
 
    "src/js/tracks/text-track-settings.js",
 
    "src/js/tracks/text-track.js",
 
    "src/js/utils/browser.js",
 
    "src/js/utils/buffer.js",
 
    "src/js/utils/create-deprecation-proxy.js",
 
    "src/js/utils/dom.js",
 
    "src/js/utils/events.js",
 
    "src/js/utils/fn.js",
 
    "src/js/utils/format-time.js",
 
    "src/js/utils/guid.js",
 
    "src/js/utils/log.js",
 
    "src/js/utils/merge-options.js",
 
    "src/js/utils/stylesheet.js",
 
    "src/js/utils/time-ranges.js",
 
    "src/js/utils/to-title-case.js",
 
    "src/js/utils/url.js",
 
    "src/js/video.js"
 
  ],
 
  "names": [],
 
  "mappings": "AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;wBC3BmB,aAAa;;;;2BACV,gBAAgB;;;;;;;;;;;;;;IAWhC,aAAa;YAAb,aAAa;;AAEN,WAFP,aAAa,CAEL,MAAM,EAAE,OAAO,EAAE;0BAFzB,aAAa;;AAGf,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",
 
  "file": "generated.js",
 
  "sourceRoot": "",
 
  "sourcesContent": [
 
    "(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})",
 
    "(function (global){\nvar topLevel = typeof global !== 'undefined' ? global :\n    typeof window !== 'undefined' ? window : {}\nvar minDoc = require('min-document');\n\nif (typeof document !== 'undefined') {\n    module.exports = document;\n} else {\n    var doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];\n\n    if (!doccy) {\n        doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;\n    }\n\n    module.exports = doccy;\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9nbG9iYWwvZG9jdW1lbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9wTGV2ZWwgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6XG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB7fVxudmFyIG1pbkRvYyA9IHJlcXVpcmUoJ21pbi1kb2N1bWVudCcpO1xuXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQ7XG59IGVsc2Uge1xuICAgIHZhciBkb2NjeSA9IHRvcExldmVsWydfX0dMT0JBTF9ET0NVTUVOVF9DQUNIRUA0J107XG5cbiAgICBpZiAoIWRvY2N5KSB7XG4gICAgICAgIGRvY2N5ID0gdG9wTGV2ZWxbJ19fR0xPQkFMX0RPQ1VNRU5UX0NBQ0hFQDQnXSA9IG1pbkRvYztcbiAgICB9XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IGRvY2N5O1xufVxuIl19",
 
    "(function (global){\nif (typeof window !== \"undefined\") {\n    module.exports = window;\n} else if (typeof global !== \"undefined\") {\n    module.exports = global;\n} else if (typeof self !== \"undefined\"){\n    module.exports = self;\n} else {\n    module.exports = {};\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9nbG9iYWwvd2luZG93LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBzZWxmO1xufSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHt9O1xufVxuIl19",
 
    null,
 
    "var getNative = require('../internal/getNative');\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeNow = getNative(Date, 'now');\n\n/**\n * Gets the number of milliseconds that have elapsed since the Unix epoch\n * (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @category Date\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => logs the number of milliseconds it took for the deferred function to be invoked\n */\nvar now = nativeNow || function() {\n  return new Date().getTime();\n};\n\nmodule.exports = now;\n",
 
    "var isObject = require('../lang/isObject'),\n    now = require('../date/now');\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed invocations. Provide an options object to indicate that `func`\n * should be invoked on the leading and/or trailing edge of the `wait` timeout.\n * Subsequent calls to the debounced function return the result of the last\n * `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the debounced function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=false] Specify invoking on the leading\n *  edge of the timeout.\n * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n *  delayed before it's invoked.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n *  edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // avoid costly calculations while the window size is in flux\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // invoke `sendMail` when the click event is fired, debouncing subsequent calls\n * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // ensure `batchLog` is invoked once after 1 second of debounced calls\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', _.debounce(batchLog, 250, {\n *   'maxWait': 1000\n * }));\n *\n * // cancel a debounced call\n * var todoChanges = _.debounce(batchLog, 1000);\n * Object.observe(models.todo, todoChanges);\n *\n * Object.observe(models, function(changes) {\n *   if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {\n *     todoChanges.cancel();\n *   }\n * }, ['delete']);\n *\n * // ...at some point `models.todo` is changed\n * models.todo.completed = true;\n *\n * // ...before 1 second has passed `models.todo` is deleted\n * // which cancels the debounced `todoChanges` call\n * delete models.todo;\n */\nfunction debounce(func, wait, options) {\n  var args,\n      maxTimeoutId,\n      result,\n      stamp,\n      thisArg,\n      timeoutId,\n      trailingCall,\n      lastCalled = 0,\n      maxWait = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = wait < 0 ? 0 : (+wait || 0);\n  if (options === true) {\n    var leading = true;\n    trailing = false;\n  } else if (isObject(options)) {\n    leading = !!options.leading;\n    maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function cancel() {\n    if (timeoutId) {\n      clearTimeout(timeoutId);\n    }\n    if (maxTimeoutId) {\n      clearTimeout(maxTimeoutId);\n    }\n    lastCalled = 0;\n    maxTimeoutId = timeoutId = trailingCall = undefined;\n  }\n\n  function complete(isCalled, id) {\n    if (id) {\n      clearTimeout(id);\n    }\n    maxTimeoutId = timeoutId = trailingCall = undefined;\n    if (isCalled) {\n      lastCalled = now();\n      result = func.apply(thisArg, args);\n      if (!timeoutId && !maxTimeoutId) {\n        args = thisArg = undefined;\n      }\n    }\n  }\n\n  function delayed() {\n    var remaining = wait - (now() - stamp);\n    if (remaining <= 0 || remaining > wait) {\n      complete(trailingCall, maxTimeoutId);\n    } else {\n      timeoutId = setTimeout(delayed, remaining);\n    }\n  }\n\n  function maxDelayed() {\n    complete(trailing, timeoutId);\n  }\n\n  function debounced() {\n    args = arguments;\n    stamp = now();\n    thisArg = this;\n    trailingCall = trailing && (timeoutId || !leading);\n\n    if (maxWait === false) {\n      var leadingCall = leading && !timeoutId;\n    } else {\n      if (!maxTimeoutId && !leading) {\n        lastCalled = stamp;\n      }\n      var remaining = maxWait - (stamp - lastCalled),\n          isCalled = remaining <= 0 || remaining > maxWait;\n\n      if (isCalled) {\n        if (maxTimeoutId) {\n          maxTimeoutId = clearTimeout(maxTimeoutId);\n        }\n        lastCalled = stamp;\n        result = func.apply(thisArg, args);\n      }\n      else if (!maxTimeoutId) {\n        maxTimeoutId = setTimeout(maxDelayed, remaining);\n      }\n    }\n    if (isCalled && timeoutId) {\n      timeoutId = clearTimeout(timeoutId);\n    }\n    else if (!timeoutId && wait !== maxWait) {\n      timeoutId = setTimeout(delayed, wait);\n    }\n    if (leadingCall) {\n      isCalled = true;\n      result = func.apply(thisArg, args);\n    }\n    if (isCalled && !timeoutId && !maxTimeoutId) {\n      args = thisArg = undefined;\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  return debounced;\n}\n\nmodule.exports = debounce;\n",
 
    "/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as an array.\n *\n * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters).\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.restParam(function(what, names) {\n *   return what + ' ' + _.initial(names).join(', ') +\n *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\nfunction restParam(func, start) {\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        rest = Array(length);\n\n    while (++index < length) {\n      rest[index] = args[start + index];\n    }\n    switch (start) {\n      case 0: return func.call(this, rest);\n      case 1: return func.call(this, args[0], rest);\n      case 2: return func.call(this, args[0], args[1], rest);\n    }\n    var otherArgs = Array(start + 1);\n    index = -1;\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = rest;\n    return func.apply(this, otherArgs);\n  };\n}\n\nmodule.exports = restParam;\n",
 
    "var debounce = require('./debounce'),\n    isObject = require('../lang/isObject');\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed invocations. Provide an options object to indicate\n * that `func` should be invoked on the leading and/or trailing edge of the\n * `wait` timeout. Subsequent calls to the throttled function return the\n * result of the last `func` call.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the throttled function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=true] Specify invoking on the leading\n *  edge of the timeout.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n *  edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // avoid excessively updating the position while scrolling\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\n *   'trailing': false\n * }));\n *\n * // cancel a trailing throttled call\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n  var leading = true,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  if (options === false) {\n    leading = false;\n  } else if (isObject(options)) {\n    leading = 'leading' in options ? !!options.leading : leading;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n  return debounce(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing });\n}\n\nmodule.exports = throttle;\n",
 
    "/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction arrayCopy(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayCopy;\n",
 
    "/**\n * A specialized version of `_.forEach` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (iteratee(array[index], index, array) === false) {\n      break;\n    }\n  }\n  return array;\n}\n\nmodule.exports = arrayEach;\n",
 
    "/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property names to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @returns {Object} Returns `object`.\n */\nfunction baseCopy(source, props, object) {\n  object || (object = {});\n\n  var index = -1,\n      length = props.length;\n\n  while (++index < length) {\n    var key = props[index];\n    object[key] = source[key];\n  }\n  return object;\n}\n\nmodule.exports = baseCopy;\n",
 
    "var createBaseFor = require('./createBaseFor');\n\n/**\n * The base implementation of `baseForIn` and `baseForOwn` which iterates\n * over `object` properties returned by `keysFunc` invoking `iteratee` for\n * each property. Iteratee functions may exit iteration early by explicitly\n * returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n",
 
    "var baseFor = require('./baseFor'),\n    keysIn = require('../object/keysIn');\n\n/**\n * The base implementation of `_.forIn` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForIn(object, iteratee) {\n  return baseFor(object, iteratee, keysIn);\n}\n\nmodule.exports = baseForIn;\n",
 
    "var arrayEach = require('./arrayEach'),\n    baseMergeDeep = require('./baseMergeDeep'),\n    isArray = require('../lang/isArray'),\n    isArrayLike = require('./isArrayLike'),\n    isObject = require('../lang/isObject'),\n    isObjectLike = require('./isObjectLike'),\n    isTypedArray = require('../lang/isTypedArray'),\n    keys = require('../object/keys');\n\n/**\n * The base implementation of `_.merge` without support for argument juggling,\n * multiple sources, and `this` binding `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Array} [stackA=[]] Tracks traversed source objects.\n * @param {Array} [stackB=[]] Associates values with source counterparts.\n * @returns {Object} Returns `object`.\n */\nfunction baseMerge(object, source, customizer, stackA, stackB) {\n  if (!isObject(object)) {\n    return object;\n  }\n  var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),\n      props = isSrcArr ? undefined : keys(source);\n\n  arrayEach(props || source, function(srcValue, key) {\n    if (props) {\n      key = srcValue;\n      srcValue = source[key];\n    }\n    if (isObjectLike(srcValue)) {\n      stackA || (stackA = []);\n      stackB || (stackB = []);\n      baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);\n    }\n    else {\n      var value = object[key],\n          result = customizer ? customizer(value, srcValue, key, object, source) : undefined,\n          isCommon = result === undefined;\n\n      if (isCommon) {\n        result = srcValue;\n      }\n      if ((result !== undefined || (isSrcArr && !(key in object))) &&\n          (isCommon || (result === result ? (result !== value) : (value === value)))) {\n        object[key] = result;\n      }\n    }\n  });\n  return object;\n}\n\nmodule.exports = baseMerge;\n",
 
    "var arrayCopy = require('./arrayCopy'),\n    isArguments = require('../lang/isArguments'),\n    isArray = require('../lang/isArray'),\n    isArrayLike = require('./isArrayLike'),\n    isPlainObject = require('../lang/isPlainObject'),\n    isTypedArray = require('../lang/isTypedArray'),\n    toPlainObject = require('../lang/toPlainObject');\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Array} [stackA=[]] Tracks traversed source objects.\n * @param {Array} [stackB=[]] Associates values with source counterparts.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {\n  var length = stackA.length,\n      srcValue = source[key];\n\n  while (length--) {\n    if (stackA[length] == srcValue) {\n      object[key] = stackB[length];\n      return;\n    }\n  }\n  var value = object[key],\n      result = customizer ? customizer(value, srcValue, key, object, source) : undefined,\n      isCommon = result === undefined;\n\n  if (isCommon) {\n    result = srcValue;\n    if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) {\n      result = isArray(value)\n        ? value\n        : (isArrayLike(value) ? arrayCopy(value) : []);\n    }\n    else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n      result = isArguments(value)\n        ? toPlainObject(value)\n        : (isPlainObject(value) ? value : {});\n    }\n    else {\n      isCommon = false;\n    }\n  }\n  // Add the source value to the stack of traversed objects and associate\n  // it with its merged value.\n  stackA.push(srcValue);\n  stackB.push(result);\n\n  if (isCommon) {\n    // Recursively merge objects and arrays (susceptible to call stack limits).\n    object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);\n  } else if (result === result ? (result !== value) : (value === value)) {\n    object[key] = result;\n  }\n}\n\nmodule.exports = baseMergeDeep;\n",
 
    "var toObject = require('./toObject');\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n  return function(object) {\n    return object == null ? undefined : toObject(object)[key];\n  };\n}\n\nmodule.exports = baseProperty;\n",
 
    "var identity = require('../utility/identity');\n\n/**\n * A specialized version of `baseCallback` which only supports `this` binding\n * and specifying the number of arguments to provide to `func`.\n *\n * @private\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {number} [argCount] The number of arguments to provide to `func`.\n * @returns {Function} Returns the callback.\n */\nfunction bindCallback(func, thisArg, argCount) {\n  if (typeof func != 'function') {\n    return identity;\n  }\n  if (thisArg === undefined) {\n    return func;\n  }\n  switch (argCount) {\n    case 1: return function(value) {\n      return func.call(thisArg, value);\n    };\n    case 3: return function(value, index, collection) {\n      return func.call(thisArg, value, index, collection);\n    };\n    case 4: return function(accumulator, value, index, collection) {\n      return func.call(thisArg, accumulator, value, index, collection);\n    };\n    case 5: return function(value, other, key, object, source) {\n      return func.call(thisArg, value, other, key, object, source);\n    };\n  }\n  return function() {\n    return func.apply(thisArg, arguments);\n  };\n}\n\nmodule.exports = bindCallback;\n",
 
    "var bindCallback = require('./bindCallback'),\n    isIterateeCall = require('./isIterateeCall'),\n    restParam = require('../function/restParam');\n\n/**\n * Creates a `_.assign`, `_.defaults`, or `_.merge` function.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n  return restParam(function(object, sources) {\n    var index = -1,\n        length = object == null ? 0 : sources.length,\n        customizer = length > 2 ? sources[length - 2] : undefined,\n        guard = length > 2 ? sources[2] : undefined,\n        thisArg = length > 1 ? sources[length - 1] : undefined;\n\n    if (typeof customizer == 'function') {\n      customizer = bindCallback(customizer, thisArg, 5);\n      length -= 2;\n    } else {\n      customizer = typeof thisArg == 'function' ? thisArg : undefined;\n      length -= (customizer ? 1 : 0);\n    }\n    if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n      customizer = length < 3 ? undefined : customizer;\n      length = 1;\n    }\n    while (++index < length) {\n      var source = sources[index];\n      if (source) {\n        assigner(object, source, customizer);\n      }\n    }\n    return object;\n  });\n}\n\nmodule.exports = createAssigner;\n",
 
    "var toObject = require('./toObject');\n\n/**\n * Creates a base function for `_.forIn` or `_.forInRight`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n  return function(object, iteratee, keysFunc) {\n    var iterable = toObject(object),\n        props = keysFunc(object),\n        length = props.length,\n        index = fromRight ? length : -1;\n\n    while ((fromRight ? index-- : ++index < length)) {\n      var key = props[index];\n      if (iteratee(iterable[key], key, iterable) === false) {\n        break;\n      }\n    }\n    return object;\n  };\n}\n\nmodule.exports = createBaseFor;\n",
 
    "var baseProperty = require('./baseProperty');\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\nmodule.exports = getLength;\n",
 
    "var isNative = require('../lang/isNative');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = object == null ? undefined : object[key];\n  return isNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n",
 
    "var getLength = require('./getLength'),\n    isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(getLength(value));\n}\n\nmodule.exports = isArrayLike;\n",
 
    "/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    // IE < 9 presents many host objects as `Object` objects that can coerce\n    // to strings despite having improperly defined `toString` methods.\n    return typeof value.toString != 'function' && typeof (value + '') == 'string';\n  };\n}());\n\nmodule.exports = isHostObject;\n",
 
    "/** Used to detect unsigned integer values. */\nvar reIsUint = /^\\d+$/;\n\n/**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n  return value > -1 && value % 1 == 0 && value < length;\n}\n\nmodule.exports = isIndex;\n",
 
    "var isArrayLike = require('./isArrayLike'),\n    isIndex = require('./isIndex'),\n    isObject = require('../lang/isObject');\n\n/**\n * Checks if the provided arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n  if (!isObject(object)) {\n    return false;\n  }\n  var type = typeof index;\n  if (type == 'number'\n      ? (isArrayLike(object) && isIndex(index, object.length))\n      : (type == 'string' && index in object)) {\n    var other = object[index];\n    return value === value ? (value === other) : (other !== other);\n  }\n  return false;\n}\n\nmodule.exports = isIterateeCall;\n",
 
    "/**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n  return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n",
 
    "/**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\nfunction isObjectLike(value) {\n  return !!value && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n",
 
    "var isArguments = require('../lang/isArguments'),\n    isArray = require('../lang/isArray'),\n    isIndex = require('./isIndex'),\n    isLength = require('./isLength'),\n    isString = require('../lang/isString'),\n    keysIn = require('../object/keysIn');\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A fallback implementation of `Object.keys` which creates an array of the\n * own enumerable property names of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction shimKeys(object) {\n  var props = keysIn(object),\n      propsLength = props.length,\n      length = propsLength && object.length;\n\n  var allowIndexes = !!length && isLength(length) &&\n    (isArray(object) || isArguments(object) || isString(object));\n\n  var index = -1,\n      result = [];\n\n  while (++index < propsLength) {\n    var key = props[index];\n    if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = shimKeys;\n",
 
    "var isObject = require('../lang/isObject'),\n    isString = require('../lang/isString'),\n    support = require('../support');\n\n/**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\nfunction toObject(value) {\n  if (support.unindexedChars && isString(value)) {\n    var index = -1,\n        length = value.length,\n        result = Object(value);\n\n    while (++index < length) {\n      result[index] = value.charAt(index);\n    }\n    return result;\n  }\n  return isObject(value) ? value : Object(value);\n}\n\nmodule.exports = toObject;\n",
 
    "var isArrayLike = require('../internal/isArrayLike'),\n    isObjectLike = require('../internal/isObjectLike');\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Native method references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is classified as an `arguments` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n  return isObjectLike(value) && isArrayLike(value) &&\n    hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');\n}\n\nmodule.exports = isArguments;\n",
 
    "var getNative = require('../internal/getNative'),\n    isLength = require('../internal/isLength'),\n    isObjectLike = require('../internal/isObjectLike');\n\n/** `Object#toString` result references. */\nvar arrayTag = '[object Array]';\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeIsArray = getNative(Array, 'isArray');\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(function() { return arguments; }());\n * // => false\n */\nvar isArray = nativeIsArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;\n};\n\nmodule.exports = isArray;\n",
 
    "var isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]';\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in older versions of Chrome and Safari which return 'function' for regexes\n  // and Safari 8 which returns 'object' for typed array constructors.\n  return isObject(value) && objToString.call(value) == funcTag;\n}\n\nmodule.exports = isFunction;\n",
 
    "var isFunction = require('./isFunction'),\n    isHostObject = require('../internal/isHostObject'),\n    isObjectLike = require('../internal/isObjectLike');\n\n/** Used to detect host constructors (Safari > 5). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar fnToString = Function.prototype.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  fnToString.call(hasOwnProperty).replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * Checks if `value` is a native function.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\nfunction isNative(value) {\n  if (value == null) {\n    return false;\n  }\n  if (isFunction(value)) {\n    return reIsNative.test(fnToString.call(value));\n  }\n  return isObjectLike(value) && (isHostObject(value) ? reIsNative : reIsHostCtor).test(value);\n}\n\nmodule.exports = isNative;\n",
 
    "/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(1);\n * // => false\n */\nfunction isObject(value) {\n  // Avoid a V8 JIT bug in Chrome 19-20.\n  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n  var type = typeof value;\n  return !!value && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n",
 
    "var baseForIn = require('../internal/baseForIn'),\n    isArguments = require('./isArguments'),\n    isHostObject = require('../internal/isHostObject'),\n    isObjectLike = require('../internal/isObjectLike'),\n    support = require('../support');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * **Note:** This method assumes objects created by the `Object` constructor\n * have no inherited enumerable properties.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n  var Ctor;\n\n  // Exit early for non `Object` objects.\n  if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isHostObject(value) && !isArguments(value)) ||\n      (!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {\n    return false;\n  }\n  // IE < 9 iterates inherited properties before own properties. If the first\n  // iterated property is an object's own property then there are no inherited\n  // enumerable properties.\n  var result;\n  if (support.ownLast) {\n    baseForIn(value, function(subValue, key, object) {\n      result = hasOwnProperty.call(object, key);\n      return false;\n    });\n    return result !== false;\n  }\n  // In most environments an object's own properties are iterated before\n  // its inherited properties. If the last iterated property is an object's\n  // own property then there are no inherited enumerable properties.\n  baseForIn(value, function(subValue, key) {\n    result = key;\n  });\n  return result === undefined || hasOwnProperty.call(value, result);\n}\n\nmodule.exports = isPlainObject;\n",
 
    "var isObjectLike = require('../internal/isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n  return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);\n}\n\nmodule.exports = isString;\n",
 
    "var isLength = require('../internal/isLength'),\n    isObjectLike = require('../internal/isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nmodule.exports = isTypedArray;\n",
 
    "var baseCopy = require('../internal/baseCopy'),\n    keysIn = require('../object/keysIn');\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable\n * properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n  return baseCopy(value, keysIn(value));\n}\n\nmodule.exports = toPlainObject;\n",
 
    "var getNative = require('../internal/getNative'),\n    isArrayLike = require('../internal/isArrayLike'),\n    isObject = require('../lang/isObject'),\n    shimKeys = require('../internal/shimKeys'),\n    support = require('../support');\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = getNative(Object, 'keys');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nvar keys = !nativeKeys ? shimKeys : function(object) {\n  var Ctor = object == null ? undefined : object.constructor;\n  if ((typeof Ctor == 'function' && Ctor.prototype === object) ||\n      (typeof object == 'function' ? support.enumPrototypes : isArrayLike(object))) {\n    return shimKeys(object);\n  }\n  return isObject(object) ? nativeKeys(object) : [];\n};\n\nmodule.exports = keys;\n",
 
    "var arrayEach = require('../internal/arrayEach'),\n    isArguments = require('../lang/isArguments'),\n    isArray = require('../lang/isArray'),\n    isFunction = require('../lang/isFunction'),\n    isIndex = require('../internal/isIndex'),\n    isLength = require('../internal/isLength'),\n    isObject = require('../lang/isObject'),\n    isString = require('../lang/isString'),\n    support = require('../support');\n\n/** `Object#toString` result references. */\nvar arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    stringTag = '[object String]';\n\n/** Used to fix the JScript `[[DontEnum]]` bug. */\nvar shadowProps = [\n  'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',\n  'toLocaleString', 'toString', 'valueOf'\n];\n\n/** Used for native method references. */\nvar errorProto = Error.prototype,\n    objectProto = Object.prototype,\n    stringProto = String.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/** Used to avoid iterating over non-enumerable properties in IE < 9. */\nvar nonEnumProps = {};\nnonEnumProps[arrayTag] = nonEnumProps[dateTag] = nonEnumProps[numberTag] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };\nnonEnumProps[boolTag] = nonEnumProps[stringTag] = { 'constructor': true, 'toString': true, 'valueOf': true };\nnonEnumProps[errorTag] = nonEnumProps[funcTag] = nonEnumProps[regexpTag] = { 'constructor': true, 'toString': true };\nnonEnumProps[objectTag] = { 'constructor': true };\n\narrayEach(shadowProps, function(key) {\n  for (var tag in nonEnumProps) {\n    if (hasOwnProperty.call(nonEnumProps, tag)) {\n      var props = nonEnumProps[tag];\n      props[key] = hasOwnProperty.call(props, key);\n    }\n  }\n});\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n  if (object == null) {\n    return [];\n  }\n  if (!isObject(object)) {\n    object = Object(object);\n  }\n  var length = object.length;\n\n  length = (length && isLength(length) &&\n    (isArray(object) || isArguments(object) || isString(object)) && length) || 0;\n\n  var Ctor = object.constructor,\n      index = -1,\n      proto = (isFunction(Ctor) && Ctor.prototype) || objectProto,\n      isProto = proto === object,\n      result = Array(length),\n      skipIndexes = length > 0,\n      skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error),\n      skipProto = support.enumPrototypes && isFunction(object);\n\n  while (++index < length) {\n    result[index] = (index + '');\n  }\n  // lodash skips the `constructor` property when it infers it's iterating\n  // over a `prototype` object because IE < 9 can't set the `[[Enumerable]]`\n  // attribute of an existing property and the `constructor` property of a\n  // prototype defaults to non-enumerable.\n  for (var key in object) {\n    if (!(skipProto && key == 'prototype') &&\n        !(skipErrorProps && (key == 'message' || key == 'name')) &&\n        !(skipIndexes && isIndex(key, length)) &&\n        !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n      result.push(key);\n    }\n  }\n  if (support.nonEnumShadows && object !== objectProto) {\n    var tag = object === stringProto ? stringTag : (object === errorProto ? errorTag : objToString.call(object)),\n        nonEnums = nonEnumProps[tag] || nonEnumProps[objectTag];\n\n    if (tag == objectTag) {\n      proto = objectProto;\n    }\n    length = shadowProps.length;\n    while (length--) {\n      key = shadowProps[length];\n      var nonEnum = nonEnums[key];\n      if (!(isProto && nonEnum) &&\n          (nonEnum ? hasOwnProperty.call(object, key) : object[key] !== proto[key])) {\n        result.push(key);\n      }\n    }\n  }\n  return result;\n}\n\nmodule.exports = keysIn;\n",
 
    "var baseMerge = require('../internal/baseMerge'),\n    createAssigner = require('../internal/createAssigner');\n\n/**\n * Recursively merges own enumerable properties of the source object(s), that\n * don't resolve to `undefined` into the destination object. Subsequent sources\n * overwrite property assignments of previous sources. If `customizer` is\n * provided it's invoked to produce the merged values of the destination and\n * source properties. If `customizer` returns `undefined` merging is handled\n * by the method instead. The `customizer` is bound to `thisArg` and invoked\n * with five arguments: (objectValue, sourceValue, key, object, source).\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var users = {\n *   'data': [{ 'user': 'barney' }, { 'user': 'fred' }]\n * };\n *\n * var ages = {\n *   'data': [{ 'age': 36 }, { 'age': 40 }]\n * };\n *\n * _.merge(users, ages);\n * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }\n *\n * // using a customizer callback\n * var object = {\n *   'fruits': ['apple'],\n *   'vegetables': ['beet']\n * };\n *\n * var other = {\n *   'fruits': ['banana'],\n *   'vegetables': ['carrot']\n * };\n *\n * _.merge(object, other, function(a, b) {\n *   if (_.isArray(a)) {\n *     return a.concat(b);\n *   }\n * });\n * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }\n */\nvar merge = createAssigner(baseMerge);\n\nmodule.exports = merge;\n",
 
    "/** Used for native method references. */\nvar arrayProto = Array.prototype,\n    errorProto = Error.prototype,\n    objectProto = Object.prototype;\n\n/** Native method references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable,\n    splice = arrayProto.splice;\n\n/**\n * An object environment feature flags.\n *\n * @static\n * @memberOf _\n * @type Object\n */\nvar support = {};\n\n(function(x) {\n  var Ctor = function() { this.x = x; },\n      object = { '0': x, 'length': x },\n      props = [];\n\n  Ctor.prototype = { 'valueOf': x, 'y': x };\n  for (var key in new Ctor) { props.push(key); }\n\n  /**\n   * Detect if `name` or `message` properties of `Error.prototype` are\n   * enumerable by default (IE < 9, Safari < 5.1).\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') ||\n    propertyIsEnumerable.call(errorProto, 'name');\n\n  /**\n   * Detect if `prototype` properties are enumerable by default.\n   *\n   * Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1\n   * (if the prototype or a property on the prototype has been set)\n   * incorrectly set the `[[Enumerable]]` value of a function's `prototype`\n   * property to `true`.\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.enumPrototypes = propertyIsEnumerable.call(Ctor, 'prototype');\n\n  /**\n   * Detect if properties shadowing those on `Object.prototype` are non-enumerable.\n   *\n   * In IE < 9 an object's own properties, shadowing non-enumerable ones,\n   * are made non-enumerable as well (a.k.a the JScript `[[DontEnum]]` bug).\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.nonEnumShadows = !/valueOf/.test(props);\n\n  /**\n   * Detect if own properties are iterated after inherited properties (IE < 9).\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.ownLast = props[0] != 'x';\n\n  /**\n   * Detect if `Array#shift` and `Array#splice` augment array-like objects\n   * correctly.\n   *\n   * Firefox < 10, compatibility modes of IE 8, and IE < 9 have buggy Array\n   * `shift()` and `splice()` functions that fail to remove the last element,\n   * `value[0]`, of array-like objects even though the \"length\" property is\n   * set to `0`. The `shift()` method is buggy in compatibility modes of IE 8,\n   * while `splice()` is buggy regardless of mode in IE < 9.\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.spliceObjects = (splice.call(object, 0, 1), !object[0]);\n\n  /**\n   * Detect lack of support for accessing string characters by index.\n   *\n   * IE < 8 can't access characters by index. IE 8 can only access characters\n   * by index on string literals, not string objects.\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.unindexedChars = ('x'[0] + Object('x')[0]) != 'xx';\n}(1, 0));\n\nmodule.exports = support;\n",
 
    "/**\n * This method returns the first argument provided to it.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'user': 'fred' };\n *\n * _.identity(object) === object;\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n",
 
    "'use strict';\n\n// modified from https://github.com/es-shims/es6-shim\nvar keys = require('object-keys');\nvar canBeObject = function (obj) {\n\treturn typeof obj !== 'undefined' && obj !== null;\n};\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';\nvar defineProperties = require('define-properties');\nvar toObject = Object;\nvar push = Array.prototype.push;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nvar assignShim = function assign(target, source1) {\n\tif (!canBeObject(target)) { throw new TypeError('target must be an object'); }\n\tvar objTarget = toObject(target);\n\tvar s, source, i, props, syms;\n\tfor (s = 1; s < arguments.length; ++s) {\n\t\tsource = toObject(arguments[s]);\n\t\tprops = keys(source);\n\t\tif (hasSymbols && Object.getOwnPropertySymbols) {\n\t\t\tsyms = Object.getOwnPropertySymbols(source);\n\t\t\tfor (i = 0; i < syms.length; ++i) {\n\t\t\t\tif (propIsEnumerable.call(source, syms[i])) {\n\t\t\t\t\tpush.call(props, syms[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (i = 0; i < props.length; ++i) {\n\t\t\tobjTarget[props[i]] = source[props[i]];\n\t\t}\n\t}\n\treturn objTarget;\n};\n\ndefineProperties(assignShim, {\n\tshim: function shimObjectAssign() {\n\t\tvar assignHasPendingExceptions = function () {\n\t\t\tif (!Object.assign || !Object.preventExtensions) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Firefox 37 still has \"pending exception\" logic in its Object.assign implementation,\n\t\t\t// which is 72% slower than our shim, and Firefox 40's native implementation.\n\t\t\tvar thrower = Object.preventExtensions({ 1: 2 });\n\t\t\ttry {\n\t\t\t\tObject.assign(thrower, 'xy');\n\t\t\t} catch (e) {\n\t\t\t\treturn thrower[1] === 'y';\n\t\t\t}\n\t\t};\n\t\tdefineProperties(\n\t\t\tObject,\n\t\t\t{ assign: assignShim },\n\t\t\t{ assign: assignHasPendingExceptions }\n\t\t);\n\t\treturn Object.assign || assignShim;\n\t}\n});\n\nmodule.exports = assignShim;\n",
 
    "'use strict';\n\nvar keys = require('object-keys');\nvar foreach = require('foreach');\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';\n\nvar toStr = Object.prototype.toString;\n\nvar isFunction = function (fn) {\n\treturn typeof fn === 'function' && toStr.call(fn) === '[object Function]';\n};\n\nvar arePropertyDescriptorsSupported = function () {\n\tvar obj = {};\n\ttry {\n\t\tObject.defineProperty(obj, 'x', { value: obj, enumerable: false });\n        /* eslint-disable no-unused-vars */\n        for (var _ in obj) { return false; }\n        /* eslint-enable no-unused-vars */\n\t\treturn obj.x === obj;\n\t} catch (e) { /* this is IE 8. */\n\t\treturn false;\n\t}\n};\nvar supportsDescriptors = Object.defineProperty && arePropertyDescriptorsSupported();\n\nvar defineProperty = function (object, name, value, predicate) {\n\tif (name in object && (!isFunction(predicate) || !predicate())) {\n\t\treturn;\n\t}\n\tif (supportsDescriptors) {\n\t\tObject.defineProperty(object, name, {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\twritable: true,\n\t\t\tvalue: value\n\t\t});\n\t} else {\n\t\tobject[name] = value;\n\t}\n};\n\nvar defineProperties = function (object, map) {\n\tvar predicates = arguments.length > 2 ? arguments[2] : {};\n\tvar props = keys(map);\n\tif (hasSymbols) {\n\t\tprops = props.concat(Object.getOwnPropertySymbols(map));\n\t}\n\tforeach(props, function (name) {\n\t\tdefineProperty(object, name, map[name], predicates[name]);\n\t});\n};\n\ndefineProperties.supportsDescriptors = !!supportsDescriptors;\n\nmodule.exports = defineProperties;\n",
 
    "\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar toString = Object.prototype.toString;\n\nmodule.exports = function forEach (obj, fn, ctx) {\n    if (toString.call(fn) !== '[object Function]') {\n        throw new TypeError('iterator must be a function');\n    }\n    var l = obj.length;\n    if (l === +l) {\n        for (var i = 0; i < l; i++) {\n            fn.call(ctx, obj[i], i, obj);\n        }\n    } else {\n        for (var k in obj) {\n            if (hasOwn.call(obj, k)) {\n                fn.call(ctx, obj[k], k, obj);\n            }\n        }\n    }\n};\n\n",
 
    "'use strict';\n\n// modified from https://github.com/es-shims/es5-shim\nvar has = Object.prototype.hasOwnProperty;\nvar toStr = Object.prototype.toString;\nvar slice = Array.prototype.slice;\nvar isArgs = require('./isArguments');\nvar hasDontEnumBug = !({ 'toString': null }).propertyIsEnumerable('toString');\nvar hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype');\nvar dontEnums = [\n\t'toString',\n\t'toLocaleString',\n\t'valueOf',\n\t'hasOwnProperty',\n\t'isPrototypeOf',\n\t'propertyIsEnumerable',\n\t'constructor'\n];\nvar equalsConstructorPrototype = function (o) {\n\tvar ctor = o.constructor;\n\treturn ctor && ctor.prototype === o;\n};\nvar blacklistedKeys = {\n\t$window: true,\n\t$console: true,\n\t$parent: true,\n\t$self: true,\n\t$frames: true,\n\t$webkitIndexedDB: true,\n\t$webkitStorageInfo: true\n};\nvar hasAutomationEqualityBug = (function () {\n\t/* global window */\n\tif (typeof window === 'undefined') { return false; }\n\tfor (var k in window) {\n\t\tif (!blacklistedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {\n\t\t\ttry {\n\t\t\t\tequalsConstructorPrototype(window[k]);\n\t\t\t} catch (e) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}());\nvar equalsConstructorPrototypeIfNotBuggy = function (o) {\n\t/* global window */\n\tif (typeof window === 'undefined' && !hasAutomationEqualityBug) {\n\t\treturn equalsConstructorPrototype(o);\n\t}\n\ttry {\n\t\treturn equalsConstructorPrototype(o);\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\nvar keysShim = function keys(object) {\n\tvar isObject = object !== null && typeof object === 'object';\n\tvar isFunction = toStr.call(object) === '[object Function]';\n\tvar isArguments = isArgs(object);\n\tvar isString = isObject && toStr.call(object) === '[object String]';\n\tvar theKeys = [];\n\n\tif (!isObject && !isFunction && !isArguments) {\n\t\tthrow new TypeError('Object.keys called on a non-object');\n\t}\n\n\tvar skipProto = hasProtoEnumBug && isFunction;\n\tif (isString && object.length > 0 && !has.call(object, 0)) {\n\t\tfor (var i = 0; i < object.length; ++i) {\n\t\t\ttheKeys.push(String(i));\n\t\t}\n\t}\n\n\tif (isArguments && object.length > 0) {\n\t\tfor (var j = 0; j < object.length; ++j) {\n\t\t\ttheKeys.push(String(j));\n\t\t}\n\t} else {\n\t\tfor (var name in object) {\n\t\t\tif (!(skipProto && name === 'prototype') && has.call(object, name)) {\n\t\t\t\ttheKeys.push(String(name));\n\t\t\t}\n\t\t}\n\t}\n\n\tif (hasDontEnumBug) {\n\t\tvar skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);\n\n\t\tfor (var k = 0; k < dontEnums.length; ++k) {\n\t\t\tif (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {\n\t\t\t\ttheKeys.push(dontEnums[k]);\n\t\t\t}\n\t\t}\n\t}\n\treturn theKeys;\n};\n\nkeysShim.shim = function shimObjectKeys() {\n\tif (!Object.keys) {\n\t\tObject.keys = keysShim;\n\t} else {\n\t\tvar keysWorksWithArguments = (function () {\n\t\t\t// Safari 5.0 bug\n\t\t\treturn (Object.keys(arguments) || '').length === 2;\n\t\t}(1, 2));\n\t\tif (!keysWorksWithArguments) {\n\t\t\tvar originalKeys = Object.keys;\n\t\t\tObject.keys = function keys(object) {\n\t\t\t\tif (isArgs(object)) {\n\t\t\t\t\treturn originalKeys(slice.call(object));\n\t\t\t\t} else {\n\t\t\t\t\treturn originalKeys(object);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n\treturn Object.keys || keysShim;\n};\n\nmodule.exports = keysShim;\n",
 
    "'use strict';\n\nvar toStr = Object.prototype.toString;\n\nmodule.exports = function isArguments(value) {\n\tvar str = toStr.call(value);\n\tvar isArgs = str === '[object Arguments]';\n\tif (!isArgs) {\n\t\tisArgs = str !== '[object Array]' &&\n\t\t\tvalue !== null &&\n\t\t\ttypeof value === 'object' &&\n\t\t\ttypeof value.length === 'number' &&\n\t\t\tvalue.length >= 0 &&\n\t\t\ttoStr.call(value.callee) === '[object Function]';\n\t}\n\treturn isArgs;\n};\n",
 
    "module.exports = SafeParseTuple\n\nfunction SafeParseTuple(obj, reviver) {\n    var json\n    var error = null\n\n    try {\n        json = JSON.parse(obj, reviver)\n    } catch (err) {\n        error = err\n    }\n\n    return [error, json]\n}\n",
 
    "function clean (s) {\n  return s.replace(/\\n\\r?\\s*/g, '')\n}\n\n\nmodule.exports = function tsml (sa) {\n  var s = ''\n    , i = 0\n\n  for (; i < arguments.length; i++)\n    s += clean(sa[i]) + (arguments[i + 1] || '')\n\n  return s\n}",
 
    "\"use strict\";\nvar window = require(\"global/window\")\nvar once = require(\"once\")\nvar parseHeaders = require(\"parse-headers\")\n\n\n\nmodule.exports = createXHR\ncreateXHR.XMLHttpRequest = window.XMLHttpRequest || noop\ncreateXHR.XDomainRequest = \"withCredentials\" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window.XDomainRequest\n\n\nfunction isEmpty(obj){\n    for(var i in obj){\n        if(obj.hasOwnProperty(i)) return false\n    }\n    return true\n}\n\nfunction createXHR(options, callback) {\n    function readystatechange() {\n        if (xhr.readyState === 4) {\n            loadFunc()\n        }\n    }\n\n    function getBody() {\n        // Chrome with requestType=blob throws errors arround when even testing access to responseText\n        var body = undefined\n\n        if (xhr.response) {\n            body = xhr.response\n        } else if (xhr.responseType === \"text\" || !xhr.responseType) {\n            body = xhr.responseText || xhr.responseXML\n        }\n\n        if (isJson) {\n            try {\n                body = JSON.parse(body)\n            } catch (e) {}\n        }\n\n        return body\n    }\n\n    var failureResponse = {\n                body: undefined,\n                headers: {},\n                statusCode: 0,\n                method: method,\n                url: uri,\n                rawRequest: xhr\n            }\n\n    function errorFunc(evt) {\n        clearTimeout(timeoutTimer)\n        if(!(evt instanceof Error)){\n            evt = new Error(\"\" + (evt || \"Unknown XMLHttpRequest Error\") )\n        }\n        evt.statusCode = 0\n        callback(evt, failureResponse)\n    }\n\n    // will load the data & process the response in a special response object\n    function loadFunc() {\n        if (aborted) return\n        var status\n        clearTimeout(timeoutTimer)\n        if(options.useXDR && xhr.status===undefined) {\n            //IE8 CORS GET successful response doesn't have a status field, but body is fine\n            status = 200\n        } else {\n            status = (xhr.status === 1223 ? 204 : xhr.status)\n        }\n        var response = failureResponse\n        var err = null\n\n        if (status !== 0){\n            response = {\n                body: getBody(),\n                statusCode: status,\n                method: method,\n                headers: {},\n                url: uri,\n                rawRequest: xhr\n            }\n            if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE\n                response.headers = parseHeaders(xhr.getAllResponseHeaders())\n            }\n        } else {\n            err = new Error(\"Internal XMLHttpRequest Error\")\n        }\n        callback(err, response, response.body)\n\n    }\n\n    if (typeof options === \"string\") {\n        options = { uri: options }\n    }\n\n    options = options || {}\n    if(typeof callback === \"undefined\"){\n        throw new Error(\"callback argument missing\")\n    }\n    callback = once(callback)\n\n    var xhr = options.xhr || null\n\n    if (!xhr) {\n        if (options.cors || options.useXDR) {\n            xhr = new createXHR.XDomainRequest()\n        }else{\n            xhr = new createXHR.XMLHttpRequest()\n        }\n    }\n\n    var key\n    var aborted\n    var uri = xhr.url = options.uri || options.url\n    var method = xhr.method = options.method || \"GET\"\n    var body = options.body || options.data\n    var headers = xhr.headers = options.headers || {}\n    var sync = !!options.sync\n    var isJson = false\n    var timeoutTimer\n\n    if (\"json\" in options) {\n        isJson = true\n        headers[\"accept\"] || headers[\"Accept\"] || (headers[\"Accept\"] = \"application/json\") //Don't override existing accept header declared by user\n        if (method !== \"GET\" && method !== \"HEAD\") {\n            headers[\"content-type\"] || headers[\"Content-Type\"] || (headers[\"Content-Type\"] = \"application/json\") //Don't override existing accept header declared by user\n            body = JSON.stringify(options.json)\n        }\n    }\n\n    xhr.onreadystatechange = readystatechange\n    xhr.onload = loadFunc\n    xhr.onerror = errorFunc\n    // IE9 must have onprogress be set to a unique function.\n    xhr.onprogress = function () {\n        // IE must die\n    }\n    xhr.ontimeout = errorFunc\n    xhr.open(method, uri, !sync, options.username, options.password)\n    //has to be after open\n    if(!sync) {\n        xhr.withCredentials = !!options.withCredentials\n    }\n    // Cannot set timeout with sync request\n    // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly\n    // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent\n    if (!sync && options.timeout > 0 ) {\n        timeoutTimer = setTimeout(function(){\n            aborted=true//IE9 may still call readystatechange\n            xhr.abort(\"timeout\")\n            var e = new Error(\"XMLHttpRequest timeout\")\n            e.code = \"ETIMEDOUT\"\n            errorFunc(e)\n        }, options.timeout )\n    }\n\n    if (xhr.setRequestHeader) {\n        for(key in headers){\n            if(headers.hasOwnProperty(key)){\n                xhr.setRequestHeader(key, headers[key])\n            }\n        }\n    } else if (options.headers && !isEmpty(options.headers)) {\n        throw new Error(\"Headers cannot be set on an XDomainRequest object\")\n    }\n\n    if (\"responseType\" in options) {\n        xhr.responseType = options.responseType\n    }\n\n    if (\"beforeSend\" in options &&\n        typeof options.beforeSend === \"function\"\n    ) {\n        options.beforeSend(xhr)\n    }\n\n    xhr.send(body)\n\n    return xhr\n\n\n}\n\nfunction noop() {}\n",
 
    "module.exports = once\n\nonce.proto = once(function () {\n  Object.defineProperty(Function.prototype, 'once', {\n    value: function () {\n      return once(this)\n    },\n    configurable: true\n  })\n})\n\nfunction once (fn) {\n  var called = false\n  return function () {\n    if (called) return\n    called = true\n    return fn.apply(this, arguments)\n  }\n}\n",
 
    "var isFunction = require('is-function')\n\nmodule.exports = forEach\n\nvar toString = Object.prototype.toString\nvar hasOwnProperty = Object.prototype.hasOwnProperty\n\nfunction forEach(list, iterator, context) {\n    if (!isFunction(iterator)) {\n        throw new TypeError('iterator must be a function')\n    }\n\n    if (arguments.length < 3) {\n        context = this\n    }\n    \n    if (toString.call(list) === '[object Array]')\n        forEachArray(list, iterator, context)\n    else if (typeof list === 'string')\n        forEachString(list, iterator, context)\n    else\n        forEachObject(list, iterator, context)\n}\n\nfunction forEachArray(array, iterator, context) {\n    for (var i = 0, len = array.length; i < len; i++) {\n        if (hasOwnProperty.call(array, i)) {\n            iterator.call(context, array[i], i, array)\n        }\n    }\n}\n\nfunction forEachString(string, iterator, context) {\n    for (var i = 0, len = string.length; i < len; i++) {\n        // no such thing as a sparse string.\n        iterator.call(context, string.charAt(i), i, string)\n    }\n}\n\nfunction forEachObject(object, iterator, context) {\n    for (var k in object) {\n        if (hasOwnProperty.call(object, k)) {\n            iterator.call(context, object[k], k, object)\n        }\n    }\n}\n",
 
    "module.exports = isFunction\n\nvar toString = Object.prototype.toString\n\nfunction isFunction (fn) {\n  var string = toString.call(fn)\n  return string === '[object Function]' ||\n    (typeof fn === 'function' && string !== '[object RegExp]') ||\n    (typeof window !== 'undefined' &&\n     // IE8 and below\n     (fn === window.setTimeout ||\n      fn === window.alert ||\n      fn === window.confirm ||\n      fn === window.prompt))\n};\n",
 
    "\nexports = module.exports = trim;\n\nfunction trim(str){\n  return str.replace(/^\\s*|\\s*$/g, '');\n}\n\nexports.left = function(str){\n  return str.replace(/^\\s*/, '');\n};\n\nexports.right = function(str){\n  return str.replace(/\\s*$/, '');\n};\n",
 
    "var trim = require('trim')\n  , forEach = require('for-each')\n  , isArray = function(arg) {\n      return Object.prototype.toString.call(arg) === '[object Array]';\n    }\n\nmodule.exports = function (headers) {\n  if (!headers)\n    return {}\n\n  var result = {}\n\n  forEach(\n      trim(headers).split('\\n')\n    , function (row) {\n        var index = row.indexOf(':')\n          , key = trim(row.slice(0, index)).toLowerCase()\n          , value = trim(row.slice(index + 1))\n\n        if (typeof(result[key]) === 'undefined') {\n          result[key] = value\n        } else if (isArray(result[key])) {\n          result[key].push(value)\n        } else {\n          result[key] = [ result[key], value ]\n        }\n      }\n  )\n\n  return result\n}",
 
    "/**\n * @file big-play-button.js\n */\nimport Button from './button.js';\nimport Component from './component.js';\n\n/**\n * Initial play button. Shows before the video has played. The hiding of the\n * big play button is done via CSS and player states.\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @extends Button\n * @class BigPlayButton\n */\nclass BigPlayButton extends Button {\n\n  constructor(player, options) {\n    super(player, options);\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return 'vjs-big-play-button';\n  }\n\n  /**\n   * Handles click for play\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    this.player_.play();\n  }\n\n}\n\nBigPlayButton.prototype.controlText_ = 'Play Video';\n\nComponent.registerComponent('BigPlayButton', BigPlayButton);\nexport default BigPlayButton;\n",
 
    "/**\n * @file button.js\n */\nimport Component from './component';\nimport * as Dom from './utils/dom.js';\nimport * as Events from './utils/events.js';\nimport * as Fn from './utils/fn.js';\nimport document from 'global/document';\nimport assign from 'object.assign';\n\n/**\n * Base class for all buttons\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @extends Component\n * @class Button\n */\nclass Button extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n\n    this.emitTapEvents();\n\n    this.on('tap', this.handleClick);\n    this.on('click', this.handleClick);\n    this.on('focus', this.handleFocus);\n    this.on('blur', this.handleBlur);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @param {String=} type Element's node type. e.g. 'div'\n   * @param {Object=} props An object of element attributes that should be set on the element Tag name\n   * @return {Element}\n   * @method createEl\n   */\n  createEl(tag='button', props={}, attributes={}) {\n    props = assign({\n      className: this.buildCSSClass(),\n      tabIndex: 0\n    }, props);\n\n    // Add standard Aria info\n    attributes = assign({\n      role: 'button',\n      type: 'button', // Necessary since the default button type is \"submit\"\n      'aria-live': 'polite' // let the screen reader user know that the text of the button may change\n    }, attributes);\n\n    let el = super.createEl(tag, props, attributes);\n\n    this.controlTextEl_ = Dom.createEl('span', {\n      className: 'vjs-control-text'\n    });\n\n    el.appendChild(this.controlTextEl_);\n\n    this.controlText(this.controlText_);\n\n    return el;\n  }\n\n  /**\n   * Controls text - both request and localize\n   *\n   * @param {String} text Text for button\n   * @return {String}\n   * @method controlText\n   */\n  controlText(text) {\n    if (!text) return this.controlText_ || 'Need Text';\n\n    this.controlText_ = text;\n    this.controlTextEl_.innerHTML = this.localize(this.controlText_);\n\n    return this;\n  }\n\n  /**\n   * Allows sub components to stack CSS class names\n   *\n   * @return {String}\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-control vjs-button ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Handle Click - Override with specific functionality for button\n   *\n   * @method handleClick\n   */\n  handleClick() {}\n\n  /**\n   * Handle Focus - Add keyboard functionality to element\n   *\n   * @method handleFocus\n   */\n  handleFocus() {\n    Events.on(document, 'keydown', Fn.bind(this, this.handleKeyPress));\n  }\n\n  /**\n   * Handle KeyPress (document level) - Trigger click when keys are pressed\n   *\n   * @method handleKeyPress\n   */\n  handleKeyPress(event) {\n    // Check for space bar (32) or enter (13) keys\n    if (event.which === 32 || event.which === 13) {\n      event.preventDefault();\n      this.handleClick(event);\n    }\n  }\n\n  /**\n   * Handle Blur - Remove keyboard triggers\n   *\n   * @method handleBlur\n   */\n  handleBlur() {\n    Events.off(document, 'keydown', Fn.bind(this, this.handleKeyPress));\n  }\n\n}\n\n\nComponent.registerComponent('Button', Button);\nexport default Button;\n",
 
    "/**\n * @file component.js\n *\n * Player Component - Base class for all UI objects\n */\n\nimport window from 'global/window';\nimport * as Dom from './utils/dom.js';\nimport * as Fn from './utils/fn.js';\nimport * as Guid from './utils/guid.js';\nimport * as Events from './utils/events.js';\nimport log from './utils/log.js';\nimport toTitleCase from './utils/to-title-case.js';\nimport assign from 'object.assign';\nimport mergeOptions from './utils/merge-options.js';\n\n\n/**\n * Base UI Component class\n * Components are embeddable UI objects that are represented by both a\n * javascript object and an element in the DOM. They can be children of other\n * components, and can have many children themselves.\n * ```js\n *     // adding a button to the player\n *     var button = player.addChild('button');\n *     button.el(); // -> button element\n * ```\n * ```html\n *     <div class=\"video-js\">\n *       <div class=\"vjs-button\">Button</div>\n *     </div>\n * ```\n * Components are also event targets.\n * ```js\n *     button.on('click', function(){\n *       console.log('Button Clicked!');\n *     });\n *     button.trigger('customevent');\n * ```\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @class Component\n */\nclass Component {\n\n  constructor(player, options, ready) {\n\n    // The component might be the player itself and we can't pass `this` to super\n    if (!player && this.play) {\n      this.player_ = player = this; // eslint-disable-line\n    } else {\n      this.player_ = player;\n    }\n\n    // Make a copy of prototype.options_ to protect against overriding defaults\n    this.options_ = mergeOptions({}, this.options_);\n\n    // Updated options with supplied options\n    options = this.options_ = mergeOptions(this.options_, options);\n\n    // Get ID from options or options element if one is supplied\n    this.id_ = options.id || (options.el && options.el.id);\n\n    // If there was no ID from the options, generate one\n    if (!this.id_) {\n      // Don't require the player ID function in the case of mock players\n      let id = player && player.id && player.id() || 'no_player';\n\n      this.id_ = `${id}_component_${Guid.newGUID()}`;\n    }\n\n    this.name_ = options.name || null;\n\n    // Create element if one wasn't provided in options\n    if (options.el) {\n      this.el_ = options.el;\n    } else if (options.createEl !== false) {\n      this.el_ = this.createEl();\n    }\n\n    this.children_ = [];\n    this.childIndex_ = {};\n    this.childNameIndex_ = {};\n\n    // Add any child components in options\n    if (options.initChildren !== false) {\n      this.initChildren();\n    }\n\n    this.ready(ready);\n    // Don't want to trigger ready here or it will before init is actually\n    // finished for all children that run this constructor\n\n    if (options.reportTouchActivity !== false) {\n      this.enableTouchActivity();\n    }\n  }\n\n  /**\n   * Dispose of the component and all child components\n   *\n   * @method dispose\n   */\n  dispose() {\n    this.trigger({ type: 'dispose', bubbles: false });\n\n    // Dispose all children.\n    if (this.children_) {\n      for (let i = this.children_.length - 1; i >= 0; i--) {\n        if (this.children_[i].dispose) {\n          this.children_[i].dispose();\n        }\n      }\n    }\n\n    // Delete child references\n    this.children_ = null;\n    this.childIndex_ = null;\n    this.childNameIndex_ = null;\n\n    // Remove all event listeners.\n    this.off();\n\n    // Remove element from DOM\n    if (this.el_.parentNode) {\n      this.el_.parentNode.removeChild(this.el_);\n    }\n\n    Dom.removeElData(this.el_);\n    this.el_ = null;\n  }\n\n  /**\n   * Return the component's player\n   *\n   * @return {Player}\n   * @method player\n   */\n  player() {\n    return this.player_;\n  }\n\n  /**\n   * Deep merge of options objects\n   * Whenever a property is an object on both options objects\n   * the two properties will be merged using mergeOptions.\n   *\n   * ```js\n   *     Parent.prototype.options_ = {\n   *       optionSet: {\n   *         'childOne': { 'foo': 'bar', 'asdf': 'fdsa' },\n   *         'childTwo': {},\n   *         'childThree': {}\n   *       }\n   *     }\n   *     newOptions = {\n   *       optionSet: {\n   *         'childOne': { 'foo': 'baz', 'abc': '123' }\n   *         'childTwo': null,\n   *         'childFour': {}\n   *       }\n   *     }\n   *\n   *     this.options(newOptions);\n   * ```\n   * RESULT\n   * ```js\n   *     {\n   *       optionSet: {\n   *         'childOne': { 'foo': 'baz', 'asdf': 'fdsa', 'abc': '123' },\n   *         'childTwo': null, // Disabled. Won't be initialized.\n   *         'childThree': {},\n   *         'childFour': {}\n   *       }\n   *     }\n   * ```\n   *\n   * @param  {Object} obj Object of new option values\n   * @return {Object}     A NEW object of this.options_ and obj merged\n   * @method options\n   */\n  options(obj) {\n    log.warn('this.options() has been deprecated and will be moved to the constructor in 6.0');\n\n    if (!obj) {\n      return this.options_;\n    }\n\n    this.options_ = mergeOptions(this.options_, obj);\n    return this.options_;\n  }\n\n  /**\n   * Get the component's DOM element\n   * ```js\n   *     var domEl = myComponent.el();\n   * ```\n   *\n   * @return {Element}\n   * @method el\n   */\n  el() {\n    return this.el_;\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @param  {String=} tagName  Element's node type. e.g. 'div'\n   * @param  {Object=} properties An object of properties that should be set\n   * @param  {Object=} attributes An object of attributes that should be set\n   * @return {Element}\n   * @method createEl\n   */\n  createEl(tagName, properties, attributes) {\n    return Dom.createEl(tagName, properties, attributes);\n  }\n\n  localize(string) {\n    let code = this.player_.language && this.player_.language();\n    let languages = this.player_.languages && this.player_.languages();\n\n    if (!code || !languages) {\n      return string;\n    }\n\n    let language = languages[code];\n\n    if (language && language[string]) {\n      return language[string];\n    }\n\n    let primaryCode = code.split('-')[0];\n    let primaryLang = languages[primaryCode];\n\n    if (primaryLang && primaryLang[string]) {\n      return primaryLang[string];\n    }\n\n    return string;\n  }\n\n  /**\n   * Return the component's DOM element where children are inserted.\n   * Will either be the same as el() or a new element defined in createEl().\n   *\n   * @return {Element}\n   * @method contentEl\n   */\n  contentEl() {\n    return this.contentEl_ || this.el_;\n  }\n\n  /**\n   * Get the component's ID\n   * ```js\n   *     var id = myComponent.id();\n   * ```\n   *\n   * @return {String}\n   * @method id\n   */\n  id() {\n    return this.id_;\n  }\n\n  /**\n   * Get the component's name. The name is often used to reference the component.\n   * ```js\n   *     var name = myComponent.name();\n   * ```\n   *\n   * @return {String}\n   * @method name\n   */\n  name() {\n    return this.name_;\n  }\n\n  /**\n   * Get an array of all child components\n   * ```js\n   *     var kids = myComponent.children();\n   * ```\n   *\n   * @return {Array} The children\n   * @method children\n   */\n  children() {\n    return this.children_;\n  }\n\n  /**\n   * Returns a child component with the provided ID\n   *\n   * @return {Component}\n   * @method getChildById\n   */\n  getChildById(id) {\n    return this.childIndex_[id];\n  }\n\n  /**\n   * Returns a child component with the provided name\n   *\n   * @return {Component}\n   * @method getChild\n   */\n  getChild(name) {\n    return this.childNameIndex_[name];\n  }\n\n  /**\n   * Adds a child component inside this component\n   * ```js\n   *     myComponent.el();\n   *     // -> <div class='my-component'></div>\n   *     myComponent.children();\n   *     // [empty array]\n   *\n   *     var myButton = myComponent.addChild('MyButton');\n   *     // -> <div class='my-component'><div class=\"my-button\">myButton<div></div>\n   *     // -> myButton === myComponent.children()[0];\n   * ```\n   * Pass in options for child constructors and options for children of the child\n   * ```js\n   *     var myButton = myComponent.addChild('MyButton', {\n   *       text: 'Press Me',\n   *       buttonChildExample: {\n   *         buttonChildOption: true\n   *       }\n   *     });\n   * ```\n   *\n   * @param {String|Component} child The class name or instance of a child to add\n   * @param {Object=} options Options, including options to be passed to children of the child.\n   * @return {Component} The child component (created by this process if a string was used)\n   * @method addChild\n   */\n  addChild(child, options={}) {\n    let component;\n    let componentName;\n\n    // If child is a string, create nt with options\n    if (typeof child === 'string') {\n      componentName = child;\n\n      // Options can also be specified as a boolean, so convert to an empty object if false.\n      if (!options) {\n        options = {};\n      }\n\n      // Same as above, but true is deprecated so show a warning.\n      if (options === true) {\n        log.warn('Initializing a child component with `true` is deprecated. Children should be defined in an array when possible, but if necessary use an object instead of `true`.');\n        options = {};\n      }\n\n      // If no componentClass in options, assume componentClass is the name lowercased\n      // (e.g. playButton)\n      let componentClassName = options.componentClass || toTitleCase(componentName);\n\n      // Set name through options\n      options.name = componentName;\n\n      // Create a new object & element for this controls set\n      // If there's no .player_, this is a player\n      let ComponentClass = Component.getComponent(componentClassName);\n\n      component = new ComponentClass(this.player_ || this, options);\n\n    // child is a component instance\n    } else {\n      component = child;\n    }\n\n    this.children_.push(component);\n\n    if (typeof component.id === 'function') {\n      this.childIndex_[component.id()] = component;\n    }\n\n    // If a name wasn't used to create the component, check if we can use the\n    // name function of the component\n    componentName = componentName || (component.name && component.name());\n\n    if (componentName) {\n      this.childNameIndex_[componentName] = component;\n    }\n\n    // Add the UI object's element to the container div (box)\n    // Having an element is not required\n    if (typeof component.el === 'function' && component.el()) {\n      this.contentEl().appendChild(component.el());\n    }\n\n    // Return so it can stored on parent object if desired.\n    return component;\n  }\n\n  /**\n   * Remove a child component from this component's list of children, and the\n   * child component's element from this component's element\n   *\n   * @param  {Component} component Component to remove\n   * @method removeChild\n   */\n  removeChild(component) {\n    if (typeof component === 'string') {\n      component = this.getChild(component);\n    }\n\n    if (!component || !this.children_) {\n      return;\n    }\n\n    let childFound = false;\n\n    for (let i = this.children_.length - 1; i >= 0; i--) {\n      if (this.children_[i] === component) {\n        childFound = true;\n        this.children_.splice(i, 1);\n        break;\n      }\n    }\n\n    if (!childFound) {\n      return;\n    }\n\n    this.childIndex_[component.id()] = null;\n    this.childNameIndex_[component.name()] = null;\n\n    let compEl = component.el();\n\n    if (compEl && compEl.parentNode === this.contentEl()) {\n      this.contentEl().removeChild(component.el());\n    }\n  }\n\n  /**\n   * Add and initialize default child components from options\n   * ```js\n   *     // when an instance of MyComponent is created, all children in options\n   *     // will be added to the instance by their name strings and options\n   *     MyComponent.prototype.options_ = {\n   *       children: [\n   *         'myChildComponent'\n   *       ],\n   *       myChildComponent: {\n   *         myChildOption: true\n   *       }\n   *     };\n   *\n   *     // Or when creating the component\n   *     var myComp = new MyComponent(player, {\n   *       children: [\n   *         'myChildComponent'\n   *       ],\n   *       myChildComponent: {\n   *         myChildOption: true\n   *       }\n   *     });\n   * ```\n   * The children option can also be an array of\n   * child options objects (that also include a 'name' key).\n   * This can be used if you have two child components of the\n   * same type that need different options.\n   * ```js\n   *     var myComp = new MyComponent(player, {\n   *       children: [\n   *         'button',\n   *         {\n   *           name: 'button',\n   *           someOtherOption: true\n   *         },\n   *         {\n   *           name: 'button',\n   *           someOtherOption: false\n   *         }\n   *       ]\n   *     });\n   * ```\n   *\n   * @method initChildren\n   */\n  initChildren() {\n    let children = this.options_.children;\n\n    if (children) {\n      // `this` is `parent`\n      let parentOptions = this.options_;\n\n      let handleAdd = (name, opts) => {\n        // Allow options for children to be set at the parent options\n        // e.g. videojs(id, { controlBar: false });\n        // instead of videojs(id, { children: { controlBar: false });\n        if (parentOptions[name] !== undefined) {\n          opts = parentOptions[name];\n        }\n\n        // Allow for disabling default components\n        // e.g. options['children']['posterImage'] = false\n        if (opts === false) {\n          return;\n        }\n\n        // Allow options to be passed as a simple boolean if no configuration\n        // is necessary.\n        if (opts === true) {\n          opts = {};\n        }\n\n        // We also want to pass the original player options to each component as well so they don't need to\n        // reach back into the player for options later.\n        opts.playerOptions = this.options_.playerOptions;\n\n        // Create and add the child component.\n        // Add a direct reference to the child by name on the parent instance.\n        // If two of the same component are used, different names should be supplied\n        // for each\n        this[name] = this.addChild(name, opts);\n      };\n\n      // Allow for an array of children details to passed in the options\n      if (Array.isArray(children)) {\n        for (let i = 0; i < children.length; i++) {\n          let child = children[i];\n          let name;\n          let opts;\n\n          if (typeof child === 'string') {\n            // ['myComponent']\n            name = child;\n            opts = {};\n          } else {\n            // [{ name: 'myComponent', otherOption: true }]\n            name = child.name;\n            opts = child;\n          }\n\n          handleAdd(name, opts);\n        }\n      } else {\n        Object.getOwnPropertyNames(children).forEach(function(name){\n          handleAdd(name, children[name]);\n        });\n      }\n    }\n  }\n\n  /**\n   * Allows sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    // Child classes can include a function that does:\n    // return 'CLASS NAME' + this._super();\n    return '';\n  }\n\n  /**\n   * Add an event listener to this component's element\n   * ```js\n   *     var myFunc = function(){\n   *       var myComponent = this;\n   *       // Do something when the event is fired\n   *     };\n   *\n   *     myComponent.on('eventType', myFunc);\n   * ```\n   * The context of myFunc will be myComponent unless previously bound.\n   * Alternatively, you can add a listener to another element or component.\n   * ```js\n   *     myComponent.on(otherElement, 'eventName', myFunc);\n   *     myComponent.on(otherComponent, 'eventName', myFunc);\n   * ```\n   * The benefit of using this over `VjsEvents.on(otherElement, 'eventName', myFunc)`\n   * and `otherComponent.on('eventName', myFunc)` is that this way the listeners\n   * will be automatically cleaned up when either component is disposed.\n   * It will also bind myComponent as the context of myFunc.\n   * **NOTE**: When using this on elements in the page other than window\n   * and document (both permanent), if you remove the element from the DOM\n   * you need to call `myComponent.trigger(el, 'dispose')` on it to clean up\n   * references to it and allow the browser to garbage collect it.\n   *\n   * @param  {String|Component} first   The event type or other component\n   * @param  {Function|String}      second  The event handler or event type\n   * @param  {Function}             third   The event handler\n   * @return {Component}\n   * @method on\n   */\n  on(first, second, third) {\n    if (typeof first === 'string' || Array.isArray(first)) {\n      Events.on(this.el_, first, Fn.bind(this, second));\n\n    // Targeting another component or element\n    } else {\n      const target = first;\n      const type = second;\n      const fn = Fn.bind(this, third);\n\n      // When this component is disposed, remove the listener from the other component\n      const removeOnDispose = () => this.off(target, type, fn);\n\n      // Use the same function ID so we can remove it later it using the ID\n      // of the original listener\n      removeOnDispose.guid = fn.guid;\n      this.on('dispose', removeOnDispose);\n\n      // If the other component is disposed first we need to clean the reference\n      // to the other component in this component's removeOnDispose listener\n      // Otherwise we create a memory leak.\n      const cleanRemover = () => this.off('dispose', removeOnDispose);\n\n      // Add the same function ID so we can easily remove it later\n      cleanRemover.guid = fn.guid;\n\n      // Check if this is a DOM node\n      if (first.nodeName) {\n        // Add the listener to the other element\n        Events.on(target, type, fn);\n        Events.on(target, 'dispose', cleanRemover);\n\n      // Should be a component\n      // Not using `instanceof Component` because it makes mock players difficult\n      } else if (typeof first.on === 'function') {\n        // Add the listener to the other component\n        target.on(type, fn);\n        target.on('dispose', cleanRemover);\n      }\n    }\n\n    return this;\n  }\n\n  /**\n   * Remove an event listener from this component's element\n   * ```js\n   *     myComponent.off('eventType', myFunc);\n   * ```\n   * If myFunc is excluded, ALL listeners for the event type will be removed.\n   * If eventType is excluded, ALL listeners will be removed from the component.\n   * Alternatively you can use `off` to remove listeners that were added to other\n   * elements or components using `myComponent.on(otherComponent...`.\n   * In this case both the event type and listener function are REQUIRED.\n   * ```js\n   *     myComponent.off(otherElement, 'eventType', myFunc);\n   *     myComponent.off(otherComponent, 'eventType', myFunc);\n   * ```\n   *\n   * @param  {String=|Component}  first  The event type or other component\n   * @param  {Function=|String}       second The listener function or event type\n   * @param  {Function=}              third  The listener for other component\n   * @return {Component}\n   * @method off\n   */\n  off(first, second, third) {\n    if (!first || typeof first === 'string' || Array.isArray(first)) {\n      Events.off(this.el_, first, second);\n    } else {\n      const target = first;\n      const type = second;\n      // Ensure there's at least a guid, even if the function hasn't been used\n      const fn = Fn.bind(this, third);\n\n      // Remove the dispose listener on this component,\n      // which was given the same guid as the event listener\n      this.off('dispose', fn);\n\n      if (first.nodeName) {\n        // Remove the listener\n        Events.off(target, type, fn);\n        // Remove the listener for cleaning the dispose listener\n        Events.off(target, 'dispose', fn);\n      } else {\n        target.off(type, fn);\n        target.off('dispose', fn);\n      }\n    }\n\n    return this;\n  }\n\n  /**\n   * Add an event listener to be triggered only once and then removed\n   * ```js\n   *     myComponent.one('eventName', myFunc);\n   * ```\n   * Alternatively you can add a listener to another element or component\n   * that will be triggered only once.\n   * ```js\n   *     myComponent.one(otherElement, 'eventName', myFunc);\n   *     myComponent.one(otherComponent, 'eventName', myFunc);\n   * ```\n   *\n   * @param  {String|Component}  first   The event type or other component\n   * @param  {Function|String}       second  The listener function or event type\n   * @param  {Function=}             third   The listener function for other component\n   * @return {Component}\n   * @method one\n   */\n  one(first, second, third) {\n    if (typeof first === 'string' || Array.isArray(first)) {\n      Events.one(this.el_, first, Fn.bind(this, second));\n    } else {\n      const target = first;\n      const type = second;\n      const fn = Fn.bind(this, third);\n\n      const newFunc = () => {\n        this.off(target, type, newFunc);\n        fn.apply(null, arguments);\n      };\n\n      // Keep the same function ID so we can remove it later\n      newFunc.guid = fn.guid;\n\n      this.on(target, type, newFunc);\n    }\n\n    return this;\n  }\n\n  /**\n   * Trigger an event on an element\n   * ```js\n   *     myComponent.trigger('eventName');\n   *     myComponent.trigger({'type':'eventName'});\n   *     myComponent.trigger('eventName', {data: 'some data'});\n   *     myComponent.trigger({'type':'eventName'}, {data: 'some data'});\n   * ```\n   *\n   * @param  {Event|Object|String} event  A string (the type) or an event object with a type attribute\n   * @param  {Object} [hash] data hash to pass along with the event\n   * @return {Component}       self\n   * @method trigger\n   */\n  trigger(event, hash) {\n    Events.trigger(this.el_, event, hash);\n    return this;\n  }\n\n  /**\n   * Bind a listener to the component's ready state.\n   * Different from event listeners in that if the ready event has already happened\n   * it will trigger the function immediately.\n   *\n   * @param  {Function} fn Ready listener\n   * @param  {Boolean} sync Exec the listener synchronously if component is ready\n   * @return {Component}\n   * @method ready\n   */\n  ready(fn, sync=false) {\n    if (fn) {\n      if (this.isReady_) {\n        if (sync) {\n          fn.call(this);\n        } else {\n          // Call the function asynchronously by default for consistency\n          this.setTimeout(fn, 1);\n        }\n      } else {\n        this.readyQueue_ = this.readyQueue_ || [];\n        this.readyQueue_.push(fn);\n      }\n    }\n    return this;\n  }\n\n  /**\n   * Trigger the ready listeners\n   *\n   * @return {Component}\n   * @method triggerReady\n   */\n  triggerReady() {\n    this.isReady_ = true;\n\n    // Ensure ready is triggerd asynchronously\n    this.setTimeout(function(){\n      let readyQueue = this.readyQueue_;\n\n      // Reset Ready Queue\n      this.readyQueue_ = [];\n\n      if (readyQueue && readyQueue.length > 0) {\n        readyQueue.forEach(function(fn){\n          fn.call(this);\n        }, this);\n      }\n\n      // Allow for using event listeners also\n      this.trigger('ready');\n    }, 1);\n  }\n\n  /**\n   * Check if a component's element has a CSS class name\n   *\n   * @param {String} classToCheck Classname to check\n   * @return {Component}\n   * @method hasClass\n   */\n  hasClass(classToCheck) {\n    return Dom.hasElClass(this.el_, classToCheck);\n  }\n\n  /**\n   * Add a CSS class name to the component's element\n   *\n   * @param {String} classToAdd Classname to add\n   * @return {Component}\n   * @method addClass\n   */\n  addClass(classToAdd) {\n    Dom.addElClass(this.el_, classToAdd);\n    return this;\n  }\n\n  /**\n   * Remove and return a CSS class name from the component's element\n   *\n   * @param {String} classToRemove Classname to remove\n   * @return {Component}\n   * @method removeClass\n   */\n  removeClass(classToRemove) {\n    Dom.removeElClass(this.el_, classToRemove);\n    return this;\n  }\n\n  /**\n   * Show the component element if hidden\n   *\n   * @return {Component}\n   * @method show\n   */\n  show() {\n    this.removeClass('vjs-hidden');\n    return this;\n  }\n\n  /**\n   * Hide the component element if currently showing\n   *\n   * @return {Component}\n   * @method hide\n   */\n  hide() {\n    this.addClass('vjs-hidden');\n    return this;\n  }\n\n  /**\n   * Lock an item in its visible state\n   * To be used with fadeIn/fadeOut.\n   *\n   * @return {Component}\n   * @private\n   * @method lockShowing\n   */\n  lockShowing() {\n    this.addClass('vjs-lock-showing');\n    return this;\n  }\n\n  /**\n   * Unlock an item to be hidden\n   * To be used with fadeIn/fadeOut.\n   *\n   * @return {Component}\n   * @private\n   * @method unlockShowing\n   */\n  unlockShowing() {\n    this.removeClass('vjs-lock-showing');\n    return this;\n  }\n\n  /**\n   * Set or get the width of the component (CSS values)\n   * Setting the video tag dimension values only works with values in pixels.\n   * Percent values will not work.\n   * Some percents can be used, but width()/height() will return the number + %,\n   * not the actual computed width/height.\n   *\n   * @param  {Number|String=} num   Optional width number\n   * @param  {Boolean} skipListeners Skip the 'resize' event trigger\n   * @return {Component} This component, when setting the width\n   * @return {Number|String} The width, when getting\n   * @method width\n   */\n  width(num, skipListeners) {\n    return this.dimension('width', num, skipListeners);\n  }\n\n  /**\n   * Get or set the height of the component (CSS values)\n   * Setting the video tag dimension values only works with values in pixels.\n   * Percent values will not work.\n   * Some percents can be used, but width()/height() will return the number + %,\n   * not the actual computed width/height.\n   *\n   * @param  {Number|String=} num     New component height\n   * @param  {Boolean=} skipListeners Skip the resize event trigger\n   * @return {Component} This component, when setting the height\n   * @return {Number|String} The height, when getting\n   * @method height\n   */\n  height(num, skipListeners) {\n    return this.dimension('height', num, skipListeners);\n  }\n\n  /**\n   * Set both width and height at the same time\n   *\n   * @param  {Number|String} width Width of player\n   * @param  {Number|String} height Height of player\n   * @return {Component} The component\n   * @method dimensions\n   */\n  dimensions(width, height) {\n    // Skip resize listeners on width for optimization\n    return this.width(width, true).height(height);\n  }\n\n  /**\n   * Get or set width or height\n   * This is the shared code for the width() and height() methods.\n   * All for an integer, integer + 'px' or integer + '%';\n   * Known issue: Hidden elements officially have a width of 0. We're defaulting\n   * to the style.width value and falling back to computedStyle which has the\n   * hidden element issue. Info, but probably not an efficient fix:\n   * http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/\n   *\n   * @param  {String} widthOrHeight  'width' or 'height'\n   * @param  {Number|String=} num     New dimension\n   * @param  {Boolean=} skipListeners Skip resize event trigger\n   * @return {Component} The component if a dimension was set\n   * @return {Number|String} The dimension if nothing was set\n   * @private\n   * @method dimension\n   */\n  dimension(widthOrHeight, num, skipListeners) {\n    if (num !== undefined) {\n      // Set to zero if null or literally NaN (NaN !== NaN)\n      if (num === null || num !== num) {\n        num = 0;\n      }\n\n      // Check if using css width/height (% or px) and adjust\n      if (('' + num).indexOf('%') !== -1 || ('' + num).indexOf('px') !== -1) {\n        this.el_.style[widthOrHeight] = num;\n      } else if (num === 'auto') {\n        this.el_.style[widthOrHeight] = '';\n      } else {\n        this.el_.style[widthOrHeight] = num + 'px';\n      }\n\n      // skipListeners allows us to avoid triggering the resize event when setting both width and height\n      if (!skipListeners) {\n        this.trigger('resize');\n      }\n\n      // Return component\n      return this;\n    }\n\n    // Not setting a value, so getting it\n    // Make sure element exists\n    if (!this.el_) {\n      return 0;\n    }\n\n    // Get dimension value from style\n    let val = this.el_.style[widthOrHeight];\n    let pxIndex = val.indexOf('px');\n\n    if (pxIndex !== -1) {\n      // Return the pixel value with no 'px'\n      return parseInt(val.slice(0, pxIndex), 10);\n    }\n\n    // No px so using % or no style was set, so falling back to offsetWidth/height\n    // If component has display:none, offset will return 0\n    // TODO: handle display:none and no dimension style using px\n    return parseInt(this.el_['offset' + toTitleCase(widthOrHeight)], 10);\n  }\n\n  /**\n   * Emit 'tap' events when touch events are supported\n   * This is used to support toggling the controls through a tap on the video.\n   * We're requiring them to be enabled because otherwise every component would\n   * have this extra overhead unnecessarily, on mobile devices where extra\n   * overhead is especially bad.\n   *\n   * @private\n   * @method emitTapEvents\n   */\n  emitTapEvents() {\n    // Track the start time so we can determine how long the touch lasted\n    let touchStart = 0;\n    let firstTouch = null;\n\n    // Maximum movement allowed during a touch event to still be considered a tap\n    // Other popular libs use anywhere from 2 (hammer.js) to 15, so 10 seems like a nice, round number.\n    const tapMovementThreshold = 10;\n\n    // The maximum length a touch can be while still being considered a tap\n    const touchTimeThreshold = 200;\n\n    let couldBeTap;\n\n    this.on('touchstart', function(event) {\n      // If more than one finger, don't consider treating this as a click\n      if (event.touches.length === 1) {\n        // Copy the touches object to prevent modifying the original\n        firstTouch = assign({}, event.touches[0]);\n        // Record start time so we can detect a tap vs. \"touch and hold\"\n        touchStart = new Date().getTime();\n        // Reset couldBeTap tracking\n        couldBeTap = true;\n      }\n    });\n\n    this.on('touchmove', function(event) {\n      // If more than one finger, don't consider treating this as a click\n      if (event.touches.length > 1) {\n        couldBeTap = false;\n      } else if (firstTouch) {\n        // Some devices will throw touchmoves for all but the slightest of taps.\n        // So, if we moved only a small distance, this could still be a tap\n        const xdiff = event.touches[0].pageX - firstTouch.pageX;\n        const ydiff = event.touches[0].pageY - firstTouch.pageY;\n        const touchDistance = Math.sqrt(xdiff  * xdiff + ydiff  * ydiff);\n\n        if (touchDistance > tapMovementThreshold) {\n          couldBeTap = false;\n        }\n      }\n    });\n\n    const noTap = function() {\n      couldBeTap = false;\n    };\n\n    // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s\n    this.on('touchleave', noTap);\n    this.on('touchcancel', noTap);\n\n    // When the touch ends, measure how long it took and trigger the appropriate\n    // event\n    this.on('touchend', function(event) {\n      firstTouch = null;\n      // Proceed only if the touchmove/leave/cancel event didn't happen\n      if (couldBeTap === true) {\n        // Measure how long the touch lasted\n        const touchTime = new Date().getTime() - touchStart;\n\n        // Make sure the touch was less than the threshold to be considered a tap\n        if (touchTime < touchTimeThreshold) {\n          // Don't let browser turn this into a click\n          event.preventDefault();\n          this.trigger('tap');\n          // It may be good to copy the touchend event object and change the\n          // type to tap, if the other event properties aren't exact after\n          // Events.fixEvent runs (e.g. event.target)\n        }\n      }\n    });\n  }\n\n  /**\n   * Report user touch activity when touch events occur\n   * User activity is used to determine when controls should show/hide. It's\n   * relatively simple when it comes to mouse events, because any mouse event\n   * should show the controls. So we capture mouse events that bubble up to the\n   * player and report activity when that happens.\n   * With touch events it isn't as easy. We can't rely on touch events at the\n   * player level, because a tap (touchstart + touchend) on the video itself on\n   * mobile devices is meant to turn controls off (and on). User activity is\n   * checked asynchronously, so what could happen is a tap event on the video\n   * turns the controls off, then the touchend event bubbles up to the player,\n   * which if it reported user activity, would turn the controls right back on.\n   * (We also don't want to completely block touch events from bubbling up)\n   * Also a touchmove, touch+hold, and anything other than a tap is not supposed\n   * to turn the controls back on on a mobile device.\n   * Here we're setting the default component behavior to report user activity\n   * whenever touch events happen, and this can be turned off by components that\n   * want touch events to act differently.\n   *\n   * @method enableTouchActivity\n   */\n  enableTouchActivity() {\n    // Don't continue if the root player doesn't support reporting user activity\n    if (!this.player() || !this.player().reportUserActivity) {\n      return;\n    }\n\n    // listener for reporting that the user is active\n    const report = Fn.bind(this.player(), this.player().reportUserActivity);\n\n    let touchHolding;\n\n    this.on('touchstart', function() {\n      report();\n      // For as long as the they are touching the device or have their mouse down,\n      // we consider them active even if they're not moving their finger or mouse.\n      // So we want to continue to update that they are active\n      this.clearInterval(touchHolding);\n      // report at the same interval as activityCheck\n      touchHolding = this.setInterval(report, 250);\n    });\n\n    const touchEnd = function(event) {\n      report();\n      // stop the interval that maintains activity if the touch is holding\n      this.clearInterval(touchHolding);\n    };\n\n    this.on('touchmove', report);\n    this.on('touchend', touchEnd);\n    this.on('touchcancel', touchEnd);\n  }\n\n  /**\n   * Creates timeout and sets up disposal automatically.\n   *\n   * @param {Function} fn The function to run after the timeout.\n   * @param {Number} timeout Number of ms to delay before executing specified function.\n   * @return {Number} Returns the timeout ID\n   * @method setTimeout\n   */\n  setTimeout(fn, timeout) {\n    fn = Fn.bind(this, fn);\n\n    // window.setTimeout would be preferable here, but due to some bizarre issue with Sinon and/or Phantomjs, we can't.\n    let timeoutId = window.setTimeout(fn, timeout);\n\n    const disposeFn = function() {\n      this.clearTimeout(timeoutId);\n    };\n\n    disposeFn.guid = `vjs-timeout-${timeoutId}`;\n\n    this.on('dispose', disposeFn);\n\n    return timeoutId;\n  }\n\n  /**\n   * Clears a timeout and removes the associated dispose listener\n   *\n   * @param {Number} timeoutId The id of the timeout to clear\n   * @return {Number} Returns the timeout ID\n   * @method clearTimeout\n   */\n  clearTimeout(timeoutId) {\n    window.clearTimeout(timeoutId);\n\n    const disposeFn = function() {};\n\n    disposeFn.guid = `vjs-timeout-${timeoutId}`;\n\n    this.off('dispose', disposeFn);\n\n    return timeoutId;\n  }\n\n  /**\n   * Creates an interval and sets up disposal automatically.\n   *\n   * @param {Function} fn The function to run every N seconds.\n   * @param {Number} interval Number of ms to delay before executing specified function.\n   * @return {Number} Returns the interval ID\n   * @method setInterval\n   */\n  setInterval(fn, interval) {\n    fn = Fn.bind(this, fn);\n\n    let intervalId = window.setInterval(fn, interval);\n\n    const disposeFn = function() {\n      this.clearInterval(intervalId);\n    };\n\n    disposeFn.guid = `vjs-interval-${intervalId}`;\n\n    this.on('dispose', disposeFn);\n\n    return intervalId;\n  }\n\n  /**\n   * Clears an interval and removes the associated dispose listener\n   *\n   * @param {Number} intervalId The id of the interval to clear\n   * @return {Number} Returns the interval ID\n   * @method clearInterval\n   */\n  clearInterval(intervalId) {\n    window.clearInterval(intervalId);\n\n    const disposeFn = function() {};\n\n    disposeFn.guid = `vjs-interval-${intervalId}`;\n\n    this.off('dispose', disposeFn);\n\n    return intervalId;\n  }\n\n  /**\n   * Registers a component\n   *\n   * @param {String} name Name of the component to register\n   * @param {Object} comp The component to register\n   * @static\n   * @method registerComponent\n   */\n  static registerComponent(name, comp) {\n    if (!Component.components_) {\n      Component.components_ = {};\n    }\n\n    Component.components_[name] = comp;\n    return comp;\n  }\n\n  /**\n   * Gets a component by name\n   *\n   * @param {String} name Name of the component to get\n   * @return {Component}\n   * @static\n   * @method getComponent\n   */\n  static getComponent(name) {\n    if (Component.components_ && Component.components_[name]) {\n      return Component.components_[name];\n    }\n\n    if (window && window.videojs && window.videojs[name]) {\n      log.warn(`The ${name} component was added to the videojs object when it should be registered using videojs.registerComponent(name, component)`);\n      return window.videojs[name];\n    }\n  }\n\n  /**\n   * Sets up the constructor using the supplied init method\n   * or uses the init of the parent object\n   *\n   * @param {Object} props An object of properties\n   * @static\n   * @deprecated\n   * @method extend\n   */\n  static extend(props) {\n    props = props || {};\n\n    log.warn('Component.extend({}) has been deprecated, use videojs.extend(Component, {}) instead');\n\n    // Set up the constructor using the supplied init method\n    // or using the init of the parent object\n    // Make sure to check the unobfuscated version for external libs\n    let init = props.init || props.init || this.prototype.init || this.prototype.init || function() {};\n    // In Resig's simple class inheritance (previously used) the constructor\n    //  is a function that calls `this.init.apply(arguments)`\n    // However that would prevent us from using `ParentObject.call(this);`\n    //  in a Child constructor because the `this` in `this.init`\n    //  would still refer to the Child and cause an infinite loop.\n    // We would instead have to do\n    //    `ParentObject.prototype.init.apply(this, arguments);`\n    //  Bleh. We're not creating a _super() function, so it's good to keep\n    //  the parent constructor reference simple.\n    let subObj = function() {\n      init.apply(this, arguments);\n    };\n\n    // Inherit from this object's prototype\n    subObj.prototype = Object.create(this.prototype);\n    // Reset the constructor property for subObj otherwise\n    // instances of subObj would have the constructor of the parent Object\n    subObj.prototype.constructor = subObj;\n\n    // Make the class extendable\n    subObj.extend = Component.extend;\n\n    // Extend subObj's prototype with functions and other properties from props\n    for (let name in props) {\n      if (props.hasOwnProperty(name)) {\n        subObj.prototype[name] = props[name];\n      }\n    }\n\n    return subObj;\n  }\n}\n\nComponent.registerComponent('Component', Component);\nexport default Component;\n",
 
    "/**\n * @file control-bar.js\n */\nimport Component from '../component.js';\n\n// Required children\nimport PlayToggle from './play-toggle.js';\nimport CurrentTimeDisplay from './time-controls/current-time-display.js';\nimport DurationDisplay from './time-controls/duration-display.js';\nimport TimeDivider from './time-controls/time-divider.js';\nimport RemainingTimeDisplay from './time-controls/remaining-time-display.js';\nimport LiveDisplay from './live-display.js';\nimport ProgressControl from './progress-control/progress-control.js';\nimport FullscreenToggle from './fullscreen-toggle.js';\nimport VolumeControl from './volume-control/volume-control.js';\nimport VolumeMenuButton from './volume-menu-button.js';\nimport MuteToggle from './mute-toggle.js';\nimport ChaptersButton from './text-track-controls/chapters-button.js';\nimport SubtitlesButton from './text-track-controls/subtitles-button.js';\nimport CaptionsButton from './text-track-controls/captions-button.js';\nimport PlaybackRateMenuButton from './playback-rate-menu/playback-rate-menu-button.js';\nimport CustomControlSpacer from './spacer-controls/custom-control-spacer.js';\n\n/**\n * Container of main controls\n *\n * @extends Component\n * @class ControlBar\n */\nclass ControlBar extends Component {\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-control-bar'\n    });\n  }\n}\n\nControlBar.prototype.options_ = {\n  loadEvent: 'play',\n  children: [\n    'playToggle',\n    'volumeMenuButton',\n    'currentTimeDisplay',\n    'timeDivider',\n    'durationDisplay',\n    'progressControl',\n    'liveDisplay',\n    'remainingTimeDisplay',\n    'customControlSpacer',\n    'playbackRateMenuButton',\n    'chaptersButton',\n    'subtitlesButton',\n    'captionsButton',\n    'fullscreenToggle'\n  ]\n};\n\nComponent.registerComponent('ControlBar', ControlBar);\nexport default ControlBar;\n",
 
    "/**\n * @file fullscreen-toggle.js\n */\nimport Button from '../button.js';\nimport Component from '../component.js';\n\n/**\n * Toggle fullscreen video\n *\n * @extends Button\n * @class FullscreenToggle\n */\nclass FullscreenToggle extends Button {\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-fullscreen-control ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Handles click for full screen\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    if (!this.player_.isFullscreen()) {\n      this.player_.requestFullscreen();\n      this.controlText('Non-Fullscreen');\n    } else {\n      this.player_.exitFullscreen();\n      this.controlText('Fullscreen');\n    }\n  }\n\n}\n\nFullscreenToggle.prototype.controlText_ = 'Fullscreen';\n\nComponent.registerComponent('FullscreenToggle', FullscreenToggle);\nexport default FullscreenToggle;\n",
 
    "/**\n * @file live-display.js\n */\nimport Component from '../component';\nimport * as Dom from '../utils/dom.js';\n\n/**\n * Displays the live indicator\n * TODO - Future make it click to snap to live\n *\n * @extends Component\n * @class LiveDisplay\n */\nclass LiveDisplay extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n\n    this.updateShowing();\n    this.on(this.player(), 'durationchange', this.updateShowing);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    var el = super.createEl('div', {\n      className: 'vjs-live-control vjs-control'\n    });\n\n    this.contentEl_ = Dom.createEl('div', {\n      className: 'vjs-live-display',\n      innerHTML: `<span class=\"vjs-control-text\">${this.localize('Stream Type')}</span>${this.localize('LIVE')}`\n    }, {\n      'aria-live': 'off'\n    });\n\n    el.appendChild(this.contentEl_);\n    return el;\n  }\n\n  updateShowing() {\n    if (this.player().duration() === Infinity) {\n      this.show();\n    } else {\n      this.hide();\n    }\n  }\n\n}\n\nComponent.registerComponent('LiveDisplay', LiveDisplay);\nexport default LiveDisplay;\n",
 
    "/**\n * @file mute-toggle.js\n */\nimport Button from '../button';\nimport Component from '../component';\nimport * as Dom from '../utils/dom.js';\n\n/**\n * A button component for muting the audio\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Button\n * @class MuteToggle\n */\nclass MuteToggle extends Button {\n\n  constructor(player, options) {\n    super(player, options);\n\n    this.on(player, 'volumechange', this.update);\n\n    // hide mute toggle if the current tech doesn't support volume control\n    if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {\n      this.addClass('vjs-hidden');\n    }\n\n    this.on(player, 'loadstart', function() {\n      this.update(); // We need to update the button to account for a default muted state.\n\n      if (player.tech_['featuresVolumeControl'] === false) {\n        this.addClass('vjs-hidden');\n      } else {\n        this.removeClass('vjs-hidden');\n      }\n    });\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-mute-control ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Handle click on mute\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    this.player_.muted( this.player_.muted() ? false : true );\n  }\n\n  /**\n   * Update volume\n   *\n   * @method update\n   */\n  update() {\n    var vol = this.player_.volume(),\n        level = 3;\n\n    if (vol === 0 || this.player_.muted()) {\n      level = 0;\n    } else if (vol < 0.33) {\n      level = 1;\n    } else if (vol < 0.67) {\n      level = 2;\n    }\n\n    // Don't rewrite the button text if the actual text doesn't change.\n    // This causes unnecessary and confusing information for screen reader users.\n    // This check is needed because this function gets called every time the volume level is changed.\n    let toMute = this.player_.muted() ? 'Unmute' : 'Mute';\n    let localizedMute = this.localize(toMute);\n    if (this.controlText() !== localizedMute) {\n      this.controlText(localizedMute);\n    }\n\n    /* TODO improve muted icon classes */\n    for (var i = 0; i < 4; i++) {\n      Dom.removeElClass(this.el_, `vjs-vol-${i}`);\n    }\n    Dom.addElClass(this.el_, `vjs-vol-${level}`);\n  }\n\n}\n\nMuteToggle.prototype.controlText_ = 'Mute';\n\nComponent.registerComponent('MuteToggle', MuteToggle);\nexport default MuteToggle;\n",
 
    "/**\n * @file play-toggle.js\n */\nimport Button from '../button.js';\nimport Component from '../component.js';\n\n/**\n * Button to toggle between play and pause\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Button\n * @class PlayToggle\n */\nclass PlayToggle extends Button {\n\n  constructor(player, options){\n    super(player, options);\n\n    this.on(player, 'play', this.handlePlay);\n    this.on(player, 'pause', this.handlePause);\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-play-control ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Handle click to toggle between play and pause\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    if (this.player_.paused()) {\n      this.player_.play();\n    } else {\n      this.player_.pause();\n    }\n  }\n\n  /**\n   * Add the vjs-playing class to the element so it can change appearance\n   *\n   * @method handlePlay\n   */\n  handlePlay() {\n    this.removeClass('vjs-paused');\n    this.addClass('vjs-playing');\n    this.controlText('Pause'); // change the button text to \"Pause\"\n  }\n\n  /**\n   * Add the vjs-paused class to the element so it can change appearance\n   *\n   * @method handlePause\n   */\n  handlePause() {\n    this.removeClass('vjs-playing');\n    this.addClass('vjs-paused');\n    this.controlText('Play'); // change the button text to \"Play\"\n  }\n\n}\n\nPlayToggle.prototype.controlText_ = 'Play';\n\nComponent.registerComponent('PlayToggle', PlayToggle);\nexport default PlayToggle;\n",
 
    "/**\n * @file playback-rate-menu-button.js\n */\nimport MenuButton from '../../menu/menu-button.js';\nimport Menu from '../../menu/menu.js';\nimport PlaybackRateMenuItem from './playback-rate-menu-item.js';\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\n\n/**\n * The component for controlling the playback rate\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuButton\n * @class PlaybackRateMenuButton\n */\nclass PlaybackRateMenuButton extends MenuButton {\n\n  constructor(player, options){\n    super(player, options);\n\n    this.updateVisibility();\n    this.updateLabel();\n\n    this.on(player, 'loadstart', this.updateVisibility);\n    this.on(player, 'ratechange', this.updateLabel);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = super.createEl();\n\n    this.labelEl_ = Dom.createEl('div', {\n      className: 'vjs-playback-rate-value',\n      innerHTML: 1.0\n    });\n\n    el.appendChild(this.labelEl_);\n\n    return el;\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-playback-rate ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Create the playback rate menu\n   *\n   * @return {Menu} Menu object populated with items\n   * @method createMenu\n   */\n  createMenu() {\n    let menu = new Menu(this.player());\n    let rates = this.playbackRates();\n\n    if (rates) {\n      for (let i = rates.length - 1; i >= 0; i--) {\n        menu.addChild(\n          new PlaybackRateMenuItem(this.player(), { 'rate': rates[i] + 'x'})\n        );\n      }\n    }\n\n    return menu;\n  }\n\n  /**\n   * Updates ARIA accessibility attributes\n   *\n   * @method updateARIAAttributes\n   */\n  updateARIAAttributes() {\n    // Current playback rate\n    this.el().setAttribute('aria-valuenow', this.player().playbackRate());\n  }\n\n  /**\n   * Handle menu item click\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    // select next rate option\n    let currentRate = this.player().playbackRate();\n    let rates = this.playbackRates();\n\n    // this will select first one if the last one currently selected\n    let newRate = rates[0];\n    for (let i = 0; i < rates.length ; i++) {\n      if (rates[i] > currentRate) {\n        newRate = rates[i];\n        break;\n      }\n    }\n    this.player().playbackRate(newRate);\n  }\n\n  /**\n   * Get possible playback rates\n   *\n   * @return {Array} Possible playback rates\n   * @method playbackRates\n   */\n  playbackRates() {\n    return this.options_['playbackRates'] || (this.options_.playerOptions && this.options_.playerOptions['playbackRates']);\n  }\n\n  /**\n   * Get supported playback rates\n   *\n   * @return {Array} Supported playback rates\n   * @method playbackRateSupported\n   */\n  playbackRateSupported() {\n    return this.player().tech_\n      && this.player().tech_['featuresPlaybackRate']\n      && this.playbackRates()\n      && this.playbackRates().length > 0\n    ;\n  }\n\n  /**\n   * Hide playback rate controls when they're no playback rate options to select\n   *\n   * @method updateVisibility\n   */\n  updateVisibility() {\n    if (this.playbackRateSupported()) {\n      this.removeClass('vjs-hidden');\n    } else {\n      this.addClass('vjs-hidden');\n    }\n  }\n\n  /**\n   * Update button label when rate changed\n   *\n   * @method updateLabel\n   */\n  updateLabel() {\n    if (this.playbackRateSupported()) {\n      this.labelEl_.innerHTML = this.player().playbackRate() + 'x';\n    }\n  }\n\n}\n\nPlaybackRateMenuButton.prototype.controlText_ = 'Playback Rate';\n\nComponent.registerComponent('PlaybackRateMenuButton', PlaybackRateMenuButton);\nexport default PlaybackRateMenuButton;\n",
 
    "/**\n * @file playback-rate-menu-item.js\n */\nimport MenuItem from '../../menu/menu-item.js';\nimport Component from '../../component.js';\n\n/**\n * The specific menu item type for selecting a playback rate\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuItem\n * @class PlaybackRateMenuItem\n */\nclass PlaybackRateMenuItem extends MenuItem {\n\n  constructor(player, options){\n    let label = options['rate'];\n    let rate = parseFloat(label, 10);\n\n    // Modify options for parent MenuItem class's init.\n    options['label'] = label;\n    options['selected'] = rate === 1;\n    super(player, options);\n\n    this.label = label;\n    this.rate = rate;\n\n    this.on(player, 'ratechange', this.update);\n  }\n\n  /**\n   * Handle click on menu item\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    super.handleClick();\n    this.player().playbackRate(this.rate);\n  }\n\n  /**\n   * Update playback rate with selected rate\n   *\n   * @method update\n   */\n  update() {\n    this.selected(this.player().playbackRate() === this.rate);\n  }\n\n}\n\nPlaybackRateMenuItem.prototype.contentElType = 'button';\n\nComponent.registerComponent('PlaybackRateMenuItem', PlaybackRateMenuItem);\nexport default PlaybackRateMenuItem;\n",
 
    "/**\n * @file load-progress-bar.js\n */\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\n\n/**\n * Shows load progress\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class LoadProgressBar\n */\nclass LoadProgressBar extends Component {\n\n  constructor(player, options){\n    super(player, options);\n    this.on(player, 'progress', this.update);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-load-progress',\n      innerHTML: `<span class=\"vjs-control-text\"><span>${this.localize('Loaded')}</span>: 0%</span>`\n    });\n  }\n\n  /**\n   * Update progress bar\n   *\n   * @method update\n   */\n  update() {\n    let buffered = this.player_.buffered();\n    let duration = this.player_.duration();\n    let bufferedEnd = this.player_.bufferedEnd();\n    let children = this.el_.children;\n\n    // get the percent width of a time compared to the total end\n    let percentify = function (time, end){\n      let percent = (time / end) || 0; // no NaN\n      return ((percent >= 1 ? 1 : percent) * 100) + '%';\n    };\n\n    // update the width of the progress bar\n    this.el_.style.width = percentify(bufferedEnd, duration);\n\n    // add child elements to represent the individual buffered time ranges\n    for (let i = 0; i < buffered.length; i++) {\n      let start = buffered.start(i);\n      let end = buffered.end(i);\n      let part = children[i];\n\n      if (!part) {\n        part = this.el_.appendChild(Dom.createEl());\n      }\n\n      // set the percent based on the width of the progress bar (bufferedEnd)\n      part.style.left = percentify(start, bufferedEnd);\n      part.style.width = percentify(end - start, bufferedEnd);\n    }\n\n    // remove unused buffered range elements\n    for (let i = children.length; i > buffered.length; i--) {\n      this.el_.removeChild(children[i-1]);\n    }\n  }\n\n}\n\nComponent.registerComponent('LoadProgressBar', LoadProgressBar);\nexport default LoadProgressBar;\n",
 
    "/**\n * @file mouse-time-display.js\n */\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\nimport * as Fn from '../../utils/fn.js';\nimport formatTime from '../../utils/format-time.js';\nimport throttle from 'lodash-compat/function/throttle';\n\n/**\n * The Mouse Time Display component shows the time you will seek to\n * when hovering over the progress bar\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class MouseTimeDisplay\n */\nclass MouseTimeDisplay extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n\n    this.update(0, 0);\n\n    player.on('ready', () => {\n      this.on(player.controlBar.progressControl.el(), 'mousemove', throttle(Fn.bind(this, this.handleMouseMove), 25));\n    });\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-mouse-display'\n    });\n  }\n\n  handleMouseMove(event) {\n    let duration = this.player_.duration();\n    let newTime = this.calculateDistance(event) * duration;\n    let position = event.pageX - Dom.findElPosition(this.el().parentNode).left;\n\n    this.update(newTime, position);\n  }\n\n  update(newTime, position) {\n    let time = formatTime(newTime, this.player_.duration());\n\n    this.el().style.left = position + 'px';\n    this.el().setAttribute('data-current-time', time);\n  }\n\n  calculateDistance(event) {\n    return Dom.getPointerPosition(this.el().parentNode, event).x;\n  }\n}\n\nComponent.registerComponent('MouseTimeDisplay', MouseTimeDisplay);\nexport default MouseTimeDisplay;\n",
 
    "/**\n * @file play-progress-bar.js\n */\nimport Component from '../../component.js';\nimport * as Fn from '../../utils/fn.js';\nimport formatTime from '../../utils/format-time.js';\n\n/**\n * Shows play progress\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class PlayProgressBar\n */\nclass PlayProgressBar extends Component {\n\n  constructor(player, options){\n    super(player, options);\n    this.updateDataAttr();\n    this.on(player, 'timeupdate', this.updateDataAttr);\n    player.ready(Fn.bind(this, this.updateDataAttr));\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-play-progress vjs-slider-bar',\n      innerHTML: `<span class=\"vjs-control-text\"><span>${this.localize('Progress')}</span>: 0%</span>`\n    });\n  }\n\n  updateDataAttr() {\n    let time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();\n    this.el_.setAttribute('data-current-time', formatTime(time, this.player_.duration()));\n  }\n\n}\n\nComponent.registerComponent('PlayProgressBar', PlayProgressBar);\nexport default PlayProgressBar;\n",
 
    "/**\n * @file progress-control.js\n */\nimport Component from '../../component.js';\nimport SeekBar from './seek-bar.js';\nimport MouseTimeDisplay from './mouse-time-display.js';\n\n/**\n * The Progress Control component contains the seek bar, load progress,\n * and play progress\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class ProgressControl\n */\nclass ProgressControl extends Component {\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-progress-control vjs-control'\n    });\n  }\n}\n\nProgressControl.prototype.options_ = {\n  children: [\n    'seekBar'\n  ]\n};\n\nComponent.registerComponent('ProgressControl', ProgressControl);\nexport default ProgressControl;\n",
 
    "/**\n * @file seek-bar.js\n */\nimport Slider from '../../slider/slider.js';\nimport Component from '../../component.js';\nimport LoadProgressBar from './load-progress-bar.js';\nimport PlayProgressBar from './play-progress-bar.js';\nimport * as Fn from '../../utils/fn.js';\nimport formatTime from '../../utils/format-time.js';\nimport assign from 'object.assign';\n\n/**\n * Seek Bar and holder for the progress bars\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Slider\n * @class SeekBar\n */\nclass SeekBar extends Slider {\n\n  constructor(player, options){\n    super(player, options);\n    this.on(player, 'timeupdate', this.updateARIAAttributes);\n    player.ready(Fn.bind(this, this.updateARIAAttributes));\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-progress-holder'\n    }, {\n      'aria-label': 'video progress bar'\n    });\n  }\n\n  /**\n   * Update ARIA accessibility attributes\n   *\n   * @method updateARIAAttributes\n   */\n  updateARIAAttributes() {\n      // Allows for smooth scrubbing, when player can't keep up.\n      let time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();\n      this.el_.setAttribute('aria-valuenow', (this.getPercent() * 100).toFixed(2)); // machine readable value of progress bar (percentage complete)\n      this.el_.setAttribute('aria-valuetext', formatTime(time, this.player_.duration())); // human readable value of progress bar (time complete)\n  }\n\n  /**\n   * Get percentage of video played\n   *\n   * @return {Number} Percentage played\n   * @method getPercent\n   */\n  getPercent() {\n    let percent = this.player_.currentTime() / this.player_.duration();\n    return percent >= 1 ? 1 : percent;\n  }\n\n  /**\n   * Handle mouse down on seek bar\n   *\n   * @method handleMouseDown\n   */\n  handleMouseDown(event) {\n    super.handleMouseDown(event);\n\n    this.player_.scrubbing(true);\n\n    this.videoWasPlaying = !this.player_.paused();\n    this.player_.pause();\n  }\n\n  /**\n   * Handle mouse move on seek bar\n   *\n   * @method handleMouseMove\n   */\n  handleMouseMove(event) {\n    let newTime = this.calculateDistance(event) * this.player_.duration();\n\n    // Don't let video end while scrubbing.\n    if (newTime === this.player_.duration()) { newTime = newTime - 0.1; }\n\n    // Set new time (tell player to seek to new time)\n    this.player_.currentTime(newTime);\n  }\n\n  /**\n   * Handle mouse up on seek bar\n   *\n   * @method handleMouseUp\n   */\n  handleMouseUp(event) {\n    super.handleMouseUp(event);\n\n    this.player_.scrubbing(false);\n    if (this.videoWasPlaying) {\n      this.player_.play();\n    }\n  }\n\n  /**\n   * Move more quickly fast forward for keyboard-only users\n   *\n   * @method stepForward\n   */\n  stepForward() {\n    this.player_.currentTime(this.player_.currentTime() + 5); // more quickly fast forward for keyboard-only users\n  }\n\n  /**\n   * Move more quickly rewind for keyboard-only users\n   *\n   * @method stepBack\n   */\n  stepBack() {\n    this.player_.currentTime(this.player_.currentTime() - 5); // more quickly rewind for keyboard-only users\n  }\n\n}\n\nSeekBar.prototype.options_ = {\n  children: [\n    'loadProgressBar',\n    'mouseTimeDisplay',\n    'playProgressBar'\n  ],\n  'barName': 'playProgressBar'\n};\n\nSeekBar.prototype.playerEvent = 'timeupdate';\n\nComponent.registerComponent('SeekBar', SeekBar);\nexport default SeekBar;\n",
 
    "/**\n * @file custom-control-spacer.js\n */\nimport Spacer from './spacer.js';\nimport Component from '../../component.js';\n\n/**\n * Spacer specifically meant to be used as an insertion point for new plugins, etc.\n *\n * @extends Spacer\n * @class CustomControlSpacer\n */\nclass CustomControlSpacer extends Spacer {\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-custom-control-spacer ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = super.createEl({\n      className: this.buildCSSClass(),\n    });\n\n    // No-flex/table-cell mode requires there be some content\n    // in the cell to fill the remaining space of the table.\n    el.innerHTML = '&nbsp;';\n    return el;\n  }\n}\n\nComponent.registerComponent('CustomControlSpacer', CustomControlSpacer);\nexport default CustomControlSpacer;\n",
 
    "/**\n * @file spacer.js\n */\nimport Component from '../../component.js';\n\n/**\n * Just an empty spacer element that can be used as an append point for plugins, etc.\n * Also can be used to create space between elements when necessary.\n *\n * @extends Component\n * @class Spacer\n */\nclass Spacer extends Component {\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-spacer ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: this.buildCSSClass()\n    });\n  }\n}\n\nComponent.registerComponent('Spacer', Spacer);\n\nexport default Spacer;\n",
 
    "/**\n * @file caption-settings-menu-item.js\n */\nimport TextTrackMenuItem from './text-track-menu-item.js';\nimport Component from '../../component.js';\n\n/**\n * The menu item for caption track settings menu\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends TextTrackMenuItem\n * @class CaptionSettingsMenuItem\n */\n class CaptionSettingsMenuItem extends TextTrackMenuItem {\n\n  constructor(player, options) {\n    options['track'] = {\n      'kind': options['kind'],\n      'player': player,\n      'label': options['kind'] + ' settings',\n      'default': false,\n      mode: 'disabled'\n    };\n\n    super(player, options);\n    this.addClass('vjs-texttrack-settings');\n  }\n\n  /**\n   * Handle click on menu item\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    this.player().getChild('textTrackSettings').show();\n  }\n\n}\n\nComponent.registerComponent('CaptionSettingsMenuItem', CaptionSettingsMenuItem);\nexport default CaptionSettingsMenuItem;\n",
 
    "/**\n * @file captions-button.js\n */\nimport TextTrackButton from './text-track-button.js';\nimport Component from '../../component.js';\nimport CaptionSettingsMenuItem from './caption-settings-menu-item.js';\n\n/**\n * The button component for toggling and selecting captions\n *\n * @param {Object} player  Player object\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends TextTrackButton\n * @class CaptionsButton\n */\nclass CaptionsButton extends TextTrackButton {\n\n  constructor(player, options, ready){\n    super(player, options, ready);\n    this.el_.setAttribute('aria-label','Captions Menu');\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-captions-button ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Update caption menu items\n   *\n   * @method update\n   */\n  update() {\n    let threshold = 2;\n    super.update();\n\n    // if native, then threshold is 1 because no settings button\n    if (this.player().tech_ && this.player().tech_['featuresNativeTextTracks']) {\n      threshold = 1;\n    }\n\n    if (this.items && this.items.length > threshold) {\n      this.show();\n    } else {\n      this.hide();\n    }\n  }\n\n  /**\n   * Create caption menu items\n   *\n   * @return {Array} Array of menu items\n   * @method createItems\n   */\n  createItems() {\n    let items = [];\n\n    if (!(this.player().tech_ && this.player().tech_['featuresNativeTextTracks'])) {\n      items.push(new CaptionSettingsMenuItem(this.player_, { 'kind': this.kind_ }));\n    }\n\n    return super.createItems(items);\n  }\n\n}\n\nCaptionsButton.prototype.kind_ = 'captions';\nCaptionsButton.prototype.controlText_ = 'Captions';\n\nComponent.registerComponent('CaptionsButton', CaptionsButton);\nexport default CaptionsButton;\n",
 
    "/**\n * @file chapters-button.js\n */\nimport TextTrackButton from './text-track-button.js';\nimport Component from '../../component.js';\nimport TextTrackMenuItem from './text-track-menu-item.js';\nimport ChaptersTrackMenuItem from './chapters-track-menu-item.js';\nimport Menu from '../../menu/menu.js';\nimport * as Dom from '../../utils/dom.js';\nimport * as Fn from '../../utils/fn.js';\nimport toTitleCase from '../../utils/to-title-case.js';\nimport window from 'global/window';\n\n/**\n * The button component for toggling and selecting chapters\n * Chapters act much differently than other text tracks\n * Cues are navigation vs. other tracks of alternative languages\n *\n * @param {Object} player  Player object\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends TextTrackButton\n * @class ChaptersButton\n */\nclass ChaptersButton extends TextTrackButton {\n\n  constructor(player, options, ready){\n    super(player, options, ready);\n    this.el_.setAttribute('aria-label','Chapters Menu');\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-chapters-button ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Create a menu item for each text track\n   *\n   * @return {Array} Array of menu items\n   * @method createItems\n   */\n  createItems() {\n    let items = [];\n\n    let tracks = this.player_.textTracks();\n\n    if (!tracks) {\n      return items;\n    }\n\n    for (let i = 0; i < tracks.length; i++) {\n      let track = tracks[i];\n      if (track['kind'] === this.kind_) {\n        items.push(new TextTrackMenuItem(this.player_, {\n          'track': track\n        }));\n      }\n    }\n\n    return items;\n  }\n\n  /**\n   * Create menu from chapter buttons\n   *\n   * @return {Menu} Menu of chapter buttons\n   * @method createMenu\n   */\n  createMenu() {\n    let tracks = this.player_.textTracks() || [];\n    let chaptersTrack;\n    let items = this.items = [];\n\n    for (let i = 0, l = tracks.length; i < l; i++) {\n      let track = tracks[i];\n      if (track['kind'] === this.kind_) {\n        if (!track.cues) {\n          track['mode'] = 'hidden';\n          /* jshint loopfunc:true */\n          // TODO see if we can figure out a better way of doing this https://github.com/videojs/video.js/issues/1864\n          window.setTimeout(Fn.bind(this, function() {\n            this.createMenu();\n          }), 100);\n          /* jshint loopfunc:false */\n        } else {\n          chaptersTrack = track;\n          break;\n        }\n      }\n    }\n\n    let menu = this.menu;\n    if (menu === undefined) {\n      menu = new Menu(this.player_);\n      menu.contentEl().appendChild(Dom.createEl('li', {\n        className: 'vjs-menu-title',\n        innerHTML: toTitleCase(this.kind_),\n        tabIndex: -1\n      }));\n    }\n\n    if (chaptersTrack) {\n      let cues = chaptersTrack['cues'], cue;\n\n      for (let i = 0, l = cues.length; i < l; i++) {\n        cue = cues[i];\n\n        let mi = new ChaptersTrackMenuItem(this.player_, {\n          'track': chaptersTrack,\n          'cue': cue\n        });\n\n        items.push(mi);\n\n        menu.addChild(mi);\n      }\n      this.addChild(menu);\n    }\n\n    if (this.items.length > 0) {\n      this.show();\n    }\n\n    return menu;\n  }\n\n}\n\nChaptersButton.prototype.kind_ = 'chapters';\nChaptersButton.prototype.controlText_ = 'Chapters';\n\nComponent.registerComponent('ChaptersButton', ChaptersButton);\nexport default ChaptersButton;\n",
 
    "/**\n * @file chapters-track-menu-item.js\n */\nimport MenuItem from '../../menu/menu-item.js';\nimport Component from '../../component.js';\nimport * as Fn from '../../utils/fn.js';\n\n/**\n * The chapter track menu item\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuItem\n * @class ChaptersTrackMenuItem\n */\nclass ChaptersTrackMenuItem extends MenuItem {\n\n  constructor(player, options){\n    let track = options['track'];\n    let cue = options['cue'];\n    let currentTime = player.currentTime();\n\n    // Modify options for parent MenuItem class's init.\n    options['label'] = cue.text;\n    options['selected'] = (cue['startTime'] <= currentTime && currentTime < cue['endTime']);\n    super(player, options);\n\n    this.track = track;\n    this.cue = cue;\n    track.addEventListener('cuechange', Fn.bind(this, this.update));\n  }\n\n  /**\n   * Handle click on menu item\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    super.handleClick();\n    this.player_.currentTime(this.cue.startTime);\n    this.update(this.cue.startTime);\n  }\n\n  /**\n   * Update chapter menu item\n   *\n   * @method update\n   */\n  update() {\n    let cue = this.cue;\n    let currentTime = this.player_.currentTime();\n\n    // vjs.log(currentTime, cue.startTime);\n    this.selected(cue['startTime'] <= currentTime && currentTime < cue['endTime']);\n  }\n\n}\n\nComponent.registerComponent('ChaptersTrackMenuItem', ChaptersTrackMenuItem);\nexport default ChaptersTrackMenuItem;\n",
 
    "/**\n * @file off-text-track-menu-item.js\n */\nimport TextTrackMenuItem from './text-track-menu-item.js';\nimport Component from '../../component.js';\n\n/**\n * A special menu item for turning of a specific type of text track\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends TextTrackMenuItem\n * @class OffTextTrackMenuItem\n */\nclass OffTextTrackMenuItem extends TextTrackMenuItem {\n\n  constructor(player, options){\n    // Create pseudo track info\n    // Requires options['kind']\n    options['track'] = {\n      'kind': options['kind'],\n      'player': player,\n      'label': options['kind'] + ' off',\n      'default': false,\n      'mode': 'disabled'\n    };\n\n    super(player, options);\n    this.selected(true);\n  }\n\n  /**\n   * Handle text track change\n   *\n   * @param {Object} event Event object\n   * @method handleTracksChange\n   */\n  handleTracksChange(event){\n    let tracks = this.player().textTracks();\n    let selected = true;\n\n    for (let i = 0, l = tracks.length; i < l; i++) {\n      let track = tracks[i];\n      if (track['kind'] === this.track['kind'] && track['mode'] === 'showing') {\n        selected = false;\n        break;\n      }\n    }\n\n    this.selected(selected);\n  }\n\n}\n\nComponent.registerComponent('OffTextTrackMenuItem', OffTextTrackMenuItem);\nexport default OffTextTrackMenuItem;\n",
 
    "/**\n * @file subtitles-button.js\n */\nimport TextTrackButton from './text-track-button.js';\nimport Component from '../../component.js';\n\n/**\n * The button component for toggling and selecting subtitles\n *\n * @param {Object} player  Player object\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends TextTrackButton\n * @class SubtitlesButton\n */\nclass SubtitlesButton extends TextTrackButton {\n\n  constructor(player, options, ready){\n    super(player, options, ready);\n    this.el_.setAttribute('aria-label','Subtitles Menu');\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-subtitles-button ${super.buildCSSClass()}`;\n  }\n\n}\n\nSubtitlesButton.prototype.kind_ = 'subtitles';\nSubtitlesButton.prototype.controlText_ = 'Subtitles';\n\nComponent.registerComponent('SubtitlesButton', SubtitlesButton);\nexport default SubtitlesButton;\n",
 
    "/**\n * @file text-track-button.js\n */\nimport MenuButton from '../../menu/menu-button.js';\nimport Component from '../../component.js';\nimport * as Fn from '../../utils/fn.js';\nimport TextTrackMenuItem from './text-track-menu-item.js';\nimport OffTextTrackMenuItem from './off-text-track-menu-item.js';\n\n/**\n * The base class for buttons that toggle specific text track types (e.g. subtitles)\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuButton\n * @class TextTrackButton\n */\nclass TextTrackButton extends MenuButton {\n\n  constructor(player, options){\n    super(player, options);\n\n    let tracks = this.player_.textTracks();\n\n    if (this.items.length <= 1) {\n      this.hide();\n    }\n\n    if (!tracks) {\n      return;\n    }\n\n    let updateHandler = Fn.bind(this, this.update);\n    tracks.addEventListener('removetrack', updateHandler);\n    tracks.addEventListener('addtrack', updateHandler);\n\n    this.player_.on('dispose', function() {\n      tracks.removeEventListener('removetrack', updateHandler);\n      tracks.removeEventListener('addtrack', updateHandler);\n    });\n  }\n\n  // Create a menu item for each text track\n  createItems(items=[]) {\n    // Add an OFF menu item to turn all tracks off\n    items.push(new OffTextTrackMenuItem(this.player_, { 'kind': this.kind_ }));\n\n    let tracks = this.player_.textTracks();\n\n    if (!tracks) {\n      return items;\n    }\n\n    for (let i = 0; i < tracks.length; i++) {\n      let track = tracks[i];\n\n      // only add tracks that are of the appropriate kind and have a label\n      if (track['kind'] === this.kind_) {\n        items.push(new TextTrackMenuItem(this.player_, {\n          'track': track\n        }));\n      }\n    }\n\n    return items;\n  }\n\n}\n\nComponent.registerComponent('TextTrackButton', TextTrackButton);\nexport default TextTrackButton;\n",
 
    "/**\n * @file text-track-menu-item.js\n */\nimport MenuItem from '../../menu/menu-item.js';\nimport Component from '../../component.js';\nimport * as Fn from '../../utils/fn.js';\nimport window from 'global/window';\nimport document from 'global/document';\n\n/**\n * The specific menu item type for selecting a language within a text track kind\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuItem\n * @class TextTrackMenuItem\n */\nclass TextTrackMenuItem extends MenuItem {\n\n  constructor(player, options){\n    let track = options['track'];\n    let tracks = player.textTracks();\n\n    // Modify options for parent MenuItem class's init.\n    options['label'] = track['label'] || track['language'] || 'Unknown';\n    options['selected'] = track['default'] || track['mode'] === 'showing';\n    super(player, options);\n\n    this.track = track;\n\n    if (tracks) {\n      let changeHandler = Fn.bind(this, this.handleTracksChange);\n\n      tracks.addEventListener('change', changeHandler);\n      this.on('dispose', function() {\n        tracks.removeEventListener('change', changeHandler);\n      });\n    }\n\n    // iOS7 doesn't dispatch change events to TextTrackLists when an\n    // associated track's mode changes. Without something like\n    // Object.observe() (also not present on iOS7), it's not\n    // possible to detect changes to the mode attribute and polyfill\n    // the change event. As a poor substitute, we manually dispatch\n    // change events whenever the controls modify the mode.\n    if (tracks && tracks.onchange === undefined) {\n      let event;\n\n      this.on(['tap', 'click'], function() {\n        if (typeof window.Event !== 'object') {\n          // Android 2.3 throws an Illegal Constructor error for window.Event\n          try {\n            event = new window.Event('change');\n          } catch(err){}\n        }\n\n        if (!event) {\n          event = document.createEvent('Event');\n          event.initEvent('change', true, true);\n        }\n\n        tracks.dispatchEvent(event);\n      });\n    }\n  }\n\n  /**\n   * Handle click on text track\n   *\n   * @method handleClick\n   */\n  handleClick(event) {\n    let kind = this.track['kind'];\n    let tracks = this.player_.textTracks();\n\n    super.handleClick(event);\n\n    if (!tracks) return;\n\n    for (let i = 0; i < tracks.length; i++) {\n      let track = tracks[i];\n\n      if (track['kind'] !== kind) {\n        continue;\n      }\n\n      if (track === this.track) {\n        track['mode'] = 'showing';\n      } else {\n        track['mode'] = 'disabled';\n      }\n    }\n  }\n\n  /**\n   * Handle text track change\n   *\n   * @method handleTracksChange\n   */\n  handleTracksChange(event){\n    this.selected(this.track['mode'] === 'showing');\n  }\n\n}\n\nComponent.registerComponent('TextTrackMenuItem', TextTrackMenuItem);\nexport default TextTrackMenuItem;\n",
 
    "/**\n * @file current-time-display.js\n */\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\nimport formatTime from '../../utils/format-time.js';\n\n/**\n * Displays the current time\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class CurrentTimeDisplay\n */\nclass CurrentTimeDisplay extends Component {\n\n  constructor(player, options){\n    super(player, options);\n\n    this.on(player, 'timeupdate', this.updateContent);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = super.createEl('div', {\n      className: 'vjs-current-time vjs-time-control vjs-control'\n    });\n\n    this.contentEl_ = Dom.createEl('div', {\n      className: 'vjs-current-time-display',\n      // label the current time for screen reader users\n      innerHTML: '<span class=\"vjs-control-text\">Current Time </span>' + '0:00',\n    }, {\n      // tell screen readers not to automatically read the time as it changes\n      'aria-live': 'off'\n    });\n\n    el.appendChild(this.contentEl_);\n    return el;\n  }\n\n  /**\n   * Update current time display\n   *\n   * @method updateContent\n   */\n  updateContent() {\n    // Allows for smooth scrubbing, when player can't keep up.\n    let time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();\n    let localizedText = this.localize('Current Time');\n    let formattedTime = formatTime(time, this.player_.duration());\n    this.contentEl_.innerHTML = `<span class=\"vjs-control-text\">${localizedText}</span> ${formattedTime}`;\n  }\n\n}\n\nComponent.registerComponent('CurrentTimeDisplay', CurrentTimeDisplay);\nexport default CurrentTimeDisplay;\n",
 
    "/**\n * @file duration-display.js\n */\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\nimport formatTime from '../../utils/format-time.js';\n\n/**\n * Displays the duration\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class DurationDisplay\n */\nclass DurationDisplay extends Component {\n\n  constructor(player, options){\n    super(player, options);\n\n    // this might need to be changed to 'durationchange' instead of 'timeupdate' eventually,\n    // however the durationchange event fires before this.player_.duration() is set,\n    // so the value cannot be written out using this method.\n    // Once the order of durationchange and this.player_.duration() being set is figured out,\n    // this can be updated.\n    this.on(player, 'timeupdate', this.updateContent);\n    this.on(player, 'loadedmetadata', this.updateContent);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = super.createEl('div', {\n      className: 'vjs-duration vjs-time-control vjs-control'\n    });\n\n    this.contentEl_ = Dom.createEl('div', {\n      className: 'vjs-duration-display',\n      // label the duration time for screen reader users\n      innerHTML: `<span class=\"vjs-control-text\">${this.localize('Duration Time')}</span> 0:00`\n    }, {\n      // tell screen readers not to automatically read the time as it changes\n      'aria-live': 'off'\n    });\n\n    el.appendChild(this.contentEl_);\n    return el;\n  }\n\n  /**\n   * Update duration time display\n   *\n   * @method updateContent\n   */\n  updateContent() {\n    let duration = this.player_.duration();\n    if (duration) {\n      let localizedText = this.localize('Duration Time');\n      let formattedTime = formatTime(duration);\n      this.contentEl_.innerHTML = `<span class=\"vjs-control-text\">${localizedText}</span> ${formattedTime}`; // label the duration time for screen reader users\n    }\n  }\n\n}\n\nComponent.registerComponent('DurationDisplay', DurationDisplay);\nexport default DurationDisplay;\n",
 
    "/**\n * @file remaining-time-display.js\n */\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\nimport formatTime from '../../utils/format-time.js';\n\n/**\n * Displays the time left in the video\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class RemainingTimeDisplay\n */\nclass RemainingTimeDisplay extends Component {\n\n  constructor(player, options){\n    super(player, options);\n\n    this.on(player, 'timeupdate', this.updateContent);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = super.createEl('div', {\n      className: 'vjs-remaining-time vjs-time-control vjs-control'\n    });\n\n    this.contentEl_ = Dom.createEl('div', {\n      className: 'vjs-remaining-time-display',\n      // label the remaining time for screen reader users\n      innerHTML: `<span class=\"vjs-control-text\">${this.localize('Remaining Time')}</span> -0:00`,\n    }, {\n      // tell screen readers not to automatically read the time as it changes\n      'aria-live': 'off'\n    });\n\n    el.appendChild(this.contentEl_);\n    return el;\n  }\n\n  /**\n   * Update remaining time display\n   *\n   * @method updateContent\n   */\n  updateContent() {\n    if (this.player_.duration()) {\n      const localizedText = this.localize('Remaining Time');\n      const formattedTime = formatTime(this.player_.remainingTime());\n      this.contentEl_.innerHTML = `<span class=\"vjs-control-text\">${localizedText}</span> -${formattedTime}`;\n    }\n\n    // Allows for smooth scrubbing, when player can't keep up.\n    // var time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();\n    // this.contentEl_.innerHTML = vjs.formatTime(time, this.player_.duration());\n  }\n\n}\n\nComponent.registerComponent('RemainingTimeDisplay', RemainingTimeDisplay);\nexport default RemainingTimeDisplay;\n",
 
    "/**\n * @file time-divider.js\n */\nimport Component from '../../component.js';\n\n/**\n * The separator between the current time and duration.\n * Can be hidden if it's not needed in the design.\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class TimeDivider\n */\nclass TimeDivider extends Component {\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-time-control vjs-time-divider',\n      innerHTML: '<div><span>/</span></div>'\n    });\n  }\n\n}\n\nComponent.registerComponent('TimeDivider', TimeDivider);\nexport default TimeDivider;\n",
 
    "/**\n * @file volume-bar.js\n */\nimport Slider from '../../slider/slider.js';\nimport Component from '../../component.js';\nimport * as Fn from '../../utils/fn.js';\n\n// Required children\nimport VolumeLevel from './volume-level.js';\n\n/**\n * The bar that contains the volume level and can be clicked on to adjust the level\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Slider\n * @class VolumeBar\n */\nclass VolumeBar extends Slider {\n\n  constructor(player, options){\n    super(player, options);\n    this.on(player, 'volumechange', this.updateARIAAttributes);\n    player.ready(Fn.bind(this, this.updateARIAAttributes));\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-volume-bar vjs-slider-bar'\n    }, {\n      'aria-label': 'volume level'\n    });\n  }\n\n  /**\n   * Handle mouse move on volume bar\n   *\n   * @method handleMouseMove\n   */\n  handleMouseMove(event) {\n    if (this.player_.muted()) {\n      this.player_.muted(false);\n    }\n\n    this.player_.volume(this.calculateDistance(event));\n  }\n\n  /**\n   * Get percent of volume level\n   *\n   * @retun {Number} Volume level percent\n   * @method getPercent\n   */\n  getPercent() {\n    if (this.player_.muted()) {\n      return 0;\n    } else {\n      return this.player_.volume();\n    }\n  }\n\n  /**\n   * Increase volume level for keyboard users\n   *\n   * @method stepForward\n   */\n  stepForward() {\n    this.player_.volume(this.player_.volume() + 0.1);\n  }\n\n  /**\n   * Decrease volume level for keyboard users\n   *\n   * @method stepBack\n   */\n  stepBack() {\n    this.player_.volume(this.player_.volume() - 0.1);\n  }\n\n  /**\n   * Update ARIA accessibility attributes\n   *\n   * @method updateARIAAttributes\n   */\n  updateARIAAttributes() {\n    // Current value of volume bar as a percentage\n    let volume = (this.player_.volume() * 100).toFixed(2);\n    this.el_.setAttribute('aria-valuenow', volume);\n    this.el_.setAttribute('aria-valuetext', volume + '%');\n  }\n\n}\n\nVolumeBar.prototype.options_ = {\n  children: [\n    'volumeLevel'\n  ],\n  'barName': 'volumeLevel'\n};\n\nVolumeBar.prototype.playerEvent = 'volumechange';\n\nComponent.registerComponent('VolumeBar', VolumeBar);\nexport default VolumeBar;\n",
 
    "/**\n * @file volume-control.js\n */\nimport Component from '../../component.js';\n\n// Required children\nimport VolumeBar from './volume-bar.js';\n\n/**\n * The component for controlling the volume level\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class VolumeControl\n */\nclass VolumeControl extends Component {\n\n  constructor(player, options){\n    super(player, options);\n\n    // hide volume controls when they're not supported by the current tech\n    if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {\n      this.addClass('vjs-hidden');\n    }\n    this.on(player, 'loadstart', function(){\n      if (player.tech_['featuresVolumeControl'] === false) {\n        this.addClass('vjs-hidden');\n      } else {\n        this.removeClass('vjs-hidden');\n      }\n    });\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-volume-control vjs-control'\n    });\n  }\n\n}\n\nVolumeControl.prototype.options_ = {\n  children: [\n    'volumeBar'\n  ]\n};\n\nComponent.registerComponent('VolumeControl', VolumeControl);\nexport default VolumeControl;\n",
 
    "/**\n * @file volume-level.js\n */\nimport Component from '../../component.js';\n\n/**\n * Shows volume level\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class VolumeLevel\n */\nclass VolumeLevel extends Component {\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-volume-level',\n      innerHTML: '<span class=\"vjs-control-text\"></span>'\n    });\n  }\n\n}\n\nComponent.registerComponent('VolumeLevel', VolumeLevel);\nexport default VolumeLevel;\n",
 
    "/**\n * @file volume-menu-button.js\n */\nimport Button from '../button.js';\nimport Component from '../component.js';\nimport Menu from '../menu/menu.js';\nimport MenuButton from '../menu/menu-button.js';\nimport MuteToggle from './mute-toggle.js';\nimport VolumeBar from './volume-control/volume-bar.js';\n\n/**\n * Button for volume menu\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuButton\n * @class VolumeMenuButton\n */\nclass VolumeMenuButton extends MenuButton {\n\n  constructor(player, options={}){\n    // Default to inline\n    if (options.inline === undefined) {\n      options.inline = true;\n    }\n\n    // If the vertical option isn't passed at all, default to true.\n    if (options.vertical === undefined) {\n      // If an inline volumeMenuButton is used, we should default to using\n      // a horizontal slider for obvious reasons.\n      if (options.inline) {\n        options.vertical = false;\n      } else {\n        options.vertical = true;\n      }\n    }\n\n    // The vertical option needs to be set on the volumeBar as well,\n    // since that will need to be passed along to the VolumeBar constructor\n    options.volumeBar = options.volumeBar || {};\n    options.volumeBar.vertical = !!options.vertical;\n\n    super(player, options);\n\n    // Same listeners as MuteToggle\n    this.on(player, 'volumechange', this.volumeUpdate);\n    this.on(player, 'loadstart', this.volumeUpdate);\n\n    // hide mute toggle if the current tech doesn't support volume control\n    function updateVisibility() {\n      if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {\n        this.addClass('vjs-hidden');\n      } else {\n        this.removeClass('vjs-hidden');\n      }\n    }\n\n    updateVisibility.call(this);\n    this.on(player, 'loadstart', updateVisibility);\n\n    this.on(this.volumeBar, ['slideractive', 'focus'], function(){\n      this.addClass('vjs-slider-active');\n    });\n\n    this.on(this.volumeBar, ['sliderinactive', 'blur'], function(){\n      this.removeClass('vjs-slider-active');\n    });\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    let orientationClass = '';\n    if (!!this.options_.vertical) {\n      orientationClass = 'vjs-volume-menu-button-vertical';\n    } else {\n      orientationClass = 'vjs-volume-menu-button-horizontal';\n    }\n\n    return `vjs-volume-menu-button ${super.buildCSSClass()} ${orientationClass}`;\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {Menu} The volume menu button\n   * @method createMenu\n   */\n  createMenu() {\n    let menu = new Menu(this.player_, {\n      contentElType: 'div'\n    });\n\n    let vb = new VolumeBar(this.player_, this.options_.volumeBar);\n\n    menu.addChild(vb);\n\n    this.volumeBar = vb;\n    return menu;\n  }\n\n  /**\n   * Handle click on volume menu and calls super\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    MuteToggle.prototype.handleClick.call(this);\n    super.handleClick();\n  }\n\n}\n\nVolumeMenuButton.prototype.volumeUpdate = MuteToggle.prototype.update;\nVolumeMenuButton.prototype.controlText_ = 'Mute';\n\nComponent.registerComponent('VolumeMenuButton', VolumeMenuButton);\nexport default VolumeMenuButton;\n",
 
    "/**\n * @file error-display.js\n */\nimport Component from './component';\nimport  * as Dom from './utils/dom.js';\n\n/**\n * Display that an error has occurred making the video unplayable\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @extends Component\n * @class ErrorDisplay\n */\nclass ErrorDisplay extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n\n    this.update();\n    this.on(player, 'error', this.update);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    var el = super.createEl('div', {\n      className: 'vjs-error-display'\n    });\n\n    this.contentEl_ = Dom.createEl('div');\n    el.appendChild(this.contentEl_);\n\n    return el;\n  }\n\n  /**\n   * Update the error message in localized language\n   *\n   * @method update\n   */\n  update() {\n    if (this.player().error()) {\n      this.contentEl_.innerHTML = this.localize(this.player().error().message);\n    }\n  }\n}\n\nComponent.registerComponent('ErrorDisplay', ErrorDisplay);\nexport default ErrorDisplay;\n",
 
    "/**\n * @file event-target.js\n */\nimport * as Events from './utils/events.js';\n\nvar EventTarget = function() {};\n\nEventTarget.prototype.allowedEvents_ = {};\n\nEventTarget.prototype.on = function(type, fn) {\n  // Remove the addEventListener alias before calling Events.on\n  // so we don't get into an infinite type loop\n  let ael = this.addEventListener;\n  this.addEventListener = Function.prototype;\n  Events.on(this, type, fn);\n  this.addEventListener = ael;\n};\nEventTarget.prototype.addEventListener = EventTarget.prototype.on;\n\nEventTarget.prototype.off = function(type, fn) {\n  Events.off(this, type, fn);\n};\nEventTarget.prototype.removeEventListener = EventTarget.prototype.off;\n\nEventTarget.prototype.one = function(type, fn) {\n  Events.one(this, type, fn);\n};\n\nEventTarget.prototype.trigger = function(event) {\n  let type = event.type || event;\n\n  if (typeof event === 'string') {\n    event = {\n      type: type\n    };\n  }\n  event = Events.fixEvent(event);\n\n  if (this.allowedEvents_[type] && this['on' + type]) {\n    this['on' + type](event);\n  }\n\n  Events.trigger(this, event);\n};\n// The standard DOM EventTarget.dispatchEvent() is aliased to trigger()\nEventTarget.prototype.dispatchEvent = EventTarget.prototype.trigger;\n\nexport default EventTarget;\n",
 
    "import log from './utils/log';\n\n/*\n * @file extend.js\n *\n * A combination of node inherits and babel's inherits (after transpile).\n * Both work the same but node adds `super_` to the subClass\n * and Bable adds the superClass as __proto__. Both seem useful.\n */\nconst _inherits = function (subClass, superClass) {\n  if (typeof superClass !== 'function' && superClass !== null) {\n    throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n\n  if (superClass) {\n    // node\n    subClass.super_ = superClass;\n  }\n};\n\n/*\n * Function for subclassing using the same inheritance that\n * videojs uses internally\n * ```js\n * var Button = videojs.getComponent('Button');\n * ```\n * ```js\n * var MyButton = videojs.extend(Button, {\n *   constructor: function(player, options) {\n *     Button.call(this, player, options);\n *   },\n *   onClick: function() {\n *     // doSomething\n *   }\n * });\n * ```\n */\nconst extendFn = function(superClass, subClassMethods={}) {\n  let subClass = function() {\n    superClass.apply(this, arguments);\n  };\n  let methods = {};\n\n  if (typeof subClassMethods === 'object') {\n    if (typeof subClassMethods.init === 'function') {\n      log.warn('Constructor logic via init() is deprecated; please use constructor() instead.');\n      subClassMethods.constructor = subClassMethods.init;\n    }\n    if (subClassMethods.constructor !== Object.prototype.constructor) {\n      subClass = subClassMethods.constructor;\n    }\n    methods = subClassMethods;\n  } else if (typeof subClassMethods === 'function') {\n    subClass = subClassMethods;\n  }\n\n  _inherits(subClass, superClass);\n\n  // Extend subObj's prototype with functions and other properties from props\n  for (var name in methods) {\n    if (methods.hasOwnProperty(name)) {\n      subClass.prototype[name] = methods[name];\n    }\n  }\n\n  return subClass;\n};\n\nexport default extendFn;\n",
 
    "/**\n * @file fullscreen-api.js\n */\nimport document from 'global/document';\n\n/*\n * Store the browser-specific methods for the fullscreen API\n * @type {Object|undefined}\n * @private\n */\nlet FullscreenApi = {};\n\n// browser API methods\n// map approach from Screenful.js - https://github.com/sindresorhus/screenfull.js\nconst apiMap = [\n  // Spec: https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html\n  [\n    'requestFullscreen',\n    'exitFullscreen',\n    'fullscreenElement',\n    'fullscreenEnabled',\n    'fullscreenchange',\n    'fullscreenerror'\n  ],\n  // WebKit\n  [\n    'webkitRequestFullscreen',\n    'webkitExitFullscreen',\n    'webkitFullscreenElement',\n    'webkitFullscreenEnabled',\n    'webkitfullscreenchange',\n    'webkitfullscreenerror'\n  ],\n  // Old WebKit (Safari 5.1)\n  [\n    'webkitRequestFullScreen',\n    'webkitCancelFullScreen',\n    'webkitCurrentFullScreenElement',\n    'webkitCancelFullScreen',\n    'webkitfullscreenchange',\n    'webkitfullscreenerror'\n  ],\n  // Mozilla\n  [\n    'mozRequestFullScreen',\n    'mozCancelFullScreen',\n    'mozFullScreenElement',\n    'mozFullScreenEnabled',\n    'mozfullscreenchange',\n    'mozfullscreenerror'\n  ],\n  // Microsoft\n  [\n    'msRequestFullscreen',\n    'msExitFullscreen',\n    'msFullscreenElement',\n    'msFullscreenEnabled',\n    'MSFullscreenChange',\n    'MSFullscreenError'\n  ]\n];\n\nlet specApi = apiMap[0];\nlet browserApi;\n\n// determine the supported set of functions\nfor (let i = 0; i < apiMap.length; i++) {\n  // check for exitFullscreen function\n  if (apiMap[i][1] in document) {\n    browserApi = apiMap[i];\n    break;\n  }\n}\n\n// map the browser API names to the spec API names\nif (browserApi) {\n  for (let i=0; i<browserApi.length; i++) {\n    FullscreenApi[specApi[i]] = browserApi[i];\n  }\n}\n\nexport default FullscreenApi;\n",
 
    "/**\n * @file loading-spinner.js\n */\nimport Component from './component';\n\n/* Loading Spinner\n================================================================================ */\n/**\n * Loading spinner for waiting events\n *\n * @extends Component\n * @class LoadingSpinner\n */\nclass LoadingSpinner extends Component {\n\n  /**\n   * Create the component's DOM element\n   *\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-loading-spinner'\n    });\n  }\n}\n\nComponent.registerComponent('LoadingSpinner', LoadingSpinner);\nexport default LoadingSpinner;\n",
 
    "/**\n * @file media-error.js\n */\nimport assign from 'object.assign';\n\n/*\n * Custom MediaError to mimic the HTML5 MediaError\n *\n * @param {Number} code The media error code\n */\nlet MediaError = function(code){\n  if (typeof code === 'number') {\n    this.code = code;\n  } else if (typeof code === 'string') {\n    // default code is zero, so this is a custom error\n    this.message = code;\n  } else if (typeof code === 'object') { // object\n    assign(this, code);\n  }\n\n  if (!this.message) {\n    this.message = MediaError.defaultMessages[this.code] || '';\n  }\n};\n\n/*\n * The error code that refers two one of the defined\n * MediaError types\n *\n * @type {Number}\n */\nMediaError.prototype.code = 0;\n\n/*\n * An optional message to be shown with the error.\n * Message is not part of the HTML5 video spec\n * but allows for more informative custom errors.\n *\n * @type {String}\n */\nMediaError.prototype.message = '';\n\n/*\n * An optional status code that can be set by plugins\n * to allow even more detail about the error.\n * For example the HLS plugin might provide the specific\n * HTTP status code that was returned when the error\n * occurred, then allowing a custom error overlay\n * to display more information.\n *\n * @type {Array}\n */\nMediaError.prototype.status = null;\n\nMediaError.errorTypes = [\n  'MEDIA_ERR_CUSTOM',            // = 0\n  'MEDIA_ERR_ABORTED',           // = 1\n  'MEDIA_ERR_NETWORK',           // = 2\n  'MEDIA_ERR_DECODE',            // = 3\n  'MEDIA_ERR_SRC_NOT_SUPPORTED', // = 4\n  'MEDIA_ERR_ENCRYPTED'          // = 5\n];\n\nMediaError.defaultMessages = {\n  1: 'You aborted the media playback',\n  2: 'A network error caused the media download to fail part-way.',\n  3: 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.',\n  4: 'The media could not be loaded, either because the server or network failed or because the format is not supported.',\n  5: 'The media is encrypted and we do not have the keys to decrypt it.'\n};\n\n// Add types as properties on MediaError\n// e.g. MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;\nfor (var errNum = 0; errNum < MediaError.errorTypes.length; errNum++) {\n  MediaError[MediaError.errorTypes[errNum]] = errNum;\n  // values should be accessible on both the class and instance\n  MediaError.prototype[MediaError.errorTypes[errNum]] = errNum;\n}\n\nexport default MediaError;\n",
 
    "/**\n * @file menu-button.js\n */\nimport Button from '../button.js';\nimport Component from '../component.js';\nimport Menu from './menu.js';\nimport * as Dom from '../utils/dom.js';\nimport * as Fn from '../utils/fn.js';\nimport toTitleCase from '../utils/to-title-case.js';\n\n/**\n * A button class with a popup menu\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Button\n * @class MenuButton\n */\nclass MenuButton extends Button {\n\n  constructor(player, options={}){\n    super(player, options);\n\n    this.update();\n\n    this.on('keydown', this.handleKeyPress);\n    this.el_.setAttribute('aria-haspopup', true);\n    this.el_.setAttribute('role', 'button');\n  }\n\n  /**\n   * Update menu\n   *\n   * @method update\n   */\n  update() {\n    let menu = this.createMenu();\n\n    if (this.menu) {\n      this.removeChild(this.menu);\n    }\n\n    this.menu = menu;\n    this.addChild(menu);\n\n    /**\n     * Track the state of the menu button\n     *\n     * @type {Boolean}\n     * @private\n     */\n    this.buttonPressed_ = false;\n\n    if (this.items && this.items.length === 0) {\n      this.hide();\n    } else if (this.items && this.items.length > 1) {\n      this.show();\n    }\n  }\n\n  /**\n   * Create menu\n   *\n   * @return {Menu} The constructed menu\n   * @method createMenu\n   */\n  createMenu() {\n    var menu = new Menu(this.player_);\n\n    // Add a title list item to the top\n    if (this.options_.title) {\n      menu.contentEl().appendChild(Dom.createEl('li', {\n        className: 'vjs-menu-title',\n        innerHTML: toTitleCase(this.options_.title),\n        tabIndex: -1\n      }));\n    }\n\n    this.items = this['createItems']();\n\n    if (this.items) {\n      // Add menu items to the menu\n      for (var i = 0; i < this.items.length; i++) {\n        menu.addItem(this.items[i]);\n      }\n    }\n\n    return menu;\n  }\n\n  /**\n   * Create the list of menu items. Specific to each subclass.\n   *\n   * @method createItems\n   */\n  createItems(){}\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: this.buildCSSClass()\n    });\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    var menuButtonClass = 'vjs-menu-button';\n\n    // If the inline option is passed, we want to use different styles altogether.\n    if (this.options_.inline === true) {\n      menuButtonClass += '-inline';\n    } else {\n      menuButtonClass += '-popup';\n    }\n\n    return `vjs-menu-button ${menuButtonClass} ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Focus - Add keyboard functionality to element\n   * This function is not needed anymore. Instead, the\n   * keyboard functionality is handled by\n   * treating the button as triggering a submenu.\n   * When the button is pressed, the submenu\n   * appears. Pressing the button again makes\n   * the submenu disappear.\n   *\n   * @method handleFocus\n   */\n  handleFocus() {}\n\n  /**\n   * Can't turn off list display that we turned\n   * on with focus, because list would go away.\n   *\n   * @method handleBlur\n   */\n  handleBlur() {}\n\n  /**\n   * When you click the button it adds focus, which\n   * will show the menu indefinitely.\n   * So we'll remove focus when the mouse leaves the button.\n   * Focus is needed for tab navigation.\n   * Allow sub components to stack CSS class names\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    this.one('mouseout', Fn.bind(this, function(){\n      this.menu.unlockShowing();\n      this.el_.blur();\n    }));\n    if (this.buttonPressed_){\n      this.unpressButton();\n    } else {\n      this.pressButton();\n    }\n  }\n\n  /**\n   * Handle key press on menu\n   *\n   * @param {Object} Key press event\n   * @method handleKeyPress\n   */\n  handleKeyPress(event) {\n\n    // Check for space bar (32) or enter (13) keys\n    if (event.which === 32 || event.which === 13) {\n      if (this.buttonPressed_){\n        this.unpressButton();\n      } else {\n        this.pressButton();\n      }\n      event.preventDefault();\n    // Check for escape (27) key\n    } else if (event.which === 27){\n      if (this.buttonPressed_){\n        this.unpressButton();\n      }\n      event.preventDefault();\n    }\n  }\n\n  /**\n   * Makes changes based on button pressed\n   *\n   * @method pressButton\n   */\n  pressButton() {\n    this.buttonPressed_ = true;\n    this.menu.lockShowing();\n    this.el_.setAttribute('aria-pressed', true);\n    if (this.items && this.items.length > 0) {\n      this.items[0].el().focus(); // set the focus to the title of the submenu\n    }\n  }\n\n  /**\n   * Makes changes based on button unpressed\n   *\n   * @method unpressButton\n   */\n  unpressButton() {\n    this.buttonPressed_ = false;\n    this.menu.unlockShowing();\n    this.el_.setAttribute('aria-pressed', false);\n  }\n}\n\nComponent.registerComponent('MenuButton', MenuButton);\nexport default MenuButton;\n",
 
    "/**\n * @file menu-item.js\n */\nimport Button from '../button.js';\nimport Component from '../component.js';\nimport assign from 'object.assign';\n\n/**\n * The component for a menu item. `<li>`\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Button\n * @class MenuItem\n */\nclass MenuItem extends Button {\n\n  constructor(player, options) {\n    super(player, options);\n    this.selected(options['selected']);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @param {String=} type Desc\n   * @param {Object=} props Desc\n   * @return {Element}\n   * @method createEl\n   */\n  createEl(type, props, attrs) {\n    return super.createEl('li', assign({\n      className: 'vjs-menu-item',\n      innerHTML: this.localize(this.options_['label'])\n    }, props), attrs);\n  }\n\n  /**\n   * Handle a click on the menu item, and set it to selected\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    this.selected(true);\n  }\n\n  /**\n   * Set this menu item as selected or not\n   *\n   * @param  {Boolean} selected\n   * @method selected\n   */\n  selected(selected) {\n    if (selected) {\n      this.addClass('vjs-selected');\n      this.el_.setAttribute('aria-selected',true);\n    } else {\n      this.removeClass('vjs-selected');\n      this.el_.setAttribute('aria-selected',false);\n    }\n  }\n\n}\n\nComponent.registerComponent('MenuItem', MenuItem);\nexport default MenuItem;\n",
 
    "/**\n * @file menu.js\n */\nimport Component from '../component.js';\nimport * as Dom from '../utils/dom.js';\nimport * as Fn from '../utils/fn.js';\nimport * as Events from '../utils/events.js';\n\n/**\n * The Menu component is used to build pop up menus, including subtitle and\n * captions selection menus.\n *\n * @extends Component\n * @class Menu\n */\nclass Menu extends Component {\n\n  /**\n   * Add a menu item to the menu\n   *\n   * @param {Object|String} component Component or component type to add\n   * @method addItem\n   */\n  addItem(component) {\n    this.addChild(component);\n    component.on('click', Fn.bind(this, function(){\n      this.unlockShowing();\n    }));\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let contentElType = this.options_.contentElType || 'ul';\n    this.contentEl_ = Dom.createEl(contentElType, {\n      className: 'vjs-menu-content'\n    });\n    var el = super.createEl('div', {\n      append: this.contentEl_,\n      className: 'vjs-menu'\n    });\n    el.appendChild(this.contentEl_);\n\n    // Prevent clicks from bubbling up. Needed for Menu Buttons,\n    // where a click on the parent is significant\n    Events.on(el, 'click', function(event){\n      event.preventDefault();\n      event.stopImmediatePropagation();\n    });\n\n    return el;\n  }\n}\n\nComponent.registerComponent('Menu', Menu);\nexport default Menu;\n",
 
    "/**\n * @file player.js\n */\n // Subclasses Component\nimport Component from './component.js';\n\nimport document from 'global/document';\nimport window from 'global/window';\nimport * as Events from './utils/events.js';\nimport * as Dom from './utils/dom.js';\nimport * as Fn from './utils/fn.js';\nimport * as Guid from './utils/guid.js';\nimport * as browser from './utils/browser.js';\nimport log from './utils/log.js';\nimport toTitleCase from './utils/to-title-case.js';\nimport { createTimeRange } from './utils/time-ranges.js';\nimport { bufferedPercent } from './utils/buffer.js';\nimport * as stylesheet from './utils/stylesheet.js';\nimport FullscreenApi from './fullscreen-api.js';\nimport MediaError from './media-error.js';\nimport safeParseTuple from 'safe-json-parse/tuple';\nimport assign from 'object.assign';\nimport mergeOptions from './utils/merge-options.js';\nimport textTrackConverter from './tracks/text-track-list-converter.js';\n\n// Include required child components (importing also registers them)\nimport MediaLoader from './tech/loader.js';\nimport PosterImage from './poster-image.js';\nimport TextTrackDisplay from './tracks/text-track-display.js';\nimport LoadingSpinner from './loading-spinner.js';\nimport BigPlayButton from './big-play-button.js';\nimport ControlBar from './control-bar/control-bar.js';\nimport ErrorDisplay from './error-display.js';\nimport TextTrackSettings from './tracks/text-track-settings.js';\n\n// Require html5 tech, at least for disposing the original video tag\nimport Html5 from './tech/html5.js';\n\n/**\n * An instance of the `Player` class is created when any of the Video.js setup methods are used to initialize a video.\n * ```js\n * var myPlayer = videojs('example_video_1');\n * ```\n * In the following example, the `data-setup` attribute tells the Video.js library to create a player instance when the library is ready.\n * ```html\n * <video id=\"example_video_1\" data-setup='{}' controls>\n *   <source src=\"my-source.mp4\" type=\"video/mp4\">\n * </video>\n * ```\n * After an instance has been created it can be accessed globally using `Video('example_video_1')`.\n *\n * @param {Element} tag        The original video tag used for configuring options\n * @param {Object=} options    Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends Component\n * @class Player\n */\nclass Player extends Component {\n\n  /**\n   * player's constructor function\n   *\n   * @constructs\n   * @method init\n   * @param {Element} tag        The original video tag used for configuring options\n   * @param {Object=} options    Player options\n   * @param {Function=} ready    Ready callback function\n   */\n  constructor(tag, options, ready){\n    // Make sure tag ID exists\n    tag.id = tag.id || `vjs_video_${Guid.newGUID()}`;\n\n    // Set Options\n    // The options argument overrides options set in the video tag\n    // which overrides globally set options.\n    // This latter part coincides with the load order\n    // (tag must exist before Player)\n    options = assign(Player.getTagSettings(tag), options);\n\n    // Delay the initialization of children because we need to set up\n    // player properties first, and can't use `this` before `super()`\n    options.initChildren = false;\n\n    // Same with creating the element\n    options.createEl = false;\n\n    // we don't want the player to report touch activity on itself\n    // see enableTouchActivity in Component\n    options.reportTouchActivity = false;\n\n    // Run base component initializing with new options\n    super(null, options, ready);\n\n    // if the global option object was accidentally blown away by\n    // someone, bail early with an informative error\n    if (!this.options_ ||\n        !this.options_.techOrder ||\n        !this.options_.techOrder.length) {\n      throw new Error('No techOrder specified. Did you overwrite ' +\n                      'videojs.options instead of just changing the ' +\n                      'properties you want to override?');\n    }\n\n    this.tag = tag; // Store the original tag used to set options\n\n    // Store the tag attributes used to restore html5 element\n    this.tagAttributes = tag && Dom.getElAttributes(tag);\n\n    // Update current language\n    this.language(this.options_.language);\n\n    // Update Supported Languages\n    if (options.languages) {\n      // Normalise player option languages to lowercase\n      let languagesToLower = {};\n\n      Object.getOwnPropertyNames(options.languages).forEach(function(name) {\n        languagesToLower[name.toLowerCase()] = options.languages[name];\n      });\n      this.languages_ = languagesToLower;\n    } else {\n      this.languages_ = Player.prototype.options_.languages;\n    }\n\n    // Cache for video property values.\n    this.cache_ = {};\n\n    // Set poster\n    this.poster_ = options.poster || '';\n\n    // Set controls\n    this.controls_ = !!options.controls;\n\n    // Original tag settings stored in options\n    // now remove immediately so native controls don't flash.\n    // May be turned back on by HTML5 tech if nativeControlsForTouch is true\n    tag.controls = false;\n\n    /*\n     * Store the internal state of scrubbing\n     *\n     * @private\n     * @return {Boolean} True if the user is scrubbing\n     */\n    this.scrubbing_ = false;\n\n    this.el_ = this.createEl();\n\n    // We also want to pass the original player options to each component and plugin\n    // as well so they don't need to reach back into the player for options later.\n    // We also need to do another copy of this.options_ so we don't end up with\n    // an infinite loop.\n    let playerOptionsCopy = mergeOptions(this.options_);\n\n    // Load plugins\n    if (options.plugins) {\n      let plugins = options.plugins;\n\n      Object.getOwnPropertyNames(plugins).forEach(function(name){\n        if (typeof this[name] === 'function') {\n          this[name](plugins[name]);\n        } else {\n          log.error('Unable to find plugin:', name);\n        }\n      }, this);\n    }\n\n    this.options_.playerOptions = playerOptionsCopy;\n\n    this.initChildren();\n\n    // Set isAudio based on whether or not an audio tag was used\n    this.isAudio(tag.nodeName.toLowerCase() === 'audio');\n\n    // Update controls className. Can't do this when the controls are initially\n    // set because the element doesn't exist yet.\n    if (this.controls()) {\n      this.addClass('vjs-controls-enabled');\n    } else {\n      this.addClass('vjs-controls-disabled');\n    }\n\n    if (this.isAudio()) {\n      this.addClass('vjs-audio');\n    }\n\n    if (this.flexNotSupported_()) {\n      this.addClass('vjs-no-flex');\n    }\n\n    // TODO: Make this smarter. Toggle user state between touching/mousing\n    // using events, since devices can have both touch and mouse events.\n    // if (browser.TOUCH_ENABLED) {\n    //   this.addClass('vjs-touch-enabled');\n    // }\n\n    // Make player easily findable by ID\n    Player.players[this.id_] = this;\n\n    // When the player is first initialized, trigger activity so components\n    // like the control bar show themselves if needed\n    this.userActive(true);\n    this.reportUserActivity();\n    this.listenForUserActivity_();\n\n    this.on('fullscreenchange', this.handleFullscreenChange_);\n    this.on('stageclick', this.handleStageClick_);\n  }\n\n  /**\n   * Destroys the video player and does any necessary cleanup\n   * ```js\n   *     myPlayer.dispose();\n   * ```\n   * This is especially helpful if you are dynamically adding and removing videos\n   * to/from the DOM.\n   *\n   * @method dispose\n   */\n  dispose() {\n    this.trigger('dispose');\n    // prevent dispose from being called twice\n    this.off('dispose');\n\n    if (this.styleEl_) {\n      this.styleEl_.parentNode.removeChild(this.styleEl_);\n    }\n\n    // Kill reference to this player\n    Player.players[this.id_] = null;\n    if (this.tag && this.tag.player) { this.tag.player = null; }\n    if (this.el_ && this.el_.player) { this.el_.player = null; }\n\n    if (this.tech_) { this.tech_.dispose(); }\n\n    super.dispose();\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = this.el_ = super.createEl('div');\n    let tag = this.tag;\n\n    // Remove width/height attrs from tag so CSS can make it 100% width/height\n    tag.removeAttribute('width');\n    tag.removeAttribute('height');\n\n    // Copy over all the attributes from the tag, including ID and class\n    // ID will now reference player box, not the video tag\n    const attrs = Dom.getElAttributes(tag);\n\n    Object.getOwnPropertyNames(attrs).forEach(function(attr){\n      // workaround so we don't totally break IE7\n      // http://stackoverflow.com/questions/3653444/css-styles-not-applied-on-dynamic-elements-in-internet-explorer-7\n      if (attr === 'class') {\n        el.className = attrs[attr];\n      } else {\n        el.setAttribute(attr, attrs[attr]);\n      }\n    });\n\n    // Update tag id/class for use as HTML5 playback tech\n    // Might think we should do this after embedding in container so .vjs-tech class\n    // doesn't flash 100% width/height, but class only applies with .video-js parent\n    tag.id += '_html5_api';\n    tag.className = 'vjs-tech';\n\n    // Make player findable on elements\n    tag.player = el.player = this;\n    // Default state of video is paused\n    this.addClass('vjs-paused');\n\n    // Add a style element in the player that we'll use to set the width/height\n    // of the player in a way that's still overrideable by CSS, just like the\n    // video element\n    this.styleEl_ = stylesheet.createStyleElement('vjs-styles-dimensions');\n    let defaultsStyleEl = document.querySelector('.vjs-styles-defaults');\n    let head = document.querySelector('head');\n    head.insertBefore(this.styleEl_, defaultsStyleEl ? defaultsStyleEl.nextSibling : head.firstChild);\n\n    // Pass in the width/height/aspectRatio options which will update the style el\n    this.width(this.options_.width);\n    this.height(this.options_.height);\n    this.fluid(this.options_.fluid);\n    this.aspectRatio(this.options_.aspectRatio);\n\n    // insertElFirst seems to cause the networkState to flicker from 3 to 2, so\n    // keep track of the original for later so we can know if the source originally failed\n    tag.initNetworkState_ = tag.networkState;\n\n    // Wrap video tag in div (el/box) container\n    if (tag.parentNode) {\n      tag.parentNode.insertBefore(el, tag);\n    }\n    Dom.insertElFirst(tag, el); // Breaks iPhone, fixed in HTML5 setup.\n\n    this.el_ = el;\n\n    return el;\n  }\n\n  /**\n   * Get/set player width\n   *\n   * @param {Number=} value Value for width\n   * @return {Number} Width when getting\n   * @method width\n   */\n  width(value) {\n    return this.dimension('width', value);\n  }\n\n  /**\n   * Get/set player height\n   *\n   * @param {Number=} value Value for height\n   * @return {Number} Height when getting\n   * @method height\n   */\n  height(value) {\n    return this.dimension('height', value);\n  }\n\n  /**\n   * Get/set dimension for player\n   *\n   * @param {String} dimension Either width or height\n   * @param {Number=} value Value for dimension\n   * @return {Component}\n   * @method dimension\n   */\n  dimension(dimension, value) {\n    let privDimension = dimension + '_';\n\n    if (value === undefined) {\n      return this[privDimension] || 0;\n    }\n\n    if (value === '') {\n      // If an empty string is given, reset the dimension to be automatic\n      this[privDimension] = undefined;\n    } else {\n      let parsedVal = parseFloat(value);\n\n      if (isNaN(parsedVal)) {\n        log.error(`Improper value \"${value}\" supplied for for ${dimension}`);\n        return this;\n      }\n\n      this[privDimension] = parsedVal;\n    }\n\n    this.updateStyleEl_();\n    return this;\n  }\n\n  /**\n   * Add/remove the vjs-fluid class\n   *\n   * @param {Boolean} bool Value of true adds the class, value of false removes the class\n   * @method fluid\n   */\n  fluid(bool) {\n    if (bool === undefined) {\n      return !!this.fluid_;\n    }\n\n    this.fluid_ = !!bool;\n\n    if (bool) {\n      this.addClass('vjs-fluid');\n    } else {\n      this.removeClass('vjs-fluid');\n    }\n  }\n\n  /**\n   * Get/Set the aspect ratio\n   *\n   * @param {String=} ratio Aspect ratio for player\n   * @return aspectRatio\n   * @method aspectRatio\n   */\n  aspectRatio(ratio) {\n    if (ratio === undefined) {\n      return this.aspectRatio_;\n    }\n\n    // Check for width:height format\n    if (!/^\\d+\\:\\d+$/.test(ratio)) {\n      throw new Error('Improper value supplied for aspect ratio. The format should be width:height, for example 16:9.');\n    }\n    this.aspectRatio_ = ratio;\n\n    // We're assuming if you set an aspect ratio you want fluid mode,\n    // because in fixed mode you could calculate width and height yourself.\n    this.fluid(true);\n\n    this.updateStyleEl_();\n  }\n\n  /**\n   * Update styles of the player element (height, width and aspect ratio)\n   *\n   * @method updateStyleEl_\n   */\n  updateStyleEl_() {\n    let width;\n    let height;\n    let aspectRatio;\n\n    // The aspect ratio is either used directly or to calculate width and height.\n    if (this.aspectRatio_ !== undefined && this.aspectRatio_ !== 'auto') {\n      // Use any aspectRatio that's been specifically set\n      aspectRatio = this.aspectRatio_;\n    } else if (this.videoWidth()) {\n      // Otherwise try to get the aspect ratio from the video metadata\n      aspectRatio = this.videoWidth() + ':' + this.videoHeight();\n    } else {\n      // Or use a default. The video element's is 2:1, but 16:9 is more common.\n      aspectRatio = '16:9';\n    }\n\n    // Get the ratio as a decimal we can use to calculate dimensions\n    let ratioParts = aspectRatio.split(':');\n    let ratioMultiplier = ratioParts[1] / ratioParts[0];\n\n    if (this.width_ !== undefined) {\n      // Use any width that's been specifically set\n      width = this.width_;\n    } else if (this.height_ !== undefined) {\n      // Or calulate the width from the aspect ratio if a height has been set\n      width = this.height_ / ratioMultiplier;\n    } else {\n      // Or use the video's metadata, or use the video el's default of 300\n      width = this.videoWidth() || 300;\n    }\n\n    if (this.height_ !== undefined) {\n      // Use any height that's been specifically set\n      height = this.height_;\n    } else {\n      // Otherwise calculate the height from the ratio and the width\n      height = width  * ratioMultiplier;\n    }\n\n    let idClass = this.id()+'-dimensions';\n\n    // Ensure the right class is still on the player for the style element\n    this.addClass(idClass);\n\n    stylesheet.setTextContent(this.styleEl_, `\n      .${idClass} {\n        width: ${width}px;\n        height: ${height}px;\n      }\n\n      .${idClass}.vjs-fluid {\n        padding-top: ${ratioMultiplier * 100}%;\n      }\n    `);\n  }\n\n  /**\n   * Load the Media Playback Technology (tech)\n   * Load/Create an instance of playback technology including element and API methods\n   * And append playback element in player div.\n   *\n   * @param {String} techName Name of the playback technology\n   * @param {String} source Video source\n   * @method loadTech_\n   * @private\n   */\n  loadTech_(techName, source) {\n\n    // Pause and remove current playback technology\n    if (this.tech_) {\n      this.unloadTech_();\n    }\n\n    // get rid of the HTML5 video tag as soon as we are using another tech\n    if (techName !== 'Html5' && this.tag) {\n      Component.getComponent('Html5').disposeMediaElement(this.tag);\n      this.tag.player = null;\n      this.tag = null;\n    }\n\n    this.techName_ = techName;\n\n    // Turn off API access because we're loading a new tech that might load asynchronously\n    this.isReady_ = false;\n\n    // Grab tech-specific options from player options and add source and parent element to use.\n    var techOptions = assign({\n      'nativeControlsForTouch': this.options_.nativeControlsForTouch,\n      'source': source,\n      'playerId': this.id(),\n      'techId': `${this.id()}_${techName}_api`,\n      'textTracks': this.textTracks_,\n      'autoplay': this.options_.autoplay,\n      'preload': this.options_.preload,\n      'loop': this.options_.loop,\n      'muted': this.options_.muted,\n      'poster': this.poster(),\n      'language': this.language(),\n      'vtt.js': this.options_['vtt.js']\n    }, this.options_[techName.toLowerCase()]);\n\n    if (this.tag) {\n      techOptions.tag = this.tag;\n    }\n\n    if (source) {\n      this.currentType_ = source.type;\n      if (source.src === this.cache_.src && this.cache_.currentTime > 0) {\n        techOptions.startTime = this.cache_.currentTime;\n      }\n\n      this.cache_.src = source.src;\n    }\n\n    // Initialize tech instance\n    let techComponent = Component.getComponent(techName);\n    this.tech_ = new techComponent(techOptions);\n\n    // player.triggerReady is always async, so don't need this to be async\n    this.tech_.ready(Fn.bind(this, this.handleTechReady_), true);\n\n    textTrackConverter.jsonToTextTracks(this.textTracksJson_ || [], this.tech_);\n\n    // Listen to all HTML5-defined events and trigger them on the player\n    this.on(this.tech_, 'loadstart', this.handleTechLoadStart_);\n    this.on(this.tech_, 'waiting', this.handleTechWaiting_);\n    this.on(this.tech_, 'canplay', this.handleTechCanPlay_);\n    this.on(this.tech_, 'canplaythrough', this.handleTechCanPlayThrough_);\n    this.on(this.tech_, 'playing', this.handleTechPlaying_);\n    this.on(this.tech_, 'ended', this.handleTechEnded_);\n    this.on(this.tech_, 'seeking', this.handleTechSeeking_);\n    this.on(this.tech_, 'seeked', this.handleTechSeeked_);\n    this.on(this.tech_, 'play', this.handleTechPlay_);\n    this.on(this.tech_, 'firstplay', this.handleTechFirstPlay_);\n    this.on(this.tech_, 'pause', this.handleTechPause_);\n    this.on(this.tech_, 'progress', this.handleTechProgress_);\n    this.on(this.tech_, 'durationchange', this.handleTechDurationChange_);\n    this.on(this.tech_, 'fullscreenchange', this.handleTechFullscreenChange_);\n    this.on(this.tech_, 'error', this.handleTechError_);\n    this.on(this.tech_, 'suspend', this.handleTechSuspend_);\n    this.on(this.tech_, 'abort', this.handleTechAbort_);\n    this.on(this.tech_, 'emptied', this.handleTechEmptied_);\n    this.on(this.tech_, 'stalled', this.handleTechStalled_);\n    this.on(this.tech_, 'loadedmetadata', this.handleTechLoadedMetaData_);\n    this.on(this.tech_, 'loadeddata', this.handleTechLoadedData_);\n    this.on(this.tech_, 'timeupdate', this.handleTechTimeUpdate_);\n    this.on(this.tech_, 'ratechange', this.handleTechRateChange_);\n    this.on(this.tech_, 'volumechange', this.handleTechVolumeChange_);\n    this.on(this.tech_, 'texttrackchange', this.handleTechTextTrackChange_);\n    this.on(this.tech_, 'loadedmetadata', this.updateStyleEl_);\n    this.on(this.tech_, 'posterchange', this.handleTechPosterChange_);\n\n    this.usingNativeControls(this.techGet_('controls'));\n\n    if (this.controls() && !this.usingNativeControls()) {\n      this.addTechControlsListeners_();\n    }\n\n    // Add the tech element in the DOM if it was not already there\n    // Make sure to not insert the original video element if using Html5\n    if (this.tech_.el().parentNode !== this.el() && (techName !== 'Html5' || !this.tag)) {\n      Dom.insertElFirst(this.tech_.el(), this.el());\n    }\n\n    // Get rid of the original video tag reference after the first tech is loaded\n    if (this.tag) {\n      this.tag.player = null;\n      this.tag = null;\n    }\n  }\n\n  /**\n   * Unload playback technology\n   *\n   * @method unloadTech_\n   * @private\n   */\n  unloadTech_() {\n    // Save the current text tracks so that we can reuse the same text tracks with the next tech\n    this.textTracks_ = this.textTracks();\n    this.textTracksJson_ = textTrackConverter.textTracksToJson(this);\n\n    this.isReady_ = false;\n\n    this.tech_.dispose();\n\n    this.tech_ = false;\n  }\n\n  /**\n   * Set up click and touch listeners for the playback element\n   *\n   * On desktops, a click on the video itself will toggle playback,\n   * on a mobile device a click on the video toggles controls.\n   * (toggling controls is done by toggling the user state between active and\n   * inactive)\n   * A tap can signal that a user has become active, or has become inactive\n   * e.g. a quick tap on an iPhone movie should reveal the controls. Another\n   * quick tap should hide them again (signaling the user is in an inactive\n   * viewing state)\n   * In addition to this, we still want the user to be considered inactive after\n   * a few seconds of inactivity.\n   * Note: the only part of iOS interaction we can't mimic with this setup\n   * is a touch and hold on the video element counting as activity in order to\n   * keep the controls showing, but that shouldn't be an issue. A touch and hold\n   * on any controls will still keep the user active\n   *\n   * @private\n   * @method addTechControlsListeners_\n   */\n  addTechControlsListeners_() {\n    // Make sure to remove all the previous listeners in case we are called multiple times.\n    this.removeTechControlsListeners_();\n\n    // Some browsers (Chrome & IE) don't trigger a click on a flash swf, but do\n    // trigger mousedown/up.\n    // http://stackoverflow.com/questions/1444562/javascript-onclick-event-over-flash-object\n    // Any touch events are set to block the mousedown event from happening\n    this.on(this.tech_, 'mousedown', this.handleTechClick_);\n\n    // If the controls were hidden we don't want that to change without a tap event\n    // so we'll check if the controls were already showing before reporting user\n    // activity\n    this.on(this.tech_, 'touchstart', this.handleTechTouchStart_);\n    this.on(this.tech_, 'touchmove', this.handleTechTouchMove_);\n    this.on(this.tech_, 'touchend', this.handleTechTouchEnd_);\n\n    // The tap listener needs to come after the touchend listener because the tap\n    // listener cancels out any reportedUserActivity when setting userActive(false)\n    this.on(this.tech_, 'tap', this.handleTechTap_);\n  }\n\n  /**\n   * Remove the listeners used for click and tap controls. This is needed for\n   * toggling to controls disabled, where a tap/touch should do nothing.\n   *\n   * @method removeTechControlsListeners_\n   * @private\n   */\n  removeTechControlsListeners_() {\n    // We don't want to just use `this.off()` because there might be other needed\n    // listeners added by techs that extend this.\n    this.off(this.tech_, 'tap', this.handleTechTap_);\n    this.off(this.tech_, 'touchstart', this.handleTechTouchStart_);\n    this.off(this.tech_, 'touchmove', this.handleTechTouchMove_);\n    this.off(this.tech_, 'touchend', this.handleTechTouchEnd_);\n    this.off(this.tech_, 'mousedown', this.handleTechClick_);\n  }\n\n  /**\n   * Player waits for the tech to be ready\n   *\n   * @method handleTechReady_\n   * @private\n   */\n  handleTechReady_() {\n    this.triggerReady();\n\n    // Keep the same volume as before\n    if (this.cache_.volume) {\n      this.techCall_('setVolume', this.cache_.volume);\n    }\n\n    // Look if the tech found a higher resolution poster while loading\n    this.handleTechPosterChange_();\n\n    // Update the duration if available\n    this.handleTechDurationChange_();\n\n    // Chrome and Safari both have issues with autoplay.\n    // In Safari (5.1.1), when we move the video element into the container div, autoplay doesn't work.\n    // In Chrome (15), if you have autoplay + a poster + no controls, the video gets hidden (but audio plays)\n    // This fixes both issues. Need to wait for API, so it updates displays correctly\n    if (this.tag && this.options_.autoplay && this.paused()) {\n      delete this.tag.poster; // Chrome Fix. Fixed in Chrome v16.\n      this.play();\n    }\n  }\n\n  /**\n   * Fired when the user agent begins looking for media data\n   *\n   * @private\n   * @method handleTechLoadStart_\n   */\n  handleTechLoadStart_() {\n    // TODO: Update to use `emptied` event instead. See #1277.\n\n    this.removeClass('vjs-ended');\n\n    // reset the error state\n    this.error(null);\n\n    // If it's already playing we want to trigger a firstplay event now.\n    // The firstplay event relies on both the play and loadstart events\n    // which can happen in any order for a new source\n    if (!this.paused()) {\n      this.trigger('loadstart');\n      this.trigger('firstplay');\n    } else {\n      // reset the hasStarted state\n      this.hasStarted(false);\n      this.trigger('loadstart');\n    }\n  }\n\n  /**\n   * Add/remove the vjs-has-started class\n   *\n   * @param {Boolean} hasStarted The value of true adds the class the value of false remove the class\n   * @return {Boolean} Boolean value if has started\n   * @private\n   * @method hasStarted\n   */\n  hasStarted(hasStarted) {\n    if (hasStarted !== undefined) {\n      // only update if this is a new value\n      if (this.hasStarted_ !== hasStarted) {\n        this.hasStarted_ = hasStarted;\n        if (hasStarted) {\n          this.addClass('vjs-has-started');\n          // trigger the firstplay event if this newly has played\n          this.trigger('firstplay');\n        } else {\n          this.removeClass('vjs-has-started');\n        }\n      }\n      return this;\n    }\n    return !!this.hasStarted_;\n  }\n\n  /**\n   * Fired whenever the media begins or resumes playback\n   *\n   * @private\n   * @method handleTechPlay_\n   */\n  handleTechPlay_() {\n    this.removeClass('vjs-ended');\n    this.removeClass('vjs-paused');\n    this.addClass('vjs-playing');\n\n    // hide the poster when the user hits play\n    // https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-play\n    this.hasStarted(true);\n\n    this.trigger('play');\n  }\n\n  /**\n   * Fired whenever the media begins waiting\n   *\n   * @private\n   * @method handleTechWaiting_\n   */\n  handleTechWaiting_() {\n    this.addClass('vjs-waiting');\n    this.trigger('waiting');\n  }\n\n  /**\n   * A handler for events that signal that waiting has ended\n   * which is not consistent between browsers. See #1351\n   *\n   * @private\n   * @method handleTechCanPlay_\n   */\n  handleTechCanPlay_() {\n    this.removeClass('vjs-waiting');\n    this.trigger('canplay');\n  }\n\n  /**\n   * A handler for events that signal that waiting has ended\n   * which is not consistent between browsers. See #1351\n   *\n   * @private\n   * @method handleTechCanPlayThrough_\n   */\n  handleTechCanPlayThrough_() {\n    this.removeClass('vjs-waiting');\n    this.trigger('canplaythrough');\n  }\n\n  /**\n   * A handler for events that signal that waiting has ended\n   * which is not consistent between browsers. See #1351\n   *\n   * @private\n   * @method handleTechPlaying_\n   */\n  handleTechPlaying_() {\n    this.removeClass('vjs-waiting');\n    this.trigger('playing');\n  }\n\n  /**\n   * Fired whenever the player is jumping to a new time\n   *\n   * @private\n   * @method handleTechSeeking_\n   */\n  handleTechSeeking_() {\n    this.addClass('vjs-seeking');\n    this.trigger('seeking');\n  }\n\n  /**\n   * Fired when the player has finished jumping to a new time\n   *\n   * @private\n   * @method handleTechSeeked_\n   */\n  handleTechSeeked_() {\n    this.removeClass('vjs-seeking');\n    this.trigger('seeked');\n  }\n\n  /**\n   * Fired the first time a video is played\n   * Not part of the HLS spec, and we're not sure if this is the best\n   * implementation yet, so use sparingly. If you don't have a reason to\n   * prevent playback, use `myPlayer.one('play');` instead.\n   *\n   * @private\n   * @method handleTechFirstPlay_\n   */\n  handleTechFirstPlay_() {\n    //If the first starttime attribute is specified\n    //then we will start at the given offset in seconds\n    if(this.options_.starttime){\n      this.currentTime(this.options_.starttime);\n    }\n\n    this.addClass('vjs-has-started');\n    this.trigger('firstplay');\n  }\n\n  /**\n   * Fired whenever the media has been paused\n   *\n   * @private\n   * @method handleTechPause_\n   */\n  handleTechPause_() {\n    this.removeClass('vjs-playing');\n    this.addClass('vjs-paused');\n    this.trigger('pause');\n  }\n\n  /**\n   * Fired while the user agent is downloading media data\n   *\n   * @private\n   * @method handleTechProgress_\n   */\n  handleTechProgress_() {\n    this.trigger('progress');\n  }\n\n  /**\n   * Fired when the end of the media resource is reached (currentTime == duration)\n   *\n   * @private\n   * @method handleTechEnded_\n   */\n  handleTechEnded_() {\n    this.addClass('vjs-ended');\n    if (this.options_.loop) {\n      this.currentTime(0);\n      this.play();\n    } else if (!this.paused()) {\n      this.pause();\n    }\n\n    this.trigger('ended');\n  }\n\n  /**\n   * Fired when the duration of the media resource is first known or changed\n   *\n   * @private\n   * @method handleTechDurationChange_\n   */\n  handleTechDurationChange_() {\n    this.duration(this.techGet_('duration'));\n  }\n\n  /**\n   * Handle a click on the media element to play/pause\n   *\n   * @param {Object=} event Event object\n   * @private\n   * @method handleTechClick_\n   */\n  handleTechClick_(event) {\n    // We're using mousedown to detect clicks thanks to Flash, but mousedown\n    // will also be triggered with right-clicks, so we need to prevent that\n    if (event.button !== 0) return;\n\n    // When controls are disabled a click should not toggle playback because\n    // the click is considered a control\n    if (this.controls()) {\n      if (this.paused()) {\n        this.play();\n      } else {\n        this.pause();\n      }\n    }\n  }\n\n  /**\n   * Handle a tap on the media element. It will toggle the user\n   * activity state, which hides and shows the controls.\n   *\n   * @private\n   * @method handleTechTap_\n   */\n  handleTechTap_() {\n    this.userActive(!this.userActive());\n  }\n\n  /**\n   * Handle touch to start\n   *\n   * @private\n   * @method handleTechTouchStart_\n   */\n  handleTechTouchStart_() {\n    this.userWasActive = this.userActive();\n  }\n\n  /**\n   * Handle touch to move\n   *\n   * @private\n   * @method handleTechTouchMove_\n   */\n  handleTechTouchMove_() {\n    if (this.userWasActive){\n      this.reportUserActivity();\n    }\n  }\n\n  /**\n   * Handle touch to end\n   *\n   * @private\n   * @method handleTechTouchEnd_\n   */\n  handleTechTouchEnd_(event) {\n    // Stop the mouse events from also happening\n    event.preventDefault();\n  }\n\n  /**\n   * Fired when the player switches in or out of fullscreen mode\n   *\n   * @private\n   * @method handleFullscreenChange_\n   */\n  handleFullscreenChange_() {\n    if (this.isFullscreen()) {\n      this.addClass('vjs-fullscreen');\n    } else {\n      this.removeClass('vjs-fullscreen');\n    }\n  }\n\n  /**\n   * native click events on the SWF aren't triggered on IE11, Win8.1RT\n   * use stageclick events triggered from inside the SWF instead\n   *\n   * @private\n   * @method handleStageClick_\n   */\n  handleStageClick_() {\n    this.reportUserActivity();\n  }\n\n  /**\n   * Handle Tech Fullscreen Change\n   *\n   * @private\n   * @method handleTechFullscreenChange_\n   */\n  handleTechFullscreenChange_(event, data) {\n    if (data) {\n      this.isFullscreen(data.isFullscreen);\n    }\n    this.trigger('fullscreenchange');\n  }\n\n  /**\n   * Fires when an error occurred during the loading of an audio/video\n   *\n   * @private\n   * @method handleTechError_\n   */\n  handleTechError_() {\n    let error = this.tech_.error();\n    this.error(error && error.code);\n  }\n\n  /**\n   * Fires when the browser is intentionally not getting media data\n   *\n   * @private\n   * @method handleTechSuspend_\n   */\n  handleTechSuspend_() {\n    this.trigger('suspend');\n  }\n\n  /**\n   * Fires when the loading of an audio/video is aborted\n   *\n   * @private\n   * @method handleTechAbort_\n   */\n  handleTechAbort_() {\n    this.trigger('abort');\n  }\n\n  /**\n   * Fires when the current playlist is empty\n   *\n   * @private\n   * @method handleTechEmptied_\n   */\n  handleTechEmptied_() {\n    this.trigger('emptied');\n  }\n\n  /**\n   * Fires when the browser is trying to get media data, but data is not available\n   *\n   * @private\n   * @method handleTechStalled_\n   */\n  handleTechStalled_() {\n    this.trigger('stalled');\n  }\n\n  /**\n   * Fires when the browser has loaded meta data for the audio/video\n   *\n   * @private\n   * @method handleTechLoadedMetaData_\n   */\n  handleTechLoadedMetaData_() {\n    this.trigger('loadedmetadata');\n  }\n\n  /**\n   * Fires when the browser has loaded the current frame of the audio/video\n   *\n   * @private\n   * @method handleTechLoadedData_\n   */\n  handleTechLoadedData_() {\n    this.trigger('loadeddata');\n  }\n\n  /**\n   * Fires when the current playback position has changed\n   *\n   * @private\n   * @method handleTechTimeUpdate_\n   */\n  handleTechTimeUpdate_() {\n    this.trigger('timeupdate');\n  }\n\n  /**\n   * Fires when the playing speed of the audio/video is changed\n   *\n   * @private\n   * @method handleTechRateChange_\n   */\n  handleTechRateChange_() {\n    this.trigger('ratechange');\n  }\n\n  /**\n   * Fires when the volume has been changed\n   *\n   * @private\n   * @method handleTechVolumeChange_\n   */\n  handleTechVolumeChange_() {\n    this.trigger('volumechange');\n  }\n\n  /**\n   * Fires when the text track has been changed\n   *\n   * @private\n   * @method handleTechTextTrackChange_\n   */\n  handleTechTextTrackChange_() {\n    this.trigger('texttrackchange');\n  }\n\n  /**\n   * Get object for cached values.\n   *\n   * @return {Object}\n   * @method getCache\n   */\n  getCache() {\n    return this.cache_;\n  }\n\n  /**\n   * Pass values to the playback tech\n   *\n   * @param {String=} method Method\n   * @param {Object=} arg Argument\n   * @private\n   * @method techCall_\n   */\n  techCall_(method, arg) {\n    // If it's not ready yet, call method when it is\n    if (this.tech_ && !this.tech_.isReady_) {\n      this.tech_.ready(function(){\n        this[method](arg);\n      }, true);\n\n    // Otherwise call method now\n    } else {\n      try {\n        this.tech_[method](arg);\n      } catch(e) {\n        log(e);\n        throw e;\n      }\n    }\n  }\n\n  /**\n   * Get calls can't wait for the tech, and sometimes don't need to.\n   *\n   * @param {String} method Tech method\n   * @return {Method}\n   * @private\n   * @method techGet_\n   */\n  techGet_(method) {\n    if (this.tech_ && this.tech_.isReady_) {\n\n      // Flash likes to die and reload when you hide or reposition it.\n      // In these cases the object methods go away and we get errors.\n      // When that happens we'll catch the errors and inform tech that it's not ready any more.\n      try {\n        return this.tech_[method]();\n      } catch(e) {\n        // When building additional tech libs, an expected method may not be defined yet\n        if (this.tech_[method] === undefined) {\n          log(`Video.js: ${method} method not defined for ${this.techName_} playback technology.`, e);\n        } else {\n          // When a method isn't available on the object it throws a TypeError\n          if (e.name === 'TypeError') {\n            log(`Video.js: ${method} unavailable on ${this.techName_} playback technology element.`, e);\n            this.tech_.isReady_ = false;\n          } else {\n            log(e);\n          }\n        }\n        throw e;\n      }\n    }\n\n    return;\n  }\n\n  /**\n   * start media playback\n   * ```js\n   *     myPlayer.play();\n   * ```\n   *\n   * @return {Player} self\n   * @method play\n   */\n  play() {\n    this.techCall_('play');\n    return this;\n  }\n\n  /**\n   * Pause the video playback\n   * ```js\n   *     myPlayer.pause();\n   * ```\n   *\n   * @return {Player} self\n   * @method pause\n   */\n  pause() {\n    this.techCall_('pause');\n    return this;\n  }\n\n  /**\n   * Check if the player is paused\n   * ```js\n   *     var isPaused = myPlayer.paused();\n   *     var isPlaying = !myPlayer.paused();\n   * ```\n   *\n   * @return {Boolean} false if the media is currently playing, or true otherwise\n   * @method paused\n   */\n  paused() {\n    // The initial state of paused should be true (in Safari it's actually false)\n    return (this.techGet_('paused') === false) ? false : true;\n  }\n\n  /**\n   * Returns whether or not the user is \"scrubbing\". Scrubbing is when the user\n   * has clicked the progress bar handle and is dragging it along the progress bar.\n   *\n   * @param  {Boolean} isScrubbing   True/false the user is scrubbing\n   * @return {Boolean}               The scrubbing status when getting\n   * @return {Object}                The player when setting\n   * @method scrubbing\n   */\n  scrubbing(isScrubbing) {\n    if (isScrubbing !== undefined) {\n      this.scrubbing_ = !!isScrubbing;\n\n      if (isScrubbing) {\n        this.addClass('vjs-scrubbing');\n      } else {\n        this.removeClass('vjs-scrubbing');\n      }\n\n      return this;\n    }\n\n    return this.scrubbing_;\n  }\n\n  /**\n   * Get or set the current time (in seconds)\n   * ```js\n   *     // get\n   *     var whereYouAt = myPlayer.currentTime();\n   *     // set\n   *     myPlayer.currentTime(120); // 2 minutes into the video\n   * ```\n   *\n   * @param  {Number|String=} seconds The time to seek to\n   * @return {Number}        The time in seconds, when not setting\n   * @return {Player}    self, when the current time is set\n   * @method currentTime\n   */\n  currentTime(seconds) {\n    if (seconds !== undefined) {\n\n      this.techCall_('setCurrentTime', seconds);\n\n      return this;\n    }\n\n    // cache last currentTime and return. default to 0 seconds\n    //\n    // Caching the currentTime is meant to prevent a massive amount of reads on the tech's\n    // currentTime when scrubbing, but may not provide much performance benefit afterall.\n    // Should be tested. Also something has to read the actual current time or the cache will\n    // never get updated.\n    return this.cache_.currentTime = (this.techGet_('currentTime') || 0);\n  }\n\n  /**\n   * Get the length in time of the video in seconds\n   * ```js\n   *     var lengthOfVideo = myPlayer.duration();\n   * ```\n   * **NOTE**: The video must have started loading before the duration can be\n   * known, and in the case of Flash, may not be known until the video starts\n   * playing.\n   *\n   * @param {Number} seconds Duration when setting\n   * @return {Number} The duration of the video in seconds when getting\n   * @method duration\n   */\n  duration(seconds) {\n    if (seconds === undefined) {\n      return this.cache_.duration || 0;\n    }\n\n    seconds = parseFloat(seconds) || 0;\n\n    // Standardize on Inifity for signaling video is live\n    if (seconds < 0) {\n      seconds = Infinity;\n    }\n\n    if (seconds !== this.cache_.duration) {\n      // Cache the last set value for optimized scrubbing (esp. Flash)\n      this.cache_.duration = seconds;\n\n      if (seconds === Infinity) {\n        this.addClass('vjs-live');\n      } else {\n        this.removeClass('vjs-live');\n      }\n\n      this.trigger('durationchange');\n    }\n\n    return this;\n  }\n\n  /**\n   * Calculates how much time is left.\n   * ```js\n   *     var timeLeft = myPlayer.remainingTime();\n   * ```\n   * Not a native video element function, but useful\n   *\n   * @return {Number} The time remaining in seconds\n   * @method remainingTime\n   */\n  remainingTime() {\n    return this.duration() - this.currentTime();\n  }\n\n  // http://dev.w3.org/html5/spec/video.html#dom-media-buffered\n  // Buffered returns a timerange object.\n  // Kind of like an array of portions of the video that have been downloaded.\n\n  /**\n   * Get a TimeRange object with the times of the video that have been downloaded\n   * If you just want the percent of the video that's been downloaded,\n   * use bufferedPercent.\n   * ```js\n   *     // Number of different ranges of time have been buffered. Usually 1.\n   *     numberOfRanges = bufferedTimeRange.length,\n   *     // Time in seconds when the first range starts. Usually 0.\n   *     firstRangeStart = bufferedTimeRange.start(0),\n   *     // Time in seconds when the first range ends\n   *     firstRangeEnd = bufferedTimeRange.end(0),\n   *     // Length in seconds of the first time range\n   *     firstRangeLength = firstRangeEnd - firstRangeStart;\n   * ```\n   *\n   * @return {Object} A mock TimeRange object (following HTML spec)\n   * @method buffered\n   */\n  buffered() {\n    var buffered = this.techGet_('buffered');\n\n    if (!buffered || !buffered.length) {\n      buffered = createTimeRange(0,0);\n    }\n\n    return buffered;\n  }\n\n  /**\n   * Get the percent (as a decimal) of the video that's been downloaded\n   * ```js\n   *     var howMuchIsDownloaded = myPlayer.bufferedPercent();\n   * ```\n   * 0 means none, 1 means all.\n   * (This method isn't in the HTML5 spec, but it's very convenient)\n   *\n   * @return {Number} A decimal between 0 and 1 representing the percent\n   * @method bufferedPercent\n   */\n  bufferedPercent() {\n    return bufferedPercent(this.buffered(), this.duration());\n  }\n\n  /**\n   * Get the ending time of the last buffered time range\n   * This is used in the progress bar to encapsulate all time ranges.\n   *\n   * @return {Number} The end of the last buffered time range\n   * @method bufferedEnd\n   */\n  bufferedEnd() {\n    var buffered = this.buffered(),\n        duration = this.duration(),\n        end = buffered.end(buffered.length-1);\n\n    if (end > duration) {\n      end = duration;\n    }\n\n    return end;\n  }\n\n  /**\n   * Get or set the current volume of the media\n   * ```js\n   *     // get\n   *     var howLoudIsIt = myPlayer.volume();\n   *     // set\n   *     myPlayer.volume(0.5); // Set volume to half\n   * ```\n   * 0 is off (muted), 1.0 is all the way up, 0.5 is half way.\n   *\n   * @param  {Number} percentAsDecimal The new volume as a decimal percent\n   * @return {Number}              The current volume when getting\n   * @return {Player}              self when setting\n   * @method volume\n   */\n  volume(percentAsDecimal) {\n    let vol;\n\n    if (percentAsDecimal !== undefined) {\n      vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal))); // Force value to between 0 and 1\n      this.cache_.volume = vol;\n      this.techCall_('setVolume', vol);\n\n      return this;\n    }\n\n    // Default to 1 when returning current volume.\n    vol = parseFloat(this.techGet_('volume'));\n    return (isNaN(vol)) ? 1 : vol;\n  }\n\n\n  /**\n   * Get the current muted state, or turn mute on or off\n   * ```js\n   *     // get\n   *     var isVolumeMuted = myPlayer.muted();\n   *     // set\n   *     myPlayer.muted(true); // mute the volume\n   * ```\n   *\n   * @param  {Boolean=} muted True to mute, false to unmute\n   * @return {Boolean} True if mute is on, false if not when getting\n   * @return {Player} self when setting mute\n   * @method muted\n   */\n  muted(muted) {\n    if (muted !== undefined) {\n      this.techCall_('setMuted', muted);\n      return this;\n    }\n    return this.techGet_('muted') || false; // Default to false\n  }\n\n  // Check if current tech can support native fullscreen\n  // (e.g. with built in controls like iOS, so not our flash swf)\n  /**\n   * Check to see if fullscreen is supported\n   *\n   * @return {Boolean}\n   * @method supportsFullScreen\n   */\n  supportsFullScreen() {\n    return this.techGet_('supportsFullScreen') || false;\n  }\n\n  /**\n   * Check if the player is in fullscreen mode\n   * ```js\n   *     // get\n   *     var fullscreenOrNot = myPlayer.isFullscreen();\n   *     // set\n   *     myPlayer.isFullscreen(true); // tell the player it's in fullscreen\n   * ```\n   * NOTE: As of the latest HTML5 spec, isFullscreen is no longer an official\n   * property and instead document.fullscreenElement is used. But isFullscreen is\n   * still a valuable property for internal player workings.\n   *\n   * @param  {Boolean=} isFS Update the player's fullscreen state\n   * @return {Boolean} true if fullscreen false if not when getting\n   * @return {Player} self when setting\n   * @method isFullscreen\n   */\n  isFullscreen(isFS) {\n    if (isFS !== undefined) {\n      this.isFullscreen_ = !!isFS;\n      return this;\n    }\n    return !!this.isFullscreen_;\n  }\n\n  /**\n   * Increase the size of the video to full screen\n   * ```js\n   *     myPlayer.requestFullscreen();\n   * ```\n   * In some browsers, full screen is not supported natively, so it enters\n   * \"full window mode\", where the video fills the browser window.\n   * In browsers and devices that support native full screen, sometimes the\n   * browser's default controls will be shown, and not the Video.js custom skin.\n   * This includes most mobile devices (iOS, Android) and older versions of\n   * Safari.\n   *\n   * @return {Player} self\n   * @method requestFullscreen\n   */\n  requestFullscreen() {\n    var fsApi = FullscreenApi;\n\n    this.isFullscreen(true);\n\n    if (fsApi.requestFullscreen) {\n      // the browser supports going fullscreen at the element level so we can\n      // take the controls fullscreen as well as the video\n\n      // Trigger fullscreenchange event after change\n      // We have to specifically add this each time, and remove\n      // when canceling fullscreen. Otherwise if there's multiple\n      // players on a page, they would all be reacting to the same fullscreen\n      // events\n      Events.on(document, fsApi.fullscreenchange, Fn.bind(this, function documentFullscreenChange(e){\n        this.isFullscreen(document[fsApi.fullscreenElement]);\n\n        // If cancelling fullscreen, remove event listener.\n        if (this.isFullscreen() === false) {\n          Events.off(document, fsApi.fullscreenchange, documentFullscreenChange);\n        }\n\n        this.trigger('fullscreenchange');\n      }));\n\n      this.el_[fsApi.requestFullscreen]();\n\n    } else if (this.tech_.supportsFullScreen()) {\n      // we can't take the video.js controls fullscreen but we can go fullscreen\n      // with native controls\n      this.techCall_('enterFullScreen');\n    } else {\n      // fullscreen isn't supported so we'll just stretch the video element to\n      // fill the viewport\n      this.enterFullWindow();\n      this.trigger('fullscreenchange');\n    }\n\n    return this;\n  }\n\n  /**\n   * Return the video to its normal size after having been in full screen mode\n   * ```js\n   *     myPlayer.exitFullscreen();\n   * ```\n   *\n   * @return {Player} self\n   * @method exitFullscreen\n   */\n  exitFullscreen() {\n    var fsApi = FullscreenApi;\n    this.isFullscreen(false);\n\n    // Check for browser element fullscreen support\n    if (fsApi.requestFullscreen) {\n      document[fsApi.exitFullscreen]();\n    } else if (this.tech_.supportsFullScreen()) {\n     this.techCall_('exitFullScreen');\n    } else {\n     this.exitFullWindow();\n     this.trigger('fullscreenchange');\n    }\n\n    return this;\n  }\n\n  /**\n   * When fullscreen isn't supported we can stretch the video container to as wide as the browser will let us.\n   *\n   * @method enterFullWindow\n   */\n  enterFullWindow() {\n    this.isFullWindow = true;\n\n    // Storing original doc overflow value to return to when fullscreen is off\n    this.docOrigOverflow = document.documentElement.style.overflow;\n\n    // Add listener for esc key to exit fullscreen\n    Events.on(document, 'keydown', Fn.bind(this, this.fullWindowOnEscKey));\n\n    // Hide any scroll bars\n    document.documentElement.style.overflow = 'hidden';\n\n    // Apply fullscreen styles\n    Dom.addElClass(document.body, 'vjs-full-window');\n\n    this.trigger('enterFullWindow');\n  }\n\n  /**\n   * Check for call to either exit full window or full screen on ESC key\n   *\n   * @param {String} event Event to check for key press\n   * @method fullWindowOnEscKey\n   */\n  fullWindowOnEscKey(event) {\n    if (event.keyCode === 27) {\n      if (this.isFullscreen() === true) {\n        this.exitFullscreen();\n      } else {\n        this.exitFullWindow();\n      }\n    }\n  }\n\n  /**\n   * Exit full window\n   *\n   * @method exitFullWindow\n   */\n  exitFullWindow() {\n    this.isFullWindow = false;\n    Events.off(document, 'keydown', this.fullWindowOnEscKey);\n\n    // Unhide scroll bars.\n    document.documentElement.style.overflow = this.docOrigOverflow;\n\n    // Remove fullscreen styles\n    Dom.removeElClass(document.body, 'vjs-full-window');\n\n    // Resize the box, controller, and poster to original sizes\n    // this.positionAll();\n    this.trigger('exitFullWindow');\n  }\n\n  /**\n   * Select source based on tech order\n   *\n   * @param {Array} sources The sources for a media asset\n   * @return {Object|Boolean} Object of source and tech order, otherwise false\n   * @method selectSource\n   */\n  selectSource(sources) {\n    // Loop through each playback technology in the options order\n    for (var i=0,j=this.options_.techOrder;i<j.length;i++) {\n      let techName = toTitleCase(j[i]);\n      let tech = Component.getComponent(techName);\n\n      // Check if the current tech is defined before continuing\n      if (!tech) {\n        log.error(`The \"${techName}\" tech is undefined. Skipped browser support check for that tech.`);\n        continue;\n      }\n\n      // Check if the browser supports this technology\n      if (tech.isSupported()) {\n        // Loop through each source object\n        for (var a=0,b=sources;a<b.length;a++) {\n          var source = b[a];\n\n          // Check if source can be played with this technology\n          if (tech.canPlaySource(source)) {\n            return { source: source, tech: techName };\n          }\n        }\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * The source function updates the video source\n   * There are three types of variables you can pass as the argument.\n   * **URL String**: A URL to the the video file. Use this method if you are sure\n   * the current playback technology (HTML5/Flash) can support the source you\n   * provide. Currently only MP4 files can be used in both HTML5 and Flash.\n   * ```js\n   *     myPlayer.src(\"http://www.example.com/path/to/video.mp4\");\n   * ```\n   * **Source Object (or element):* * A javascript object containing information\n   * about the source file. Use this method if you want the player to determine if\n   * it can support the file using the type information.\n   * ```js\n   *     myPlayer.src({ type: \"video/mp4\", src: \"http://www.example.com/path/to/video.mp4\" });\n   * ```\n   * **Array of Source Objects:* * To provide multiple versions of the source so\n   * that it can be played using HTML5 across browsers you can use an array of\n   * source objects. Video.js will detect which version is supported and load that\n   * file.\n   * ```js\n   *     myPlayer.src([\n   *       { type: \"video/mp4\", src: \"http://www.example.com/path/to/video.mp4\" },\n   *       { type: \"video/webm\", src: \"http://www.example.com/path/to/video.webm\" },\n   *       { type: \"video/ogg\", src: \"http://www.example.com/path/to/video.ogv\" }\n   *     ]);\n   * ```\n   *\n   * @param  {String|Object|Array=} source The source URL, object, or array of sources\n   * @return {String} The current video source when getting\n   * @return {String} The player when setting\n   * @method src\n   */\n  src(source) {\n    if (source === undefined) {\n      return this.techGet_('src');\n    }\n\n    let currentTech = Component.getComponent(this.techName_);\n\n    // case: Array of source objects to choose from and pick the best to play\n    if (Array.isArray(source)) {\n      this.sourceList_(source);\n\n    // case: URL String (http://myvideo...)\n    } else if (typeof source === 'string') {\n      // create a source object from the string\n      this.src({ src: source });\n\n    // case: Source object { src: '', type: '' ... }\n    } else if (source instanceof Object) {\n      // check if the source has a type and the loaded tech cannot play the source\n      // if there's no type we'll just try the current tech\n      if (source.type && !currentTech.canPlaySource(source)) {\n        // create a source list with the current source and send through\n        // the tech loop to check for a compatible technology\n        this.sourceList_([source]);\n      } else {\n        this.cache_.src = source.src;\n        this.currentType_ = source.type || '';\n\n        // wait until the tech is ready to set the source\n        this.ready(function(){\n\n          // The setSource tech method was added with source handlers\n          // so older techs won't support it\n          // We need to check the direct prototype for the case where subclasses\n          // of the tech do not support source handlers\n          if (currentTech.prototype.hasOwnProperty('setSource')) {\n            this.techCall_('setSource', source);\n          } else {\n            this.techCall_('src', source.src);\n          }\n\n          if (this.options_.preload === 'auto') {\n            this.load();\n          }\n\n          if (this.options_.autoplay) {\n            this.play();\n          }\n\n        // Set the source synchronously if possible (#2326)\n        }, true);\n      }\n    }\n\n    return this;\n  }\n\n  /**\n   * Handle an array of source objects\n   *\n   * @param  {Array} sources Array of source objects\n   * @private\n   * @method sourceList_\n   */\n  sourceList_(sources) {\n    var sourceTech = this.selectSource(sources);\n\n    if (sourceTech) {\n      if (sourceTech.tech === this.techName_) {\n        // if this technology is already loaded, set the source\n        this.src(sourceTech.source);\n      } else {\n        // load this technology with the chosen source\n        this.loadTech_(sourceTech.tech, sourceTech.source);\n      }\n    } else {\n      // We need to wrap this in a timeout to give folks a chance to add error event handlers\n      this.setTimeout( function() {\n        this.error({ code: 4, message: this.localize(this.options_.notSupportedMessage) });\n      }, 0);\n\n      // we could not find an appropriate tech, but let's still notify the delegate that this is it\n      // this needs a better comment about why this is needed\n      this.triggerReady();\n    }\n  }\n\n  /**\n   * Begin loading the src data.\n   *\n   * @return {Player} Returns the player\n   * @method load\n   */\n  load() {\n    this.techCall_('load');\n    return this;\n  }\n\n  /**\n   * Returns the fully qualified URL of the current source value e.g. http://mysite.com/video.mp4\n   * Can be used in conjuction with `currentType` to assist in rebuilding the current source object.\n   *\n   * @return {String} The current source\n   * @method currentSrc\n   */\n  currentSrc() {\n    return this.techGet_('currentSrc') || this.cache_.src || '';\n  }\n\n  /**\n   * Get the current source type e.g. video/mp4\n   * This can allow you rebuild the current source object so that you could load the same\n   * source and tech later\n   *\n   * @return {String} The source MIME type\n   * @method currentType\n   */\n  currentType() {\n    return this.currentType_ || '';\n  }\n\n  /**\n   * Get or set the preload attribute\n   *\n   * @param {Boolean} value Boolean to determine if preload should be used\n   * @return {String} The preload attribute value when getting\n   * @return {Player} Returns the player when setting\n   * @method preload\n   */\n  preload(value) {\n    if (value !== undefined) {\n      this.techCall_('setPreload', value);\n      this.options_.preload = value;\n      return this;\n    }\n    return this.techGet_('preload');\n  }\n\n  /**\n   * Get or set the autoplay attribute.\n   *\n   * @param {Boolean} value Boolean to determine if preload should be used\n   * @return {String} The autoplay attribute value when getting\n   * @return {Player} Returns the player when setting\n   * @method autoplay\n   */\n  autoplay(value) {\n    if (value !== undefined) {\n      this.techCall_('setAutoplay', value);\n      this.options_.autoplay = value;\n      return this;\n    }\n    return this.techGet_('autoplay', value);\n  }\n\n  /**\n   * Get or set the loop attribute on the video element.\n   *\n   * @param {Boolean} value Boolean to determine if preload should be used\n   * @return {String} The loop attribute value when getting\n   * @return {Player} Returns the player when setting\n   * @method loop\n   */\n  loop(value) {\n    if (value !== undefined) {\n      this.techCall_('setLoop', value);\n      this.options_['loop'] = value;\n      return this;\n    }\n    return this.techGet_('loop');\n  }\n\n  /**\n   * Get or set the poster image source url\n   *\n   * ##### EXAMPLE:\n   * ```js\n   *     // get\n   *     var currentPoster = myPlayer.poster();\n   *     // set\n   *     myPlayer.poster('http://example.com/myImage.jpg');\n   * ```\n   *\n   * @param  {String=} src Poster image source URL\n   * @return {String} poster URL when getting\n   * @return {Player} self when setting\n   * @method poster\n   */\n  poster(src) {\n    if (src === undefined) {\n      return this.poster_;\n    }\n\n    // The correct way to remove a poster is to set as an empty string\n    // other falsey values will throw errors\n    if (!src) {\n      src = '';\n    }\n\n    // update the internal poster variable\n    this.poster_ = src;\n\n    // update the tech's poster\n    this.techCall_('setPoster', src);\n\n    // alert components that the poster has been set\n    this.trigger('posterchange');\n\n    return this;\n  }\n\n  /**\n   * Some techs (e.g. YouTube) can provide a poster source in an\n   * asynchronous way. We want the poster component to use this\n   * poster source so that it covers up the tech's controls.\n   * (YouTube's play button). However we only want to use this\n   * soruce if the player user hasn't set a poster through\n   * the normal APIs.\n   *\n   * @private\n   * @method handleTechPosterChange_\n   */\n  handleTechPosterChange_() {\n    if (!this.poster_ && this.tech_ && this.tech_.poster) {\n      this.poster_ = this.tech_.poster() || '';\n\n      // Let components know the poster has changed\n      this.trigger('posterchange');\n    }\n  }\n\n  /**\n   * Get or set whether or not the controls are showing.\n   *\n   * @param  {Boolean} bool Set controls to showing or not\n   * @return {Boolean}    Controls are showing\n   * @method controls\n   */\n  controls(bool) {\n    if (bool !== undefined) {\n      bool = !!bool; // force boolean\n      // Don't trigger a change event unless it actually changed\n      if (this.controls_ !== bool) {\n        this.controls_ = bool;\n\n        if (this.usingNativeControls()) {\n          this.techCall_('setControls', bool);\n        }\n\n        if (bool) {\n          this.removeClass('vjs-controls-disabled');\n          this.addClass('vjs-controls-enabled');\n          this.trigger('controlsenabled');\n\n          if (!this.usingNativeControls()) {\n            this.addTechControlsListeners_();\n          }\n        } else {\n          this.removeClass('vjs-controls-enabled');\n          this.addClass('vjs-controls-disabled');\n          this.trigger('controlsdisabled');\n\n          if (!this.usingNativeControls()) {\n            this.removeTechControlsListeners_();\n          }\n        }\n      }\n      return this;\n    }\n    return !!this.controls_;\n  }\n\n  /**\n   * Toggle native controls on/off. Native controls are the controls built into\n   * devices (e.g. default iPhone controls), Flash, or other techs\n   * (e.g. Vimeo Controls)\n   * **This should only be set by the current tech, because only the tech knows\n   * if it can support native controls**\n   *\n   * @param  {Boolean} bool    True signals that native controls are on\n   * @return {Player}      Returns the player\n   * @private\n   * @method usingNativeControls\n   */\n  usingNativeControls(bool) {\n    if (bool !== undefined) {\n      bool = !!bool; // force boolean\n      // Don't trigger a change event unless it actually changed\n      if (this.usingNativeControls_ !== bool) {\n        this.usingNativeControls_ = bool;\n        if (bool) {\n          this.addClass('vjs-using-native-controls');\n\n          /**\n            * player is using the native device controls\n           *\n            * @event usingnativecontrols\n            * @memberof Player\n            * @instance\n            * @private\n            */\n          this.trigger('usingnativecontrols');\n        } else {\n          this.removeClass('vjs-using-native-controls');\n\n          /**\n            * player is using the custom HTML controls\n           *\n            * @event usingcustomcontrols\n            * @memberof Player\n            * @instance\n            * @private\n            */\n          this.trigger('usingcustomcontrols');\n        }\n      }\n      return this;\n    }\n    return !!this.usingNativeControls_;\n  }\n\n  /**\n   * Set or get the current MediaError\n   *\n   * @param  {*} err A MediaError or a String/Number to be turned into a MediaError\n   * @return {MediaError|null}     when getting\n   * @return {Player}              when setting\n   * @method error\n   */\n  error(err) {\n    if (err === undefined) {\n      return this.error_ || null;\n    }\n\n    // restoring to default\n    if (err === null) {\n      this.error_ = err;\n      this.removeClass('vjs-error');\n      return this;\n    }\n\n    // error instance\n    if (err instanceof MediaError) {\n      this.error_ = err;\n    } else {\n      this.error_ = new MediaError(err);\n    }\n\n    // fire an error event on the player\n    this.trigger('error');\n\n    // add the vjs-error classname to the player\n    this.addClass('vjs-error');\n\n    // log the name of the error type and any message\n    // ie8 just logs \"[object object]\" if you just log the error object\n    log.error(`(CODE:${this.error_.code} ${MediaError.errorTypes[this.error_.code]})`, this.error_.message, this.error_);\n\n    return this;\n  }\n\n  /**\n   * Returns whether or not the player is in the \"ended\" state.\n   *\n   * @return {Boolean} True if the player is in the ended state, false if not.\n   * @method ended\n   */\n  ended() { return this.techGet_('ended'); }\n\n  /**\n   * Returns whether or not the player is in the \"seeking\" state.\n   *\n   * @return {Boolean} True if the player is in the seeking state, false if not.\n   * @method seeking\n   */\n  seeking() { return this.techGet_('seeking'); }\n\n  /**\n   * Returns the TimeRanges of the media that are currently available\n   * for seeking to.\n   *\n   * @return {TimeRanges} the seekable intervals of the media timeline\n   * @method seekable\n   */\n  seekable() { return this.techGet_('seekable'); }\n\n  /**\n   * Report user activity\n   *\n   * @param {Object} event Event object\n   * @method reportUserActivity\n   */\n  reportUserActivity(event) {\n    this.userActivity_ = true;\n  }\n\n  /**\n   * Get/set if user is active\n   *\n   * @param {Boolean} bool Value when setting\n   * @return {Boolean} Value if user is active user when getting\n   * @method userActive\n   */\n  userActive(bool) {\n    if (bool !== undefined) {\n      bool = !!bool;\n      if (bool !== this.userActive_) {\n        this.userActive_ = bool;\n        if (bool) {\n          // If the user was inactive and is now active we want to reset the\n          // inactivity timer\n          this.userActivity_ = true;\n          this.removeClass('vjs-user-inactive');\n          this.addClass('vjs-user-active');\n          this.trigger('useractive');\n        } else {\n          // We're switching the state to inactive manually, so erase any other\n          // activity\n          this.userActivity_ = false;\n\n          // Chrome/Safari/IE have bugs where when you change the cursor it can\n          // trigger a mousemove event. This causes an issue when you're hiding\n          // the cursor when the user is inactive, and a mousemove signals user\n          // activity. Making it impossible to go into inactive mode. Specifically\n          // this happens in fullscreen when we really need to hide the cursor.\n          //\n          // When this gets resolved in ALL browsers it can be removed\n          // https://code.google.com/p/chromium/issues/detail?id=103041\n          if(this.tech_) {\n            this.tech_.one('mousemove', function(e){\n              e.stopPropagation();\n              e.preventDefault();\n            });\n          }\n\n          this.removeClass('vjs-user-active');\n          this.addClass('vjs-user-inactive');\n          this.trigger('userinactive');\n        }\n      }\n      return this;\n    }\n    return this.userActive_;\n  }\n\n  /**\n   * Listen for user activity based on timeout value\n   *\n   * @private\n   * @method listenForUserActivity_\n   */\n  listenForUserActivity_() {\n    let mouseInProgress, lastMoveX, lastMoveY;\n\n    let handleActivity = Fn.bind(this, this.reportUserActivity);\n\n    let handleMouseMove = function(e) {\n      // #1068 - Prevent mousemove spamming\n      // Chrome Bug: https://code.google.com/p/chromium/issues/detail?id=366970\n      if(e.screenX !== lastMoveX || e.screenY !== lastMoveY) {\n        lastMoveX = e.screenX;\n        lastMoveY = e.screenY;\n        handleActivity();\n      }\n    };\n\n    let handleMouseDown = function() {\n      handleActivity();\n      // For as long as the they are touching the device or have their mouse down,\n      // we consider them active even if they're not moving their finger or mouse.\n      // So we want to continue to update that they are active\n      this.clearInterval(mouseInProgress);\n      // Setting userActivity=true now and setting the interval to the same time\n      // as the activityCheck interval (250) should ensure we never miss the\n      // next activityCheck\n      mouseInProgress = this.setInterval(handleActivity, 250);\n    };\n\n    let handleMouseUp = function(event) {\n      handleActivity();\n      // Stop the interval that maintains activity if the mouse/touch is down\n      this.clearInterval(mouseInProgress);\n    };\n\n    // Any mouse movement will be considered user activity\n    this.on('mousedown', handleMouseDown);\n    this.on('mousemove', handleMouseMove);\n    this.on('mouseup', handleMouseUp);\n\n    // Listen for keyboard navigation\n    // Shouldn't need to use inProgress interval because of key repeat\n    this.on('keydown', handleActivity);\n    this.on('keyup', handleActivity);\n\n    // Run an interval every 250 milliseconds instead of stuffing everything into\n    // the mousemove/touchmove function itself, to prevent performance degradation.\n    // `this.reportUserActivity` simply sets this.userActivity_ to true, which\n    // then gets picked up by this loop\n    // http://ejohn.org/blog/learning-from-twitter/\n    let inactivityTimeout;\n    let activityCheck = this.setInterval(function() {\n      // Check to see if mouse/touch activity has happened\n      if (this.userActivity_) {\n        // Reset the activity tracker\n        this.userActivity_ = false;\n\n        // If the user state was inactive, set the state to active\n        this.userActive(true);\n\n        // Clear any existing inactivity timeout to start the timer over\n        this.clearTimeout(inactivityTimeout);\n\n        var timeout = this.options_['inactivityTimeout'];\n        if (timeout > 0) {\n          // In <timeout> milliseconds, if no more activity has occurred the\n          // user will be considered inactive\n          inactivityTimeout = this.setTimeout(function () {\n            // Protect against the case where the inactivityTimeout can trigger just\n            // before the next user activity is picked up by the activityCheck loop\n            // causing a flicker\n            if (!this.userActivity_) {\n                this.userActive(false);\n            }\n          }, timeout);\n        }\n      }\n    }, 250);\n  }\n\n  /**\n   * Gets or sets the current playback rate.  A playback rate of\n   * 1.0 represents normal speed and 0.5 would indicate half-speed\n   * playback, for instance.\n   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-playbackrate\n   *\n   * @param  {Number} rate    New playback rate to set.\n   * @return {Number}         Returns the new playback rate when setting\n   * @return {Number}         Returns the current playback rate when getting\n   * @method playbackRate\n   */\n  playbackRate(rate) {\n    if (rate !== undefined) {\n      this.techCall_('setPlaybackRate', rate);\n      return this;\n    }\n\n    if (this.tech_ && this.tech_['featuresPlaybackRate']) {\n      return this.techGet_('playbackRate');\n    } else {\n      return 1.0;\n    }\n  }\n\n  /**\n   * Gets or sets the audio flag\n   *\n   * @param  {Boolean} bool    True signals that this is an audio player.\n   * @return {Boolean}         Returns true if player is audio, false if not when getting\n   * @return {Player}      Returns the player if setting\n   * @private\n   * @method isAudio\n   */\n  isAudio(bool) {\n    if (bool !== undefined) {\n      this.isAudio_ = !!bool;\n      return this;\n    }\n\n    return !!this.isAudio_;\n  }\n\n  /**\n   * Returns the current state of network activity for the element, from\n   * the codes in the list below.\n   * - NETWORK_EMPTY (numeric value 0)\n   *   The element has not yet been initialised. All attributes are in\n   *   their initial states.\n   * - NETWORK_IDLE (numeric value 1)\n   *   The element's resource selection algorithm is active and has\n   *   selected a resource, but it is not actually using the network at\n   *   this time.\n   * - NETWORK_LOADING (numeric value 2)\n   *   The user agent is actively trying to download data.\n   * - NETWORK_NO_SOURCE (numeric value 3)\n   *   The element's resource selection algorithm is active, but it has\n   *   not yet found a resource to use.\n   *\n   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#network-states\n   * @return {Number} the current network activity state\n   * @method networkState\n   */\n  networkState() {\n    return this.techGet_('networkState');\n  }\n\n  /**\n   * Returns a value that expresses the current state of the element\n   * with respect to rendering the current playback position, from the\n   * codes in the list below.\n   * - HAVE_NOTHING (numeric value 0)\n   *   No information regarding the media resource is available.\n   * - HAVE_METADATA (numeric value 1)\n   *   Enough of the resource has been obtained that the duration of the\n   *   resource is available.\n   * - HAVE_CURRENT_DATA (numeric value 2)\n   *   Data for the immediate current playback position is available.\n   * - HAVE_FUTURE_DATA (numeric value 3)\n   *   Data for the immediate current playback position is available, as\n   *   well as enough data for the user agent to advance the current\n   *   playback position in the direction of playback.\n   * - HAVE_ENOUGH_DATA (numeric value 4)\n   *   The user agent estimates that enough data is available for\n   *   playback to proceed uninterrupted.\n   *\n   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-readystate\n   * @return {Number} the current playback rendering state\n   * @method readyState\n   */\n  readyState() {\n    return this.techGet_('readyState');\n  }\n\n  /*\n    * Text tracks are tracks of timed text events.\n    * Captions - text displayed over the video for the hearing impaired\n    * Subtitles - text displayed over the video for those who don't understand language in the video\n    * Chapters - text displayed in a menu allowing the user to jump to particular points (chapters) in the video\n    * Descriptions (not supported yet) - audio descriptions that are read back to the user by a screen reading device\n    */\n\n  /**\n   * Get an array of associated text tracks. captions, subtitles, chapters, descriptions\n   * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-texttracks\n   *\n   * @return {Array}           Array of track objects\n   * @method textTracks\n   */\n  textTracks() {\n    // cannot use techGet_ directly because it checks to see whether the tech is ready.\n    // Flash is unlikely to be ready in time but textTracks should still work.\n    return this.tech_ && this.tech_['textTracks']();\n  }\n\n  /**\n   * Get an array of remote text tracks\n   *\n   * @return {Array}\n   * @method remoteTextTracks\n   */\n  remoteTextTracks() {\n    return this.tech_ && this.tech_['remoteTextTracks']();\n  }\n\n  /**\n   * Add a text track\n   * In addition to the W3C settings we allow adding additional info through options.\n   * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-addtexttrack\n   *\n   * @param {String}  kind        Captions, subtitles, chapters, descriptions, or metadata\n   * @param {String=} label       Optional label\n   * @param {String=} language    Optional language\n   * @method addTextTrack\n   */\n  addTextTrack(kind, label, language) {\n    return this.tech_ && this.tech_['addTextTrack'](kind, label, language);\n  }\n\n  /**\n   * Add a remote text track\n   *\n   * @param {Object} options    Options for remote text track\n   * @method addRemoteTextTrack\n   */\n  addRemoteTextTrack(options) {\n    return this.tech_ && this.tech_['addRemoteTextTrack'](options);\n  }\n\n  /**\n   * Remove a remote text track\n   *\n   * @param {Object} track    Remote text track to remove\n   * @method removeRemoteTextTrack\n   */\n  removeRemoteTextTrack(track) {\n    this.tech_ && this.tech_['removeRemoteTextTrack'](track);\n  }\n\n  /**\n   * Get video width\n   *\n   * @return {Number} Video width\n   * @method videoWidth\n   */\n  videoWidth() {\n    return this.tech_ && this.tech_.videoWidth && this.tech_.videoWidth() || 0;\n  }\n\n  /**\n   * Get video height\n   *\n   * @return {Number} Video height\n   * @method videoHeight\n   */\n  videoHeight() {\n    return this.tech_ && this.tech_.videoHeight && this.tech_.videoHeight() || 0;\n  }\n\n  // Methods to add support for\n  // initialTime: function(){ return this.techCall_('initialTime'); },\n  // startOffsetTime: function(){ return this.techCall_('startOffsetTime'); },\n  // played: function(){ return this.techCall_('played'); },\n  // videoTracks: function(){ return this.techCall_('videoTracks'); },\n  // audioTracks: function(){ return this.techCall_('audioTracks'); },\n  // defaultPlaybackRate: function(){ return this.techCall_('defaultPlaybackRate'); },\n  // defaultMuted: function(){ return this.techCall_('defaultMuted'); }\n\n  /**\n   * The player's language code\n   * NOTE: The language should be set in the player options if you want the\n   * the controls to be built with a specific language. Changing the lanugage\n   * later will not update controls text.\n   *\n   * @param {String} code  The locale string\n   * @return {String}      The locale string when getting\n   * @return {Player}      self when setting\n   * @method language\n   */\n  language(code) {\n    if (code === undefined) {\n      return this.language_;\n    }\n\n    this.language_ = (''+code).toLowerCase();\n    return this;\n  }\n\n  /**\n   * Get the player's language dictionary\n   * Merge every time, because a newly added plugin might call videojs.addLanguage() at any time\n   * Languages specified directly in the player options have precedence\n   *\n   * @return {Array} Array of languages\n   * @method languages\n   */\n  languages() {\n    return  mergeOptions(Player.prototype.options_.languages, this.languages_);\n  }\n\n  /**\n   * Converts track info to JSON\n   *\n   * @return {Object} JSON object of options\n   * @method toJSON\n   */\n  toJSON() {\n    let options = mergeOptions(this.options_);\n    let tracks = options.tracks;\n\n    options.tracks = [];\n\n    for (let i = 0; i < tracks.length; i++) {\n      let track = tracks[i];\n\n      // deep merge tracks and null out player so no circular references\n      track = mergeOptions(track);\n      track.player = undefined;\n      options.tracks[i] = track;\n    }\n\n    return options;\n  }\n\n  /**\n   * Gets tag settings\n   *\n   * @param {Element} tag The player tag\n   * @return {Array} An array of sources and track objects\n   * @static\n   * @method getTagSettings\n   */\n  static getTagSettings(tag) {\n    let baseOptions = {\n      'sources': [],\n      'tracks': []\n    };\n\n    const tagOptions = Dom.getElAttributes(tag);\n    const dataSetup = tagOptions['data-setup'];\n\n    // Check if data-setup attr exists.\n    if (dataSetup !== null){\n      // Parse options JSON\n      // If empty string, make it a parsable json object.\n      const [err, data] = safeParseTuple(dataSetup || '{}');\n      if (err) {\n        log.error(err);\n      }\n      assign(tagOptions, data);\n    }\n\n    assign(baseOptions, tagOptions);\n\n    // Get tag children settings\n    if (tag.hasChildNodes()) {\n      const children = tag.childNodes;\n\n      for (let i=0, j=children.length; i<j; i++) {\n        const child = children[i];\n        // Change case needed: http://ejohn.org/blog/nodename-case-sensitivity/\n        const childName = child.nodeName.toLowerCase();\n        if (childName === 'source') {\n          baseOptions.sources.push(Dom.getElAttributes(child));\n        } else if (childName === 'track') {\n          baseOptions.tracks.push(Dom.getElAttributes(child));\n        }\n      }\n    }\n\n    return baseOptions;\n  }\n\n}\n\n/*\n * Global player list\n *\n * @type {Object}\n */\nPlayer.players = {};\n\nlet navigator = window.navigator;\n/*\n * Player instance options, surfaced using options\n * options = Player.prototype.options_\n * Make changes in options, not here.\n *\n * @type {Object}\n * @private\n */\nPlayer.prototype.options_ = {\n  // Default order of fallback technology\n  techOrder: ['html5','flash'],\n  // techOrder: ['flash','html5'],\n\n  html5: {},\n  flash: {},\n\n  // defaultVolume: 0.85,\n  defaultVolume: 0.00, // The freakin seaguls are driving me crazy!\n\n  // default inactivity timeout\n  inactivityTimeout: 2000,\n\n  // default playback rates\n  playbackRates: [],\n  // Add playback rate selection by adding rates\n  // 'playbackRates': [0.5, 1, 1.5, 2],\n\n  // Included control sets\n  children: [\n    'mediaLoader',\n    'posterImage',\n    'textTrackDisplay',\n    'loadingSpinner',\n    'bigPlayButton',\n    'controlBar',\n    'errorDisplay',\n    'textTrackSettings'\n  ],\n\n  language: document.getElementsByTagName('html')[0].getAttribute('lang') || navigator.languages && navigator.languages[0] || navigator.userLanguage || navigator.language || 'en',\n\n  // locales and their language translations\n  languages: {},\n\n  // Default message to show when a video cannot be played.\n  notSupportedMessage: 'No compatible source was found for this video.'\n};\n\n/**\n * Fired when the player has initial duration and dimension information\n *\n * @event loadedmetadata\n */\nPlayer.prototype.handleLoadedMetaData_;\n\n/**\n * Fired when the player has downloaded data at the current playback position\n *\n * @event loadeddata\n */\nPlayer.prototype.handleLoadedData_;\n\n/**\n * Fired when the user is active, e.g. moves the mouse over the player\n *\n * @event useractive\n */\nPlayer.prototype.handleUserActive_;\n\n/**\n * Fired when the user is inactive, e.g. a short delay after the last mouse move or control interaction\n *\n * @event userinactive\n */\nPlayer.prototype.handleUserInactive_;\n\n/**\n * Fired when the current playback position has changed *\n * During playback this is fired every 15-250 milliseconds, depending on the\n * playback technology in use.\n *\n * @event timeupdate\n */\nPlayer.prototype.handleTimeUpdate_;\n\n/**\n * Fired when the volume changes\n *\n * @event volumechange\n */\nPlayer.prototype.handleVolumeChange_;\n\n/**\n * Fired when an error occurs\n *\n * @event error\n */\nPlayer.prototype.handleError_;\n\nPlayer.prototype.flexNotSupported_ = function() {\n  var elem = document.createElement('i');\n\n  // Note: We don't actually use flexBasis (or flexOrder), but it's one of the more\n  // common flex features that we can rely on when checking for flex support.\n  return !('flexBasis' in elem.style ||\n          'webkitFlexBasis' in elem.style ||\n          'mozFlexBasis' in elem.style ||\n          'msFlexBasis' in elem.style ||\n          'msFlexOrder' in elem.style /* IE10-specific (2012 flex spec)  */);\n};\n\nComponent.registerComponent('Player', Player);\nexport default Player;\n",
 
    "/**\n * @file plugins.js\n */\nimport Player from './player.js';\n\n/**\n * The method for registering a video.js plugin\n *\n * @param  {String} name The name of the plugin\n * @param  {Function} init The function that is run when the player inits\n * @method plugin\n */\nvar plugin = function(name, init){\n  Player.prototype[name] = init;\n};\n\nexport default plugin;\n",
 
    "/**\n * @file poster-image.js\n */\nimport Button from './button.js';\nimport Component from './component.js';\nimport * as Fn from './utils/fn.js';\nimport * as Dom from './utils/dom.js';\nimport * as browser from './utils/browser.js';\n\n/**\n * The component that handles showing the poster image.\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Button\n * @class PosterImage\n */\nclass PosterImage extends Button {\n\n  constructor(player, options){\n    super(player, options);\n\n    this.update();\n    player.on('posterchange', Fn.bind(this, this.update));\n  }\n\n  /**\n   * Clean up the poster image\n   *\n   * @method dispose\n   */\n  dispose() {\n    this.player().off('posterchange', this.update);\n    super.dispose();\n  }\n\n  /**\n   * Create the poster's image element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = Dom.createEl('div', {\n      className: 'vjs-poster',\n\n      // Don't want poster to be tabbable.\n      tabIndex: -1\n    });\n\n    // To ensure the poster image resizes while maintaining its original aspect\n    // ratio, use a div with `background-size` when available. For browsers that\n    // do not support `background-size` (e.g. IE8), fall back on using a regular\n    // img element.\n    if (!browser.BACKGROUND_SIZE_SUPPORTED) {\n      this.fallbackImg_ = Dom.createEl('img');\n      el.appendChild(this.fallbackImg_);\n    }\n\n    return el;\n  }\n\n  /**\n   * Event handler for updates to the player's poster source\n   *\n   * @method update\n   */\n  update() {\n    let url = this.player().poster();\n\n    this.setSrc(url);\n\n    // If there's no poster source we should display:none on this component\n    // so it's not still clickable or right-clickable\n    if (url) {\n      this.show();\n    } else {\n      this.hide();\n    }\n  }\n\n  /**\n   * Set the poster source depending on the display method\n   *\n   * @param {String} url The URL to the poster source\n   * @method setSrc\n   */\n  setSrc(url) {\n    if (this.fallbackImg_) {\n      this.fallbackImg_.src = url;\n    } else {\n      let backgroundImage = '';\n      // Any falsey values should stay as an empty string, otherwise\n      // this will throw an extra error\n      if (url) {\n        backgroundImage = `url(\"${url}\")`;\n      }\n\n      this.el_.style.backgroundImage = backgroundImage;\n    }\n  }\n\n  /**\n   * Event handler for clicks on the poster image\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    // We don't want a click to trigger playback when controls are disabled\n    // but CSS should be hiding the poster to prevent that from happening\n    if (this.player_.paused()) {\n      this.player_.play();\n    } else {\n      this.player_.pause();\n    }\n  }\n\n}\n\nComponent.registerComponent('PosterImage', PosterImage);\nexport default PosterImage;\n",
 
    "/**\n * @file setup.js\n *\n * Functions for automatically setting up a player\n * based on the data-setup attribute of the video tag\n */\nimport * as Events from './utils/events.js';\nimport document from 'global/document';\nimport window from 'global/window';\n\nlet _windowLoaded = false;\nlet videojs;\n\n\n// Automatically set up any tags that have a data-setup attribute\nvar autoSetup = function(){\n  // One day, when we stop supporting IE8, go back to this, but in the meantime...*hack hack hack*\n  // var vids = Array.prototype.slice.call(document.getElementsByTagName('video'));\n  // var audios = Array.prototype.slice.call(document.getElementsByTagName('audio'));\n  // var mediaEls = vids.concat(audios);\n\n  // Because IE8 doesn't support calling slice on a node list, we need to loop through each list of elements\n  // to build up a new, combined list of elements.\n  var vids = document.getElementsByTagName('video');\n  var audios = document.getElementsByTagName('audio');\n  var mediaEls = [];\n  if (vids && vids.length > 0) {\n    for(let i=0, e=vids.length; i<e; i++) {\n      mediaEls.push(vids[i]);\n    }\n  }\n  if (audios && audios.length > 0) {\n    for(let i=0, e=audios.length; i<e; i++) {\n      mediaEls.push(audios[i]);\n    }\n  }\n\n  // Check if any media elements exist\n  if (mediaEls && mediaEls.length > 0) {\n\n    for (let i=0, e=mediaEls.length; i<e; i++) {\n      let mediaEl = mediaEls[i];\n\n      // Check if element exists, has getAttribute func.\n      // IE seems to consider typeof el.getAttribute == 'object' instead of 'function' like expected, at least when loading the player immediately.\n      if (mediaEl && mediaEl.getAttribute) {\n\n        // Make sure this player hasn't already been set up.\n        if (mediaEl['player'] === undefined) {\n          let options = mediaEl.getAttribute('data-setup');\n\n          // Check if data-setup attr exists.\n          // We only auto-setup if they've added the data-setup attr.\n          if (options !== null) {\n            // Create new video.js instance.\n            let player = videojs(mediaEl);\n          }\n        }\n\n      // If getAttribute isn't defined, we need to wait for the DOM.\n      } else {\n        autoSetupTimeout(1);\n        break;\n      }\n    }\n\n  // No videos were found, so keep looping unless page is finished loading.\n  } else if (!_windowLoaded) {\n    autoSetupTimeout(1);\n  }\n};\n\n// Pause to let the DOM keep processing\nvar autoSetupTimeout = function(wait, vjs){\n  videojs = vjs;\n  setTimeout(autoSetup, wait);\n};\n\nif (document.readyState === 'complete') {\n  _windowLoaded = true;\n} else {\n  Events.one(window, 'load', function(){\n    _windowLoaded = true;\n  });\n}\n\nvar hasLoaded = function() {\n  return _windowLoaded;\n};\n\nexport { autoSetup, autoSetupTimeout, hasLoaded };\n",
 
    "/**\n * @file slider.js\n */\nimport Component from '../component.js';\nimport * as Dom from '../utils/dom.js';\nimport document from 'global/document';\nimport assign from 'object.assign';\n\n/**\n * The base functionality for sliders like the volume bar and seek bar\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class Slider\n */\nclass Slider extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n\n    // Set property names to bar to match with the child Slider class is looking for\n    this.bar = this.getChild(this.options_.barName);\n\n    // Set a horizontal or vertical class on the slider depending on the slider type\n    this.vertical(!!this.options_.vertical);\n\n    this.on('mousedown', this.handleMouseDown);\n    this.on('touchstart', this.handleMouseDown);\n    this.on('focus', this.handleFocus);\n    this.on('blur', this.handleBlur);\n    this.on('click', this.handleClick);\n\n    this.on(player, 'controlsvisible', this.update);\n    this.on(player, this.playerEvent, this.update);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @param {String} type Type of element to create\n   * @param {Object=} props List of properties in Object form\n   * @return {Element}\n   * @method createEl\n   */\n  createEl(type, props={}, attributes={}) {\n    // Add the slider element class to all sub classes\n    props.className = props.className + ' vjs-slider';\n    props = assign({\n      tabIndex: 0\n    }, props);\n\n    attributes = assign({\n      'role': 'slider',\n      'aria-valuenow': 0,\n      'aria-valuemin': 0,\n      'aria-valuemax': 100,\n      tabIndex: 0\n    }, attributes);\n\n    return super.createEl(type, props, attributes);\n  }\n\n  /**\n   * Handle mouse down on slider\n   *\n   * @param {Object} event Mouse down event object\n   * @method handleMouseDown\n   */\n  handleMouseDown(event) {\n    event.preventDefault();\n    Dom.blockTextSelection();\n\n    this.addClass('vjs-sliding');\n    this.trigger('slideractive');\n\n    this.on(document, 'mousemove', this.handleMouseMove);\n    this.on(document, 'mouseup', this.handleMouseUp);\n    this.on(document, 'touchmove', this.handleMouseMove);\n    this.on(document, 'touchend', this.handleMouseUp);\n\n    this.handleMouseMove(event);\n  }\n\n  /**\n   * To be overridden by a subclass\n   *\n   * @method handleMouseMove\n   */\n  handleMouseMove() {}\n\n  /**\n   * Handle mouse up on Slider\n   *\n   * @method handleMouseUp\n   */\n  handleMouseUp() {\n    Dom.unblockTextSelection();\n\n    this.removeClass('vjs-sliding');\n    this.trigger('sliderinactive');\n\n    this.off(document, 'mousemove', this.handleMouseMove);\n    this.off(document, 'mouseup', this.handleMouseUp);\n    this.off(document, 'touchmove', this.handleMouseMove);\n    this.off(document, 'touchend', this.handleMouseUp);\n\n    this.update();\n  }\n\n  /**\n   * Update slider\n   *\n   * @method update\n   */\n  update() {\n    // In VolumeBar init we have a setTimeout for update that pops and update to the end of the\n    // execution stack. The player is destroyed before then update will cause an error\n    if (!this.el_) return;\n\n    // If scrubbing, we could use a cached value to make the handle keep up with the user's mouse.\n    // On HTML5 browsers scrubbing is really smooth, but some flash players are slow, so we might want to utilize this later.\n    // var progress =  (this.player_.scrubbing()) ? this.player_.getCache().currentTime / this.player_.duration() : this.player_.currentTime() / this.player_.duration();\n    let progress = this.getPercent();\n    let bar = this.bar;\n\n    // If there's no bar...\n    if (!bar) return;\n\n    // Protect against no duration and other division issues\n    if (typeof progress !== 'number' ||\n        progress !== progress ||\n        progress < 0 ||\n        progress === Infinity) {\n          progress = 0;\n    }\n\n    // Convert to a percentage for setting\n    let percentage = (progress * 100).toFixed(2) + '%';\n\n    // Set the new bar width or height\n    if (this.vertical()) {\n      bar.el().style.height = percentage;\n    } else {\n      bar.el().style.width = percentage;\n    }\n  }\n\n  /**\n   * Calculate distance for slider\n   *\n   * @param {Object} event Event object\n   * @method calculateDistance\n   */\n  calculateDistance(event){\n    let position = Dom.getPointerPosition(this.el_, event);\n    if (this.vertical()) {\n      return position.y;\n    }\n    return position.x;\n  }\n\n  /**\n   * Handle on focus for slider\n   *\n   * @method handleFocus\n   */\n  handleFocus() {\n    this.on(document, 'keydown', this.handleKeyPress);\n  }\n\n  /**\n   * Handle key press for slider\n   *\n   * @param {Object} event Event object\n   * @method handleKeyPress\n   */\n  handleKeyPress(event) {\n    if (event.which === 37 || event.which === 40) { // Left and Down Arrows\n      event.preventDefault();\n      this.stepBack();\n    } else if (event.which === 38 || event.which === 39) { // Up and Right Arrows\n      event.preventDefault();\n      this.stepForward();\n    }\n  }\n\n  /**\n   * Handle on blur for slider\n   *\n   * @method handleBlur\n   */\n  handleBlur() {\n    this.off(document, 'keydown', this.handleKeyPress);\n  }\n\n  /**\n   * Listener for click events on slider, used to prevent clicks\n   *   from bubbling up to parent elements like button menus.\n   *\n   * @param {Object} event Event object\n   * @method handleClick\n   */\n  handleClick(event) {\n    event.stopImmediatePropagation();\n    event.preventDefault();\n  }\n\n  /**\n   * Get/set if slider is horizontal for vertical\n   *\n   * @param {Boolean} bool True if slider is vertical, false is horizontal\n   * @return {Boolean} True if slider is vertical, false is horizontal\n   * @method vertical\n   */\n  vertical(bool) {\n    if (bool === undefined) {\n      return this.vertical_ || false;\n    }\n\n    this.vertical_ = !!bool;\n\n    if (this.vertical_) {\n      this.addClass('vjs-slider-vertical');\n    } else {\n      this.addClass('vjs-slider-horizontal');\n    }\n\n    return this;\n  }\n\n}\n\nComponent.registerComponent('Slider', Slider);\nexport default Slider;\n",
 
    "/**\n * @file flash-rtmp.js\n */\nfunction FlashRtmpDecorator(Flash) {\n  Flash.streamingFormats = {\n    'rtmp/mp4': 'MP4',\n    'rtmp/flv': 'FLV'\n  };\n\n  Flash.streamFromParts = function(connection, stream) {\n    return connection + '&' + stream;\n  };\n\n  Flash.streamToParts = function(src) {\n    let parts = {\n      connection: '',\n      stream: ''\n    };\n\n    if (!src) return parts;\n\n    // Look for the normal URL separator we expect, '&'.\n    // If found, we split the URL into two pieces around the\n    // first '&'.\n    let connEnd = src.indexOf('&');\n    let streamBegin;\n    if (connEnd !== -1) {\n      streamBegin = connEnd + 1;\n    }\n    else {\n      // If there's not a '&', we use the last '/' as the delimiter.\n      connEnd = streamBegin = src.lastIndexOf('/') + 1;\n      if (connEnd === 0) {\n        // really, there's not a '/'?\n        connEnd = streamBegin = src.length;\n      }\n    }\n    parts.connection = src.substring(0, connEnd);\n    parts.stream = src.substring(streamBegin, src.length);\n\n    return parts;\n  };\n\n  Flash.isStreamingType = function(srcType) {\n    return srcType in Flash.streamingFormats;\n  };\n\n  // RTMP has four variations, any string starting\n  // with one of these protocols should be valid\n  Flash.RTMP_RE = /^rtmp[set]?:\\/\\//i;\n\n  Flash.isStreamingSrc = function(src) {\n    return Flash.RTMP_RE.test(src);\n  };\n\n  /**\n   * A source handler for RTMP urls\n   * @type {Object}\n   */\n  Flash.rtmpSourceHandler = {};\n\n  /**\n   * Check Flash can handle the source natively\n   * @param  {Object} source  The source object\n   * @return {String}         'probably', 'maybe', or '' (empty string)\n   */\n  Flash.rtmpSourceHandler.canHandleSource = function(source){\n    if (Flash.isStreamingType(source.type) || Flash.isStreamingSrc(source.src)) {\n      return 'maybe';\n    }\n\n    return '';\n  };\n\n  /**\n   * Pass the source to the flash object\n   * Adaptive source handlers will have more complicated workflows before passing\n   * video data to the video element\n   * @param  {Object} source    The source object\n   * @param  {Flash} tech   The instance of the Flash tech\n   */\n  Flash.rtmpSourceHandler.handleSource = function(source, tech){\n    let srcParts = Flash.streamToParts(source.src);\n\n    tech['setRtmpConnection'](srcParts.connection);\n    tech['setRtmpStream'](srcParts.stream);\n  };\n\n  // Register the native source handler\n  Flash.registerSourceHandler(Flash.rtmpSourceHandler);\n\n  return Flash;\n}\n\nexport default FlashRtmpDecorator;\n",
 
    "/**\n * @file flash.js\n * VideoJS-SWF - Custom Flash Player with HTML5-ish API\n * https://github.com/zencoder/video-js-swf\n * Not using setupTriggers. Using global onEvent func to distribute events\n */\n\nimport Tech from './tech';\nimport * as Dom from '../utils/dom.js';\nimport * as Url from '../utils/url.js';\nimport { createTimeRange } from '../utils/time-ranges.js';\nimport FlashRtmpDecorator from './flash-rtmp';\nimport Component from '../component';\nimport window from 'global/window';\nimport assign from 'object.assign';\n\nlet navigator = window.navigator;\n/**\n * Flash Media Controller - Wrapper for fallback SWF API\n *\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready Ready callback function\n * @extends Tech\n * @class Flash\n */\nclass Flash extends Tech {\n\n  constructor(options, ready){\n    super(options, ready);\n\n    // Set the source when ready\n    if (options.source) {\n      this.ready(function(){\n        this.setSource(options.source);\n      }, true);\n    }\n\n    // Having issues with Flash reloading on certain page actions (hide/resize/fullscreen) in certain browsers\n    // This allows resetting the playhead when we catch the reload\n    if (options.startTime) {\n      this.ready(function(){\n        this.load();\n        this.play();\n        this.currentTime(options.startTime);\n      }, true);\n    }\n\n    // Add global window functions that the swf expects\n    // A 4.x workflow we weren't able to solve for in 5.0\n    // because of the need to hard code these functions\n    // into the swf for security reasons\n    window.videojs = window.videojs || {};\n    window.videojs.Flash = window.videojs.Flash || {};\n    window.videojs.Flash.onReady = Flash.onReady;\n    window.videojs.Flash.onEvent = Flash.onEvent;\n    window.videojs.Flash.onError = Flash.onError;\n\n    this.on('seeked', function() {\n      this.lastSeekTarget_ = undefined;\n    });\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let options = this.options_;\n\n    // If video.js is hosted locally you should also set the location\n    // for the hosted swf, which should be relative to the page (not video.js)\n    // Otherwise this adds a CDN url.\n    // The CDN also auto-adds a swf URL for that specific version.\n    if (!options.swf) {\n      options.swf = '//vjs.zencdn.net/swf/__SWF_VERSION__/video-js.swf';\n    }\n\n    // Generate ID for swf object\n    let objId = options.techId;\n\n    // Merge default flashvars with ones passed in to init\n    let flashVars = assign({\n\n      // SWF Callback Functions\n      'readyFunction': 'videojs.Flash.onReady',\n      'eventProxyFunction': 'videojs.Flash.onEvent',\n      'errorEventProxyFunction': 'videojs.Flash.onError',\n\n      // Player Settings\n      'autoplay': options.autoplay,\n      'preload': options.preload,\n      'loop': options.loop,\n      'muted': options.muted\n\n    }, options.flashVars);\n\n    // Merge default parames with ones passed in\n    let params = assign({\n      'wmode': 'opaque', // Opaque is needed to overlay controls, but can affect playback performance\n      'bgcolor': '#000000' // Using bgcolor prevents a white flash when the object is loading\n    }, options.params);\n\n    // Merge default attributes with ones passed in\n    let attributes = assign({\n      'id': objId,\n      'name': objId, // Both ID and Name needed or swf to identify itself\n      'class': 'vjs-tech'\n    }, options.attributes);\n\n    this.el_ = Flash.embed(options.swf, flashVars, params, attributes);\n    this.el_.tech = this;\n\n    return this.el_;\n  }\n\n  /**\n   * Play for flash tech\n   *\n   * @method play\n   */\n  play() {\n    if (this.ended()) {\n      this.setCurrentTime(0);\n    }\n    this.el_.vjs_play();\n  }\n\n  /**\n   * Pause for flash tech\n   *\n   * @method pause\n   */\n  pause() {\n    this.el_.vjs_pause();\n  }\n\n  /**\n   * Get/set video\n   *\n   * @param {Object=} src Source object\n   * @return {Object}\n   * @method src\n   */\n  src(src) {\n    if (src === undefined) {\n      return this.currentSrc();\n    }\n\n    // Setting src through `src` not `setSrc` will be deprecated\n    return this.setSrc(src);\n  }\n\n  /**\n   * Set video\n   *\n   * @param {Object=} src Source object\n   * @deprecated\n   * @method setSrc\n   */\n  setSrc(src) {\n    // Make sure source URL is absolute.\n    src = Url.getAbsoluteURL(src);\n    this.el_.vjs_src(src);\n\n    // Currently the SWF doesn't autoplay if you load a source later.\n    // e.g. Load player w/ no source, wait 2s, set src.\n    if (this.autoplay()) {\n      var tech = this;\n      this.setTimeout(function(){ tech.play(); }, 0);\n    }\n  }\n\n  /**\n   * Returns true if the tech is currently seeking.\n   * @return {boolean} true if seeking\n   */\n  seeking() {\n    return this.lastSeekTarget_ !== undefined;\n  }\n\n  /**\n   * Set current time\n   *\n   * @param {Number} time Current time of video\n   * @method setCurrentTime\n   */\n  setCurrentTime(time) {\n    let seekable = this.seekable();\n    if (seekable.length) {\n      // clamp to the current seekable range\n      time = time > seekable.start(0) ? time : seekable.start(0);\n      time = time < seekable.end(seekable.length - 1) ? time : seekable.end(seekable.length - 1);\n\n      this.lastSeekTarget_ = time;\n      this.trigger('seeking');\n      this.el_.vjs_setProperty('currentTime', time);\n      super.setCurrentTime();\n    }\n  }\n\n  /**\n   * Get current time\n   *\n   * @param {Number=} time Current time of video\n   * @return {Number} Current time\n   * @method currentTime\n   */\n  currentTime(time) {\n    // when seeking make the reported time keep up with the requested time\n    // by reading the time we're seeking to\n    if (this.seeking()) {\n      return this.lastSeekTarget_ || 0;\n    }\n    return this.el_.vjs_getProperty('currentTime');\n  }\n\n  /**\n   * Get current source\n   *\n   * @method currentSrc\n   */\n  currentSrc() {\n    if (this.currentSource_) {\n      return this.currentSource_.src;\n    } else {\n      return this.el_.vjs_getProperty('currentSrc');\n    }\n  }\n\n  /**\n   * Load media into player\n   *\n   * @method load\n   */\n  load() {\n    this.el_.vjs_load();\n  }\n\n  /**\n   * Get poster\n   *\n   * @method poster\n   */\n  poster() {\n    this.el_.vjs_getProperty('poster');\n  }\n\n  /**\n   * Poster images are not handled by the Flash tech so make this a no-op\n   *\n   * @method setPoster\n   */\n  setPoster() {}\n\n  /**\n   * Determine if can seek in media\n   *\n   * @return {TimeRangeObject}\n   * @method seekable\n   */\n  seekable() {\n    const duration = this.duration();\n    if (duration === 0) {\n      return createTimeRange();\n    }\n    return createTimeRange(0, duration);\n  }\n\n  /**\n   * Get buffered time range\n   *\n   * @return {TimeRangeObject}\n   * @method buffered\n   */\n  buffered() {\n    let ranges = this.el_.vjs_getProperty('buffered');\n    if (ranges.length === 0) {\n      return createTimeRange();\n    }\n    return createTimeRange(ranges[0][0], ranges[0][1]);\n  }\n\n  /**\n   * Get fullscreen support -\n   * Flash does not allow fullscreen through javascript\n   * so always returns false\n   *\n   * @return {Boolean} false\n   * @method supportsFullScreen\n   */\n  supportsFullScreen() {\n    return false; // Flash does not allow fullscreen through javascript\n  }\n\n  /**\n   * Request to enter fullscreen\n   * Flash does not allow fullscreen through javascript\n   * so always returns false\n   *\n   * @return {Boolean} false\n   * @method enterFullScreen\n   */\n  enterFullScreen() {\n    return false;\n  }\n\n}\n\n\n// Create setters and getters for attributes\nconst _api = Flash.prototype;\nconst _readWrite = 'rtmpConnection,rtmpStream,preload,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted'.split(',');\nconst _readOnly = 'networkState,readyState,initialTime,duration,startOffsetTime,paused,ended,videoTracks,audioTracks,videoWidth,videoHeight'.split(',');\n\nfunction _createSetter(attr){\n  var attrUpper = attr.charAt(0).toUpperCase() + attr.slice(1);\n  _api['set'+attrUpper] = function(val){ return this.el_.vjs_setProperty(attr, val); };\n}\nfunction _createGetter(attr) {\n  _api[attr] = function(){ return this.el_.vjs_getProperty(attr); };\n}\n\n// Create getter and setters for all read/write attributes\nfor (let i = 0; i < _readWrite.length; i++) {\n  _createGetter(_readWrite[i]);\n  _createSetter(_readWrite[i]);\n}\n\n// Create getters for read-only attributes\nfor (let i = 0; i < _readOnly.length; i++) {\n  _createGetter(_readOnly[i]);\n}\n\n/* Flash Support Testing -------------------------------------------------------- */\n\nFlash.isSupported = function(){\n  return Flash.version()[0] >= 10;\n  // return swfobject.hasFlashPlayerVersion('10');\n};\n\n// Add Source Handler pattern functions to this tech\nTech.withSourceHandlers(Flash);\n\n/*\n * The default native source handler.\n * This simply passes the source to the video element. Nothing fancy.\n *\n * @param  {Object} source   The source object\n * @param  {Flash} tech  The instance of the Flash tech\n */\nFlash.nativeSourceHandler = {};\n\n/*\n * Check Flash can handle the source natively\n *\n * @param  {Object} source  The source object\n * @return {String}         'probably', 'maybe', or '' (empty string)\n */\nFlash.nativeSourceHandler.canHandleSource = function(source){\n  var type;\n\n  function guessMimeType(src) {\n    var ext = Url.getFileExtension(src);\n    if (ext) {\n      return `video/${ext}`;\n    }\n    return '';\n  }\n\n  if (!source.type) {\n    type = guessMimeType(source.src);\n  } else {\n    // Strip code information from the type because we don't get that specific\n    type = source.type.replace(/;.*/, '').toLowerCase();\n  }\n\n  if (type in Flash.formats) {\n    return 'maybe';\n  }\n\n  return '';\n};\n\n/*\n * Pass the source to the flash object\n * Adaptive source handlers will have more complicated workflows before passing\n * video data to the video element\n *\n * @param  {Object} source    The source object\n * @param  {Flash} tech   The instance of the Flash tech\n */\nFlash.nativeSourceHandler.handleSource = function(source, tech){\n  tech.setSrc(source.src);\n};\n\n/*\n * Clean up the source handler when disposing the player or switching sources..\n * (no cleanup is needed when supporting the format natively)\n */\nFlash.nativeSourceHandler.dispose = function(){};\n\n// Register the native source handler\nFlash.registerSourceHandler(Flash.nativeSourceHandler);\n\nFlash.formats = {\n  'video/flv': 'FLV',\n  'video/x-flv': 'FLV',\n  'video/mp4': 'MP4',\n  'video/m4v': 'MP4'\n};\n\nFlash.onReady = function(currSwf){\n  let el = Dom.getEl(currSwf);\n  let tech = el && el.tech;\n\n  // if there is no el then the tech has been disposed\n  // and the tech element was removed from the player div\n  if (tech && tech.el()) {\n    // check that the flash object is really ready\n    Flash.checkReady(tech);\n  }\n};\n\n// The SWF isn't always ready when it says it is. Sometimes the API functions still need to be added to the object.\n// If it's not ready, we set a timeout to check again shortly.\nFlash.checkReady = function(tech){\n  // stop worrying if the tech has been disposed\n  if (!tech.el()) {\n    return;\n  }\n\n  // check if API property exists\n  if (tech.el().vjs_getProperty) {\n    // tell tech it's ready\n    tech.triggerReady();\n  } else {\n    // wait longer\n    this.setTimeout(function(){\n      Flash['checkReady'](tech);\n    }, 50);\n  }\n};\n\n// Trigger events from the swf on the player\nFlash.onEvent = function(swfID, eventName){\n  let tech = Dom.getEl(swfID).tech;\n  tech.trigger(eventName);\n};\n\n// Log errors from the swf\nFlash.onError = function(swfID, err){\n  const tech = Dom.getEl(swfID).tech;\n\n  // trigger MEDIA_ERR_SRC_NOT_SUPPORTED\n  if (err === 'srcnotfound') {\n    return tech.error(4);\n  }\n\n  // trigger a custom error\n  tech.error('FLASH: ' + err);\n};\n\n// Flash Version Check\nFlash.version = function(){\n  let version = '0,0,0';\n\n  // IE\n  try {\n    version = new window.ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\\D+/g, ',').match(/^,?(.+),?$/)[1];\n\n  // other browsers\n  } catch(e) {\n    try {\n      if (navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin){\n        version = (navigator.plugins['Shockwave Flash 2.0'] || navigator.plugins['Shockwave Flash']).description.replace(/\\D+/g, ',').match(/^,?(.+),?$/)[1];\n      }\n    } catch(err) {}\n  }\n  return version.split(',');\n};\n\n// Flash embedding method. Only used in non-iframe mode\nFlash.embed = function(swf, flashVars, params, attributes){\n  const code = Flash.getEmbedCode(swf, flashVars, params, attributes);\n\n  // Get element by embedding code and retrieving created element\n  const obj = Dom.createEl('div', { innerHTML: code }).childNodes[0];\n\n  return obj;\n};\n\nFlash.getEmbedCode = function(swf, flashVars, params, attributes){\n  const objTag = '<object type=\"application/x-shockwave-flash\" ';\n  let flashVarsString = '';\n  let paramsString = '';\n  let attrsString = '';\n\n  // Convert flash vars to string\n  if (flashVars) {\n    Object.getOwnPropertyNames(flashVars).forEach(function(key){\n      flashVarsString += `${key}=${flashVars[key]}&amp;`;\n    });\n  }\n\n  // Add swf, flashVars, and other default params\n  params = assign({\n    'movie': swf,\n    'flashvars': flashVarsString,\n    'allowScriptAccess': 'always', // Required to talk to swf\n    'allowNetworking': 'all' // All should be default, but having security issues.\n  }, params);\n\n  // Create param tags string\n  Object.getOwnPropertyNames(params).forEach(function(key){\n    paramsString += `<param name=\"${key}\" value=\"${params[key]}\" />`;\n  });\n\n  attributes = assign({\n    // Add swf to attributes (need both for IE and Others to work)\n    'data': swf,\n\n    // Default to 100% width/height\n    'width': '100%',\n    'height': '100%'\n\n  }, attributes);\n\n  // Create Attributes string\n  Object.getOwnPropertyNames(attributes).forEach(function(key){\n    attrsString += `${key}=\"${attributes[key]}\" `;\n  });\n\n  return `${objTag}${attrsString}>${paramsString}</object>`;\n};\n\n// Run Flash through the RTMP decorator\nFlashRtmpDecorator(Flash);\n\nComponent.registerComponent('Flash', Flash);\nexport default Flash;\n",
 
    "/**\n * @file html5.js\n * HTML5 Media Controller - Wrapper for HTML5 Media API\n */\n\nimport Tech from './tech.js';\nimport Component from '../component';\nimport * as Dom from '../utils/dom.js';\nimport * as Url from '../utils/url.js';\nimport * as Fn from '../utils/fn.js';\nimport log from '../utils/log.js';\nimport * as browser from '../utils/browser.js';\nimport document from 'global/document';\nimport window from 'global/window';\nimport assign from 'object.assign';\nimport mergeOptions from '../utils/merge-options.js';\n\n/**\n * HTML5 Media Controller - Wrapper for HTML5 Media API\n *\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready Ready callback function\n * @extends Tech\n * @class Html5\n */\nclass Html5 extends Tech {\n\n  constructor(options, ready){\n    super(options, ready);\n\n    const source = options.source;\n\n    // Set the source if one is provided\n    // 1) Check if the source is new (if not, we want to keep the original so playback isn't interrupted)\n    // 2) Check to see if the network state of the tag was failed at init, and if so, reset the source\n    // anyway so the error gets fired.\n    if (source && (this.el_.currentSrc !== source.src || (options.tag && options.tag.initNetworkState_ === 3))) {\n      this.setSource(source);\n    } else {\n      this.handleLateInit_(this.el_);\n    }\n\n    if (this.el_.hasChildNodes()) {\n\n      let nodes = this.el_.childNodes;\n      let nodesLength = nodes.length;\n      let removeNodes = [];\n\n      while (nodesLength--) {\n        let node = nodes[nodesLength];\n        let nodeName = node.nodeName.toLowerCase();\n        if (nodeName === 'track') {\n          if (!this.featuresNativeTextTracks) {\n            // Empty video tag tracks so the built-in player doesn't use them also.\n            // This may not be fast enough to stop HTML5 browsers from reading the tags\n            // so we'll need to turn off any default tracks if we're manually doing\n            // captions and subtitles. videoElement.textTracks\n            removeNodes.push(node);\n          } else {\n            this.remoteTextTracks().addTrack_(node.track);\n          }\n        }\n      }\n\n      for (let i=0; i<removeNodes.length; i++) {\n        this.el_.removeChild(removeNodes[i]);\n      }\n    }\n\n    if (this.featuresNativeTextTracks) {\n      this.handleTextTrackChange_ = Fn.bind(this, this.handleTextTrackChange);\n      this.handleTextTrackAdd_ = Fn.bind(this, this.handleTextTrackAdd);\n      this.handleTextTrackRemove_ = Fn.bind(this, this.handleTextTrackRemove);\n      this.proxyNativeTextTracks_();\n    }\n\n    // Determine if native controls should be used\n    // Our goal should be to get the custom controls on mobile solid everywhere\n    // so we can remove this all together. Right now this will block custom\n    // controls on touch enabled laptops like the Chrome Pixel\n    if (browser.TOUCH_ENABLED && options.nativeControlsForTouch === true ||\n        browser.IS_IPHONE ||\n        browser.IS_NATIVE_ANDROID) {\n      this.setControls(true);\n    }\n\n    this.triggerReady();\n  }\n\n  /**\n   * Dispose of html5 media element\n   *\n   * @method dispose\n   */\n  dispose() {\n    let tt = this.el().textTracks;\n    let emulatedTt = this.textTracks();\n\n    // remove native event listeners\n    if (tt && tt.removeEventListener) {\n      tt.removeEventListener('change', this.handleTextTrackChange_);\n      tt.removeEventListener('addtrack', this.handleTextTrackAdd_);\n      tt.removeEventListener('removetrack', this.handleTextTrackRemove_);\n    }\n\n    // clearout the emulated text track list.\n    let i = emulatedTt.length;\n\n    while (i--) {\n      emulatedTt.removeTrack_(emulatedTt[i]);\n    }\n\n\n    Html5.disposeMediaElement(this.el_);\n    super.dispose();\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = this.options_.tag;\n\n    // Check if this browser supports moving the element into the box.\n    // On the iPhone video will break if you move the element,\n    // So we have to create a brand new element.\n    if (!el || this['movingMediaElementInDOM'] === false) {\n\n      // If the original tag is still there, clone and remove it.\n      if (el) {\n        const clone = el.cloneNode(true);\n        el.parentNode.insertBefore(clone, el);\n        Html5.disposeMediaElement(el);\n        el = clone;\n      } else {\n        el = document.createElement('video');\n\n        // determine if native controls should be used\n        let tagAttributes = this.options_.tag && Dom.getElAttributes(this.options_.tag);\n        let attributes = mergeOptions({}, tagAttributes);\n        if (!browser.TOUCH_ENABLED || this.options_.nativeControlsForTouch !== true) {\n          delete attributes.controls;\n        }\n\n        Dom.setElAttributes(el,\n          assign(attributes, {\n            id: this.options_.techId,\n            class: 'vjs-tech'\n          })\n        );\n      }\n    }\n\n    // Update specific tag settings, in case they were overridden\n    let settingsAttrs = ['autoplay','preload','loop','muted'];\n    for (let i = settingsAttrs.length - 1; i >= 0; i--) {\n      const attr = settingsAttrs[i];\n      let overwriteAttrs = {};\n      if (typeof this.options_[attr] !== 'undefined') {\n        overwriteAttrs[attr] = this.options_[attr];\n      }\n      Dom.setElAttributes(el, overwriteAttrs);\n    }\n\n    return el;\n    // jenniisawesome = true;\n  }\n\n  // If we're loading the playback object after it has started loading\n  // or playing the video (often with autoplay on) then the loadstart event\n  // has already fired and we need to fire it manually because many things\n  // rely on it.\n  handleLateInit_(el) {\n    if (el.networkState === 0 || el.networkState === 3) {\n      // The video element hasn't started loading the source yet\n      // or didn't find a source\n      return;\n    }\n\n    if (el.readyState === 0) {\n      // NetworkState is set synchronously BUT loadstart is fired at the\n      // end of the current stack, usually before setInterval(fn, 0).\n      // So at this point we know loadstart may have already fired or is\n      // about to fire, and either way the player hasn't seen it yet.\n      // We don't want to fire loadstart prematurely here and cause a\n      // double loadstart so we'll wait and see if it happens between now\n      // and the next loop, and fire it if not.\n      // HOWEVER, we also want to make sure it fires before loadedmetadata\n      // which could also happen between now and the next loop, so we'll\n      // watch for that also.\n      let loadstartFired = false;\n      let setLoadstartFired = function() {\n        loadstartFired = true;\n      };\n      this.on('loadstart', setLoadstartFired);\n\n      let triggerLoadstart = function() {\n        // We did miss the original loadstart. Make sure the player\n        // sees loadstart before loadedmetadata\n        if (!loadstartFired) {\n          this.trigger('loadstart');\n        }\n      };\n      this.on('loadedmetadata', triggerLoadstart);\n\n      this.ready(function(){\n        this.off('loadstart', setLoadstartFired);\n        this.off('loadedmetadata', triggerLoadstart);\n\n        if (!loadstartFired) {\n          // We did miss the original native loadstart. Fire it now.\n          this.trigger('loadstart');\n        }\n      });\n\n      return;\n    }\n\n    // From here on we know that loadstart already fired and we missed it.\n    // The other readyState events aren't as much of a problem if we double\n    // them, so not going to go to as much trouble as loadstart to prevent\n    // that unless we find reason to.\n    let eventsToTrigger = ['loadstart'];\n\n    // loadedmetadata: newly equal to HAVE_METADATA (1) or greater\n    eventsToTrigger.push('loadedmetadata');\n\n    // loadeddata: newly increased to HAVE_CURRENT_DATA (2) or greater\n    if (el.readyState >= 2) {\n      eventsToTrigger.push('loadeddata');\n    }\n\n    // canplay: newly increased to HAVE_FUTURE_DATA (3) or greater\n    if (el.readyState >= 3) {\n      eventsToTrigger.push('canplay');\n    }\n\n    // canplaythrough: newly equal to HAVE_ENOUGH_DATA (4)\n    if (el.readyState >= 4) {\n      eventsToTrigger.push('canplaythrough');\n    }\n\n    // We still need to give the player time to add event listeners\n    this.ready(function(){\n      eventsToTrigger.forEach(function(type){\n        this.trigger(type);\n      }, this);\n    });\n  }\n\n  proxyNativeTextTracks_() {\n    let tt = this.el().textTracks;\n\n    if (tt && tt.addEventListener) {\n      tt.addEventListener('change', this.handleTextTrackChange_);\n      tt.addEventListener('addtrack', this.handleTextTrackAdd_);\n      tt.addEventListener('removetrack', this.handleTextTrackRemove_);\n    }\n  }\n\n  handleTextTrackChange(e) {\n    let tt = this.textTracks();\n    this.textTracks().trigger({\n      type: 'change',\n      target: tt,\n      currentTarget: tt,\n      srcElement: tt\n    });\n  }\n\n  handleTextTrackAdd(e) {\n    this.textTracks().addTrack_(e.track);\n  }\n\n  handleTextTrackRemove(e) {\n    this.textTracks().removeTrack_(e.track);\n  }\n\n  /**\n   * Play for html5 tech\n   *\n   * @method play\n   */\n  play() { this.el_.play(); }\n\n  /**\n   * Pause for html5 tech\n   *\n   * @method pause\n   */\n  pause() { this.el_.pause(); }\n\n  /**\n   * Paused for html5 tech\n   *\n   * @return {Boolean}\n   * @method paused\n   */\n  paused() { return this.el_.paused; }\n\n  /**\n   * Get current time\n   *\n   * @return {Number}\n   * @method currentTime\n   */\n  currentTime() { return this.el_.currentTime; }\n\n  /**\n   * Set current time\n   *\n   * @param {Number} seconds Current time of video\n   * @method setCurrentTime\n   */\n  setCurrentTime(seconds) {\n    try {\n      this.el_.currentTime = seconds;\n    } catch(e) {\n      log(e, 'Video is not ready. (Video.js)');\n      // this.warning(VideoJS.warnings.videoNotReady);\n    }\n  }\n\n  /**\n   * Get duration\n   *\n   * @return {Number}\n   * @method duration\n   */\n  duration() { return this.el_.duration || 0; }\n\n  /**\n   * Get a TimeRange object that represents the intersection\n   * of the time ranges for which the user agent has all\n   * relevant media\n   *\n   * @return {TimeRangeObject}\n   * @method buffered\n   */\n  buffered() { return this.el_.buffered; }\n\n  /**\n   * Get volume level\n   *\n   * @return {Number}\n   * @method volume\n   */\n  volume() { return this.el_.volume; }\n\n  /**\n   * Set volume level\n   *\n   * @param {Number} percentAsDecimal Volume percent as a decimal\n   * @method setVolume\n   */\n  setVolume(percentAsDecimal) { this.el_.volume = percentAsDecimal; }\n\n  /**\n   * Get if muted\n   *\n   * @return {Boolean}\n   * @method muted\n   */\n  muted() { return this.el_.muted; }\n\n  /**\n   * Set muted\n   *\n   * @param {Boolean} If player is to be muted or note\n   * @method setMuted\n   */\n  setMuted(muted) { this.el_.muted = muted; }\n\n  /**\n   * Get player width\n   *\n   * @return {Number}\n   * @method width\n   */\n  width() { return this.el_.offsetWidth; }\n\n  /**\n   * Get player height\n   *\n   * @return {Number}\n   * @method height\n   */\n  height() {  return this.el_.offsetHeight; }\n\n  /**\n   * Get if there is fullscreen support\n   *\n   * @return {Boolean}\n   * @method supportsFullScreen\n   */\n  supportsFullScreen() {\n    if (typeof this.el_.webkitEnterFullScreen === 'function') {\n      let userAgent = window.navigator.userAgent;\n      // Seems to be broken in Chromium/Chrome && Safari in Leopard\n      if (/Android/.test(userAgent) || !/Chrome|Mac OS X 10.5/.test(userAgent)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Request to enter fullscreen\n   *\n   * @method enterFullScreen\n   */\n  enterFullScreen() {\n    var video = this.el_;\n\n    if ('webkitDisplayingFullscreen' in video) {\n      this.one('webkitbeginfullscreen', function() {\n        this.one('webkitendfullscreen', function() {\n          this.trigger('fullscreenchange', { isFullscreen: false });\n        });\n\n        this.trigger('fullscreenchange', { isFullscreen: true });\n      });\n    }\n\n    if (video.paused && video.networkState <= video.HAVE_METADATA) {\n      // attempt to prime the video element for programmatic access\n      // this isn't necessary on the desktop but shouldn't hurt\n      this.el_.play();\n\n      // playing and pausing synchronously during the transition to fullscreen\n      // can get iOS ~6.1 devices into a play/pause loop\n      this.setTimeout(function(){\n        video.pause();\n        video.webkitEnterFullScreen();\n      }, 0);\n    } else {\n      video.webkitEnterFullScreen();\n    }\n  }\n\n  /**\n   * Request to exit fullscreen\n   *\n   * @method exitFullScreen\n   */\n  exitFullScreen() {\n    this.el_.webkitExitFullScreen();\n  }\n\n  /**\n   * Get/set video\n   *\n   * @param {Object=} src Source object\n   * @return {Object}\n   * @method src\n   */\n  src(src) {\n    if (src === undefined) {\n      return this.el_.src;\n    } else {\n      // Setting src through `src` instead of `setSrc` will be deprecated\n      this.setSrc(src);\n    }\n  }\n\n  /**\n   * Set video\n   *\n   * @param {Object} src Source object\n   * @deprecated\n   * @method setSrc\n   */\n  setSrc(src) {\n    this.el_.src = src;\n  }\n\n  /**\n   * Load media into player\n   *\n   * @method load\n   */\n  load(){\n    this.el_.load();\n  }\n\n  /**\n   * Get current source\n   *\n   * @return {Object}\n   * @method currentSrc\n   */\n  currentSrc() { return this.el_.currentSrc; }\n\n  /**\n   * Get poster\n   *\n   * @return {String}\n   * @method poster\n   */\n  poster() { return this.el_.poster; }\n\n  /**\n   * Set poster\n   *\n   * @param {String} val URL to poster image\n   * @method\n   */\n  setPoster(val) { this.el_.poster = val; }\n\n  /**\n   * Get preload attribute\n   *\n   * @return {String}\n   * @method preload\n   */\n  preload() { return this.el_.preload; }\n\n  /**\n   * Set preload attribute\n   *\n   * @param {String} val Value for preload attribute\n   * @method setPreload\n   */\n  setPreload(val) { this.el_.preload = val; }\n\n  /**\n   * Get autoplay attribute\n   *\n   * @return {String}\n   * @method autoplay\n   */\n  autoplay() { return this.el_.autoplay; }\n\n  /**\n   * Set autoplay attribute\n   *\n   * @param {String} val Value for preload attribute\n   * @method setAutoplay\n   */\n  setAutoplay(val) { this.el_.autoplay = val; }\n\n  /**\n   * Get controls attribute\n   *\n   * @return {String}\n   * @method controls\n   */\n  controls() { return this.el_.controls; }\n\n  /**\n   * Set controls attribute\n   *\n   * @param {String} val Value for controls attribute\n   * @method setControls\n   */\n  setControls(val) { this.el_.controls = !!val; }\n\n  /**\n   * Get loop attribute\n   *\n   * @return {String}\n   * @method loop\n   */\n  loop() { return this.el_.loop; }\n\n  /**\n   * Set loop attribute\n   *\n   * @param {String} val Value for loop attribute\n   * @method setLoop\n   */\n  setLoop(val) { this.el_.loop = val; }\n\n  /**\n   * Get error value\n   *\n   * @return {String}\n   * @method error\n   */\n  error() { return this.el_.error; }\n\n  /**\n   * Get whether or not the player is in the \"seeking\" state\n   *\n   * @return {Boolean}\n   * @method seeking\n   */\n  seeking() { return this.el_.seeking; }\n\n  /**\n   * Get a TimeRanges object that represents the\n   * ranges of the media resource to which it is possible\n   * for the user agent to seek.\n   *\n   * @return {TimeRangeObject}\n   * @method seekable\n   */\n  seekable() { return this.el_.seekable; }\n\n  /**\n   * Get if video ended\n   *\n   * @return {Boolean}\n   * @method ended\n   */\n  ended() { return this.el_.ended; }\n\n  /**\n   * Get the value of the muted content attribute\n   * This attribute has no dynamic effect, it only\n   * controls the default state of the element\n   *\n   * @return {Boolean}\n   * @method defaultMuted\n   */\n  defaultMuted() { return this.el_.defaultMuted; }\n\n  /**\n   * Get desired speed at which the media resource is to play\n   *\n   * @return {Number}\n   * @method playbackRate\n   */\n  playbackRate() { return this.el_.playbackRate; }\n\n  /**\n   * Returns a TimeRanges object that represents the ranges of the\n   * media resource that the user agent has played.\n   * @return {TimeRangeObject} the range of points on the media\n   * timeline that has been reached through normal playback\n   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-played\n   */\n  played() { return this.el_.played; }\n\n  /**\n   * Set desired speed at which the media resource is to play\n   *\n   * @param {Number} val Speed at which the media resource is to play\n   * @method setPlaybackRate\n   */\n  setPlaybackRate(val) { this.el_.playbackRate = val; }\n\n  /**\n   * Get the current state of network activity for the element, from\n   * the list below\n   * NETWORK_EMPTY (numeric value 0)\n   * NETWORK_IDLE (numeric value 1)\n   * NETWORK_LOADING (numeric value 2)\n   * NETWORK_NO_SOURCE (numeric value 3)\n   *\n   * @return {Number}\n   * @method networkState\n   */\n  networkState() { return this.el_.networkState; }\n\n  /**\n   * Get a value that expresses the current state of the element\n   * with respect to rendering the current playback position, from\n   * the codes in the list below\n   * HAVE_NOTHING (numeric value 0)\n   * HAVE_METADATA (numeric value 1)\n   * HAVE_CURRENT_DATA (numeric value 2)\n   * HAVE_FUTURE_DATA (numeric value 3)\n   * HAVE_ENOUGH_DATA (numeric value 4)\n   *\n   * @return {Number}\n   * @method readyState\n   */\n  readyState() { return this.el_.readyState; }\n\n  /**\n   * Get width of video\n   *\n   * @return {Number}\n   * @method videoWidth\n   */\n  videoWidth() { return this.el_.videoWidth; }\n\n  /**\n   * Get height of video\n   *\n   * @return {Number}\n   * @method videoHeight\n   */\n  videoHeight() { return this.el_.videoHeight; }\n\n  /**\n   * Get text tracks\n   *\n   * @return {TextTrackList}\n   * @method textTracks\n   */\n  textTracks() {\n    return super.textTracks();\n  }\n\n  /**\n   * Creates and returns a text track object\n   *\n   * @param {String} kind Text track kind (subtitles, captions, descriptions\n   *                                       chapters and metadata)\n   * @param {String=} label Label to identify the text track\n   * @param {String=} language Two letter language abbreviation\n   * @return {TextTrackObject}\n   * @method addTextTrack\n   */\n  addTextTrack(kind, label, language) {\n    if (!this['featuresNativeTextTracks']) {\n      return super.addTextTrack(kind, label, language);\n    }\n\n    return this.el_.addTextTrack(kind, label, language);\n  }\n\n  /**\n   * Creates and returns a remote text track object\n   *\n   * @param {Object} options The object should contain values for\n   * kind, language, label and src (location of the WebVTT file)\n   * @return {TextTrackObject}\n   * @method addRemoteTextTrack\n   */\n  addRemoteTextTrack(options={}) {\n    if (!this['featuresNativeTextTracks']) {\n      return super.addRemoteTextTrack(options);\n    }\n\n    var track = document.createElement('track');\n\n    if (options['kind']) {\n      track['kind'] = options['kind'];\n    }\n    if (options['label']) {\n      track['label'] = options['label'];\n    }\n    if (options['language'] || options['srclang']) {\n      track['srclang'] = options['language'] || options['srclang'];\n    }\n    if (options['default']) {\n      track['default'] = options['default'];\n    }\n    if (options['id']) {\n      track['id'] = options['id'];\n    }\n    if (options['src']) {\n      track['src'] = options['src'];\n    }\n\n    this.el().appendChild(track);\n\n    this.remoteTextTracks().addTrack_(track.track);\n\n    return track;\n  }\n\n  /**\n   * Remove remote text track from TextTrackList object\n   *\n   * @param {TextTrackObject} track Texttrack object to remove\n   * @method removeRemoteTextTrack\n   */\n  removeRemoteTextTrack(track) {\n    if (!this['featuresNativeTextTracks']) {\n      return super.removeRemoteTextTrack(track);\n    }\n\n    var tracks, i;\n\n    this.remoteTextTracks().removeTrack_(track);\n\n    tracks = this.el().querySelectorAll('track');\n\n    i = tracks.length;\n    while (i--) {\n      if (track === tracks[i] || track === tracks[i].track) {\n        this.el().removeChild(tracks[i]);\n      }\n    }\n  }\n\n}\n\n\n/* HTML5 Support Testing ---------------------------------------------------- */\n\n/*\n* Element for testing browser HTML5 video capabilities\n*\n* @type {Element}\n* @constant\n* @private\n*/\nHtml5.TEST_VID = document.createElement('video');\nlet track = document.createElement('track');\ntrack.kind = 'captions';\ntrack.srclang = 'en';\ntrack.label = 'English';\nHtml5.TEST_VID.appendChild(track);\n\n/*\n * Check if HTML5 video is supported by this browser/device\n *\n * @return {Boolean}\n */\nHtml5.isSupported = function(){\n  // IE9 with no Media Player is a LIAR! (#984)\n  try {\n    Html5.TEST_VID['volume'] = 0.5;\n  } catch (e) {\n    return false;\n  }\n\n  return !!Html5.TEST_VID.canPlayType;\n};\n\n// Add Source Handler pattern functions to this tech\nTech.withSourceHandlers(Html5);\n\n/*\n * The default native source handler.\n * This simply passes the source to the video element. Nothing fancy.\n *\n * @param  {Object} source   The source object\n * @param  {Html5} tech  The instance of the HTML5 tech\n */\nHtml5.nativeSourceHandler = {};\n\n/*\n * Check if the video element can handle the source natively\n *\n * @param  {Object} source  The source object\n * @return {String}         'probably', 'maybe', or '' (empty string)\n */\nHtml5.nativeSourceHandler.canHandleSource = function(source){\n  var match, ext;\n\n  function canPlayType(type){\n    // IE9 on Windows 7 without MediaPlayer throws an error here\n    // https://github.com/videojs/video.js/issues/519\n    try {\n      return Html5.TEST_VID.canPlayType(type);\n    } catch(e) {\n      return '';\n    }\n  }\n\n  // If a type was provided we should rely on that\n  if (source.type) {\n    return canPlayType(source.type);\n  } else if (source.src) {\n    // If no type, fall back to checking 'video/[EXTENSION]'\n    ext = Url.getFileExtension(source.src);\n\n    return canPlayType(`video/${ext}`);\n  }\n\n  return '';\n};\n\n/*\n * Pass the source to the video element\n * Adaptive source handlers will have more complicated workflows before passing\n * video data to the video element\n *\n * @param  {Object} source    The source object\n * @param  {Html5} tech   The instance of the Html5 tech\n */\nHtml5.nativeSourceHandler.handleSource = function(source, tech){\n  tech.setSrc(source.src);\n};\n\n/*\n* Clean up the source handler when disposing the player or switching sources..\n* (no cleanup is needed when supporting the format natively)\n*/\nHtml5.nativeSourceHandler.dispose = function(){};\n\n// Register the native source handler\nHtml5.registerSourceHandler(Html5.nativeSourceHandler);\n\n/*\n * Check if the volume can be changed in this browser/device.\n * Volume cannot be changed in a lot of mobile devices.\n * Specifically, it can't be changed from 1 on iOS.\n *\n * @return {Boolean}\n */\nHtml5.canControlVolume = function(){\n  var volume =  Html5.TEST_VID.volume;\n  Html5.TEST_VID.volume = (volume / 2) + 0.1;\n  return volume !== Html5.TEST_VID.volume;\n};\n\n/*\n * Check if playbackRate is supported in this browser/device.\n *\n * @return {Number} [description]\n */\nHtml5.canControlPlaybackRate = function(){\n  var playbackRate = Html5.TEST_VID.playbackRate;\n  Html5.TEST_VID.playbackRate = (playbackRate / 2) + 0.1;\n  return playbackRate !== Html5.TEST_VID.playbackRate;\n};\n\n/*\n * Check to see if native text tracks are supported by this browser/device\n *\n * @return {Boolean}\n */\nHtml5.supportsNativeTextTracks = function() {\n  var supportsTextTracks;\n\n  // Figure out native text track support\n  // If mode is a number, we cannot change it because it'll disappear from view.\n  // Browsers with numeric modes include IE10 and older (<=2013) samsung android models.\n  // Firefox isn't playing nice either with modifying the mode\n  // TODO: Investigate firefox: https://github.com/videojs/video.js/issues/1862\n  supportsTextTracks = !!Html5.TEST_VID.textTracks;\n  if (supportsTextTracks && Html5.TEST_VID.textTracks.length > 0) {\n    supportsTextTracks = typeof Html5.TEST_VID.textTracks[0]['mode'] !== 'number';\n  }\n  if (supportsTextTracks && browser.IS_FIREFOX) {\n    supportsTextTracks = false;\n  }\n  if (supportsTextTracks && !('onremovetrack' in Html5.TEST_VID.textTracks)) {\n    supportsTextTracks = false;\n  }\n\n  return supportsTextTracks;\n};\n\n/**\n * An array of events available on the Html5 tech.\n *\n * @private\n * @type {Array}\n */\nHtml5.Events = [\n  'loadstart',\n  'suspend',\n  'abort',\n  'error',\n  'emptied',\n  'stalled',\n  'loadedmetadata',\n  'loadeddata',\n  'canplay',\n  'canplaythrough',\n  'playing',\n  'waiting',\n  'seeking',\n  'seeked',\n  'ended',\n  'durationchange',\n  'timeupdate',\n  'progress',\n  'play',\n  'pause',\n  'ratechange',\n  'volumechange'\n];\n\n/*\n * Set the tech's volume control support status\n *\n * @type {Boolean}\n */\nHtml5.prototype['featuresVolumeControl'] = Html5.canControlVolume();\n\n/*\n * Set the tech's playbackRate support status\n *\n * @type {Boolean}\n */\nHtml5.prototype['featuresPlaybackRate'] = Html5.canControlPlaybackRate();\n\n/*\n * Set the tech's status on moving the video element.\n * In iOS, if you move a video element in the DOM, it breaks video playback.\n *\n * @type {Boolean}\n */\nHtml5.prototype['movingMediaElementInDOM'] = !browser.IS_IOS;\n\n/*\n * Set the the tech's fullscreen resize support status.\n * HTML video is able to automatically resize when going to fullscreen.\n * (No longer appears to be used. Can probably be removed.)\n */\nHtml5.prototype['featuresFullscreenResize'] = true;\n\n/*\n * Set the tech's progress event support status\n * (this disables the manual progress events of the Tech)\n */\nHtml5.prototype['featuresProgressEvents'] = true;\n\n/*\n * Sets the tech's status on native text track support\n *\n * @type {Boolean}\n */\nHtml5.prototype['featuresNativeTextTracks'] = Html5.supportsNativeTextTracks();\n\n// HTML5 Feature detection and Device Fixes --------------------------------- //\nlet canPlayType;\nconst mpegurlRE = /^application\\/(?:x-|vnd\\.apple\\.)mpegurl/i;\nconst mp4RE = /^video\\/mp4/i;\n\nHtml5.patchCanPlayType = function() {\n  // Android 4.0 and above can play HLS to some extent but it reports being unable to do so\n  if (browser.ANDROID_VERSION >= 4.0) {\n    if (!canPlayType) {\n      canPlayType = Html5.TEST_VID.constructor.prototype.canPlayType;\n    }\n\n    Html5.TEST_VID.constructor.prototype.canPlayType = function(type) {\n      if (type && mpegurlRE.test(type)) {\n        return 'maybe';\n      }\n      return canPlayType.call(this, type);\n    };\n  }\n\n  // Override Android 2.2 and less canPlayType method which is broken\n  if (browser.IS_OLD_ANDROID) {\n    if (!canPlayType) {\n      canPlayType = Html5.TEST_VID.constructor.prototype.canPlayType;\n    }\n\n    Html5.TEST_VID.constructor.prototype.canPlayType = function(type){\n      if (type && mp4RE.test(type)) {\n        return 'maybe';\n      }\n      return canPlayType.call(this, type);\n    };\n  }\n};\n\nHtml5.unpatchCanPlayType = function() {\n  var r = Html5.TEST_VID.constructor.prototype.canPlayType;\n  Html5.TEST_VID.constructor.prototype.canPlayType = canPlayType;\n  canPlayType = null;\n  return r;\n};\n\n// by default, patch the video element\nHtml5.patchCanPlayType();\n\nHtml5.disposeMediaElement = function(el){\n  if (!el) { return; }\n\n  if (el.parentNode) {\n    el.parentNode.removeChild(el);\n  }\n\n  // remove any child track or source nodes to prevent their loading\n  while(el.hasChildNodes()) {\n    el.removeChild(el.firstChild);\n  }\n\n  // remove any src reference. not setting `src=''` because that causes a warning\n  // in firefox\n  el.removeAttribute('src');\n\n  // force the media element to update its loading state by calling load()\n  // however IE on Windows 7N has a bug that throws an error so need a try/catch (#793)\n  if (typeof el.load === 'function') {\n    // wrapping in an iife so it's not deoptimized (#1060#discussion_r10324473)\n    (function() {\n      try {\n        el.load();\n      } catch (e) {\n        // not supported\n      }\n    })();\n  }\n};\n\nComponent.registerComponent('Html5', Html5);\nexport default Html5;\n",
 
    "/**\n * @file loader.js\n */\nimport Component from '../component';\nimport window from 'global/window';\nimport toTitleCase from '../utils/to-title-case.js';\n\n/**\n * The Media Loader is the component that decides which playback technology to load\n * when the player is initialized.\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends Component\n * @class MediaLoader\n */\nclass MediaLoader extends Component {\n\n  constructor(player, options, ready){\n    super(player, options, ready);\n\n    // If there are no sources when the player is initialized,\n    // load the first supported playback technology.\n\n    if (!options.playerOptions['sources'] || options.playerOptions['sources'].length === 0) {\n      for (let i=0, j=options.playerOptions['techOrder']; i<j.length; i++) {\n        let techName = toTitleCase(j[i]);\n        let tech = Component.getComponent(techName);\n\n        // Check if the browser supports this technology\n        if (tech && tech.isSupported()) {\n          player.loadTech_(techName);\n          break;\n        }\n      }\n    } else {\n      // // Loop through playback technologies (HTML5, Flash) and check for support.\n      // // Then load the best source.\n      // // A few assumptions here:\n      // //   All playback technologies respect preload false.\n      player.src(options.playerOptions['sources']);\n    }\n  }\n}\n\nComponent.registerComponent('MediaLoader', MediaLoader);\nexport default MediaLoader;\n",
 
    "/**\n * @file tech.js\n * Media Technology Controller - Base class for media playback\n * technology controllers like Flash and HTML5\n */\n\nimport Component from '../component';\nimport TextTrack from '../tracks/text-track';\nimport TextTrackList from '../tracks/text-track-list';\nimport * as Fn from '../utils/fn.js';\nimport log from '../utils/log.js';\nimport { createTimeRange } from '../utils/time-ranges.js';\nimport { bufferedPercent } from '../utils/buffer.js';\nimport MediaError from '../media-error.js';\nimport window from 'global/window';\nimport document from 'global/document';\n\n/**\n * Base class for media (HTML5 Video, Flash) controllers\n *\n * @param {Object=} options Options object\n * @param {Function=} ready Ready callback function\n * @extends Component\n * @class Tech\n */\nclass Tech extends Component {\n\n  constructor(options={}, ready=function(){}){\n    // we don't want the tech to report user activity automatically.\n    // This is done manually in addControlsListeners\n    options.reportTouchActivity = false;\n    super(null, options, ready);\n\n    // keep track of whether the current source has played at all to\n    // implement a very limited played()\n    this.hasStarted_ = false;\n    this.on('playing', function() {\n      this.hasStarted_ = true;\n    });\n    this.on('loadstart', function() {\n      this.hasStarted_ = false;\n    });\n\n    this.textTracks_ = options.textTracks;\n\n    // Manually track progress in cases where the browser/flash player doesn't report it.\n    if (!this.featuresProgressEvents) {\n      this.manualProgressOn();\n    }\n\n    // Manually track timeupdates in cases where the browser/flash player doesn't report it.\n    if (!this.featuresTimeupdateEvents) {\n      this.manualTimeUpdatesOn();\n    }\n\n    if (options.nativeCaptions === false || options.nativeTextTracks === false) {\n      this.featuresNativeTextTracks = false;\n    }\n\n    if (!this.featuresNativeTextTracks) {\n      this.emulateTextTracks();\n    }\n\n    this.initTextTrackListeners();\n\n    // Turn on component tap events\n    this.emitTapEvents();\n  }\n\n  /* Fallbacks for unsupported event types\n  ================================================================================ */\n  // Manually trigger progress events based on changes to the buffered amount\n  // Many flash players and older HTML5 browsers don't send progress or progress-like events\n  /**\n   * Turn on progress events\n   *\n   * @method manualProgressOn\n   */\n  manualProgressOn() {\n    this.on('durationchange', this.onDurationChange);\n\n    this.manualProgress = true;\n\n    // Trigger progress watching when a source begins loading\n    this.one('ready', this.trackProgress);\n  }\n\n  /**\n   * Turn off progress events\n   *\n   * @method manualProgressOff\n   */\n  manualProgressOff() {\n    this.manualProgress = false;\n    this.stopTrackingProgress();\n\n    this.off('durationchange', this.onDurationChange);\n  }\n\n  /**\n   * Track progress\n   *\n   * @method trackProgress\n   */\n  trackProgress() {\n    this.stopTrackingProgress();\n    this.progressInterval = this.setInterval(Fn.bind(this, function(){\n      // Don't trigger unless buffered amount is greater than last time\n\n      let numBufferedPercent = this.bufferedPercent();\n\n      if (this.bufferedPercent_ !== numBufferedPercent) {\n        this.trigger('progress');\n      }\n\n      this.bufferedPercent_ = numBufferedPercent;\n\n      if (numBufferedPercent === 1) {\n        this.stopTrackingProgress();\n      }\n    }), 500);\n  }\n\n  /**\n   * Update duration\n   *\n   * @method onDurationChange\n   */\n  onDurationChange() {\n    this.duration_ = this.duration();\n  }\n\n  /**\n   * Create and get TimeRange object for buffering\n   *\n   * @return {TimeRangeObject}\n   * @method buffered\n   */\n  buffered() {\n    return createTimeRange(0, 0);\n  }\n\n  /**\n   * Get buffered percent\n   *\n   * @return {Number}\n   * @method bufferedPercent\n   */\n  bufferedPercent() {\n    return bufferedPercent(this.buffered(), this.duration_);\n  }\n\n  /**\n   * Stops tracking progress by clearing progress interval\n   *\n   * @method stopTrackingProgress\n   */\n  stopTrackingProgress() {\n    this.clearInterval(this.progressInterval);\n  }\n\n  /*! Time Tracking -------------------------------------------------------------- */\n  /**\n   * Set event listeners for on play and pause and tracking current time\n   *\n   * @method manualTimeUpdatesOn\n   */\n  manualTimeUpdatesOn() {\n    this.manualTimeUpdates = true;\n\n    this.on('play', this.trackCurrentTime);\n    this.on('pause', this.stopTrackingCurrentTime);\n  }\n\n  /**\n   * Remove event listeners for on play and pause and tracking current time\n   *\n   * @method manualTimeUpdatesOff\n   */\n  manualTimeUpdatesOff() {\n    this.manualTimeUpdates = false;\n    this.stopTrackingCurrentTime();\n    this.off('play', this.trackCurrentTime);\n    this.off('pause', this.stopTrackingCurrentTime);\n  }\n\n  /**\n   * Tracks current time\n   *\n   * @method trackCurrentTime\n   */\n  trackCurrentTime() {\n    if (this.currentTimeInterval) { this.stopTrackingCurrentTime(); }\n    this.currentTimeInterval = this.setInterval(function(){\n      this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n    }, 250); // 42 = 24 fps // 250 is what Webkit uses // FF uses 15\n  }\n\n  /**\n   * Turn off play progress tracking (when paused or dragging)\n   *\n   * @method stopTrackingCurrentTime\n   */\n  stopTrackingCurrentTime() {\n    this.clearInterval(this.currentTimeInterval);\n\n    // #1002 - if the video ends right before the next timeupdate would happen,\n    // the progress bar won't make it all the way to the end\n    this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n  }\n\n  /**\n   * Turn off any manual progress or timeupdate tracking\n   *\n   * @method dispose\n   */\n  dispose() {\n    // clear out text tracks because we can't reuse them between techs\n    let textTracks = this.textTracks();\n\n    if (textTracks) {\n      let i = textTracks.length;\n      while(i--) {\n        this.removeRemoteTextTrack(textTracks[i]);\n      }\n    }\n\n    // Turn off any manual progress or timeupdate tracking\n    if (this.manualProgress) { this.manualProgressOff(); }\n\n    if (this.manualTimeUpdates) { this.manualTimeUpdatesOff(); }\n\n    super.dispose();\n  }\n\n  /**\n   * When invoked without an argument, returns a MediaError object\n   * representing the current error state of the player or null if\n   * there is no error. When invoked with an argument, set the current\n   * error state of the player.\n   * @param {MediaError=} err    Optional an error object\n   * @return {MediaError}        the current error object or null\n   * @method error\n   */\n  error(err) {\n    if (err !== undefined) {\n      if (err instanceof MediaError) {\n        this.error_ = err;\n      } else {\n        this.error_ = new MediaError(err);\n      }\n      this.trigger('error');\n    }\n    return this.error_;\n  }\n\n  /**\n   * Return the time ranges that have been played through for the\n   * current source. This implementation is incomplete. It does not\n   * track the played time ranges, only whether the source has played\n   * at all or not.\n   * @return {TimeRangeObject} a single time range if this video has\n   * played or an empty set of ranges if not.\n   * @method played\n   */\n  played() {\n    if (this.hasStarted_) {\n      return createTimeRange(0, 0);\n    }\n    return createTimeRange();\n  }\n\n  /**\n   * Set current time\n   *\n   * @method setCurrentTime\n   */\n  setCurrentTime() {\n    // improve the accuracy of manual timeupdates\n    if (this.manualTimeUpdates) { this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true }); }\n  }\n\n  /**\n   * Initialize texttrack listeners\n   *\n   * @method initTextTrackListeners\n   */\n  initTextTrackListeners() {\n    let textTrackListChanges = Fn.bind(this, function() {\n      this.trigger('texttrackchange');\n    });\n\n    let tracks = this.textTracks();\n\n    if (!tracks) return;\n\n    tracks.addEventListener('removetrack', textTrackListChanges);\n    tracks.addEventListener('addtrack', textTrackListChanges);\n\n    this.on('dispose', Fn.bind(this, function() {\n      tracks.removeEventListener('removetrack', textTrackListChanges);\n      tracks.removeEventListener('addtrack', textTrackListChanges);\n    }));\n  }\n\n  /**\n   * Emulate texttracks\n   *\n   * @method emulateTextTracks\n   */\n  emulateTextTracks() {\n    if (!window['WebVTT'] && this.el().parentNode != null) {\n      let script = document.createElement('script');\n      script.src = this.options_['vtt.js'] || '../node_modules/vtt.js/dist/vtt.js';\n      this.el().parentNode.appendChild(script);\n      window['WebVTT'] = true;\n    }\n\n    let tracks = this.textTracks();\n    if (!tracks) {\n      return;\n    }\n\n    let textTracksChanges = Fn.bind(this, function() {\n      let updateDisplay = () => this.trigger('texttrackchange');\n\n      updateDisplay();\n\n      for (let i = 0; i < tracks.length; i++) {\n        let track = tracks[i];\n        track.removeEventListener('cuechange', updateDisplay);\n        if (track.mode === 'showing') {\n          track.addEventListener('cuechange', updateDisplay);\n        }\n      }\n    });\n\n    tracks.addEventListener('change', textTracksChanges);\n\n    this.on('dispose', function() {\n      tracks.removeEventListener('change', textTracksChanges);\n    });\n  }\n\n  /*\n   * Provide default methods for text tracks.\n   *\n   * Html5 tech overrides these.\n   */\n\n  /**\n   * Get texttracks\n   *\n   * @returns {TextTrackList}\n   * @method textTracks\n   */\n  textTracks() {\n    this.textTracks_ = this.textTracks_ || new TextTrackList();\n    return this.textTracks_;\n  }\n\n  /**\n   * Get remote texttracks\n   *\n   * @returns {TextTrackList}\n   * @method remoteTextTracks\n   */\n  remoteTextTracks() {\n    this.remoteTextTracks_ = this.remoteTextTracks_ || new TextTrackList();\n    return this.remoteTextTracks_;\n  }\n\n  /**\n   * Creates and returns a remote text track object\n   *\n   * @param {String} kind Text track kind (subtitles, captions, descriptions\n   *                                       chapters and metadata)\n   * @param {String=} label Label to identify the text track\n   * @param {String=} language Two letter language abbreviation\n   * @return {TextTrackObject}\n   * @method addTextTrack\n   */\n  addTextTrack(kind, label, language) {\n    if (!kind) {\n      throw new Error('TextTrack kind is required but was not provided');\n    }\n\n    return createTrackHelper(this, kind, label, language);\n  }\n\n  /**\n   * Creates and returns a remote text track object\n   *\n   * @param {Object} options The object should contain values for\n   * kind, language, label and src (location of the WebVTT file)\n   * @return {TextTrackObject}\n   * @method addRemoteTextTrack\n   */\n  addRemoteTextTrack(options) {\n    let track = createTrackHelper(this, options.kind, options.label, options.language, options);\n    this.remoteTextTracks().addTrack_(track);\n    return {\n      track: track\n    };\n  }\n\n  /**\n   * Remove remote texttrack\n   *\n   * @param {TextTrackObject} track Texttrack to remove\n   * @method removeRemoteTextTrack\n   */\n  removeRemoteTextTrack(track) {\n    this.textTracks().removeTrack_(track);\n    this.remoteTextTracks().removeTrack_(track);\n  }\n\n  /**\n   * Provide a default setPoster method for techs\n   * Poster support for techs should be optional, so we don't want techs to\n   * break if they don't have a way to set a poster.\n   *\n   * @method setPoster\n   */\n  setPoster() {}\n\n}\n\n/*\n * List of associated text tracks\n *\n * @type {Array}\n * @private\n */\nTech.prototype.textTracks_;\n\nvar createTrackHelper = function(self, kind, label, language, options={}) {\n  let tracks = self.textTracks();\n\n  options.kind = kind;\n\n  if (label) {\n    options.label = label;\n  }\n  if (language) {\n    options.language = language;\n  }\n  options.tech = self;\n\n  let track = new TextTrack(options);\n  tracks.addTrack_(track);\n\n  return track;\n};\n\nTech.prototype.featuresVolumeControl = true;\n\n// Resizing plugins using request fullscreen reloads the plugin\nTech.prototype.featuresFullscreenResize = false;\nTech.prototype.featuresPlaybackRate = false;\n\n// Optional events that we can manually mimic with timers\n// currently not triggered by video-js-swf\nTech.prototype.featuresProgressEvents = false;\nTech.prototype.featuresTimeupdateEvents = false;\n\nTech.prototype.featuresNativeTextTracks = false;\n\n/*\n * A functional mixin for techs that want to use the Source Handler pattern.\n *\n * ##### EXAMPLE:\n *\n *   Tech.withSourceHandlers.call(MyTech);\n *\n */\nTech.withSourceHandlers = function(_Tech){\n   /*\n    * Register a source handler\n    * Source handlers are scripts for handling specific formats.\n    * The source handler pattern is used for adaptive formats (HLS, DASH) that\n    * manually load video data and feed it into a Source Buffer (Media Source Extensions)\n    * @param  {Function} handler  The source handler\n    * @param  {Boolean}  first    Register it before any existing handlers\n    */\n   _Tech.registerSourceHandler = function(handler, index){\n    let handlers = _Tech.sourceHandlers;\n\n    if (!handlers) {\n      handlers = _Tech.sourceHandlers = [];\n    }\n\n    if (index === undefined) {\n      // add to the end of the list\n      index = handlers.length;\n    }\n\n    handlers.splice(index, 0, handler);\n  };\n\n   /*\n    * Return the first source handler that supports the source\n    * TODO: Answer question: should 'probably' be prioritized over 'maybe'\n    * @param  {Object} source The source object\n    * @returns {Object}       The first source handler that supports the source\n    * @returns {null}         Null if no source handler is found\n    */\n   _Tech.selectSourceHandler = function(source){\n    let handlers = _Tech.sourceHandlers || [];\n    let can;\n\n    for (let i = 0; i < handlers.length; i++) {\n      can = handlers[i].canHandleSource(source);\n\n      if (can) {\n        return handlers[i];\n      }\n    }\n\n    return null;\n  };\n\n  /*\n   * Check if the tech can support the given source\n   * @param  {Object} srcObj  The source object\n   * @return {String}         'probably', 'maybe', or '' (empty string)\n   */\n  _Tech.canPlaySource = function(srcObj){\n    let sh = _Tech.selectSourceHandler(srcObj);\n\n    if (sh) {\n      return sh.canHandleSource(srcObj);\n    }\n\n    return '';\n  };\n\n  let originalSeekable = _Tech.prototype.seekable;\n\n  // when a source handler is registered, prefer its implementation of\n  // seekable when present.\n  _Tech.prototype.seekable = function() {\n    if (this.sourceHandler_ && this.sourceHandler_.seekable) {\n      return this.sourceHandler_.seekable();\n    }\n    return originalSeekable.call(this);\n  };\n\n   /*\n    * Create a function for setting the source using a source object\n    * and source handlers.\n    * Should never be called unless a source handler was found.\n    * @param {Object} source  A source object with src and type keys\n    * @return {Tech} self\n    */\n   _Tech.prototype.setSource = function(source){\n    let sh = _Tech.selectSourceHandler(source);\n\n    if (!sh) {\n      // Fall back to a native source hander when unsupported sources are\n      // deliberately set\n      if (_Tech.nativeSourceHandler) {\n        sh = _Tech.nativeSourceHandler;\n      } else {\n        log.error('No source hander found for the current source.');\n      }\n    }\n\n    // Dispose any existing source handler\n    this.disposeSourceHandler();\n    this.off('dispose', this.disposeSourceHandler);\n\n    this.currentSource_ = source;\n    this.sourceHandler_ = sh.handleSource(source, this);\n    this.on('dispose', this.disposeSourceHandler);\n\n    return this;\n  };\n\n   /*\n    * Clean up any existing source handler\n    */\n   _Tech.prototype.disposeSourceHandler = function(){\n    if (this.sourceHandler_ && this.sourceHandler_.dispose) {\n      this.sourceHandler_.dispose();\n    }\n  };\n\n};\n\nComponent.registerComponent('Tech', Tech);\n// Old name for Tech\nComponent.registerComponent('MediaTechController', Tech);\nexport default Tech;\n",
 
    "/**\n * @file text-track-cue-list.js\n */\nimport * as browser from '../utils/browser.js';\nimport document from 'global/document';\n\n/*\n * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcuelist\n *\n * interface TextTrackCueList {\n *   readonly attribute unsigned long length;\n *   getter TextTrackCue (unsigned long index);\n *   TextTrackCue? getCueById(DOMString id);\n * };\n */\n\nlet TextTrackCueList = function(cues) {\n  let list = this;\n\n  if (browser.IS_IE8) {\n    list = document.createElement('custom');\n\n    for (let prop in TextTrackCueList.prototype) {\n      list[prop] = TextTrackCueList.prototype[prop];\n    }\n  }\n\n  TextTrackCueList.prototype.setCues_.call(list, cues);\n\n  Object.defineProperty(list, 'length', {\n    get: function() {\n      return this.length_;\n    }\n  });\n\n  if (browser.IS_IE8) {\n    return list;\n  }\n};\n\nTextTrackCueList.prototype.setCues_ = function(cues) {\n  let oldLength = this.length || 0;\n  let i = 0;\n  let l = cues.length;\n\n  this.cues_ = cues;\n  this.length_ = cues.length;\n\n  let defineProp = function(i) {\n    if (!(''+i in this)) {\n      Object.defineProperty(this, '' + i, {\n        get: function() {\n          return this.cues_[i];\n        }\n      });\n    }\n  };\n\n  if (oldLength < l) {\n    i = oldLength;\n\n    for(; i < l; i++) {\n      defineProp.call(this, i);\n    }\n  }\n};\n\nTextTrackCueList.prototype.getCueById = function(id) {\n  let result = null;\n  for (let i = 0, l = this.length; i < l; i++) {\n    let cue = this[i];\n    if (cue.id === id) {\n      result = cue;\n      break;\n    }\n  }\n\n  return result;\n};\n\nexport default TextTrackCueList;\n",
 
    "/**\n * @file text-track-display.js\n */\nimport Component from '../component';\nimport Menu from '../menu/menu.js';\nimport MenuItem from '../menu/menu-item.js';\nimport MenuButton from '../menu/menu-button.js';\nimport * as Fn from '../utils/fn.js';\nimport document from 'global/document';\nimport window from 'global/window';\n\nconst darkGray = '#222';\nconst lightGray = '#ccc';\nconst fontMap = {\n  monospace:             'monospace',\n  sansSerif:             'sans-serif',\n  serif:                 'serif',\n  monospaceSansSerif:    '\"Andale Mono\", \"Lucida Console\", monospace',\n  monospaceSerif:        '\"Courier New\", monospace',\n  proportionalSansSerif: 'sans-serif',\n  proportionalSerif:     'serif',\n  casual:                '\"Comic Sans MS\", Impact, fantasy',\n  script:                '\"Monotype Corsiva\", cursive',\n  smallcaps:             '\"Andale Mono\", \"Lucida Console\", monospace, sans-serif'\n};\n\n/**\n * The component for displaying text track cues\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends Component\n * @class TextTrackDisplay\n */\nclass TextTrackDisplay extends Component {\n\n  constructor(player, options, ready){\n    super(player, options, ready);\n\n    player.on('loadstart', Fn.bind(this, this.toggleDisplay));\n    player.on('texttrackchange', Fn.bind(this, this.updateDisplay));\n\n    // This used to be called during player init, but was causing an error\n    // if a track should show by default and the display hadn't loaded yet.\n    // Should probably be moved to an external track loader when we support\n    // tracks that don't need a display.\n    player.ready(Fn.bind(this, function() {\n      if (player.tech_ && player.tech_['featuresNativeTextTracks']) {\n        this.hide();\n        return;\n      }\n\n      player.on('fullscreenchange', Fn.bind(this, this.updateDisplay));\n\n      let tracks = this.options_.playerOptions['tracks'] || [];\n      for (let i = 0; i < tracks.length; i++) {\n        let track = tracks[i];\n        this.player_.addRemoteTextTrack(track);\n      }\n    }));\n  }\n\n  /**\n   * Toggle display texttracks\n   *\n   * @method toggleDisplay\n   */\n  toggleDisplay() {\n    if (this.player_.tech_ && this.player_.tech_['featuresNativeTextTracks']) {\n      this.hide();\n    } else {\n      this.show();\n    }\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-text-track-display'\n    });\n  }\n\n  /**\n   * Clear display texttracks\n   *\n   * @method clearDisplay\n   */\n  clearDisplay() {\n    if (typeof window['WebVTT'] === 'function') {\n      window['WebVTT']['processCues'](window, [], this.el_);\n    }\n  }\n\n  /**\n   * Update display texttracks\n   *\n   * @method updateDisplay\n   */\n  updateDisplay() {\n    var tracks = this.player_.textTracks();\n\n    this.clearDisplay();\n\n    if (!tracks) {\n      return;\n    }\n\n    for (let i=0; i < tracks.length; i++) {\n      let track = tracks[i];\n      if (track['mode'] === 'showing') {\n        this.updateForTrack(track);\n      }\n    }\n  }\n\n  /**\n   * Add texttrack to texttrack list\n   *\n   * @param {TextTrackObject} track Texttrack object to be added to list\n   * @method updateForTrack\n   */\n  updateForTrack(track) {\n    if (typeof window['WebVTT'] !== 'function' || !track['activeCues']) {\n      return;\n    }\n\n    let overrides = this.player_['textTrackSettings'].getValues();\n\n    let cues = [];\n    for (let i = 0; i < track['activeCues'].length; i++) {\n      cues.push(track['activeCues'][i]);\n    }\n\n    window['WebVTT']['processCues'](window, track['activeCues'], this.el_);\n\n    let i = cues.length;\n    while (i--) {\n      let cueDiv = cues[i].displayState;\n      if (overrides.color) {\n        cueDiv.firstChild.style.color = overrides.color;\n      }\n      if (overrides.textOpacity) {\n        tryUpdateStyle(cueDiv.firstChild,\n                       'color',\n                       constructColor(overrides.color || '#fff',\n                                      overrides.textOpacity));\n      }\n      if (overrides.backgroundColor) {\n        cueDiv.firstChild.style.backgroundColor = overrides.backgroundColor;\n      }\n      if (overrides.backgroundOpacity) {\n        tryUpdateStyle(cueDiv.firstChild,\n                       'backgroundColor',\n                       constructColor(overrides.backgroundColor || '#000',\n                                      overrides.backgroundOpacity));\n      }\n      if (overrides.windowColor) {\n        if (overrides.windowOpacity) {\n          tryUpdateStyle(cueDiv,\n                         'backgroundColor',\n                         constructColor(overrides.windowColor, overrides.windowOpacity));\n        } else {\n          cueDiv.style.backgroundColor = overrides.windowColor;\n        }\n      }\n      if (overrides.edgeStyle) {\n        if (overrides.edgeStyle === 'dropshadow') {\n          cueDiv.firstChild.style.textShadow = `2px 2px 3px ${darkGray}, 2px 2px 4px ${darkGray}, 2px 2px 5px ${darkGray}`;\n        } else if (overrides.edgeStyle === 'raised') {\n          cueDiv.firstChild.style.textShadow = `1px 1px ${darkGray}, 2px 2px ${darkGray}, 3px 3px ${darkGray}`;\n        } else if (overrides.edgeStyle === 'depressed') {\n          cueDiv.firstChild.style.textShadow = `1px 1px ${lightGray}, 0 1px ${lightGray}, -1px -1px ${darkGray}, 0 -1px ${darkGray}`;\n        } else if (overrides.edgeStyle === 'uniform') {\n          cueDiv.firstChild.style.textShadow = `0 0 4px ${darkGray}, 0 0 4px ${darkGray}, 0 0 4px ${darkGray}, 0 0 4px ${darkGray}`;\n        }\n      }\n      if (overrides.fontPercent && overrides.fontPercent !== 1) {\n        const fontSize = window.parseFloat(cueDiv.style.fontSize);\n        cueDiv.style.fontSize = (fontSize * overrides.fontPercent) + 'px';\n        cueDiv.style.height = 'auto';\n        cueDiv.style.top = 'auto';\n        cueDiv.style.bottom = '2px';\n      }\n      if (overrides.fontFamily && overrides.fontFamily !== 'default') {\n        if (overrides.fontFamily === 'small-caps') {\n          cueDiv.firstChild.style.fontVariant = 'small-caps';\n        } else {\n          cueDiv.firstChild.style.fontFamily = fontMap[overrides.fontFamily];\n        }\n      }\n    }\n  }\n\n}\n\n/**\n* Add cue HTML to display\n*\n* @param {Number} color Hex number for color, like #f0e\n* @param {Number} opacity Value for opacity,0.0 - 1.0\n* @return {RGBAColor} In the form 'rgba(255, 0, 0, 0.3)'\n* @method constructColor\n*/\nfunction constructColor(color, opacity) {\n  return 'rgba(' +\n    // color looks like \"#f0e\"\n    parseInt(color[1] + color[1], 16) + ',' +\n    parseInt(color[2] + color[2], 16) + ',' +\n    parseInt(color[3] + color[3], 16) + ',' +\n    opacity + ')';\n}\n\n/**\n * Try to update style\n * Some style changes will throw an error, particularly in IE8. Those should be noops.\n *\n * @param {Element} el The element to be styles\n * @param {CSSProperty} style The CSS property to be styled\n * @param {CSSStyle} rule The actual style to be applied to the property\n * @method tryUpdateStyle\n */\nfunction tryUpdateStyle(el, style, rule) {\n  //\n  try {\n    el.style[style] = rule;\n  } catch (e) {}\n}\n\nComponent.registerComponent('TextTrackDisplay', TextTrackDisplay);\nexport default TextTrackDisplay;\n",
 
    "/**\n * @file text-track-enums.js\n *\n * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackmode\n *\n * enum TextTrackMode { \"disabled\",  \"hidden\",  \"showing\" };\n */\nvar TextTrackMode = {\n  'disabled': 'disabled',\n  'hidden': 'hidden',\n  'showing': 'showing'\n};\n\n/*\n * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackkind\n *\n * enum TextTrackKind { \"subtitles\",  \"captions\",  \"descriptions\",  \"chapters\",  \"metadata\" };\n */\nvar TextTrackKind = {\n  'subtitles': 'subtitles',\n  'captions': 'captions',\n  'descriptions': 'descriptions',\n  'chapters': 'chapters',\n  'metadata': 'metadata'\n};\n\nexport { TextTrackMode, TextTrackKind };\n",
 
    "/**\n * Utilities for capturing text track state and re-creating tracks\n * based on a capture.\n *\n * @file text-track-list-converter.js\n */\n\n/**\n * Examine a single text track and return a JSON-compatible javascript\n * object that represents the text track's state.\n * @param track {TextTrackObject} the text track to query\n * @return {Object} a serializable javascript representation of the\n * @private\n */\nlet trackToJson_ = function(track) {\n  return {\n    kind: track.kind,\n    label: track.label,\n    language: track.language,\n    id: track.id,\n    inBandMetadataTrackDispatchType: track.inBandMetadataTrackDispatchType,\n    mode: track.mode,\n    cues: track.cues && Array.prototype.map.call(track.cues, function(cue) {\n      return {\n        startTime: cue.startTime,\n        endTime: cue.endTime,\n        text: cue.text,\n        id: cue.id\n      };\n    }),\n    src: track.src\n  };\n};\n\n/**\n * Examine a tech and return a JSON-compatible javascript array that\n * represents the state of all text tracks currently configured. The\n * return array is compatible with `jsonToTextTracks`.\n * @param tech {tech} the tech object to query\n * @return {Array} a serializable javascript representation of the\n * @function textTracksToJson\n */\nlet textTracksToJson = function(tech) {\n  let trackEls = tech.el().querySelectorAll('track');\n\n  let trackObjs = Array.prototype.map.call(trackEls, (t) => t.track);\n  let tracks = Array.prototype.map.call(trackEls, function(trackEl) {\n    let json = trackToJson_(trackEl.track);\n    json.src = trackEl.src;\n    return json;\n  });\n\n  return tracks.concat(Array.prototype.filter.call(tech.textTracks(), function(track) {\n    return trackObjs.indexOf(track) === -1;\n  }).map(trackToJson_));\n};\n\n/**\n * Creates a set of remote text tracks on a tech based on an array of\n * javascript text track representations.\n * @param json {Array} an array of text track representation objects,\n * like those that would be produced by `textTracksToJson`\n * @param tech {tech} the tech to create text tracks on\n * @function jsonToTextTracks\n */\nlet jsonToTextTracks = function(json, tech) {\n  json.forEach(function(track) {\n    let addedTrack = tech.addRemoteTextTrack(track).track;\n    if (!track.src && track.cues) {\n      track.cues.forEach((cue) => addedTrack.addCue(cue));\n    }\n  });\n\n  return tech.textTracks();\n};\n\nexport default {textTracksToJson, jsonToTextTracks, trackToJson_};\n",
 
    "/**\n * @file text-track-list.js\n */\nimport EventTarget from '../event-target';\nimport * as Fn from '../utils/fn.js';\nimport * as browser from '../utils/browser.js';\nimport document from 'global/document';\n\n/*\n * https://html.spec.whatwg.org/multipage/embedded-content.html#texttracklist\n *\n * interface TextTrackList : EventTarget {\n *   readonly attribute unsigned long length;\n *   getter TextTrack (unsigned long index);\n *   TextTrack? getTrackById(DOMString id);\n *\n *   attribute EventHandler onchange;\n *   attribute EventHandler onaddtrack;\n *   attribute EventHandler onremovetrack;\n * };\n */\nlet TextTrackList = function(tracks) {\n  let list = this;\n\n  if (browser.IS_IE8) {\n    list = document.createElement('custom');\n\n    for (let prop in TextTrackList.prototype) {\n      list[prop] = TextTrackList.prototype[prop];\n    }\n  }\n\n  tracks = tracks || [];\n  list.tracks_ = [];\n\n  Object.defineProperty(list, 'length', {\n    get: function() {\n      return this.tracks_.length;\n    }\n  });\n\n  for (let i = 0; i < tracks.length; i++) {\n    list.addTrack_(tracks[i]);\n  }\n\n  if (browser.IS_IE8) {\n    return list;\n  }\n};\n\nTextTrackList.prototype = Object.create(EventTarget.prototype);\nTextTrackList.prototype.constructor = TextTrackList;\n\n/*\n * change - One or more tracks in the track list have been enabled or disabled.\n * addtrack - A track has been added to the track list.\n * removetrack - A track has been removed from the track list.\n */\nTextTrackList.prototype.allowedEvents_ = {\n  'change': 'change',\n  'addtrack': 'addtrack',\n  'removetrack': 'removetrack'\n};\n\n// emulate attribute EventHandler support to allow for feature detection\nfor (let event in TextTrackList.prototype.allowedEvents_) {\n  TextTrackList.prototype['on' + event] = null;\n}\n\nTextTrackList.prototype.addTrack_ = function(track) {\n  let index = this.tracks_.length;\n  if (!(''+index in this)) {\n    Object.defineProperty(this, index, {\n      get: function() {\n        return this.tracks_[index];\n      }\n    });\n  }\n\n  track.addEventListener('modechange', Fn.bind(this, function() {\n    this.trigger('change');\n  }));\n  this.tracks_.push(track);\n\n  this.trigger({\n    type: 'addtrack',\n    track: track\n  });\n};\n\nTextTrackList.prototype.removeTrack_ = function(rtrack) {\n  let result = null;\n  let track;\n\n  for (let i = 0, l = this.length; i < l; i++) {\n    track = this[i];\n    if (track === rtrack) {\n      this.tracks_.splice(i, 1);\n      break;\n    }\n  }\n\n  this.trigger({\n    type: 'removetrack',\n    track: track\n  });\n};\n\nTextTrackList.prototype.getTrackById = function(id) {\n  let result = null;\n\n  for (let i = 0, l = this.length; i < l; i++) {\n    let track = this[i];\n    if (track.id === id) {\n      result = track;\n      break;\n    }\n  }\n\n  return result;\n};\n\nexport default TextTrackList;\n",
 
    "/**\n * @file text-track-settings.js\n */\nimport Component from '../component';\nimport * as Events from '../utils/events.js';\nimport * as Fn from '../utils/fn.js';\nimport log from '../utils/log.js';\nimport safeParseTuple from 'safe-json-parse/tuple';\nimport window from 'global/window';\n\n/**\n * Manipulate settings of texttracks\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @extends Component\n * @class TextTrackSettings\n */\nclass TextTrackSettings extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n    this.hide();\n\n    // Grab `persistTextTrackSettings` from the player options if not passed in child options\n    if (options.persistTextTrackSettings === undefined) {\n      this.options_.persistTextTrackSettings = this.options_.playerOptions.persistTextTrackSettings;\n    }\n\n    Events.on(this.el().querySelector('.vjs-done-button'), 'click', Fn.bind(this, function() {\n      this.saveSettings();\n      this.hide();\n    }));\n\n    Events.on(this.el().querySelector('.vjs-default-button'), 'click', Fn.bind(this, function() {\n      this.el().querySelector('.vjs-fg-color > select').selectedIndex = 0;\n      this.el().querySelector('.vjs-bg-color > select').selectedIndex = 0;\n      this.el().querySelector('.window-color > select').selectedIndex = 0;\n      this.el().querySelector('.vjs-text-opacity > select').selectedIndex = 0;\n      this.el().querySelector('.vjs-bg-opacity > select').selectedIndex = 0;\n      this.el().querySelector('.vjs-window-opacity > select').selectedIndex = 0;\n      this.el().querySelector('.vjs-edge-style select').selectedIndex = 0;\n      this.el().querySelector('.vjs-font-family select').selectedIndex = 0;\n      this.el().querySelector('.vjs-font-percent select').selectedIndex = 2;\n      this.updateDisplay();\n    }));\n\n    Events.on(this.el().querySelector('.vjs-fg-color > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-bg-color > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.window-color > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-text-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-bg-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-window-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-font-percent select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-edge-style select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-font-family select'), 'change', Fn.bind(this, this.updateDisplay));\n\n    if (this.options_.persistTextTrackSettings) {\n      this.restoreSettings();\n    }\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-caption-settings vjs-modal-overlay',\n      innerHTML: captionOptionsMenuTemplate()\n    });\n  }\n\n  /**\n   * Get texttrack settings \n   * Settings are\n   * .vjs-edge-style\n   * .vjs-font-family\n   * .vjs-fg-color\n   * .vjs-text-opacity\n   * .vjs-bg-color\n   * .vjs-bg-opacity\n   * .window-color\n   * .vjs-window-opacity \n   *\n   * @return {Object} \n   * @method getValues\n   */\n  getValues() {\n    const el = this.el();\n\n    const textEdge = getSelectedOptionValue(el.querySelector('.vjs-edge-style select'));\n    const fontFamily = getSelectedOptionValue(el.querySelector('.vjs-font-family select'));\n    const fgColor = getSelectedOptionValue(el.querySelector('.vjs-fg-color > select'));\n    const textOpacity = getSelectedOptionValue(el.querySelector('.vjs-text-opacity > select'));\n    const bgColor = getSelectedOptionValue(el.querySelector('.vjs-bg-color > select'));\n    const bgOpacity = getSelectedOptionValue(el.querySelector('.vjs-bg-opacity > select'));\n    const windowColor = getSelectedOptionValue(el.querySelector('.window-color > select'));\n    const windowOpacity = getSelectedOptionValue(el.querySelector('.vjs-window-opacity > select'));\n    const fontPercent = window['parseFloat'](getSelectedOptionValue(el.querySelector('.vjs-font-percent > select')));\n\n    let result = {\n      'backgroundOpacity': bgOpacity,\n      'textOpacity': textOpacity,\n      'windowOpacity': windowOpacity,\n      'edgeStyle': textEdge,\n      'fontFamily': fontFamily,\n      'color': fgColor,\n      'backgroundColor': bgColor,\n      'windowColor': windowColor,\n      'fontPercent': fontPercent\n    };\n    for (let name in result) {\n      if (result[name] === '' || result[name] === 'none' || (name === 'fontPercent' && result[name] === 1.00)) {\n        delete result[name];\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Set texttrack settings \n   * Settings are\n   * .vjs-edge-style\n   * .vjs-font-family\n   * .vjs-fg-color\n   * .vjs-text-opacity\n   * .vjs-bg-color\n   * .vjs-bg-opacity\n   * .window-color\n   * .vjs-window-opacity \n   *\n   * @param {Object} values Object with texttrack setting values\n   * @method setValues\n   */\n  setValues(values) {\n    const el = this.el();\n\n    setSelectedOption(el.querySelector('.vjs-edge-style select'), values.edgeStyle);\n    setSelectedOption(el.querySelector('.vjs-font-family select'), values.fontFamily);\n    setSelectedOption(el.querySelector('.vjs-fg-color > select'), values.color);\n    setSelectedOption(el.querySelector('.vjs-text-opacity > select'), values.textOpacity);\n    setSelectedOption(el.querySelector('.vjs-bg-color > select'), values.backgroundColor);\n    setSelectedOption(el.querySelector('.vjs-bg-opacity > select'), values.backgroundOpacity);\n    setSelectedOption(el.querySelector('.window-color > select'), values.windowColor);\n    setSelectedOption(el.querySelector('.vjs-window-opacity > select'), values.windowOpacity);\n\n    let fontPercent = values.fontPercent;\n\n    if (fontPercent) {\n      fontPercent = fontPercent.toFixed(2);\n    }\n\n    setSelectedOption(el.querySelector('.vjs-font-percent > select'), fontPercent);\n  }\n\n  /**\n   * Restore texttrack settings \n   *\n   * @method restoreSettings\n   */\n  restoreSettings() {\n    let [err, values] = safeParseTuple(window.localStorage.getItem('vjs-text-track-settings'));\n\n    if (err) {\n      log.error(err);\n    }\n\n    if (values) {\n      this.setValues(values);\n    }\n  }\n\n  /**\n   * Save texttrack settings to local storage \n   *\n   * @method saveSettings\n   */\n  saveSettings() {\n    if (!this.options_.persistTextTrackSettings) {\n      return;\n    }\n\n    let values = this.getValues();\n    try {\n      if (Object.getOwnPropertyNames(values).length > 0) {\n        window.localStorage.setItem('vjs-text-track-settings', JSON.stringify(values));\n      } else {\n        window.localStorage.removeItem('vjs-text-track-settings');\n      }\n    } catch (e) {}\n  }\n\n  /**\n   * Update display of texttrack settings  \n   *\n   * @method updateDisplay\n   */\n  updateDisplay() {\n    let ttDisplay = this.player_.getChild('textTrackDisplay');\n    if (ttDisplay) {\n      ttDisplay.updateDisplay();\n    }\n  }\n\n}\n\nComponent.registerComponent('TextTrackSettings', TextTrackSettings);\n\nfunction getSelectedOptionValue(target) {\n  let selectedOption;\n  // not all browsers support selectedOptions, so, fallback to options\n  if (target.selectedOptions) {\n    selectedOption = target.selectedOptions[0];\n  } else if (target.options) {\n    selectedOption = target.options[target.options.selectedIndex];\n  }\n\n  return selectedOption.value;\n}\n\nfunction setSelectedOption(target, value) {\n  if (!value) {\n    return;\n  }\n\n  let i;\n  for (i = 0; i < target.options.length; i++) {\n    const option = target.options[i];\n    if (option.value === value) {\n      break;\n    }\n  }\n\n  target.selectedIndex = i;\n}\n\nfunction captionOptionsMenuTemplate() {\n  let template = `<div class=\"vjs-tracksettings\">\n      <div class=\"vjs-tracksettings-colors\">\n        <div class=\"vjs-fg-color vjs-tracksetting\">\n            <label class=\"vjs-label\">Foreground</label>\n            <select>\n              <option value=\"\">---</option>\n              <option value=\"#FFF\">White</option>\n              <option value=\"#000\">Black</option>\n              <option value=\"#F00\">Red</option>\n              <option value=\"#0F0\">Green</option>\n              <option value=\"#00F\">Blue</option>\n              <option value=\"#FF0\">Yellow</option>\n              <option value=\"#F0F\">Magenta</option>\n              <option value=\"#0FF\">Cyan</option>\n            </select>\n            <span class=\"vjs-text-opacity vjs-opacity\">\n              <select>\n                <option value=\"\">---</option>\n                <option value=\"1\">Opaque</option>\n                <option value=\"0.5\">Semi-Opaque</option>\n              </select>\n            </span>\n        </div> <!-- vjs-fg-color -->\n        <div class=\"vjs-bg-color vjs-tracksetting\">\n            <label class=\"vjs-label\">Background</label>\n            <select>\n              <option value=\"\">---</option>\n              <option value=\"#FFF\">White</option>\n              <option value=\"#000\">Black</option>\n              <option value=\"#F00\">Red</option>\n              <option value=\"#0F0\">Green</option>\n              <option value=\"#00F\">Blue</option>\n              <option value=\"#FF0\">Yellow</option>\n              <option value=\"#F0F\">Magenta</option>\n              <option value=\"#0FF\">Cyan</option>\n            </select>\n            <span class=\"vjs-bg-opacity vjs-opacity\">\n                <select>\n                  <option value=\"\">---</option>\n                  <option value=\"1\">Opaque</option>\n                  <option value=\"0.5\">Semi-Transparent</option>\n                  <option value=\"0\">Transparent</option>\n                </select>\n            </span>\n        </div> <!-- vjs-bg-color -->\n        <div class=\"window-color vjs-tracksetting\">\n            <label class=\"vjs-label\">Window</label>\n            <select>\n              <option value=\"\">---</option>\n              <option value=\"#FFF\">White</option>\n              <option value=\"#000\">Black</option>\n              <option value=\"#F00\">Red</option>\n              <option value=\"#0F0\">Green</option>\n              <option value=\"#00F\">Blue</option>\n              <option value=\"#FF0\">Yellow</option>\n              <option value=\"#F0F\">Magenta</option>\n              <option value=\"#0FF\">Cyan</option>\n            </select>\n            <span class=\"vjs-window-opacity vjs-opacity\">\n                <select>\n                  <option value=\"\">---</option>\n                  <option value=\"1\">Opaque</option>\n                  <option value=\"0.5\">Semi-Transparent</option>\n                  <option value=\"0\">Transparent</option>\n                </select>\n            </span>\n        </div> <!-- vjs-window-color -->\n      </div> <!-- vjs-tracksettings -->\n      <div class=\"vjs-tracksettings-font\">\n        <div class=\"vjs-font-percent vjs-tracksetting\">\n          <label class=\"vjs-label\">Font Size</label>\n          <select>\n            <option value=\"0.50\">50%</option>\n            <option value=\"0.75\">75%</option>\n            <option value=\"1.00\" selected>100%</option>\n            <option value=\"1.25\">125%</option>\n            <option value=\"1.50\">150%</option>\n            <option value=\"1.75\">175%</option>\n            <option value=\"2.00\">200%</option>\n            <option value=\"3.00\">300%</option>\n            <option value=\"4.00\">400%</option>\n          </select>\n        </div> <!-- vjs-font-percent -->\n        <div class=\"vjs-edge-style vjs-tracksetting\">\n          <label class=\"vjs-label\">Text Edge Style</label>\n          <select>\n            <option value=\"none\">None</option>\n            <option value=\"raised\">Raised</option>\n            <option value=\"depressed\">Depressed</option>\n            <option value=\"uniform\">Uniform</option>\n            <option value=\"dropshadow\">Dropshadow</option>\n          </select>\n        </div> <!-- vjs-edge-style -->\n        <div class=\"vjs-font-family vjs-tracksetting\">\n          <label class=\"vjs-label\">Font Family</label>\n          <select>\n            <option value=\"\">Default</option>\n            <option value=\"monospaceSerif\">Monospace Serif</option>\n            <option value=\"proportionalSerif\">Proportional Serif</option>\n            <option value=\"monospaceSansSerif\">Monospace Sans-Serif</option>\n            <option value=\"proportionalSansSerif\">Proportional Sans-Serif</option>\n            <option value=\"casual\">Casual</option>\n            <option value=\"script\">Script</option>\n            <option value=\"small-caps\">Small Caps</option>\n          </select>\n        </div> <!-- vjs-font-family -->\n      </div>\n    </div>\n    <div class=\"vjs-tracksettings-controls\">\n      <button class=\"vjs-default-button\">Defaults</button>\n      <button class=\"vjs-done-button\">Done</button>\n    </div>`;\n\n    return template;\n}\n\nexport default TextTrackSettings;\n",
 
    "/**\n * @file text-track.js\n */\nimport TextTrackCueList from './text-track-cue-list';\nimport * as Fn from '../utils/fn.js';\nimport * as Guid from '../utils/guid.js';\nimport * as browser from '../utils/browser.js';\nimport * as TextTrackEnum from './text-track-enums';\nimport log from '../utils/log.js';\nimport EventTarget from '../event-target';\nimport document from 'global/document';\nimport window from 'global/window';\nimport { isCrossOrigin } from '../utils/url.js';\nimport XHR from 'xhr';\n\n/*\n * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrack\n *\n * interface TextTrack : EventTarget {\n *   readonly attribute TextTrackKind kind;\n *   readonly attribute DOMString label;\n *   readonly attribute DOMString language;\n *\n *   readonly attribute DOMString id;\n *   readonly attribute DOMString inBandMetadataTrackDispatchType;\n *\n *   attribute TextTrackMode mode;\n *\n *   readonly attribute TextTrackCueList? cues;\n *   readonly attribute TextTrackCueList? activeCues;\n *\n *   void addCue(TextTrackCue cue);\n *   void removeCue(TextTrackCue cue);\n *\n *   attribute EventHandler oncuechange;\n * };\n */\nlet TextTrack = function(options={}) {\n  if (!options.tech) {\n    throw new Error('A tech was not provided.');\n  }\n\n  let tt = this;\n  if (browser.IS_IE8) {\n    tt = document.createElement('custom');\n\n    for (let prop in TextTrack.prototype) {\n      tt[prop] = TextTrack.prototype[prop];\n    }\n  }\n\n  tt.tech_ = options.tech;\n\n  let mode = TextTrackEnum.TextTrackMode[options['mode']] || 'disabled';\n  let kind = TextTrackEnum.TextTrackKind[options['kind']] || 'subtitles';\n  let label = options['label'] || '';\n  let language = options['language'] || options['srclang'] || '';\n  let id = options['id'] || 'vjs_text_track_' + Guid.newGUID();\n\n  if (kind === 'metadata' || kind === 'chapters') {\n    mode = 'hidden';\n  }\n\n  tt.cues_ = [];\n  tt.activeCues_ = [];\n\n  let cues = new TextTrackCueList(tt.cues_);\n  let activeCues = new TextTrackCueList(tt.activeCues_);\n\n  let changed = false;\n  let timeupdateHandler = Fn.bind(tt, function() {\n    this['activeCues'];\n    if (changed) {\n      this['trigger']('cuechange');\n      changed = false;\n    }\n  });\n  if (mode !== 'disabled') {\n    tt.tech_.on('timeupdate', timeupdateHandler);\n  }\n\n  Object.defineProperty(tt, 'kind', {\n    get: function() {\n      return kind;\n    },\n    set: Function.prototype\n  });\n\n  Object.defineProperty(tt, 'label', {\n    get: function() {\n      return label;\n    },\n    set: Function.prototype\n  });\n\n  Object.defineProperty(tt, 'language', {\n    get: function() {\n      return language;\n    },\n    set: Function.prototype\n  });\n\n  Object.defineProperty(tt, 'id', {\n    get: function() {\n      return id;\n    },\n    set: Function.prototype\n  });\n\n  Object.defineProperty(tt, 'mode', {\n    get: function() {\n      return mode;\n    },\n    set: function(newMode) {\n      if (!TextTrackEnum.TextTrackMode[newMode]) {\n        return;\n      }\n      mode = newMode;\n      if (mode === 'showing') {\n        this.tech_.on('timeupdate', timeupdateHandler);\n      }\n      this.trigger('modechange');\n    }\n  });\n\n  Object.defineProperty(tt, 'cues', {\n    get: function() {\n      if (!this.loaded_) {\n        return null;\n      }\n\n      return cues;\n    },\n    set: Function.prototype\n  });\n\n  Object.defineProperty(tt, 'activeCues', {\n    get: function() {\n      if (!this.loaded_) {\n        return null;\n      }\n\n      if (this['cues'].length === 0) {\n        return activeCues; // nothing to do\n      }\n\n      let ct = this.tech_.currentTime();\n      let active = [];\n\n      for (let i = 0, l = this['cues'].length; i < l; i++) {\n        let cue = this['cues'][i];\n        if (cue['startTime'] <= ct && cue['endTime'] >= ct) {\n          active.push(cue);\n        } else if (cue['startTime'] === cue['endTime'] && cue['startTime'] <= ct && cue['startTime'] + 0.5 >= ct) {\n          active.push(cue);\n        }\n      }\n\n      changed = false;\n\n      if (active.length !== this.activeCues_.length) {\n        changed = true;\n      } else {\n        for (let i = 0; i < active.length; i++) {\n          if (indexOf.call(this.activeCues_, active[i]) === -1) {\n            changed = true;\n          }\n        }\n      }\n\n      this.activeCues_ = active;\n      activeCues.setCues_(this.activeCues_);\n\n      return activeCues;\n    },\n    set: Function.prototype\n  });\n\n  if (options.src) {\n    tt.src = options.src;\n    loadTrack(options.src, tt);\n  } else {\n    tt.loaded_ = true;\n  }\n\n  if (browser.IS_IE8) {\n    return tt;\n  }\n};\n\nTextTrack.prototype = Object.create(EventTarget.prototype);\nTextTrack.prototype.constructor = TextTrack;\n\n/*\n * cuechange - One or more cues in the track have become active or stopped being active.\n */\nTextTrack.prototype.allowedEvents_ = {\n  'cuechange': 'cuechange'\n};\n\nTextTrack.prototype.addCue = function(cue) {\n  let tracks = this.tech_.textTracks();\n\n  if (tracks) {\n    for (let i = 0; i < tracks.length; i++) {\n      if (tracks[i] !== this) {\n        tracks[i].removeCue(cue);\n      }\n    }\n  }\n\n  this.cues_.push(cue);\n  this['cues'].setCues_(this.cues_);\n};\n\nTextTrack.prototype.removeCue = function(removeCue) {\n  let removed = false;\n\n  for (let i = 0, l = this.cues_.length; i < l; i++) {\n    let cue = this.cues_[i];\n    if (cue === removeCue) {\n      this.cues_.splice(i, 1);\n      removed = true;\n    }\n  }\n\n  if (removed) {\n    this.cues.setCues_(this.cues_);\n  }\n};\n\n/*\n* Downloading stuff happens below this point\n*/\nvar parseCues = function(srcContent, track) {\n  if (typeof window['WebVTT'] !== 'function') {\n    //try again a bit later\n    return window.setTimeout(function() {\n      parseCues(srcContent, track);\n    }, 25);\n  }\n\n  let parser = new window['WebVTT']['Parser'](window, window['vttjs'], window['WebVTT']['StringDecoder']());\n\n  parser['oncue'] = function(cue) {\n    track.addCue(cue);\n  };\n  parser['onparsingerror'] = function(error) {\n    log.error(error);\n  };\n\n  parser['parse'](srcContent);\n  parser['flush']();\n};\n\nvar loadTrack = function(src, track) {\n  let opts = {\n    uri: src\n  };\n\n  let crossOrigin = isCrossOrigin(src);\n  if (crossOrigin) {\n    opts.cors = crossOrigin;\n  }\n\n  XHR(opts, Fn.bind(this, function(err, response, responseBody){\n    if (err) {\n      return log.error(err, response);\n    }\n\n    track.loaded_ = true;\n    parseCues(responseBody, track);\n  }));\n};\n\nvar indexOf = function(searchElement, fromIndex) {\n  if (this == null) {\n    throw new TypeError('\"this\" is null or not defined');\n  }\n\n  let O = Object(this);\n\n  let len = O.length >>> 0;\n\n  if (len === 0) {\n    return -1;\n  }\n\n  let n = +fromIndex || 0;\n\n  if (Math.abs(n) === Infinity) {\n    n = 0;\n  }\n\n  if (n >= len) {\n    return -1;\n  }\n\n  let k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n\n  while (k < len) {\n    if (k in O && O[k] === searchElement) {\n      return k;\n    }\n    k++;\n  }\n  return -1;\n};\n\nexport default TextTrack;\n",
 
    "/**\n * @file browser.js\n */\nimport document from 'global/document';\nimport window from 'global/window';\n\nconst USER_AGENT = window.navigator.userAgent;\nconst webkitVersionMap = (/AppleWebKit\\/([\\d.]+)/i).exec(USER_AGENT);\nconst appleWebkitVersion = webkitVersionMap ? parseFloat(webkitVersionMap.pop()) : null;\n\n/*\n * Device is an iPhone\n *\n * @type {Boolean}\n * @constant\n * @private\n */\nexport const IS_IPHONE = (/iPhone/i).test(USER_AGENT);\nexport const IS_IPAD = (/iPad/i).test(USER_AGENT);\nexport const IS_IPOD = (/iPod/i).test(USER_AGENT);\nexport const IS_IOS = IS_IPHONE || IS_IPAD || IS_IPOD;\n\nexport const IOS_VERSION = (function(){\n  var match = USER_AGENT.match(/OS (\\d+)_/i);\n  if (match && match[1]) { return match[1]; }\n})();\n\nexport const IS_ANDROID = (/Android/i).test(USER_AGENT);\nexport const ANDROID_VERSION = (function() {\n  // This matches Android Major.Minor.Patch versions\n  // ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned\n  var match = USER_AGENT.match(/Android (\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))*/i),\n    major,\n    minor;\n\n  if (!match) {\n    return null;\n  }\n\n  major = match[1] && parseFloat(match[1]);\n  minor = match[2] && parseFloat(match[2]);\n\n  if (major && minor) {\n    return parseFloat(match[1] + '.' + match[2]);\n  } else if (major) {\n    return major;\n  } else {\n    return null;\n  }\n})();\n// Old Android is defined as Version older than 2.3, and requiring a webkit version of the android browser\nexport const IS_OLD_ANDROID = IS_ANDROID && (/webkit/i).test(USER_AGENT) && ANDROID_VERSION < 2.3;\nexport const IS_NATIVE_ANDROID = IS_ANDROID && ANDROID_VERSION < 5 && appleWebkitVersion < 537;\n\nexport const IS_FIREFOX = (/Firefox/i).test(USER_AGENT);\nexport const IS_CHROME = (/Chrome/i).test(USER_AGENT);\nexport const IS_IE8 = (/MSIE\\s8\\.0/).test(USER_AGENT);\n\nexport const TOUCH_ENABLED = !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch);\nexport const BACKGROUND_SIZE_SUPPORTED = 'backgroundSize' in document.createElement('video').style;\n",
 
    "/**\n * @file buffer.js\n */\nimport { createTimeRange } from './time-ranges.js';\n\n/**\n * Compute how much your video has been buffered\n *\n * @param  {Object} Buffered object\n * @param  {Number} Total duration\n * @return {Number} Percent buffered of the total duration\n * @private\n * @function bufferedPercent\n */\nexport function bufferedPercent(buffered, duration) {\n  var bufferedDuration = 0,\n      start, end;\n\n  if (!duration) {\n    return 0;\n  }\n\n  if (!buffered || !buffered.length) {\n    buffered = createTimeRange(0, 0);\n  }\n\n  for (let i = 0; i < buffered.length; i++){\n    start = buffered.start(i);\n    end   = buffered.end(i);\n\n    // buffered end can be bigger than duration by a very small fraction\n    if (end > duration) {\n      end = duration;\n    }\n\n    bufferedDuration += end - start;\n  }\n\n  return bufferedDuration / duration;\n}\n",
 
    "import log from './log.js';\n\n/**\n * Object containing the default behaviors for available handler methods.\n *\n * @private\n * @type {Object}\n */\nconst defaultBehaviors = {\n  get(obj, key) {\n    return obj[key];\n  },\n  set(obj, key, value) {\n    obj[key] = value;\n    return true;\n  }\n};\n\n/**\n * Expose private objects publicly using a Proxy to log deprecation warnings.\n *\n * Browsers that do not support Proxy objects will simply return the `target`\n * object, so it can be directly exposed.\n *\n * @param {Object} target The target object.\n * @param {Object} messages Messages to display from a Proxy. Only operations\n *                          with an associated message will be proxied.\n * @param {String} [messages.get]\n * @param {String} [messages.set]\n * @return {Object} A Proxy if supported or the `target` argument.\n */\nexport default (target, messages={}) => {\n  if (typeof Proxy === 'function') {\n    let handler = {};\n\n    // Build a handler object based on those keys that have both messages\n    // and default behaviors.\n    Object.keys(messages).forEach(key => {\n      if (defaultBehaviors.hasOwnProperty(key)) {\n        handler[key] = function() {\n          log.warn(messages[key]);\n          return defaultBehaviors[key].apply(this, arguments);\n        };\n      }\n    });\n\n    return new Proxy(target, handler);\n  }\n  return target;\n};\n",
 
    "/**\n * @file dom.js\n */\nimport document from 'global/document';\nimport window from 'global/window';\nimport  * as Guid from './guid.js';\nimport log from './log.js';\nimport tsml from 'tsml';\n\n/**\n * Shorthand for document.getElementById()\n * Also allows for CSS (jQuery) ID syntax. But nothing other than IDs.\n *\n * @param  {String} id  Element ID\n * @return {Element}    Element with supplied ID\n * @function getEl\n */\nexport function getEl(id){\n  if (id.indexOf('#') === 0) {\n    id = id.slice(1);\n  }\n\n  return document.getElementById(id);\n}\n\n/**\n * Creates an element and applies properties.\n *\n * @param  {String=} tagName    Name of tag to be created.\n * @param  {Object=} properties Element properties to be applied.\n * @return {Element}\n * @function createEl\n */\nexport function createEl(tagName='div', properties={}, attributes={}){\n  let el = document.createElement(tagName);\n\n  Object.getOwnPropertyNames(properties).forEach(function(propName){\n    let val = properties[propName];\n\n    // See #2176\n    // We originally were accepting both properties and attributes in the\n    // same object, but that doesn't work so well.\n    if (propName.indexOf('aria-') !== -1 || propName === 'role' || propName === 'type') {\n      log.warn(tsml`Setting attributes in the second argument of createEl()\n                has been deprecated. Use the third argument instead.\n                createEl(type, properties, attributes). Attempting to set ${propName} to ${val}.`);\n      el.setAttribute(propName, val);\n    } else {\n      el[propName] = val;\n    }\n  });\n\n  Object.getOwnPropertyNames(attributes).forEach(function(attrName){\n    let val = attributes[attrName];\n    el.setAttribute(attrName, attributes[attrName]);\n  });\n\n  return el;\n}\n\n/**\n * Insert an element as the first child node of another\n *\n * @param  {Element} child   Element to insert\n * @param  {Element} parent Element to insert child into\n * @private\n * @function insertElFirst\n */\nexport function insertElFirst(child, parent){\n  if (parent.firstChild) {\n    parent.insertBefore(child, parent.firstChild);\n  } else {\n    parent.appendChild(child);\n  }\n}\n\n/**\n * Element Data Store. Allows for binding data to an element without putting it directly on the element.\n * Ex. Event listeners are stored here.\n * (also from jsninja.com, slightly modified and updated for closure compiler)\n *\n * @type {Object}\n * @private\n */\nconst elData = {};\n\n/*\n * Unique attribute name to store an element's guid in\n *\n * @type {String}\n * @constant\n * @private\n */\nconst elIdAttr = 'vdata' + (new Date()).getTime();\n\n/**\n * Returns the cache object where data for an element is stored\n *\n * @param  {Element} el Element to store data for.\n * @return {Object}\n * @function getElData\n */\nexport function getElData(el) {\n  let id = el[elIdAttr];\n\n  if (!id) {\n    id = el[elIdAttr] = Guid.newGUID();\n  }\n\n  if (!elData[id]) {\n    elData[id] = {};\n  }\n\n  return elData[id];\n}\n\n/**\n * Returns whether or not an element has cached data\n *\n * @param  {Element} el A dom element\n * @return {Boolean}\n * @private\n * @function hasElData\n */\nexport function hasElData(el) {\n  const id = el[elIdAttr];\n\n  if (!id) {\n    return false;\n  }\n\n  return !!Object.getOwnPropertyNames(elData[id]).length;\n}\n\n/**\n * Delete data for the element from the cache and the guid attr from getElementById\n *\n * @param  {Element} el Remove data for an element\n * @private\n * @function removeElData\n */\nexport function removeElData(el) {\n  let id = el[elIdAttr];\n\n  if (!id) {\n    return;\n  }\n\n  // Remove all stored data\n  delete elData[id];\n\n  // Remove the elIdAttr property from the DOM node\n  try {\n    delete el[elIdAttr];\n  } catch(e) {\n    if (el.removeAttribute) {\n      el.removeAttribute(elIdAttr);\n    } else {\n      // IE doesn't appear to support removeAttribute on the document element\n      el[elIdAttr] = null;\n    }\n  }\n}\n\n/**\n * Check if an element has a CSS class\n *\n * @param {Element} element Element to check\n * @param {String} classToCheck Classname to check\n * @function hasElClass\n */\nexport function hasElClass(element, classToCheck) {\n  return ((' ' + element.className + ' ').indexOf(' ' + classToCheck + ' ') !== -1);\n}\n\n/**\n * Add a CSS class name to an element\n *\n * @param {Element} element    Element to add class name to\n * @param {String} classToAdd Classname to add\n * @function addElClass\n */\nexport function addElClass(element, classToAdd) {\n  if (!hasElClass(element, classToAdd)) {\n    element.className = element.className === '' ? classToAdd : element.className + ' ' + classToAdd;\n  }\n}\n\n/**\n * Remove a CSS class name from an element\n *\n * @param {Element} element    Element to remove from class name\n * @param {String} classToRemove Classname to remove\n * @function removeElClass\n */\nexport function removeElClass(element, classToRemove) {\n  if (!hasElClass(element, classToRemove)) {return;}\n\n  let classNames = element.className.split(' ');\n\n  // no arr.indexOf in ie8, and we don't want to add a big shim\n  for (let i = classNames.length - 1; i >= 0; i--) {\n    if (classNames[i] === classToRemove) {\n      classNames.splice(i,1);\n    }\n  }\n\n  element.className = classNames.join(' ');\n}\n\n/**\n * Apply attributes to an HTML element.\n *\n * @param  {Element} el         Target element.\n * @param  {Object=} attributes Element attributes to be applied.\n * @private\n * @function setElAttributes\n */\nexport function setElAttributes(el, attributes) {\n  Object.getOwnPropertyNames(attributes).forEach(function(attrName){\n    let attrValue = attributes[attrName];\n\n    if (attrValue === null || typeof attrValue === 'undefined' || attrValue === false) {\n      el.removeAttribute(attrName);\n    } else {\n      el.setAttribute(attrName, (attrValue === true ? '' : attrValue));\n    }\n  });\n}\n\n/**\n * Get an element's attribute values, as defined on the HTML tag\n * Attributes are not the same as properties. They're defined on the tag\n * or with setAttribute (which shouldn't be used with HTML)\n * This will return true or false for boolean attributes.\n *\n * @param  {Element} tag Element from which to get tag attributes\n * @return {Object}\n * @private\n * @function getElAttributes\n */\nexport function getElAttributes(tag) {\n  var obj, knownBooleans, attrs, attrName, attrVal;\n\n  obj = {};\n\n  // known boolean attributes\n  // we can check for matching boolean properties, but older browsers\n  // won't know about HTML5 boolean attributes that we still read from\n  knownBooleans = ','+'autoplay,controls,loop,muted,default'+',';\n\n  if (tag && tag.attributes && tag.attributes.length > 0) {\n    attrs = tag.attributes;\n\n    for (var i = attrs.length - 1; i >= 0; i--) {\n      attrName = attrs[i].name;\n      attrVal = attrs[i].value;\n\n      // check for known booleans\n      // the matching element property will return a value for typeof\n      if (typeof tag[attrName] === 'boolean' || knownBooleans.indexOf(','+attrName+',') !== -1) {\n        // the value of an included boolean attribute is typically an empty\n        // string ('') which would equal false if we just check for a false value.\n        // we also don't want support bad code like autoplay='false'\n        attrVal = (attrVal !== null) ? true : false;\n      }\n\n      obj[attrName] = attrVal;\n    }\n  }\n\n  return obj;\n}\n\n/**\n * Attempt to block the ability to select text while dragging controls\n *\n * @return {Boolean}\n * @method blockTextSelection\n */\nexport function blockTextSelection() {\n  document.body.focus();\n  document.onselectstart = function() {\n    return false;\n  };\n}\n\n/**\n * Turn off text selection blocking\n *\n * @return {Boolean}\n * @method unblockTextSelection\n */\nexport function unblockTextSelection() {\n  document.onselectstart = function() {\n    return true;\n  };\n}\n\n/**\n * Offset Left\n * getBoundingClientRect technique from\n * John Resig http://ejohn.org/blog/getboundingclientrect-is-awesome/\n *\n * @param {Element} el Element from which to get offset\n * @return {Object=}\n * @method findElPosition\n */\nexport function findElPosition(el) {\n  let box;\n\n  if (el.getBoundingClientRect && el.parentNode) {\n    box = el.getBoundingClientRect();\n  }\n\n  if (!box) {\n    return {\n      left: 0,\n      top: 0\n    };\n  }\n\n  const docEl = document.documentElement;\n  const body = document.body;\n\n  const clientLeft = docEl.clientLeft || body.clientLeft || 0;\n  const scrollLeft = window.pageXOffset || body.scrollLeft;\n  const left = box.left + scrollLeft - clientLeft;\n\n  const clientTop = docEl.clientTop || body.clientTop || 0;\n  const scrollTop = window.pageYOffset || body.scrollTop;\n  const top = box.top + scrollTop - clientTop;\n\n  // Android sometimes returns slightly off decimal values, so need to round\n  return {\n    left: Math.round(left),\n    top: Math.round(top)\n  };\n}\n\n/**\n * Get pointer position in element\n * Returns an object with x and y coordinates.\n * The base on the coordinates are the bottom left of the element.\n *\n * @param {Element} el Element on which to get the pointer position on\n * @param {Event} event Event object\n * @return {Object=} position This object will have x and y coordinates corresponding to the mouse position\n * @metho getPointerPosition\n */\nexport function getPointerPosition(el, event) {\n  let position = {};\n  let box = findElPosition(el);\n  let boxW = el.offsetWidth;\n  let boxH = el.offsetHeight;\n\n  let boxY = box.top;\n  let boxX = box.left;\n  let pageY = event.pageY;\n  let pageX = event.pageX;\n\n  if (event.changedTouches) {\n    pageX = event.changedTouches[0].pageX;\n    pageY = event.changedTouches[0].pageY;\n  }\n\n  position.y = Math.max(0, Math.min(1, ((boxY - pageY) + boxH) / boxH));\n  position.x = Math.max(0, Math.min(1, (pageX - boxX) / boxW));\n\n  return position;\n}\n",
 
    "/**\n * @file events.js\n *\n * Event System (John Resig - Secrets of a JS Ninja http://jsninja.com/)\n * (Original book version wasn't completely usable, so fixed some things and made Closure Compiler compatible)\n * This should work very similarly to jQuery's events, however it's based off the book version which isn't as\n * robust as jquery's, so there's probably some differences.\n */\n\nimport  * as Dom from './dom.js';\nimport  * as Guid from './guid.js';\nimport window from 'global/window';\nimport document from 'global/document';\n\n/**\n * Add an event listener to element\n * It stores the handler function in a separate cache object\n * and adds a generic handler to the element's event,\n * along with a unique id (guid) to the element.\n *\n * @param  {Element|Object}   elem Element or object to bind listeners to\n * @param  {String|Array}   type Type of event to bind to.\n * @param  {Function} fn   Event listener.\n * @method on\n */\nexport function on(elem, type, fn){\n  if (Array.isArray(type)) {\n    return _handleMultipleEvents(on, elem, type, fn);\n  }\n\n  let data = Dom.getElData(elem);\n\n  // We need a place to store all our handler data\n  if (!data.handlers) data.handlers = {};\n\n  if (!data.handlers[type]) data.handlers[type] = [];\n\n  if (!fn.guid) fn.guid = Guid.newGUID();\n\n  data.handlers[type].push(fn);\n\n  if (!data.dispatcher) {\n    data.disabled = false;\n\n    data.dispatcher = function (event, hash){\n\n      if (data.disabled) return;\n      event = fixEvent(event);\n\n      var handlers = data.handlers[event.type];\n\n      if (handlers) {\n        // Copy handlers so if handlers are added/removed during the process it doesn't throw everything off.\n        var handlersCopy = handlers.slice(0);\n\n        for (var m = 0, n = handlersCopy.length; m < n; m++) {\n          if (event.isImmediatePropagationStopped()) {\n            break;\n          } else {\n            handlersCopy[m].call(elem, event, hash);\n          }\n        }\n      }\n    };\n  }\n\n  if (data.handlers[type].length === 1) {\n    if (elem.addEventListener) {\n      elem.addEventListener(type, data.dispatcher, false);\n    } else if (elem.attachEvent) {\n      elem.attachEvent('on' + type, data.dispatcher);\n    }\n  }\n}\n\n/**\n * Removes event listeners from an element\n *\n * @param  {Element|Object}   elem Object to remove listeners from\n * @param  {String|Array=}   type Type of listener to remove. Don't include to remove all events from element.\n * @param  {Function} fn   Specific listener to remove. Don't include to remove listeners for an event type.\n * @method off\n */\nexport function off(elem, type, fn) {\n  // Don't want to add a cache object through getElData if not needed\n  if (!Dom.hasElData(elem)) return;\n\n  let data = Dom.getElData(elem);\n\n  // If no events exist, nothing to unbind\n  if (!data.handlers) { return; }\n\n  if (Array.isArray(type)) {\n    return _handleMultipleEvents(off, elem, type, fn);\n  }\n\n  // Utility function\n  var removeType = function(t){\n     data.handlers[t] = [];\n     _cleanUpEvents(elem,t);\n  };\n\n  // Are we removing all bound events?\n  if (!type) {\n    for (let t in data.handlers) removeType(t);\n    return;\n  }\n\n  var handlers = data.handlers[type];\n\n  // If no handlers exist, nothing to unbind\n  if (!handlers) return;\n\n  // If no listener was provided, remove all listeners for type\n  if (!fn) {\n    removeType(type);\n    return;\n  }\n\n  // We're only removing a single handler\n  if (fn.guid) {\n    for (let n = 0; n < handlers.length; n++) {\n      if (handlers[n].guid === fn.guid) {\n        handlers.splice(n--, 1);\n      }\n    }\n  }\n\n  _cleanUpEvents(elem, type);\n}\n\n/**\n * Trigger an event for an element\n *\n * @param  {Element|Object}      elem  Element to trigger an event on\n * @param  {Event|Object|String} event A string (the type) or an event object with a type attribute\n * @param  {Object} [hash] data hash to pass along with the event\n * @return {Boolean=} Returned only if default was prevented\n * @method trigger\n */\nexport function trigger(elem, event, hash) {\n  // Fetches element data and a reference to the parent (for bubbling).\n  // Don't want to add a data object to cache for every parent,\n  // so checking hasElData first.\n  var elemData = (Dom.hasElData(elem)) ? Dom.getElData(elem) : {};\n  var parent = elem.parentNode || elem.ownerDocument;\n      // type = event.type || event,\n      // handler;\n\n  // If an event name was passed as a string, creates an event out of it\n  if (typeof event === 'string') {\n    event = { type:event, target:elem };\n  }\n  // Normalizes the event properties.\n  event = fixEvent(event);\n\n  // If the passed element has a dispatcher, executes the established handlers.\n  if (elemData.dispatcher) {\n    elemData.dispatcher.call(elem, event, hash);\n  }\n\n  // Unless explicitly stopped or the event does not bubble (e.g. media events)\n    // recursively calls this function to bubble the event up the DOM.\n    if (parent && !event.isPropagationStopped() && event.bubbles === true) {\n      trigger.call(null, parent, event, hash);\n\n  // If at the top of the DOM, triggers the default action unless disabled.\n  } else if (!parent && !event.defaultPrevented) {\n    var targetData = Dom.getElData(event.target);\n\n    // Checks if the target has a default action for this event.\n    if (event.target[event.type]) {\n      // Temporarily disables event dispatching on the target as we have already executed the handler.\n      targetData.disabled = true;\n      // Executes the default action.\n      if (typeof event.target[event.type] === 'function') {\n        event.target[event.type]();\n      }\n      // Re-enables event dispatching.\n      targetData.disabled = false;\n    }\n  }\n\n  // Inform the triggerer if the default was prevented by returning false\n  return !event.defaultPrevented;\n}\n\n/**\n * Trigger a listener only once for an event\n *\n * @param  {Element|Object}   elem Element or object to\n * @param  {String|Array}   type Name/type of event\n * @param  {Function} fn Event handler function\n * @method one\n */\nexport function one(elem, type, fn) {\n  if (Array.isArray(type)) {\n    return _handleMultipleEvents(one, elem, type, fn);\n  }\n  var func = function(){\n    off(elem, type, func);\n    fn.apply(this, arguments);\n  };\n  // copy the guid to the new function so it can removed using the original function's ID\n  func.guid = fn.guid = fn.guid || Guid.newGUID();\n  on(elem, type, func);\n}\n\n/**\n * Fix a native event to have standard property values\n *\n * @param  {Object} event Event object to fix\n * @return {Object}\n * @private\n * @method fixEvent\n */\nexport function fixEvent(event) {\n\n  function returnTrue() { return true; }\n  function returnFalse() { return false; }\n\n  // Test if fixing up is needed\n  // Used to check if !event.stopPropagation instead of isPropagationStopped\n  // But native events return true for stopPropagation, but don't have\n  // other expected methods like isPropagationStopped. Seems to be a problem\n  // with the Javascript Ninja code. So we're just overriding all events now.\n  if (!event || !event.isPropagationStopped) {\n    var old = event || window.event;\n\n    event = {};\n    // Clone the old object so that we can modify the values event = {};\n    // IE8 Doesn't like when you mess with native event properties\n    // Firefox returns false for event.hasOwnProperty('type') and other props\n    //  which makes copying more difficult.\n    // TODO: Probably best to create a whitelist of event props\n    for (var key in old) {\n      // Safari 6.0.3 warns you if you try to copy deprecated layerX/Y\n      // Chrome warns you if you try to copy deprecated keyboardEvent.keyLocation\n      // and webkitMovementX/Y\n      if (key !== 'layerX' && key !== 'layerY' && key !== 'keyLocation' &&\n          key !== 'webkitMovementX' && key !== 'webkitMovementY') {\n        // Chrome 32+ warns if you try to copy deprecated returnValue, but\n        // we still want to if preventDefault isn't supported (IE8).\n        if (!(key === 'returnValue' && old.preventDefault)) {\n          event[key] = old[key];\n        }\n      }\n    }\n\n    // The event occurred on this element\n    if (!event.target) {\n      event.target = event.srcElement || document;\n    }\n\n    // Handle which other element the event is related to\n    if (!event.relatedTarget) {\n      event.relatedTarget = event.fromElement === event.target ?\n        event.toElement :\n        event.fromElement;\n    }\n\n    // Stop the default browser action\n    event.preventDefault = function () {\n      if (old.preventDefault) {\n        old.preventDefault();\n      }\n      event.returnValue = false;\n      old.returnValue = false;\n      event.defaultPrevented = true;\n    };\n\n    event.defaultPrevented = false;\n\n    // Stop the event from bubbling\n    event.stopPropagation = function () {\n      if (old.stopPropagation) {\n        old.stopPropagation();\n      }\n      event.cancelBubble = true;\n      old.cancelBubble = true;\n      event.isPropagationStopped = returnTrue;\n    };\n\n    event.isPropagationStopped = returnFalse;\n\n    // Stop the event from bubbling and executing other handlers\n    event.stopImmediatePropagation = function () {\n      if (old.stopImmediatePropagation) {\n        old.stopImmediatePropagation();\n      }\n      event.isImmediatePropagationStopped = returnTrue;\n      event.stopPropagation();\n    };\n\n    event.isImmediatePropagationStopped = returnFalse;\n\n    // Handle mouse position\n    if (event.clientX != null) {\n      var doc = document.documentElement, body = document.body;\n\n      event.pageX = event.clientX +\n        (doc && doc.scrollLeft || body && body.scrollLeft || 0) -\n        (doc && doc.clientLeft || body && body.clientLeft || 0);\n      event.pageY = event.clientY +\n        (doc && doc.scrollTop || body && body.scrollTop || 0) -\n        (doc && doc.clientTop || body && body.clientTop || 0);\n    }\n\n    // Handle key presses\n    event.which = event.charCode || event.keyCode;\n\n    // Fix button for mouse clicks:\n    // 0 == left; 1 == middle; 2 == right\n    if (event.button != null) {\n      event.button = (event.button & 1 ? 0 :\n        (event.button & 4 ? 1 :\n          (event.button & 2 ? 2 : 0)));\n    }\n  }\n\n  // Returns fixed-up instance\n  return event;\n}\n\n/**\n * Clean up the listener cache and dispatchers\n*\n * @param  {Element|Object} elem Element to clean up\n * @param  {String} type Type of event to clean up\n * @private\n * @method _cleanUpEvents\n */\nfunction _cleanUpEvents(elem, type) {\n  var data = Dom.getElData(elem);\n\n  // Remove the events of a particular type if there are none left\n  if (data.handlers[type].length === 0) {\n    delete data.handlers[type];\n    // data.handlers[type] = null;\n    // Setting to null was causing an error with data.handlers\n\n    // Remove the meta-handler from the element\n    if (elem.removeEventListener) {\n      elem.removeEventListener(type, data.dispatcher, false);\n    } else if (elem.detachEvent) {\n      elem.detachEvent('on' + type, data.dispatcher);\n    }\n  }\n\n  // Remove the events object if there are no types left\n  if (Object.getOwnPropertyNames(data.handlers).length <= 0) {\n    delete data.handlers;\n    delete data.dispatcher;\n    delete data.disabled;\n  }\n\n  // Finally remove the element data if there is no data left\n  if (Object.getOwnPropertyNames(data).length === 0) {\n    Dom.removeElData(elem);\n  }\n}\n\n/**\n * Loops through an array of event types and calls the requested method for each type.\n *\n * @param  {Function} fn   The event method we want to use.\n * @param  {Element|Object} elem Element or object to bind listeners to\n * @param  {String}   type Type of event to bind to.\n * @param  {Function} callback   Event listener.\n * @private\n * @function _handleMultipleEvents\n */\nfunction _handleMultipleEvents(fn, elem, types, callback) {\n  types.forEach(function(type) {\n    //Call the event method for each one of the types\n    fn(elem, type, callback);\n  });\n}\n",
 
    "/**\n * @file fn.js\n */\nimport { newGUID } from './guid.js';\n\n/**\n * Bind (a.k.a proxy or Context). A simple method for changing the context of a function\n * It also stores a unique id on the function so it can be easily removed from events\n *\n * @param  {*}   context The object to bind as scope\n * @param  {Function} fn      The function to be bound to a scope\n * @param  {Number=}   uid     An optional unique ID for the function to be set\n * @return {Function}\n * @private\n * @method bind\n */\nexport const bind = function(context, fn, uid) {\n  // Make sure the function has a unique ID\n  if (!fn.guid) { fn.guid = newGUID(); }\n\n  // Create the new function that changes the context\n  let ret = function() {\n    return fn.apply(context, arguments);\n  };\n\n  // Allow for the ability to individualize this function\n  // Needed in the case where multiple objects might share the same prototype\n  // IF both items add an event listener with the same function, then you try to remove just one\n  // it will remove both because they both have the same guid.\n  // when using this, you need to use the bind method when you remove the listener as well.\n  // currently used in text tracks\n  ret.guid = (uid) ? uid + '_' + fn.guid : fn.guid;\n\n  return ret;\n};\n",
 
    "/**\n * @file format-time.js\n *\n * Format seconds as a time string, H:MM:SS or M:SS\n * Supplying a guide (in seconds) will force a number of leading zeros\n * to cover the length of the guide\n *\n * @param  {Number} seconds Number of seconds to be turned into a string\n * @param  {Number} guide   Number (in seconds) to model the string after\n * @return {String}         Time formatted as H:MM:SS or M:SS\n * @private\n * @function formatTime\n */\nfunction formatTime(seconds, guide=seconds) {\n  let s = Math.floor(seconds % 60);\n  let m = Math.floor(seconds / 60 % 60);\n  let h = Math.floor(seconds / 3600);\n  const gm = Math.floor(guide / 60 % 60);\n  const gh = Math.floor(guide / 3600);\n\n  // handle invalid times\n  if (isNaN(seconds) || seconds === Infinity) {\n    // '-' is false for all relational operators (e.g. <, >=) so this setting\n    // will add the minimum number of fields specified by the guide\n    h = m = s = '-';\n  }\n\n  // Check if we need to show hours\n  h = (h > 0 || gh > 0) ? h + ':' : '';\n\n  // If hours are showing, we may need to add a leading zero.\n  // Always show at least one digit of minutes.\n  m = (((h || gm >= 10) && m < 10) ? '0' + m : m) + ':';\n\n  // Check if leading zero is need for seconds\n  s = (s < 10) ? '0' + s : s;\n\n  return h + m + s;\n}\n\nexport default formatTime;\n",
 
    "/**\n * @file guid.js\n *\n * Unique ID for an element or function\n * @type {Number}\n * @private\n */\nlet _guid = 1;\n\n/**\n * Get the next unique ID\n *\n * @return {String} \n * @function newGUID\n */\nexport function newGUID() {\n  return _guid++;\n}\n",
 
    "/**\n * @file log.js\n */\nimport window from 'global/window';\n\n/**\n * Log plain debug messages\n */\nconst log = function(){\n  _logType(null, arguments);\n};\n\n/**\n * Keep a history of log messages\n * @type {Array}\n */\nlog.history = [];\n\n/**\n * Log error messages\n */\nlog.error = function(){\n  _logType('error', arguments);\n};\n\n/**\n * Log warning messages\n */\nlog.warn = function(){\n  _logType('warn', arguments);\n};\n\n/**\n * Log messages to the console and history based on the type of message\n *\n * @param  {String} type The type of message, or `null` for `log`\n * @param  {Object} args The args to be passed to the log\n * @private\n * @method _logType\n */\nfunction _logType(type, args){\n  // convert args to an array to get array functions\n  let argsArray = Array.prototype.slice.call(args);\n  // if there's no console then don't try to output messages\n  // they will still be stored in log.history\n  // Was setting these once outside of this function, but containing them\n  // in the function makes it easier to test cases where console doesn't exist\n  let noop = function(){};\n\n  let console = window['console'] || {\n    'log': noop,\n    'warn': noop,\n    'error': noop\n  };\n\n  if (type) {\n    // add the type to the front of the message\n    argsArray.unshift(type.toUpperCase()+':');\n  } else {\n    // default to log with no prefix\n    type = 'log';\n  }\n\n  // add to history\n  log.history.push(argsArray);\n\n  // add console prefix after adding to history\n  argsArray.unshift('VIDEOJS:');\n\n  // call appropriate log function\n  if (console[type].apply) {\n    console[type].apply(console, argsArray);\n  } else {\n    // ie8 doesn't allow error.apply, but it will just join() the array anyway\n    console[type](argsArray.join(' '));\n  }\n}\n\nexport default log;\n",
 
    "/**\n * @file merge-options.js\n */\nimport merge from 'lodash-compat/object/merge';\n\nfunction isPlain(obj) {\n  return !!obj\n    && typeof obj === 'object'\n    && obj.toString() === '[object Object]'\n    && obj.constructor === Object;\n}\n\n/**\n * Merge customizer. video.js simply overwrites non-simple objects\n * (like arrays) instead of attempting to overlay them.\n * @see https://lodash.com/docs#merge\n */\nconst customizer = function(destination, source) {\n  // If we're not working with a plain object, copy the value as is\n  // If source is an array, for instance, it will replace destination\n  if (!isPlain(source)) {\n    return source;\n  }\n\n  // If the new value is a plain object but the first object value is not\n  // we need to create a new object for the first object to merge with.\n  // This makes it consistent with how merge() works by default\n  // and also protects from later changes the to first object affecting\n  // the second object's values.\n  if (!isPlain(destination)) {\n    return mergeOptions(source);\n  }\n};\n\n/**\n * Merge one or more options objects, recursively merging **only**\n * plain object properties.  Previously `deepMerge`.\n *\n * @param  {...Object} source One or more objects to merge\n * @returns {Object}          a new object that is the union of all\n * provided objects\n * @function mergeOptions\n */\nexport default function mergeOptions() {\n  // contruct the call dynamically to handle the variable number of\n  // objects to merge\n  let args = Array.prototype.slice.call(arguments);\n\n  // unshift an empty object into the front of the call as the target\n  // of the merge\n  args.unshift({});\n\n  // customize conflict resolution to match our historical merge behavior\n  args.push(customizer);\n\n  merge.apply(null, args);\n\n  // return the mutated result object\n  return args[0];\n}\n",
 
    "import document from 'global/document';\n\nexport let createStyleElement = function(className) {\n  let style = document.createElement('style');\n  style.className = className;\n\n  return style;\n};\n\nexport let setTextContent = function(el, content) {\n  if (el.styleSheet) {\n    el.styleSheet.cssText = content;\n  } else {\n    el.textContent = content;\n  }\n};\n",
 
    "import log from './log.js';\n\n/**\n * @file time-ranges.js\n *\n * Should create a fake TimeRange object\n * Mimics an HTML5 time range instance, which has functions that\n * return the start and end times for a range\n * TimeRanges are returned by the buffered() method\n *\n * @param  {(Number|Array)} Start of a single range or an array of ranges\n * @param  {Number} End of a single range\n * @private\n * @method createTimeRanges\n */\nexport function createTimeRanges(start, end){\n  if (Array.isArray(start)) {\n    return createTimeRangesObj(start);\n  } else if (start === undefined || end === undefined) {\n    return createTimeRangesObj();\n  }\n  return createTimeRangesObj([[start, end]]);\n}\n\nexport { createTimeRanges as createTimeRange };\n\nfunction createTimeRangesObj(ranges){\n  if (ranges === undefined || ranges.length === 0) {\n    return {\n      length: 0,\n      start: function() {\n        throw new Error('This TimeRanges object is empty');\n      },\n      end: function() {\n        throw new Error('This TimeRanges object is empty');\n      }\n    };\n  }\n  return {\n    length: ranges.length,\n    start: getRange.bind(null, 'start', 0, ranges),\n    end: getRange.bind(null, 'end', 1, ranges)\n  };\n}\n\nfunction getRange(fnName, valueIndex, ranges, rangeIndex){\n  if (rangeIndex === undefined) {\n    log.warn(`DEPRECATED: Function '${fnName}' on 'TimeRanges' called without an index argument.`);\n    rangeIndex = 0;\n  }\n  rangeCheck(fnName, rangeIndex, ranges.length - 1);\n  return ranges[rangeIndex][valueIndex];\n}\n\nfunction rangeCheck(fnName, index, maxIndex){\n  if (index < 0 || index > maxIndex) {\n    throw new Error(`Failed to execute '${fnName}' on 'TimeRanges': The index provided (${index}) is greater than or equal to the maximum bound (${maxIndex}).`);\n  }\n}\n",
 
    "/**\n * @file to-title-case.js\n *\n * Uppercase the first letter of a string\n *\n * @param  {String} string String to be uppercased\n * @return {String}\n * @private\n * @method toTitleCase\n */\nfunction toTitleCase(string){\n  return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nexport default toTitleCase;\n",
 
    "/**\n * @file url.js\n */\nimport document from 'global/document';\nimport window from 'global/window';\n\n/**\n * Resolve and parse the elements of a URL\n *\n * @param  {String} url The url to parse\n * @return {Object}     An object of url details\n * @method parseUrl\n */\nexport const parseUrl = function(url) {\n  const props = ['protocol', 'hostname', 'port', 'pathname', 'search', 'hash', 'host'];\n\n  // add the url to an anchor and let the browser parse the URL\n  let a = document.createElement('a');\n  a.href = url;\n\n  // IE8 (and 9?) Fix\n  // ie8 doesn't parse the URL correctly until the anchor is actually\n  // added to the body, and an innerHTML is needed to trigger the parsing\n  let addToBody = (a.host === '' && a.protocol !== 'file:');\n  let div;\n  if (addToBody) {\n    div = document.createElement('div');\n    div.innerHTML = `<a href=\"${url}\"></a>`;\n    a = div.firstChild;\n    // prevent the div from affecting layout\n    div.setAttribute('style', 'display:none; position:absolute;');\n    document.body.appendChild(div);\n  }\n\n  // Copy the specific URL properties to a new object\n  // This is also needed for IE8 because the anchor loses its\n  // properties when it's removed from the dom\n  let details = {};\n  for (var i = 0; i < props.length; i++) {\n    details[props[i]] = a[props[i]];\n  }\n\n  // IE9 adds the port to the host property unlike everyone else. If\n  // a port identifier is added for standard ports, strip it.\n  if (details.protocol === 'http:') {\n    details.host = details.host.replace(/:80$/, '');\n  }\n  if (details.protocol === 'https:') {\n    details.host = details.host.replace(/:443$/, '');\n  }\n\n  if (addToBody) {\n    document.body.removeChild(div);\n  }\n\n  return details;\n};\n\n/**\n * Get absolute version of relative URL. Used to tell flash correct URL.\n * http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue\n *\n * @param  {String} url URL to make absolute\n * @return {String}     Absolute URL\n * @private\n * @method getAbsoluteURL\n */\nexport const getAbsoluteURL = function(url){\n  // Check if absolute URL\n  if (!url.match(/^https?:\\/\\//)) {\n    // Convert to absolute URL. Flash hosted off-site needs an absolute URL.\n    let div = document.createElement('div');\n    div.innerHTML = `<a href=\"${url}\">x</a>`;\n    url = div.firstChild.href;\n  }\n\n  return url;\n};\n\n/**\n * Returns the extension of the passed file name. It will return an empty string if you pass an invalid path\n *\n * @param {String}    path    The fileName path like '/path/to/file.mp4'\n * @returns {String}          The extension in lower case or an empty string if no extension could be found.\n * @method getFileExtension\n */\nexport const getFileExtension = function(path) {\n  if(typeof path === 'string'){\n    let splitPathRe = /^(\\/?)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?)(\\.([^\\.\\/\\?]+)))(?:[\\/]*|[\\?].*)$/i;\n    let pathParts = splitPathRe.exec(path);\n\n    if (pathParts) {\n      return pathParts.pop().toLowerCase();\n    }\n  }\n\n  return '';\n};\n\n/**\n * Returns whether the url passed is a cross domain request or not.\n *\n * @param {String} url The url to check\n * @return {Boolean}   Whether it is a cross domain request or not\n * @method isCrossOrigin\n */\nexport const isCrossOrigin = function(url) {\n  let urlInfo = parseUrl(url);\n  let winLoc = window.location;\n\n  // IE8 protocol relative urls will return ':' for protocol\n  let srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol;\n\n  // Check if url is for another domain/origin\n  // IE8 doesn't know location.origin, so we won't rely on it here\n  let crossOrigin = (srcProtocol + urlInfo.host) !== (winLoc.protocol + winLoc.host);\n\n  return crossOrigin;\n};\n",
 
    "/**\n * @file video.js\n */\nimport document from 'global/document';\nimport * as setup from './setup';\nimport * as stylesheet from './utils/stylesheet.js';\nimport Component from './component';\nimport EventTarget from './event-target';\nimport * as Events from './utils/events.js';\nimport Player from './player';\nimport plugin from './plugins.js';\nimport mergeOptions from '../../src/js/utils/merge-options.js';\nimport * as Fn from './utils/fn.js';\nimport TextTrack from './tracks/text-track.js';\n\nimport assign from 'object.assign';\nimport { createTimeRanges } from './utils/time-ranges.js';\nimport formatTime from './utils/format-time.js';\nimport log from './utils/log.js';\nimport * as Dom from './utils/dom.js';\nimport * as browser from './utils/browser.js';\nimport * as Url from './utils/url.js';\nimport extendFn from './extend.js';\nimport merge from 'lodash-compat/object/merge';\nimport createDeprecationProxy from './utils/create-deprecation-proxy.js';\nimport xhr from 'xhr';\n\n// Include the built-in techs\nimport Html5 from './tech/html5.js';\nimport Flash from './tech/flash.js';\n\n// HTML5 Element Shim for IE8\nif (typeof HTMLVideoElement === 'undefined') {\n  document.createElement('video');\n  document.createElement('audio');\n  document.createElement('track');\n}\n\n/**\n * Doubles as the main function for users to create a player instance and also\n * the main library object.\n * The `videojs` function can be used to initialize or retrieve a player.\n * ```js\n *     var myPlayer = videojs('my_video_id');\n * ```\n *\n * @param  {String|Element} id      Video element or video element ID\n * @param  {Object=} options        Optional options object for config/settings\n * @param  {Function=} ready        Optional ready callback\n * @return {Player}                 A player instance\n * @mixes videojs\n * @method videojs\n */\nvar videojs = function(id, options, ready){\n  var tag; // Element of ID\n\n  // Allow for element or ID to be passed in\n  // String ID\n  if (typeof id === 'string') {\n\n    // Adjust for jQuery ID syntax\n    if (id.indexOf('#') === 0) {\n      id = id.slice(1);\n    }\n\n    // If a player instance has already been created for this ID return it.\n    if (videojs.getPlayers()[id]) {\n\n      // If options or ready funtion are passed, warn\n      if (options) {\n        log.warn(`Player \"${id}\" is already initialised. Options will not be applied.`);\n      }\n\n      if (ready) {\n        videojs.getPlayers()[id].ready(ready);\n      }\n\n      return videojs.getPlayers()[id];\n\n    // Otherwise get element for ID\n    } else {\n      tag = Dom.getEl(id);\n    }\n\n  // ID is a media element\n  } else {\n    tag = id;\n  }\n\n  // Check for a useable element\n  if (!tag || !tag.nodeName) { // re: nodeName, could be a box div also\n    throw new TypeError('The element or ID supplied is not valid. (videojs)'); // Returns\n  }\n\n  // Element may have a player attr referring to an already created player instance.\n  // If not, set up a new player and return the instance.\n  return tag['player'] || new Player(tag, options, ready);\n};\n\n// Add default styles\nlet style = document.querySelector('.vjs-styles-defaults');\nif (!style) {\n  style = stylesheet.createStyleElement('vjs-styles-defaults');\n  let head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n  stylesheet.setTextContent(style, `\n    .video-js {\n      width: 300px;\n      height: 150px;\n    }\n\n    .vjs-fluid {\n      padding-top: 56.25%\n    }\n  `);\n}\n\n// Run Auto-load players\n// You have to wait at least once in case this script is loaded after your video in the DOM (weird behavior only with minified version)\nsetup.autoSetupTimeout(1, videojs);\n\n/*\n * Current software version (semver)\n *\n * @type {String}\n */\nvideojs.VERSION = '__VERSION__';\n\n/**\n * The global options object. These are the settings that take effect\n * if no overrides are specified when the player is created.\n *\n * ```js\n *     videojs.options.autoplay = true\n *     // -> all players will autoplay by default\n * ```\n *\n * @type {Object}\n */\nvideojs.options = Player.prototype.options_;\n\n/**\n * Get an object with the currently created players, keyed by player ID\n *\n * @return {Object} The created players\n * @mixes videojs\n * @method getPlayers\n */\nvideojs.getPlayers = function() {\n  return Player.players;\n};\n\n/**\n * For backward compatibility, expose players object.\n *\n * @deprecated\n * @memberOf videojs\n * @property {Object|Proxy} players\n */\nvideojs.players = createDeprecationProxy(Player.players, {\n  get: 'Access to videojs.players is deprecated; use videojs.getPlayers instead',\n  set: 'Modification of videojs.players is deprecated'\n});\n\n/**\n * Get a component class object by name\n * ```js\n *     var VjsButton = videojs.getComponent('Button');\n *     // Create a new instance of the component\n *     var myButton = new VjsButton(myPlayer);\n * ```\n *\n * @return {Component} Component identified by name\n * @mixes videojs\n * @method getComponent\n */\nvideojs.getComponent = Component.getComponent;\n\n/**\n * Register a component so it can referred to by name\n * Used when adding to other\n * components, either through addChild\n * `component.addChild('myComponent')`\n * or through default children options\n * `{ children: ['myComponent'] }`.\n * ```js\n *     // Get a component to subclass\n *     var VjsButton = videojs.getComponent('Button');\n *     // Subclass the component (see 'extend' doc for more info)\n *     var MySpecialButton = videojs.extend(VjsButton, {});\n *     // Register the new component\n *     VjsButton.registerComponent('MySepcialButton', MySepcialButton);\n *     // (optionally) add the new component as a default player child\n *     myPlayer.addChild('MySepcialButton');\n * ```\n * NOTE: You could also just initialize the component before adding.\n * `component.addChild(new MyComponent());`\n *\n * @param {String} The class name of the component\n * @param {Component} The component class\n * @return {Component} The newly registered component\n * @mixes videojs\n * @method registerComponent\n */\nvideojs.registerComponent = Component.registerComponent;\n\n/**\n * A suite of browser and device tests\n *\n * @type {Object}\n * @private\n */\nvideojs.browser = browser;\n\n/**\n * Whether or not the browser supports touch events. Included for backward\n * compatibility with 4.x, but deprecated. Use `videojs.browser.TOUCH_ENABLED`\n * instead going forward.\n *\n * @deprecated\n * @type {Boolean}\n */\nvideojs.TOUCH_ENABLED = browser.TOUCH_ENABLED;\n\n/**\n * Subclass an existing class\n * Mimics ES6 subclassing with the `extend` keyword\n * ```js\n *     // Create a basic javascript 'class'\n *     function MyClass(name){\n *       // Set a property at initialization\n *       this.myName = name;\n *     }\n *     // Create an instance method\n *     MyClass.prototype.sayMyName = function(){\n *       alert(this.myName);\n *     };\n *     // Subclass the exisitng class and change the name\n *     // when initializing\n *     var MySubClass = videojs.extend(MyClass, {\n *       constructor: function(name) {\n *         // Call the super class constructor for the subclass\n *         MyClass.call(this, name)\n *       }\n *     });\n *     // Create an instance of the new sub class\n *     var myInstance = new MySubClass('John');\n *     myInstance.sayMyName(); // -> should alert \"John\"\n * ```\n *\n * @param {Function} The Class to subclass\n * @param {Object} An object including instace methods for the new class\n *                   Optionally including a `constructor` function\n * @return {Function} The newly created subclass\n * @mixes videojs\n * @method extend\n */\nvideojs.extend = extendFn;\n\n/**\n * Merge two options objects recursively\n * Performs a deep merge like lodash.merge but **only merges plain objects**\n * (not arrays, elements, anything else)\n * Other values will be copied directly from the second object.\n * ```js\n *     var defaultOptions = {\n *       foo: true,\n *       bar: {\n *         a: true,\n *         b: [1,2,3]\n *       }\n *     };\n *     var newOptions = {\n *       foo: false,\n *       bar: {\n *         b: [4,5,6]\n *       }\n *     };\n *     var result = videojs.mergeOptions(defaultOptions, newOptions);\n *     // result.foo = false;\n *     // result.bar.a = true;\n *     // result.bar.b = [4,5,6];\n * ```\n *\n * @param {Object} The options object whose values will be overriden\n * @param {Object} The options object with values to override the first\n * @param {Object} Any number of additional options objects\n *\n * @return {Object} a new object with the merged values\n * @mixes videojs\n * @method mergeOptions\n */\nvideojs.mergeOptions = mergeOptions;\n\n/**\n * Change the context (this) of a function\n *\n *     videojs.bind(newContext, function(){\n *       this === newContext\n *     });\n *\n * NOTE: as of v5.0 we require an ES5 shim, so you should use the native\n * `function(){}.bind(newContext);` instead of this.\n *\n * @param  {*}        context The object to bind as scope\n * @param  {Function} fn      The function to be bound to a scope\n * @param  {Number=}  uid     An optional unique ID for the function to be set\n * @return {Function}\n */\nvideojs.bind = Fn.bind;\n\n/**\n * Create a Video.js player plugin\n * Plugins are only initialized when options for the plugin are included\n * in the player options, or the plugin function on the player instance is\n * called.\n * **See the plugin guide in the docs for a more detailed example**\n * ```js\n *     // Make a plugin that alerts when the player plays\n *     videojs.plugin('myPlugin', function(myPluginOptions) {\n *       myPluginOptions = myPluginOptions || {};\n *\n *       var player = this;\n *       var alertText = myPluginOptions.text || 'Player is playing!'\n *\n *       player.on('play', function(){\n *         alert(alertText);\n *       });\n *     });\n *     // USAGE EXAMPLES\n *     // EXAMPLE 1: New player with plugin options, call plugin immediately\n *     var player1 = videojs('idOne', {\n *       myPlugin: {\n *         text: 'Custom text!'\n *       }\n *     });\n *     // Click play\n *     // --> Should alert 'Custom text!'\n *     // EXAMPLE 3: New player, initialize plugin later\n *     var player3 = videojs('idThree');\n *     // Click play\n *     // --> NO ALERT\n *     // Click pause\n *     // Initialize plugin using the plugin function on the player instance\n *     player3.myPlugin({\n *       text: 'Plugin added later!'\n *     });\n *     // Click play\n *     // --> Should alert 'Plugin added later!'\n * ```\n *\n * @param {String} The plugin name\n * @param {Function} The plugin function that will be called with options\n * @mixes videojs\n * @method plugin\n */\nvideojs.plugin = plugin;\n\n/**\n * Adding languages so that they're available to all players.\n * ```js\n *     videojs.addLanguage('es', { 'Hello': 'Hola' });\n * ```\n *\n * @param  {String} code The language code or dictionary property\n * @param  {Object} data The data values to be translated\n * @return {Object} The resulting language dictionary object\n * @mixes videojs\n * @method addLanguage\n */\nvideojs.addLanguage = function(code, data){\n  code = ('' + code).toLowerCase();\n  return merge(videojs.options.languages, { [code]: data })[code];\n};\n\n/**\n * Log debug messages.\n *\n * @param {...Object} messages One or more messages to log\n */\nvideojs.log = log;\n\n/**\n * Creates an emulated TimeRange object.\n *\n * @param  {Number|Array} start Start time in seconds or an array of ranges\n * @param  {Number} end   End time in seconds\n * @return {Object}       Fake TimeRange object\n * @method createTimeRange\n */\nvideojs.createTimeRange = videojs.createTimeRanges = createTimeRanges;\n\n/**\n * Format seconds as a time string, H:MM:SS or M:SS\n * Supplying a guide (in seconds) will force a number of leading zeros\n * to cover the length of the guide\n *\n * @param  {Number} seconds Number of seconds to be turned into a string\n * @param  {Number} guide   Number (in seconds) to model the string after\n * @return {String}         Time formatted as H:MM:SS or M:SS\n * @method formatTime\n */\nvideojs.formatTime = formatTime;\n\n/**\n * Resolve and parse the elements of a URL\n *\n * @param  {String} url The url to parse\n * @return {Object}     An object of url details\n * @method parseUrl\n */\nvideojs.parseUrl = Url.parseUrl;\n\n/**\n * Returns whether the url passed is a cross domain request or not.\n *\n * @param {String} url The url to check\n * @return {Boolean}   Whether it is a cross domain request or not\n * @method isCrossOrigin\n */\nvideojs.isCrossOrigin = Url.isCrossOrigin;\n\n/**\n * Event target class.\n *\n * @type {Function}\n */\nvideojs.EventTarget = EventTarget;\n\n/**\n * Add an event listener to element\n * It stores the handler function in a separate cache object\n * and adds a generic handler to the element's event,\n * along with a unique id (guid) to the element.\n *\n * @param  {Element|Object}   elem Element or object to bind listeners to\n * @param  {String|Array}   type Type of event to bind to.\n * @param  {Function} fn   Event listener.\n * @method on\n */\nvideojs.on = Events.on;\n\n/**\n * Trigger a listener only once for an event\n *\n * @param  {Element|Object}   elem Element or object to\n * @param  {String|Array}   type Name/type of event\n * @param  {Function} fn Event handler function\n * @method one\n */\nvideojs.one = Events.one;\n\n/**\n * Removes event listeners from an element\n *\n * @param  {Element|Object}   elem Object to remove listeners from\n * @param  {String|Array=}   type Type of listener to remove. Don't include to remove all events from element.\n * @param  {Function} fn   Specific listener to remove. Don't include to remove listeners for an event type.\n * @method off\n */\nvideojs.off = Events.off;\n\n/**\n * Trigger an event for an element\n *\n * @param  {Element|Object}      elem  Element to trigger an event on\n * @param  {Event|Object|String} event A string (the type) or an event object with a type attribute\n * @param  {Object} [hash] data hash to pass along with the event\n * @return {Boolean=} Returned only if default was prevented\n * @method trigger\n */\nvideojs.trigger = Events.trigger;\n\n/**\n * A cross-browser XMLHttpRequest wrapper. Here's a simple example:\n *\n *     videojs.xhr({\n *       body: someJSONString,\n *       uri: \"/foo\",\n *       headers: {\n *         \"Content-Type\": \"application/json\"\n *       }\n *     }, function (err, resp, body) {\n *       // check resp.statusCode\n *     });\n *\n * Check out the [full\n * documentation](https://github.com/Raynos/xhr/blob/v2.1.0/README.md)\n * for more options.\n *\n * @param {Object} options settings for the request.\n * @return {XMLHttpRequest|XDomainRequest} the request object.\n * @see https://github.com/Raynos/xhr\n */\nvideojs.xhr = xhr;\n\n/**\n * TextTrack class\n *\n * @type {Function}\n */\nvideojs.TextTrack = TextTrack;\n\n// REMOVING: We probably should add this to the migration plugin\n// // Expose but deprecate the window[componentName] method for accessing components\n// Object.getOwnPropertyNames(Component.components).forEach(function(name){\n//   let component = Component.components[name];\n//\n//   // A deprecation warning as the constuctor\n//   module.exports[name] = function(player, options, ready){\n//     log.warn('Using videojs.'+name+' to access the '+name+' component has been deprecated. Please use videojs.getComponent(\"componentName\")');\n//\n//     return new Component(player, options, ready);\n//   };\n//\n//   // Allow the prototype and class methods to be accessible still this way\n//   // Though anything that attempts to override class methods will no longer work\n//   assign(module.exports[name], component);\n// });\n\n/*\n * Custom Universal Module Definition (UMD)\n *\n * Video.js will never be a non-browser lib so we can simplify UMD a bunch and\n * still support requirejs and browserify. This also needs to be closure\n * compiler compatible, so string keys are used.\n */\nif (typeof define === 'function' && define['amd']) {\n  define('videojs', [], function(){ return videojs; });\n\n// checking that module is an object too because of umdjs/umd#35\n} else if (typeof exports === 'object' && typeof module === 'object') {\n  module['exports'] = videojs;\n}\n\nexport default videojs;\n"
 
  ]
 
}
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/video.min.js
Show inline comments
 
new file 100644
 
/**
 
 * @license
 
 * Video.js 5.0.0 <http://videojs.com/>
 
 * Copyright Brightcove, Inc. <https://www.brightcove.com/>
 
 * Available under Apache License Version 2.0
 
 * <https://github.com/videojs/video.js/blob/master/LICENSE>
 
 *
 
 * Includes vtt.js <https://github.com/mozilla/vtt.js>
 
 * Available under Apache License Version 2.0
 
 * <https://github.com/mozilla/vtt.js/blob/master/LICENSE>
 
 */
 
!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.videojs=a()}}(function(){var a;return function b(a,c,d){function e(g,h){if(!c[g]){if(!a[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};a[g][0].call(k.exports,function(b){var c=a[g][1][b];return e(c?c:b)},k,k.exports,b,a,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b){(function(c){var d="undefined"!=typeof c?c:"undefined"!=typeof window?window:{},e=a("min-document");if("undefined"!=typeof document)b.exports=document;else{var f=d["__GLOBAL_DOCUMENT_CACHE@4"];f||(f=d["__GLOBAL_DOCUMENT_CACHE@4"]=e),b.exports=f}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"min-document":3}],2:[function(a,b){(function(a){b.exports="undefined"!=typeof window?window:"undefined"!=typeof a?a:"undefined"!=typeof self?self:{}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],3:[function(){},{}],4:[function(a,b){var c=a("../internal/getNative"),d=c(Date,"now"),e=d||function(){return(new Date).getTime()};b.exports=e},{"../internal/getNative":20}],5:[function(a,b){function c(a,b,c){function h(){r&&clearTimeout(r),n&&clearTimeout(n),t=0,n=r=s=void 0}function i(b,c){c&&clearTimeout(c),n=r=s=void 0,b&&(t=e(),o=a.apply(q,m),r||n||(m=q=void 0))}function j(){var a=b-(e()-p);0>=a||a>b?i(s,n):r=setTimeout(j,a)}function k(){i(v,r)}function l(){if(m=arguments,p=e(),q=this,s=v&&(r||!w),u===!1)var c=w&&!r;else{n||w||(t=p);var d=u-(p-t),f=0>=d||d>u;f?(n&&(n=clearTimeout(n)),t=p,o=a.apply(q,m)):n||(n=setTimeout(k,d))}return f&&r?r=clearTimeout(r):r||b===u||(r=setTimeout(j,b)),c&&(f=!0,o=a.apply(q,m)),!f||r||n||(m=q=void 0),o}var m,n,o,p,q,r,s,t=0,u=!1,v=!0;if("function"!=typeof a)throw new TypeError(f);if(b=0>b?0:+b||0,c===!0){var w=!0;v=!1}else d(c)&&(w=!!c.leading,u="maxWait"in c&&g(+c.maxWait||0,b),v="trailing"in c?!!c.trailing:v);return l.cancel=h,l}var d=a("../lang/isObject"),e=a("../date/now"),f="Expected a function",g=Math.max;b.exports=c},{"../date/now":4,"../lang/isObject":33}],6:[function(a,b){function c(a,b){if("function"!=typeof a)throw new TypeError(d);return b=e(void 0===b?a.length-1:+b||0,0),function(){for(var c=arguments,d=-1,f=e(c.length-b,0),g=Array(f);++d<f;)g[d]=c[b+d];switch(b){case 0:return a.call(this,g);case 1:return a.call(this,c[0],g);case 2:return a.call(this,c[0],c[1],g)}var h=Array(b+1);for(d=-1;++d<b;)h[d]=c[d];return h[b]=g,a.apply(this,h)}}var d="Expected a function",e=Math.max;b.exports=c},{}],7:[function(a,b){function c(a,b,c){var g=!0,h=!0;if("function"!=typeof a)throw new TypeError(f);return c===!1?g=!1:e(c)&&(g="leading"in c?!!c.leading:g,h="trailing"in c?!!c.trailing:h),d(a,b,{leading:g,maxWait:+b,trailing:h})}var d=a("./debounce"),e=a("../lang/isObject"),f="Expected a function";b.exports=c},{"../lang/isObject":33,"./debounce":5}],8:[function(a,b){function c(a,b){var c=-1,d=a.length;for(b||(b=Array(d));++c<d;)b[c]=a[c];return b}b.exports=c},{}],9:[function(a,b){function c(a,b){for(var c=-1,d=a.length;++c<d&&b(a[c],c,a)!==!1;);return a}b.exports=c},{}],10:[function(a,b){function c(a,b,c){c||(c={});for(var d=-1,e=b.length;++d<e;){var f=b[d];c[f]=a[f]}return c}b.exports=c},{}],11:[function(a,b){var c=a("./createBaseFor"),d=c();b.exports=d},{"./createBaseFor":18}],12:[function(a,b){function c(a,b){return d(a,b,e)}var d=a("./baseFor"),e=a("../object/keysIn");b.exports=c},{"../object/keysIn":39,"./baseFor":11}],13:[function(a,b){function c(a,b,l,m,n){if(!h(a))return a;var o=g(b)&&(f(b)||j(b)),p=o?void 0:k(b);return d(p||b,function(d,f){if(p&&(f=d,d=b[f]),i(d))m||(m=[]),n||(n=[]),e(a,b,f,c,l,m,n);else{var g=a[f],h=l?l(g,d,f,a,b):void 0,j=void 0===h;j&&(h=d),void 0===h&&(!o||f in a)||!j&&(h===h?h===g:g!==g)||(a[f]=h)}}),a}var d=a("./arrayEach"),e=a("./baseMergeDeep"),f=a("../lang/isArray"),g=a("./isArrayLike"),h=a("../lang/isObject"),i=a("./isObjectLike"),j=a("../lang/isTypedArray"),k=a("../object/keys");b.exports=c},{"../lang/isArray":30,"../lang/isObject":33,"../lang/isTypedArray":36,"../object/keys":38,"./arrayEach":9,"./baseMergeDeep":14,"./isArrayLike":21,"./isObjectLike":26}],14:[function(a,b){function c(a,b,c,k,l,m,n){for(var o=m.length,p=b[c];o--;)if(m[o]==p)return void(a[c]=n[o]);var q=a[c],r=l?l(q,p,c,a,b):void 0,s=void 0===r;s&&(r=p,g(p)&&(f(p)||i(p))?r=f(q)?q:g(q)?d(q):[]:h(p)||e(p)?r=e(q)?j(q):h(q)?q:{}:s=!1),m.push(p),n.push(r),s?a[c]=k(r,p,l,m,n):(r===r?r!==q:q===q)&&(a[c]=r)}var d=a("./arrayCopy"),e=a("../lang/isArguments"),f=a("../lang/isArray"),g=a("./isArrayLike"),h=a("../lang/isPlainObject"),i=a("../lang/isTypedArray"),j=a("../lang/toPlainObject");b.exports=c},{"../lang/isArguments":29,"../lang/isArray":30,"../lang/isPlainObject":34,"../lang/isTypedArray":36,"../lang/toPlainObject":37,"./arrayCopy":8,"./isArrayLike":21}],15:[function(a,b){function c(a){return function(b){return null==b?void 0:d(b)[a]}}var d=a("./toObject");b.exports=c},{"./toObject":28}],16:[function(a,b){function c(a,b,c){if("function"!=typeof a)return d;if(void 0===b)return a;switch(c){case 1:return function(c){return a.call(b,c)};case 3:return function(c,d,e){return a.call(b,c,d,e)};case 4:return function(c,d,e,f){return a.call(b,c,d,e,f)};case 5:return function(c,d,e,f,g){return a.call(b,c,d,e,f,g)}}return function(){return a.apply(b,arguments)}}var d=a("../utility/identity");b.exports=c},{"../utility/identity":42}],17:[function(a,b){function c(a){return f(function(b,c){var f=-1,g=null==b?0:c.length,h=g>2?c[g-2]:void 0,i=g>2?c[2]:void 0,j=g>1?c[g-1]:void 0;for("function"==typeof h?(h=d(h,j,5),g-=2):(h="function"==typeof j?j:void 0,g-=h?1:0),i&&e(c[0],c[1],i)&&(h=3>g?void 0:h,g=1);++f<g;){var k=c[f];k&&a(b,k,h)}return b})}var d=a("./bindCallback"),e=a("./isIterateeCall"),f=a("../function/restParam");b.exports=c},{"../function/restParam":6,"./bindCallback":16,"./isIterateeCall":24}],18:[function(a,b){function c(a){return function(b,c,e){for(var f=d(b),g=e(b),h=g.length,i=a?h:-1;a?i--:++i<h;){var j=g[i];if(c(f[j],j,f)===!1)break}return b}}var d=a("./toObject");b.exports=c},{"./toObject":28}],19:[function(a,b){var c=a("./baseProperty"),d=c("length");b.exports=d},{"./baseProperty":15}],20:[function(a,b){function c(a,b){var c=null==a?void 0:a[b];return d(c)?c:void 0}var d=a("../lang/isNative");b.exports=c},{"../lang/isNative":32}],21:[function(a,b){function c(a){return null!=a&&e(d(a))}var d=a("./getLength"),e=a("./isLength");b.exports=c},{"./getLength":19,"./isLength":25}],22:[function(a,b){var c=function(){try{Object({toString:0}+"")}catch(a){return function(){return!1}}return function(a){return"function"!=typeof a.toString&&"string"==typeof(a+"")}}();b.exports=c},{}],23:[function(a,b){function c(a,b){return a="number"==typeof a||d.test(a)?+a:-1,b=null==b?e:b,a>-1&&a%1==0&&b>a}var d=/^\d+$/,e=9007199254740991;b.exports=c},{}],24:[function(a,b){function c(a,b,c){if(!f(c))return!1;var g=typeof b;if("number"==g?d(c)&&e(b,c.length):"string"==g&&b in c){var h=c[b];return a===a?a===h:h!==h}return!1}var d=a("./isArrayLike"),e=a("./isIndex"),f=a("../lang/isObject");b.exports=c},{"../lang/isObject":33,"./isArrayLike":21,"./isIndex":23}],25:[function(a,b){function c(a){return"number"==typeof a&&a>-1&&a%1==0&&d>=a}var d=9007199254740991;b.exports=c},{}],26:[function(a,b){function c(a){return!!a&&"object"==typeof a}b.exports=c},{}],27:[function(a,b){function c(a){for(var b=i(a),c=b.length,j=c&&a.length,l=!!j&&g(j)&&(e(a)||d(a)||h(a)),m=-1,n=[];++m<c;){var o=b[m];(l&&f(o,j)||k.call(a,o))&&n.push(o)}return n}var d=a("../lang/isArguments"),e=a("../lang/isArray"),f=a("./isIndex"),g=a("./isLength"),h=a("../lang/isString"),i=a("../object/keysIn"),j=Object.prototype,k=j.hasOwnProperty;b.exports=c},{"../lang/isArguments":29,"../lang/isArray":30,"../lang/isString":35,"../object/keysIn":39,"./isIndex":23,"./isLength":25}],28:[function(a,b){function c(a){if(f.unindexedChars&&e(a)){for(var b=-1,c=a.length,g=Object(a);++b<c;)g[b]=a.charAt(b);return g}return d(a)?a:Object(a)}var d=a("../lang/isObject"),e=a("../lang/isString"),f=a("../support");b.exports=c},{"../lang/isObject":33,"../lang/isString":35,"../support":41}],29:[function(a,b){function c(a){return e(a)&&d(a)&&g.call(a,"callee")&&!h.call(a,"callee")}var d=a("../internal/isArrayLike"),e=a("../internal/isObjectLike"),f=Object.prototype,g=f.hasOwnProperty,h=f.propertyIsEnumerable;b.exports=c},{"../internal/isArrayLike":21,"../internal/isObjectLike":26}],30:[function(a,b){var c=a("../internal/getNative"),d=a("../internal/isLength"),e=a("../internal/isObjectLike"),f="[object Array]",g=Object.prototype,h=g.toString,i=c(Array,"isArray"),j=i||function(a){return e(a)&&d(a.length)&&h.call(a)==f};b.exports=j},{"../internal/getNative":20,"../internal/isLength":25,"../internal/isObjectLike":26}],31:[function(a,b){function c(a){return d(a)&&g.call(a)==e}var d=a("./isObject"),e="[object Function]",f=Object.prototype,g=f.toString;b.exports=c},{"./isObject":33}],32:[function(a,b){function c(a){return null==a?!1:d(a)?k.test(i.call(a)):f(a)&&(e(a)?k:g).test(a)}var d=a("./isFunction"),e=a("../internal/isHostObject"),f=a("../internal/isObjectLike"),g=/^\[object .+?Constructor\]$/,h=Object.prototype,i=Function.prototype.toString,j=h.hasOwnProperty,k=RegExp("^"+i.call(j).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");b.exports=c},{"../internal/isHostObject":22,"../internal/isObjectLike":26,"./isFunction":31}],33:[function(a,b){function c(a){var b=typeof a;return!!a&&("object"==b||"function"==b)}b.exports=c},{}],34:[function(a,b){function c(a){var b;if(!g(a)||l.call(a)!=i||f(a)||e(a)||!k.call(a,"constructor")&&(b=a.constructor,"function"==typeof b&&!(b instanceof b)))return!1;var c;return h.ownLast?(d(a,function(a,b,d){return c=k.call(d,b),!1}),c!==!1):(d(a,function(a,b){c=b}),void 0===c||k.call(a,c))}var d=a("../internal/baseForIn"),e=a("./isArguments"),f=a("../internal/isHostObject"),g=a("../internal/isObjectLike"),h=a("../support"),i="[object Object]",j=Object.prototype,k=j.hasOwnProperty,l=j.toString;b.exports=c},{"../internal/baseForIn":12,"../internal/isHostObject":22,"../internal/isObjectLike":26,"../support":41,"./isArguments":29}],35:[function(a,b){function c(a){return"string"==typeof a||d(a)&&g.call(a)==e}var d=a("../internal/isObjectLike"),e="[object String]",f=Object.prototype,g=f.toString;b.exports=c},{"../internal/isObjectLike":26}],36:[function(a,b){function c(a){return e(a)&&d(a.length)&&!!C[E.call(a)]}var d=a("../internal/isLength"),e=a("../internal/isObjectLike"),f="[object Arguments]",g="[object Array]",h="[object Boolean]",i="[object Date]",j="[object Error]",k="[object Function]",l="[object Map]",m="[object Number]",n="[object Object]",o="[object RegExp]",p="[object Set]",q="[object String]",r="[object WeakMap]",s="[object ArrayBuffer]",t="[object Float32Array]",u="[object Float64Array]",v="[object Int8Array]",w="[object Int16Array]",x="[object Int32Array]",y="[object Uint8Array]",z="[object Uint8ClampedArray]",A="[object Uint16Array]",B="[object Uint32Array]",C={};C[t]=C[u]=C[v]=C[w]=C[x]=C[y]=C[z]=C[A]=C[B]=!0,C[f]=C[g]=C[s]=C[h]=C[i]=C[j]=C[k]=C[l]=C[m]=C[n]=C[o]=C[p]=C[q]=C[r]=!1;var D=Object.prototype,E=D.toString;b.exports=c},{"../internal/isLength":25,"../internal/isObjectLike":26}],37:[function(a,b){function c(a){return d(a,e(a))}var d=a("../internal/baseCopy"),e=a("../object/keysIn");b.exports=c},{"../internal/baseCopy":10,"../object/keysIn":39}],38:[function(a,b){var c=a("../internal/getNative"),d=a("../internal/isArrayLike"),e=a("../lang/isObject"),f=a("../internal/shimKeys"),g=a("../support"),h=c(Object,"keys"),i=h?function(a){var b=null==a?void 0:a.constructor;return"function"==typeof b&&b.prototype===a||("function"==typeof a?g.enumPrototypes:d(a))?f(a):e(a)?h(a):[]}:f;b.exports=i},{"../internal/getNative":20,"../internal/isArrayLike":21,"../internal/shimKeys":27,"../lang/isObject":33,"../support":41}],39:[function(a,b){function c(a){if(null==a)return[];j(a)||(a=Object(a));var b=a.length;b=b&&i(b)&&(f(a)||e(a)||k(a))&&b||0;for(var c=a.constructor,d=-1,m=g(c)&&c.prototype||x,n=m===a,o=Array(b),q=b>0,r=l.enumErrorProps&&(a===w||a instanceof Error),t=l.enumPrototypes&&g(a);++d<b;)o[d]=d+"";for(var C in a)t&&"prototype"==C||r&&("message"==C||"name"==C)||q&&h(C,b)||"constructor"==C&&(n||!z.call(a,C))||o.push(C);if(l.nonEnumShadows&&a!==x){var D=a===y?u:a===w?p:A.call(a),E=B[D]||B[s];for(D==s&&(m=x),b=v.length;b--;){C=v[b];var F=E[C];n&&F||(F?!z.call(a,C):a[C]===m[C])||o.push(C)}}return o}var d=a("../internal/arrayEach"),e=a("../lang/isArguments"),f=a("../lang/isArray"),g=a("../lang/isFunction"),h=a("../internal/isIndex"),i=a("../internal/isLength"),j=a("../lang/isObject"),k=a("../lang/isString"),l=a("../support"),m="[object Array]",n="[object Boolean]",o="[object Date]",p="[object Error]",q="[object Function]",r="[object Number]",s="[object Object]",t="[object RegExp]",u="[object String]",v=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],w=Error.prototype,x=Object.prototype,y=String.prototype,z=x.hasOwnProperty,A=x.toString,B={};B[m]=B[o]=B[r]={constructor:!0,toLocaleString:!0,toString:!0,valueOf:!0},B[n]=B[u]={constructor:!0,toString:!0,valueOf:!0},B[p]=B[q]=B[t]={constructor:!0,toString:!0},B[s]={constructor:!0},d(v,function(a){for(var b in B)if(z.call(B,b)){var c=B[b];c[a]=z.call(c,a)}}),b.exports=c},{"../internal/arrayEach":9,"../internal/isIndex":23,"../internal/isLength":25,"../lang/isArguments":29,"../lang/isArray":30,"../lang/isFunction":31,"../lang/isObject":33,"../lang/isString":35,"../support":41}],40:[function(a,b){var c=a("../internal/baseMerge"),d=a("../internal/createAssigner"),e=d(c);b.exports=e},{"../internal/baseMerge":13,"../internal/createAssigner":17}],41:[function(a,b){var c=Array.prototype,d=Error.prototype,e=Object.prototype,f=e.propertyIsEnumerable,g=c.splice,h={};!function(a){var b=function(){this.x=a},c={0:a,length:a},e=[];b.prototype={valueOf:a,y:a};for(var i in new b)e.push(i);h.enumErrorProps=f.call(d,"message")||f.call(d,"name"),h.enumPrototypes=f.call(b,"prototype"),h.nonEnumShadows=!/valueOf/.test(e),h.ownLast="x"!=e[0],h.spliceObjects=(g.call(c,0,1),!c[0]),h.unindexedChars="x"[0]+Object("x")[0]!="xx"}(1,0),b.exports=h},{}],42:[function(a,b){function c(a){return a}b.exports=c},{}],43:[function(a,b){"use strict";var c=a("object-keys"),d=function(a){return"undefined"!=typeof a&&null!==a},e="function"==typeof Symbol&&"symbol"==typeof Symbol(),f=a("define-properties"),g=Object,h=Array.prototype.push,i=Object.prototype.propertyIsEnumerable,j=function(a){if(!d(a))throw new TypeError("target must be an object");var b,f,j,k,l,m=g(a);for(b=1;b<arguments.length;++b){if(f=g(arguments[b]),k=c(f),e&&Object.getOwnPropertySymbols)for(l=Object.getOwnPropertySymbols(f),j=0;j<l.length;++j)i.call(f,l[j])&&h.call(k,l[j]);for(j=0;j<k.length;++j)m[k[j]]=f[k[j]]}return m};f(j,{shim:function(){var a=function(){if(!Object.assign||!Object.preventExtensions)return!1;var a=Object.preventExtensions({1:2});try{Object.assign(a,"xy")}catch(b){return"y"===a[1]}};return f(Object,{assign:j},{assign:a}),Object.assign||j}}),b.exports=j},{"define-properties":44,"object-keys":46}],44:[function(a,b){"use strict";var c=a("object-keys"),d=a("foreach"),e="function"==typeof Symbol&&"symbol"==typeof Symbol(),f=Object.prototype.toString,g=function(a){return"function"==typeof a&&"[object Function]"===f.call(a)},h=function(){var a={};try{Object.defineProperty(a,"x",{value:a,enumerable:!1});for(var b in a)return!1;return a.x===a}catch(c){return!1}},i=Object.defineProperty&&h(),j=function(a,b,c,d){(!(b in a)||g(d)&&d())&&(i?Object.defineProperty(a,b,{configurable:!0,enumerable:!1,writable:!0,value:c}):a[b]=c)},k=function(a,b){var f=arguments.length>2?arguments[2]:{},g=c(b);e&&(g=g.concat(Object.getOwnPropertySymbols(b))),d(g,function(c){j(a,c,b[c],f[c])})};k.supportsDescriptors=!!i,b.exports=k},{foreach:45,"object-keys":46}],45:[function(a,b){var c=Object.prototype.hasOwnProperty,d=Object.prototype.toString;b.exports=function(a,b,e){if("[object Function]"!==d.call(b))throw new TypeError("iterator must be a function");var f=a.length;if(f===+f)for(var g=0;f>g;g++)b.call(e,a[g],g,a);else for(var h in a)c.call(a,h)&&b.call(e,a[h],h,a)}},{}],46:[function(a,b){"use strict";var c=Object.prototype.hasOwnProperty,d=Object.prototype.toString,e=Array.prototype.slice,f=a("./isArguments"),g=!{toString:null}.propertyIsEnumerable("toString"),h=function(){}.propertyIsEnumerable("prototype"),i=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],j=function(a){var b=a.constructor;return b&&b.prototype===a},k={$window:!0,$console:!0,$parent:!0,$self:!0,$frames:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0},l=function(){if("undefined"==typeof window)return!1;for(var a in window)if(!k["$"+a]&&c.call(window,a)&&null!==window[a]&&"object"==typeof window[a])try{j(window[a])}catch(b){return!0}return!1}(),m=function(a){if("undefined"==typeof window&&!l)return j(a);try{return j(a)}catch(b){return!1}},n=function(a){var b=null!==a&&"object"==typeof a,e="[object Function]"===d.call(a),j=f(a),k=b&&"[object String]"===d.call(a),l=[];if(!b&&!e&&!j)throw new TypeError("Object.keys called on a non-object");var n=h&&e;if(k&&a.length>0&&!c.call(a,0))for(var o=0;o<a.length;++o)l.push(String(o));if(j&&a.length>0)for(var p=0;p<a.length;++p)l.push(String(p));else for(var q in a)n&&"prototype"===q||!c.call(a,q)||l.push(String(q));if(g)for(var r=m(a),s=0;s<i.length;++s)r&&"constructor"===i[s]||!c.call(a,i[s])||l.push(i[s]);return l};n.shim=function(){if(Object.keys){var a=function(){return 2===(Object.keys(arguments)||"").length}(1,2);if(!a){var b=Object.keys;Object.keys=function(a){return b(f(a)?e.call(a):a)}}}else Object.keys=n;return Object.keys||n},b.exports=n},{"./isArguments":47}],47:[function(a,b){"use strict";var c=Object.prototype.toString;b.exports=function(a){var b=c.call(a),d="[object Arguments]"===b;return d||(d="[object Array]"!==b&&null!==a&&"object"==typeof a&&"number"==typeof a.length&&a.length>=0&&"[object Function]"===c.call(a.callee)),d}},{}],48:[function(a,b){function c(a,b){var c,d=null;try{c=JSON.parse(a,b)}catch(e){d=e}return[d,c]}b.exports=c},{}],49:[function(a,b){function c(a){return a.replace(/\n\r?\s*/g,"")}b.exports=function(a){for(var b="",d=0;d<arguments.length;d++)b+=c(a[d])+(arguments[d+1]||"");return b}},{}],50:[function(a,b){"use strict";function c(a){for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}function d(a,b){function e(){4===l.readyState&&j()}function f(){var a=void 0;if(l.response?a=l.response:"text"!==l.responseType&&l.responseType||(a=l.responseText||l.responseXML),u)try{a=JSON.parse(a)}catch(b){}return a}function i(a){clearTimeout(o),a instanceof Error||(a=new Error(""+(a||"Unknown XMLHttpRequest Error"))),a.statusCode=0,b(a,k)}function j(){if(!n){var c;clearTimeout(o),c=a.useXDR&&void 0===l.status?200:1223===l.status?204:l.status;var d=k,e=null;0!==c?(d={body:f(),statusCode:c,method:q,headers:{},url:p,rawRequest:l},l.getAllResponseHeaders&&(d.headers=h(l.getAllResponseHeaders()))):e=new Error("Internal XMLHttpRequest Error"),b(e,d,d.body)}}var k={body:void 0,headers:{},statusCode:0,method:q,url:p,rawRequest:l};if("string"==typeof a&&(a={uri:a}),a=a||{},"undefined"==typeof b)throw new Error("callback argument missing");b=g(b);var l=a.xhr||null;l||(l=a.cors||a.useXDR?new d.XDomainRequest:new d.XMLHttpRequest);var m,n,o,p=l.url=a.uri||a.url,q=l.method=a.method||"GET",r=a.body||a.data,s=l.headers=a.headers||{},t=!!a.sync,u=!1;if("json"in a&&(u=!0,s.accept||s.Accept||(s.Accept="application/json"),"GET"!==q&&"HEAD"!==q&&(s["content-type"]||s["Content-Type"]||(s["Content-Type"]="application/json"),r=JSON.stringify(a.json))),l.onreadystatechange=e,l.onload=j,l.onerror=i,l.onprogress=function(){},l.ontimeout=i,l.open(q,p,!t,a.username,a.password),t||(l.withCredentials=!!a.withCredentials),!t&&a.timeout>0&&(o=setTimeout(function(){n=!0,l.abort("timeout");var a=new Error("XMLHttpRequest timeout");a.code="ETIMEDOUT",i(a)},a.timeout)),l.setRequestHeader)for(m in s)s.hasOwnProperty(m)&&l.setRequestHeader(m,s[m]);else if(a.headers&&!c(a.headers))throw new Error("Headers cannot be set on an XDomainRequest object");return"responseType"in a&&(l.responseType=a.responseType),"beforeSend"in a&&"function"==typeof a.beforeSend&&a.beforeSend(l),l.send(r),l}function e(){}var f=a("global/window"),g=a("once"),h=a("parse-headers");b.exports=d,d.XMLHttpRequest=f.XMLHttpRequest||e,d.XDomainRequest="withCredentials"in new d.XMLHttpRequest?d.XMLHttpRequest:f.XDomainRequest},{"global/window":2,once:51,"parse-headers":55}],51:[function(a,b){function c(a){var b=!1;return function(){return b?void 0:(b=!0,a.apply(this,arguments))}}b.exports=c,c.proto=c(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return c(this)},configurable:!0})})},{}],52:[function(a,b){function c(a,b,c){if(!g(b))throw new TypeError("iterator must be a function");arguments.length<3&&(c=this),"[object Array]"===h.call(a)?d(a,b,c):"string"==typeof a?e(a,b,c):f(a,b,c)}function d(a,b,c){for(var d=0,e=a.length;e>d;d++)i.call(a,d)&&b.call(c,a[d],d,a)}function e(a,b,c){for(var d=0,e=a.length;e>d;d++)b.call(c,a.charAt(d),d,a)}function f(a,b,c){for(var d in a)i.call(a,d)&&b.call(c,a[d],d,a)}var g=a("is-function");b.exports=c;var h=Object.prototype.toString,i=Object.prototype.hasOwnProperty},{"is-function":53}],53:[function(a,b){function c(a){var b=d.call(a);return"[object Function]"===b||"function"==typeof a&&"[object RegExp]"!==b||"undefined"!=typeof window&&(a===window.setTimeout||a===window.alert||a===window.confirm||a===window.prompt)}b.exports=c;var d=Object.prototype.toString},{}],54:[function(a,b,c){function d(a){return a.replace(/^\s*|\s*$/g,"")}c=b.exports=d,c.left=function(a){return a.replace(/^\s*/,"")},c.right=function(a){return a.replace(/\s*$/,"")}},{}],55:[function(a,b){var c=a("trim"),d=a("for-each"),e=function(a){return"[object Array]"===Object.prototype.toString.call(a)};b.exports=function(a){if(!a)return{};var b={};return d(c(a).split("\n"),function(a){var d=a.indexOf(":"),f=c(a.slice(0,d)).toLowerCase(),g=c(a.slice(d+1));"undefined"==typeof b[f]?b[f]=g:e(b[f])?b[f].push(g):b[f]=[b[f],g]}),b}},{"for-each":52,trim:54}],56:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("./button.js"),h=d(g),i=a("./component.js"),j=d(i),k=function(a){function b(c,d){e(this,b),a.call(this,c,d)}return f(b,a),b.prototype.buildCSSClass=function(){return"vjs-big-play-button"},b.prototype.handleClick=function(){this.player_.play()},b}(h["default"]);k.prototype.controlText_="Play Video",j["default"].registerComponent("BigPlayButton",k),c["default"]=k,b.exports=c["default"]},{"./button.js":57,"./component.js":58}],57:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("./component"),i=e(h),j=a("./utils/dom.js"),k=d(j),l=a("./utils/events.js"),m=d(l),n=a("./utils/fn.js"),o=d(n),p=a("global/document"),q=e(p),r=a("object.assign"),s=e(r),t=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.emitTapEvents(),this.on("tap",this.handleClick),this.on("click",this.handleClick),this.on("focus",this.handleFocus),this.on("blur",this.handleBlur)}return g(b,a),b.prototype.createEl=function(){var b=arguments.length<=0||void 0===arguments[0]?"button":arguments[0],c=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],d=arguments.length<=2||void 0===arguments[2]?{}:arguments[2];c=s["default"]({className:this.buildCSSClass(),tabIndex:0},c),d=s["default"]({role:"button",type:"button","aria-live":"polite"},d);var e=a.prototype.createEl.call(this,b,c,d);return this.controlTextEl_=k.createEl("span",{className:"vjs-control-text"}),e.appendChild(this.controlTextEl_),this.controlText(this.controlText_),e},b.prototype.controlText=function(a){return a?(this.controlText_=a,this.controlTextEl_.innerHTML=this.localize(this.controlText_),this):this.controlText_||"Need Text"},b.prototype.buildCSSClass=function(){return"vjs-control vjs-button "+a.prototype.buildCSSClass.call(this)},b.prototype.handleClick=function(){},b.prototype.handleFocus=function(){m.on(q["default"],"keydown",o.bind(this,this.handleKeyPress))},b.prototype.handleKeyPress=function(a){(32===a.which||13===a.which)&&(a.preventDefault(),this.handleClick(a))},b.prototype.handleBlur=function(){m.off(q["default"],"keydown",o.bind(this,this.handleKeyPress))},b}(i["default"]);i["default"].registerComponent("Button",t),c["default"]=t,b.exports=c["default"]},{"./component":58,"./utils/dom.js":118,"./utils/events.js":119,"./utils/fn.js":120,"global/document":1,"object.assign":43}],58:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}c.__esModule=!0;var g=a("global/window"),h=e(g),i=a("./utils/dom.js"),j=d(i),k=a("./utils/fn.js"),l=d(k),m=a("./utils/guid.js"),n=d(m),o=a("./utils/events.js"),p=d(o),q=a("./utils/log.js"),r=e(q),s=a("./utils/to-title-case.js"),t=e(s),u=a("object.assign"),v=e(u),w=a("./utils/merge-options.js"),x=e(w),y=function(){function a(b,c,d){if(f(this,a),this.player_=!b&&this.play?b=this:b,this.options_=x["default"]({},this.options_),c=this.options_=x["default"](this.options_,c),this.id_=c.id||c.el&&c.el.id,!this.id_){var e=b&&b.id&&b.id()||"no_player";this.id_=e+"_component_"+n.newGUID()}this.name_=c.name||null,c.el?this.el_=c.el:c.createEl!==!1&&(this.el_=this.createEl()),this.children_=[],this.childIndex_={},this.childNameIndex_={},c.initChildren!==!1&&this.initChildren(),this.ready(d),c.reportTouchActivity!==!1&&this.enableTouchActivity()}return a.prototype.dispose=function(){if(this.trigger({type:"dispose",bubbles:!1}),this.children_)for(var a=this.children_.length-1;a>=0;a--)this.children_[a].dispose&&this.children_[a].dispose();this.children_=null,this.childIndex_=null,this.childNameIndex_=null,this.off(),this.el_.parentNode&&this.el_.parentNode.removeChild(this.el_),j.removeElData(this.el_),this.el_=null},a.prototype.player=function(){return this.player_},a.prototype.options=function(a){return r["default"].warn("this.options() has been deprecated and will be moved to the constructor in 6.0"),a?(this.options_=x["default"](this.options_,a),this.options_):this.options_},a.prototype.el=function(){return this.el_},a.prototype.createEl=function(a,b,c){return j.createEl(a,b,c)},a.prototype.localize=function(a){var b=this.player_.language&&this.player_.language(),c=this.player_.languages&&this.player_.languages();if(!b||!c)return a;var d=c[b];if(d&&d[a])return d[a];var e=b.split("-")[0],f=c[e];return f&&f[a]?f[a]:a},a.prototype.contentEl=function(){return this.contentEl_||this.el_},a.prototype.id=function(){return this.id_},a.prototype.name=function(){return this.name_},a.prototype.children=function(){return this.children_},a.prototype.getChildById=function(a){return this.childIndex_[a]},a.prototype.getChild=function(a){return this.childNameIndex_[a]},a.prototype.addChild=function(b){var c=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],d=void 0,e=void 0;if("string"==typeof b){e=b,c||(c={}),c===!0&&(r["default"].warn("Initializing a child component with `true` is deprecated. Children should be defined in an array when possible, but if necessary use an object instead of `true`."),c={});var f=c.componentClass||t["default"](e);c.name=e;var g=a.getComponent(f);d=new g(this.player_||this,c)}else d=b;return this.children_.push(d),"function"==typeof d.id&&(this.childIndex_[d.id()]=d),e=e||d.name&&d.name(),e&&(this.childNameIndex_[e]=d),"function"==typeof d.el&&d.el()&&this.contentEl().appendChild(d.el()),d},a.prototype.removeChild=function(a){if("string"==typeof a&&(a=this.getChild(a)),a&&this.children_){for(var b=!1,c=this.children_.length-1;c>=0;c--)if(this.children_[c]===a){b=!0,this.children_.splice(c,1);break}if(b){this.childIndex_[a.id()]=null,this.childNameIndex_[a.name()]=null;var d=a.el();d&&d.parentNode===this.contentEl()&&this.contentEl().removeChild(a.el())}}},a.prototype.initChildren=function(){var a=this,b=this.options_.children;b&&!function(){var c=a.options_,d=function(b,d){void 0!==c[b]&&(d=c[b]),d!==!1&&(d===!0&&(d={}),d.playerOptions=a.options_.playerOptions,a[b]=a.addChild(b,d))};if(Array.isArray(b))for(var e=0;e<b.length;e++){var f=b[e],g=void 0,h=void 0;"string"==typeof f?(g=f,h={}):(g=f.name,h=f),d(g,h)}else Object.getOwnPropertyNames(b).forEach(function(a){d(a,b[a])})}()},a.prototype.buildCSSClass=function(){return""},a.prototype.on=function(a,b,c){var d=this;return"string"==typeof a||Array.isArray(a)?p.on(this.el_,a,l.bind(this,b)):!function(){var e=a,f=b,g=l.bind(d,c),h=function(){return d.off(e,f,g)};h.guid=g.guid,d.on("dispose",h);var i=function(){return d.off("dispose",h)};i.guid=g.guid,a.nodeName?(p.on(e,f,g),p.on(e,"dispose",i)):"function"==typeof a.on&&(e.on(f,g),e.on("dispose",i))}(),this},a.prototype.off=function(a,b,c){if(!a||"string"==typeof a||Array.isArray(a))p.off(this.el_,a,b);else{var d=a,e=b,f=l.bind(this,c);this.off("dispose",f),a.nodeName?(p.off(d,e,f),p.off(d,"dispose",f)):(d.off(e,f),d.off("dispose",f))}return this},a.prototype.one=function(a,b,c){var d=this,e=arguments;return"string"==typeof a||Array.isArray(a)?p.one(this.el_,a,l.bind(this,b)):!function(){var f=a,g=b,h=l.bind(d,c),i=function j(){d.off(f,g,j),h.apply(null,e)};i.guid=h.guid,d.on(f,g,i)}(),this},a.prototype.trigger=function(a,b){return p.trigger(this.el_,a,b),this},a.prototype.ready=function(a){var b=arguments.length<=1||void 0===arguments[1]?!1:arguments[1];return a&&(this.isReady_?b?a.call(this):this.setTimeout(a,1):(this.readyQueue_=this.readyQueue_||[],this.readyQueue_.push(a))),this},a.prototype.triggerReady=function(){this.isReady_=!0,this.setTimeout(function(){var a=this.readyQueue_;this.readyQueue_=[],a&&a.length>0&&a.forEach(function(a){a.call(this)},this),this.trigger("ready")},1)},a.prototype.hasClass=function(a){return j.hasElClass(this.el_,a)},a.prototype.addClass=function(a){return j.addElClass(this.el_,a),this},a.prototype.removeClass=function(a){return j.removeElClass(this.el_,a),this},a.prototype.show=function(){return this.removeClass("vjs-hidden"),this},a.prototype.hide=function(){return this.addClass("vjs-hidden"),this},a.prototype.lockShowing=function(){return this.addClass("vjs-lock-showing"),
 
this},a.prototype.unlockShowing=function(){return this.removeClass("vjs-lock-showing"),this},a.prototype.width=function(a,b){return this.dimension("width",a,b)},a.prototype.height=function(a,b){return this.dimension("height",a,b)},a.prototype.dimensions=function(a,b){return this.width(a,!0).height(b)},a.prototype.dimension=function(a,b,c){if(void 0!==b)return(null===b||b!==b)&&(b=0),this.el_.style[a]=-1!==(""+b).indexOf("%")||-1!==(""+b).indexOf("px")?b:"auto"===b?"":b+"px",c||this.trigger("resize"),this;if(!this.el_)return 0;var d=this.el_.style[a],e=d.indexOf("px");return-1!==e?parseInt(d.slice(0,e),10):parseInt(this.el_["offset"+t["default"](a)],10)},a.prototype.emitTapEvents=function(){var a=0,b=null,c=10,d=200,e=void 0;this.on("touchstart",function(c){1===c.touches.length&&(b=v["default"]({},c.touches[0]),a=(new Date).getTime(),e=!0)}),this.on("touchmove",function(a){if(a.touches.length>1)e=!1;else if(b){var d=a.touches[0].pageX-b.pageX,f=a.touches[0].pageY-b.pageY,g=Math.sqrt(d*d+f*f);g>c&&(e=!1)}});var f=function(){e=!1};this.on("touchleave",f),this.on("touchcancel",f),this.on("touchend",function(c){if(b=null,e===!0){var f=(new Date).getTime()-a;d>f&&(c.preventDefault(),this.trigger("tap"))}})},a.prototype.enableTouchActivity=function(){if(this.player()&&this.player().reportUserActivity){var a=l.bind(this.player(),this.player().reportUserActivity),b=void 0;this.on("touchstart",function(){a(),this.clearInterval(b),b=this.setInterval(a,250)});var c=function(){a(),this.clearInterval(b)};this.on("touchmove",a),this.on("touchend",c),this.on("touchcancel",c)}},a.prototype.setTimeout=function(a,b){a=l.bind(this,a);var c=h["default"].setTimeout(a,b),d=function(){this.clearTimeout(c)};return d.guid="vjs-timeout-"+c,this.on("dispose",d),c},a.prototype.clearTimeout=function(a){h["default"].clearTimeout(a);var b=function(){};return b.guid="vjs-timeout-"+a,this.off("dispose",b),a},a.prototype.setInterval=function(a,b){a=l.bind(this,a);var c=h["default"].setInterval(a,b),d=function(){this.clearInterval(c)};return d.guid="vjs-interval-"+c,this.on("dispose",d),c},a.prototype.clearInterval=function(a){h["default"].clearInterval(a);var b=function(){};return b.guid="vjs-interval-"+a,this.off("dispose",b),a},a.registerComponent=function(b,c){return a.components_||(a.components_={}),a.components_[b]=c,c},a.getComponent=function(b){return a.components_&&a.components_[b]?a.components_[b]:h["default"]&&h["default"].videojs&&h["default"].videojs[b]?(r["default"].warn("The "+b+" component was added to the videojs object when it should be registered using videojs.registerComponent(name, component)"),h["default"].videojs[b]):void 0},a.extend=function(b){b=b||{},r["default"].warn("Component.extend({}) has been deprecated, use videojs.extend(Component, {}) instead");var c=b.init||b.init||this.prototype.init||this.prototype.init||function(){},d=function(){c.apply(this,arguments)};d.prototype=Object.create(this.prototype),d.prototype.constructor=d,d.extend=a.extend;for(var e in b)b.hasOwnProperty(e)&&(d.prototype[e]=b[e]);return d},a}();y.registerComponent("Component",y),c["default"]=y,b.exports=c["default"]},{"./utils/dom.js":118,"./utils/events.js":119,"./utils/fn.js":120,"./utils/guid.js":122,"./utils/log.js":123,"./utils/merge-options.js":124,"./utils/to-title-case.js":127,"global/window":2,"object.assign":43}],59:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../component.js"),h=d(g),i=a("./play-toggle.js"),j=(d(i),a("./time-controls/current-time-display.js")),k=(d(j),a("./time-controls/duration-display.js")),l=(d(k),a("./time-controls/time-divider.js")),m=(d(l),a("./time-controls/remaining-time-display.js")),n=(d(m),a("./live-display.js")),o=(d(n),a("./progress-control/progress-control.js")),p=(d(o),a("./fullscreen-toggle.js")),q=(d(p),a("./volume-control/volume-control.js")),r=(d(q),a("./volume-menu-button.js")),s=(d(r),a("./mute-toggle.js")),t=(d(s),a("./text-track-controls/chapters-button.js")),u=(d(t),a("./text-track-controls/subtitles-button.js")),v=(d(u),a("./text-track-controls/captions-button.js")),w=(d(v),a("./playback-rate-menu/playback-rate-menu-button.js")),x=(d(w),a("./spacer-controls/custom-control-spacer.js")),y=(d(x),function(a){function b(){e(this,b),a.apply(this,arguments)}return f(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-control-bar"})},b}(h["default"]));y.prototype.options_={loadEvent:"play",children:["playToggle","volumeMenuButton","currentTimeDisplay","timeDivider","durationDisplay","progressControl","liveDisplay","remainingTimeDisplay","customControlSpacer","playbackRateMenuButton","chaptersButton","subtitlesButton","captionsButton","fullscreenToggle"]},h["default"].registerComponent("ControlBar",y),c["default"]=y,b.exports=c["default"]},{"../component.js":58,"./fullscreen-toggle.js":60,"./live-display.js":61,"./mute-toggle.js":62,"./play-toggle.js":63,"./playback-rate-menu/playback-rate-menu-button.js":64,"./progress-control/progress-control.js":69,"./spacer-controls/custom-control-spacer.js":71,"./text-track-controls/captions-button.js":74,"./text-track-controls/chapters-button.js":75,"./text-track-controls/subtitles-button.js":78,"./time-controls/current-time-display.js":81,"./time-controls/duration-display.js":82,"./time-controls/remaining-time-display.js":83,"./time-controls/time-divider.js":84,"./volume-control/volume-control.js":86,"./volume-menu-button.js":88}],60:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../button.js"),h=d(g),i=a("../component.js"),j=d(i),k=function(a){function b(){e(this,b),a.apply(this,arguments)}return f(b,a),b.prototype.buildCSSClass=function(){return"vjs-fullscreen-control "+a.prototype.buildCSSClass.call(this)},b.prototype.handleClick=function(){this.player_.isFullscreen()?(this.player_.exitFullscreen(),this.controlText("Fullscreen")):(this.player_.requestFullscreen(),this.controlText("Non-Fullscreen"))},b}(h["default"]);k.prototype.controlText_="Fullscreen",j["default"].registerComponent("FullscreenToggle",k),c["default"]=k,b.exports=c["default"]},{"../button.js":57,"../component.js":58}],61:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../component"),i=e(h),j=a("../utils/dom.js"),k=d(j),l=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.updateShowing(),this.on(this.player(),"durationchange",this.updateShowing)}return g(b,a),b.prototype.createEl=function(){var b=a.prototype.createEl.call(this,"div",{className:"vjs-live-control vjs-control"});return this.contentEl_=k.createEl("div",{className:"vjs-live-display",innerHTML:'<span class="vjs-control-text">'+this.localize("Stream Type")+"</span>"+this.localize("LIVE")},{"aria-live":"off"}),b.appendChild(this.contentEl_),b},b.prototype.updateShowing=function(){this.player().duration()===1/0?this.show():this.hide()},b}(i["default"]);i["default"].registerComponent("LiveDisplay",l),c["default"]=l,b.exports=c["default"]},{"../component":58,"../utils/dom.js":118}],62:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../button"),i=e(h),j=a("../component"),k=e(j),l=a("../utils/dom.js"),m=d(l),n=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.on(c,"volumechange",this.update),c.tech_&&c.tech_.featuresVolumeControl===!1&&this.addClass("vjs-hidden"),this.on(c,"loadstart",function(){this.update(),c.tech_.featuresVolumeControl===!1?this.addClass("vjs-hidden"):this.removeClass("vjs-hidden")})}return g(b,a),b.prototype.buildCSSClass=function(){return"vjs-mute-control "+a.prototype.buildCSSClass.call(this)},b.prototype.handleClick=function(){this.player_.muted(this.player_.muted()?!1:!0)},b.prototype.update=function(){var a=this.player_.volume(),b=3;0===a||this.player_.muted()?b=0:.33>a?b=1:.67>a&&(b=2);var c=this.player_.muted()?"Unmute":"Mute",d=this.localize(c);this.controlText()!==d&&this.controlText(d);for(var e=0;4>e;e++)m.removeElClass(this.el_,"vjs-vol-"+e);m.addElClass(this.el_,"vjs-vol-"+b)},b}(i["default"]);n.prototype.controlText_="Mute",k["default"].registerComponent("MuteToggle",n),c["default"]=n,b.exports=c["default"]},{"../button":57,"../component":58,"../utils/dom.js":118}],63:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../button.js"),h=d(g),i=a("../component.js"),j=d(i),k=function(a){function b(c,d){e(this,b),a.call(this,c,d),this.on(c,"play",this.handlePlay),this.on(c,"pause",this.handlePause)}return f(b,a),b.prototype.buildCSSClass=function(){return"vjs-play-control "+a.prototype.buildCSSClass.call(this)},b.prototype.handleClick=function(){this.player_.paused()?this.player_.play():this.player_.pause()},b.prototype.handlePlay=function(){this.removeClass("vjs-paused"),this.addClass("vjs-playing"),this.controlText("Pause")},b.prototype.handlePause=function(){this.removeClass("vjs-playing"),this.addClass("vjs-paused"),this.controlText("Play")},b}(h["default"]);k.prototype.controlText_="Play",j["default"].registerComponent("PlayToggle",k),c["default"]=k,b.exports=c["default"]},{"../button.js":57,"../component.js":58}],64:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../menu/menu-button.js"),i=e(h),j=a("../../menu/menu.js"),k=e(j),l=a("./playback-rate-menu-item.js"),m=e(l),n=a("../../component.js"),o=e(n),p=a("../../utils/dom.js"),q=d(p),r=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.updateVisibility(),this.updateLabel(),this.on(c,"loadstart",this.updateVisibility),this.on(c,"ratechange",this.updateLabel)}return g(b,a),b.prototype.createEl=function(){var b=a.prototype.createEl.call(this);return this.labelEl_=q.createEl("div",{className:"vjs-playback-rate-value",innerHTML:1}),b.appendChild(this.labelEl_),b},b.prototype.buildCSSClass=function(){return"vjs-playback-rate "+a.prototype.buildCSSClass.call(this)},b.prototype.createMenu=function(){var a=new k["default"](this.player()),b=this.playbackRates();if(b)for(var c=b.length-1;c>=0;c--)a.addChild(new m["default"](this.player(),{rate:b[c]+"x"}));return a},b.prototype.updateARIAAttributes=function(){this.el().setAttribute("aria-valuenow",this.player().playbackRate())},b.prototype.handleClick=function(){for(var a=this.player().playbackRate(),b=this.playbackRates(),c=b[0],d=0;d<b.length;d++)if(b[d]>a){c=b[d];break}this.player().playbackRate(c)},b.prototype.playbackRates=function(){return this.options_.playbackRates||this.options_.playerOptions&&this.options_.playerOptions.playbackRates},b.prototype.playbackRateSupported=function(){return this.player().tech_&&this.player().tech_.featuresPlaybackRate&&this.playbackRates()&&this.playbackRates().length>0},b.prototype.updateVisibility=function(){this.playbackRateSupported()?this.removeClass("vjs-hidden"):this.addClass("vjs-hidden")},b.prototype.updateLabel=function(){this.playbackRateSupported()&&(this.labelEl_.innerHTML=this.player().playbackRate()+"x")},b}(i["default"]);r.prototype.controlText_="Playback Rate",o["default"].registerComponent("PlaybackRateMenuButton",r),c["default"]=r,b.exports=c["default"]},{"../../component.js":58,"../../menu/menu-button.js":95,"../../menu/menu.js":97,"../../utils/dom.js":118,"./playback-rate-menu-item.js":65}],65:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../../menu/menu-item.js"),h=d(g),i=a("../../component.js"),j=d(i),k=function(a){function b(c,d){e(this,b);var f=d.rate,g=parseFloat(f,10);d.label=f,d.selected=1===g,a.call(this,c,d),this.label=f,this.rate=g,this.on(c,"ratechange",this.update)}return f(b,a),b.prototype.handleClick=function(){a.prototype.handleClick.call(this),this.player().playbackRate(this.rate)},b.prototype.update=function(){this.selected(this.player().playbackRate()===this.rate)},b}(h["default"]);k.prototype.contentElType="button",j["default"].registerComponent("PlaybackRateMenuItem",k),c["default"]=k,b.exports=c["default"]},{"../../component.js":58,"../../menu/menu-item.js":96}],66:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../component.js"),i=e(h),j=a("../../utils/dom.js"),k=d(j),l=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.on(c,"progress",this.update)}return g(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-load-progress",innerHTML:'<span class="vjs-control-text"><span>'+this.localize("Loaded")+"</span>: 0%</span>"})},b.prototype.update=function(){var a=this.player_.buffered(),b=this.player_.duration(),c=this.player_.bufferedEnd(),d=this.el_.children,e=function(a,b){var c=a/b||0;return 100*(c>=1?1:c)+"%"};this.el_.style.width=e(c,b);for(var f=0;f<a.length;f++){var g=a.start(f),h=a.end(f),i=d[f];i||(i=this.el_.appendChild(k.createEl())),i.style.left=e(g,c),i.style.width=e(h-g,c)}for(var f=d.length;f>a.length;f--)this.el_.removeChild(d[f-1])},b}(i["default"]);i["default"].registerComponent("LoadProgressBar",l),c["default"]=l,b.exports=c["default"]},{"../../component.js":58,"../../utils/dom.js":118}],67:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../component.js"),i=e(h),j=a("../../utils/dom.js"),k=d(j),l=a("../../utils/fn.js"),m=d(l),n=a("../../utils/format-time.js"),o=e(n),p=a("lodash-compat/function/throttle"),q=e(p),r=function(a){function b(c,d){var e=this;f(this,b),a.call(this,c,d),this.update(0,0),c.on("ready",function(){e.on(c.controlBar.progressControl.el(),"mousemove",q["default"](m.bind(e,e.handleMouseMove),25))})}return g(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-mouse-display"})},b.prototype.handleMouseMove=function(a){var b=this.player_.duration(),c=this.calculateDistance(a)*b,d=a.pageX-k.findElPosition(this.el().parentNode).left;this.update(c,d)},b.prototype.update=function(a,b){var c=o["default"](a,this.player_.duration());this.el().style.left=b+"px",this.el().setAttribute("data-current-time",c)},b.prototype.calculateDistance=function(a){return k.getPointerPosition(this.el().parentNode,a).x},b}(i["default"]);i["default"].registerComponent("MouseTimeDisplay",r),c["default"]=r,b.exports=c["default"]},{"../../component.js":58,"../../utils/dom.js":118,"../../utils/fn.js":120,"../../utils/format-time.js":121,"lodash-compat/function/throttle":7}],68:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../component.js"),i=e(h),j=a("../../utils/fn.js"),k=d(j),l=a("../../utils/format-time.js"),m=e(l),n=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.updateDataAttr(),this.on(c,"timeupdate",this.updateDataAttr),c.ready(k.bind(this,this.updateDataAttr))}return g(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-play-progress vjs-slider-bar",innerHTML:'<span class="vjs-control-text"><span>'+this.localize("Progress")+"</span>: 0%</span>"})},b.prototype.updateDataAttr=function(){var a=this.player_.scrubbing()?this.player_.getCache().currentTime:this.player_.currentTime();this.el_.setAttribute("data-current-time",m["default"](a,this.player_.duration()))},b}(i["default"]);i["default"].registerComponent("PlayProgressBar",n),c["default"]=n,b.exports=c["default"]},{"../../component.js":58,"../../utils/fn.js":120,"../../utils/format-time.js":121}],69:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../../component.js"),h=d(g),i=a("./seek-bar.js"),j=(d(i),a("./mouse-time-display.js")),k=(d(j),function(a){function b(){e(this,b),a.apply(this,arguments)}return f(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-progress-control vjs-control"})},b}(h["default"]));k.prototype.options_={children:["seekBar"]},h["default"].registerComponent("ProgressControl",k),c["default"]=k,b.exports=c["default"]},{"../../component.js":58,"./mouse-time-display.js":67,"./seek-bar.js":70}],70:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../slider/slider.js"),i=e(h),j=a("../../component.js"),k=e(j),l=a("./load-progress-bar.js"),m=(e(l),a("./play-progress-bar.js")),n=(e(m),a("../../utils/fn.js")),o=d(n),p=a("../../utils/format-time.js"),q=e(p),r=a("object.assign"),s=(e(r),function(a){function b(c,d){f(this,b),a.call(this,c,d),this.on(c,"timeupdate",this.updateARIAAttributes),c.ready(o.bind(this,this.updateARIAAttributes))}return g(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-progress-holder"},{"aria-label":"video progress bar"})},b.prototype.updateARIAAttributes=function(){var a=this.player_.scrubbing()?this.player_.getCache().currentTime:this.player_.currentTime();this.el_.setAttribute("aria-valuenow",(100*this.getPercent()).toFixed(2)),this.el_.setAttribute("aria-valuetext",q["default"](a,this.player_.duration()))},b.prototype.getPercent=function(){var a=this.player_.currentTime()/this.player_.duration();return a>=1?1:a},b.prototype.handleMouseDown=function(b){a.prototype.handleMouseDown.call(this,b),this.player_.scrubbing(!0),this.videoWasPlaying=!this.player_.paused(),this.player_.pause()},b.prototype.handleMouseMove=function(a){var b=this.calculateDistance(a)*this.player_.duration();b===this.player_.duration()&&(b-=.1),this.player_.currentTime(b)},b.prototype.handleMouseUp=function(b){a.prototype.handleMouseUp.call(this,b),this.player_.scrubbing(!1),this.videoWasPlaying&&this.player_.play()},b.prototype.stepForward=function(){this.player_.currentTime(this.player_.currentTime()+5)},b.prototype.stepBack=function(){this.player_.currentTime(this.player_.currentTime()-5)},b}(i["default"]));s.prototype.options_={children:["loadProgressBar","mouseTimeDisplay","playProgressBar"],barName:"playProgressBar"},s.prototype.playerEvent="timeupdate",k["default"].registerComponent("SeekBar",s),c["default"]=s,b.exports=c["default"]},{"../../component.js":58,"../../slider/slider.js":102,"../../utils/fn.js":120,"../../utils/format-time.js":121,"./load-progress-bar.js":66,"./play-progress-bar.js":68,"object.assign":43}],71:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("./spacer.js"),h=d(g),i=a("../../component.js"),j=d(i),k=function(a){function b(){e(this,b),a.apply(this,arguments)}return f(b,a),b.prototype.buildCSSClass=function(){return"vjs-custom-control-spacer "+a.prototype.buildCSSClass.call(this)},b.prototype.createEl=function(){var b=a.prototype.createEl.call(this,{className:this.buildCSSClass()});return b.innerHTML="&nbsp;",b},b}(h["default"]);j["default"].registerComponent("CustomControlSpacer",k),c["default"]=k,b.exports=c["default"]},{"../../component.js":58,"./spacer.js":72}],72:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../../component.js"),h=d(g),i=function(a){function b(){e(this,b),a.apply(this,arguments)}return f(b,a),b.prototype.buildCSSClass=function(){return"vjs-spacer "+a.prototype.buildCSSClass.call(this)},b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:this.buildCSSClass()})},b}(h["default"]);h["default"].registerComponent("Spacer",i),c["default"]=i,b.exports=c["default"]},{"../../component.js":58}],73:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("./text-track-menu-item.js"),h=d(g),i=a("../../component.js"),j=d(i),k=function(a){function b(c,d){e(this,b),d.track={kind:d.kind,player:c,label:d.kind+" settings","default":!1,mode:"disabled"},a.call(this,c,d),this.addClass("vjs-texttrack-settings")}return f(b,a),b.prototype.handleClick=function(){this.player().getChild("textTrackSettings").show()},b}(h["default"]);j["default"].registerComponent("CaptionSettingsMenuItem",k),c["default"]=k,b.exports=c["default"]},{"../../component.js":58,"./text-track-menu-item.js":80}],74:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("./text-track-button.js"),h=d(g),i=a("../../component.js"),j=d(i),k=a("./caption-settings-menu-item.js"),l=d(k),m=function(a){function b(c,d,f){e(this,b),a.call(this,c,d,f),this.el_.setAttribute("aria-label","Captions Menu")}return f(b,a),b.prototype.buildCSSClass=function(){return"vjs-captions-button "+a.prototype.buildCSSClass.call(this)},b.prototype.update=function(){var b=2;a.prototype.update.call(this),this.player().tech_&&this.player().tech_.featuresNativeTextTracks&&(b=1),this.items&&this.items.length>b?this.show():this.hide()},b.prototype.createItems=function(){var b=[];return this.player().tech_&&this.player().tech_.featuresNativeTextTracks||b.push(new l["default"](this.player_,{kind:this.kind_})),a.prototype.createItems.call(this,b)},b}(h["default"]);m.prototype.kind_="captions",m.prototype.controlText_="Captions",j["default"].registerComponent("CaptionsButton",m),c["default"]=m,b.exports=c["default"]},{"../../component.js":58,"./caption-settings-menu-item.js":73,"./text-track-button.js":79}],75:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("./text-track-button.js"),i=e(h),j=a("../../component.js"),k=e(j),l=a("./text-track-menu-item.js"),m=e(l),n=a("./chapters-track-menu-item.js"),o=e(n),p=a("../../menu/menu.js"),q=e(p),r=a("../../utils/dom.js"),s=d(r),t=a("../../utils/fn.js"),u=d(t),v=a("../../utils/to-title-case.js"),w=e(v),x=a("global/window"),y=e(x),z=function(a){function b(c,d,e){f(this,b),a.call(this,c,d,e),this.el_.setAttribute("aria-label","Chapters Menu")}return g(b,a),b.prototype.buildCSSClass=function(){return"vjs-chapters-button "+a.prototype.buildCSSClass.call(this)},b.prototype.createItems=function(){var a=[],b=this.player_.textTracks();if(!b)return a;for(var c=0;c<b.length;c++){var d=b[c];d.kind===this.kind_&&a.push(new m["default"](this.player_,{track:d}))}return a},b.prototype.createMenu=function(){for(var a=this.player_.textTracks()||[],b=void 0,c=this.items=[],d=0,e=a.length;e>d;d++){var f=a[d];if(f.kind===this.kind_){if(f.cues){b=f;break}f.mode="hidden",y["default"].setTimeout(u.bind(this,function(){this.createMenu()}),100)}}var g=this.menu;if(void 0===g&&(g=new q["default"](this.player_),g.contentEl().appendChild(s.createEl("li",{className:"vjs-menu-title",innerHTML:w["default"](this.kind_),tabIndex:-1}))),b){for(var h=b.cues,i=void 0,d=0,e=h.length;e>d;d++){i=h[d];var j=new o["default"](this.player_,{track:b,cue:i});c.push(j),g.addChild(j)}this.addChild(g)}return this.items.length>0&&this.show(),g},b}(i["default"]);z.prototype.kind_="chapters",z.prototype.controlText_="Chapters",k["default"].registerComponent("ChaptersButton",z),c["default"]=z,b.exports=c["default"]},{"../../component.js":58,"../../menu/menu.js":97,"../../utils/dom.js":118,"../../utils/fn.js":120,"../../utils/to-title-case.js":127,"./chapters-track-menu-item.js":76,"./text-track-button.js":79,"./text-track-menu-item.js":80,"global/window":2}],76:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,
 
configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../menu/menu-item.js"),i=e(h),j=a("../../component.js"),k=e(j),l=a("../../utils/fn.js"),m=d(l),n=function(a){function b(c,d){f(this,b);var e=d.track,g=d.cue,h=c.currentTime();d.label=g.text,d.selected=g.startTime<=h&&h<g.endTime,a.call(this,c,d),this.track=e,this.cue=g,e.addEventListener("cuechange",m.bind(this,this.update))}return g(b,a),b.prototype.handleClick=function(){a.prototype.handleClick.call(this),this.player_.currentTime(this.cue.startTime),this.update(this.cue.startTime)},b.prototype.update=function(){var a=this.cue,b=this.player_.currentTime();this.selected(a.startTime<=b&&b<a.endTime)},b}(i["default"]);k["default"].registerComponent("ChaptersTrackMenuItem",n),c["default"]=n,b.exports=c["default"]},{"../../component.js":58,"../../menu/menu-item.js":96,"../../utils/fn.js":120}],77:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("./text-track-menu-item.js"),h=d(g),i=a("../../component.js"),j=d(i),k=function(a){function b(c,d){e(this,b),d.track={kind:d.kind,player:c,label:d.kind+" off","default":!1,mode:"disabled"},a.call(this,c,d),this.selected(!0)}return f(b,a),b.prototype.handleTracksChange=function(){for(var a=this.player().textTracks(),b=!0,c=0,d=a.length;d>c;c++){var e=a[c];if(e.kind===this.track.kind&&"showing"===e.mode){b=!1;break}}this.selected(b)},b}(h["default"]);j["default"].registerComponent("OffTextTrackMenuItem",k),c["default"]=k,b.exports=c["default"]},{"../../component.js":58,"./text-track-menu-item.js":80}],78:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("./text-track-button.js"),h=d(g),i=a("../../component.js"),j=d(i),k=function(a){function b(c,d,f){e(this,b),a.call(this,c,d,f),this.el_.setAttribute("aria-label","Subtitles Menu")}return f(b,a),b.prototype.buildCSSClass=function(){return"vjs-subtitles-button "+a.prototype.buildCSSClass.call(this)},b}(h["default"]);k.prototype.kind_="subtitles",k.prototype.controlText_="Subtitles",j["default"].registerComponent("SubtitlesButton",k),c["default"]=k,b.exports=c["default"]},{"../../component.js":58,"./text-track-button.js":79}],79:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../menu/menu-button.js"),i=e(h),j=a("../../component.js"),k=e(j),l=a("../../utils/fn.js"),m=d(l),n=a("./text-track-menu-item.js"),o=e(n),p=a("./off-text-track-menu-item.js"),q=e(p),r=function(a){function b(c,d){f(this,b),a.call(this,c,d);var e=this.player_.textTracks();if(this.items.length<=1&&this.hide(),e){var g=m.bind(this,this.update);e.addEventListener("removetrack",g),e.addEventListener("addtrack",g),this.player_.on("dispose",function(){e.removeEventListener("removetrack",g),e.removeEventListener("addtrack",g)})}}return g(b,a),b.prototype.createItems=function(){var a=arguments.length<=0||void 0===arguments[0]?[]:arguments[0];a.push(new q["default"](this.player_,{kind:this.kind_}));var b=this.player_.textTracks();if(!b)return a;for(var c=0;c<b.length;c++){var d=b[c];d.kind===this.kind_&&a.push(new o["default"](this.player_,{track:d}))}return a},b}(i["default"]);k["default"].registerComponent("TextTrackButton",r),c["default"]=r,b.exports=c["default"]},{"../../component.js":58,"../../menu/menu-button.js":95,"../../utils/fn.js":120,"./off-text-track-menu-item.js":77,"./text-track-menu-item.js":80}],80:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../menu/menu-item.js"),i=e(h),j=a("../../component.js"),k=e(j),l=a("../../utils/fn.js"),m=d(l),n=a("global/window"),o=e(n),p=a("global/document"),q=e(p),r=function(a){function b(c,d){var e=this;f(this,b);var g=d.track,h=c.textTracks();d.label=g.label||g.language||"Unknown",d.selected=g["default"]||"showing"===g.mode,a.call(this,c,d),this.track=g,h&&!function(){var a=m.bind(e,e.handleTracksChange);h.addEventListener("change",a),e.on("dispose",function(){h.removeEventListener("change",a)})}(),h&&void 0===h.onchange&&!function(){var a=void 0;e.on(["tap","click"],function(){if("object"!=typeof o["default"].Event)try{a=new o["default"].Event("change")}catch(b){}a||(a=q["default"].createEvent("Event"),a.initEvent("change",!0,!0)),h.dispatchEvent(a)})}()}return g(b,a),b.prototype.handleClick=function(b){var c=this.track.kind,d=this.player_.textTracks();if(a.prototype.handleClick.call(this,b),d)for(var e=0;e<d.length;e++){var f=d[e];f.kind===c&&(f.mode=f===this.track?"showing":"disabled")}},b.prototype.handleTracksChange=function(){this.selected("showing"===this.track.mode)},b}(i["default"]);k["default"].registerComponent("TextTrackMenuItem",r),c["default"]=r,b.exports=c["default"]},{"../../component.js":58,"../../menu/menu-item.js":96,"../../utils/fn.js":120,"global/document":1,"global/window":2}],81:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../component.js"),i=e(h),j=a("../../utils/dom.js"),k=d(j),l=a("../../utils/format-time.js"),m=e(l),n=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.on(c,"timeupdate",this.updateContent)}return g(b,a),b.prototype.createEl=function(){var b=a.prototype.createEl.call(this,"div",{className:"vjs-current-time vjs-time-control vjs-control"});return this.contentEl_=k.createEl("div",{className:"vjs-current-time-display",innerHTML:'<span class="vjs-control-text">Current Time </span>0:00'},{"aria-live":"off"}),b.appendChild(this.contentEl_),b},b.prototype.updateContent=function(){var a=this.player_.scrubbing()?this.player_.getCache().currentTime:this.player_.currentTime(),b=this.localize("Current Time"),c=m["default"](a,this.player_.duration());this.contentEl_.innerHTML='<span class="vjs-control-text">'+b+"</span> "+c},b}(i["default"]);i["default"].registerComponent("CurrentTimeDisplay",n),c["default"]=n,b.exports=c["default"]},{"../../component.js":58,"../../utils/dom.js":118,"../../utils/format-time.js":121}],82:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../component.js"),i=e(h),j=a("../../utils/dom.js"),k=d(j),l=a("../../utils/format-time.js"),m=e(l),n=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.on(c,"timeupdate",this.updateContent),this.on(c,"loadedmetadata",this.updateContent)}return g(b,a),b.prototype.createEl=function(){var b=a.prototype.createEl.call(this,"div",{className:"vjs-duration vjs-time-control vjs-control"});return this.contentEl_=k.createEl("div",{className:"vjs-duration-display",innerHTML:'<span class="vjs-control-text">'+this.localize("Duration Time")+"</span> 0:00"},{"aria-live":"off"}),b.appendChild(this.contentEl_),b},b.prototype.updateContent=function(){var a=this.player_.duration();if(a){var b=this.localize("Duration Time"),c=m["default"](a);this.contentEl_.innerHTML='<span class="vjs-control-text">'+b+"</span> "+c}},b}(i["default"]);i["default"].registerComponent("DurationDisplay",n),c["default"]=n,b.exports=c["default"]},{"../../component.js":58,"../../utils/dom.js":118,"../../utils/format-time.js":121}],83:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../component.js"),i=e(h),j=a("../../utils/dom.js"),k=d(j),l=a("../../utils/format-time.js"),m=e(l),n=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.on(c,"timeupdate",this.updateContent)}return g(b,a),b.prototype.createEl=function(){var b=a.prototype.createEl.call(this,"div",{className:"vjs-remaining-time vjs-time-control vjs-control"});return this.contentEl_=k.createEl("div",{className:"vjs-remaining-time-display",innerHTML:'<span class="vjs-control-text">'+this.localize("Remaining Time")+"</span> -0:00"},{"aria-live":"off"}),b.appendChild(this.contentEl_),b},b.prototype.updateContent=function(){if(this.player_.duration()){var a=this.localize("Remaining Time"),b=m["default"](this.player_.remainingTime());this.contentEl_.innerHTML='<span class="vjs-control-text">'+a+"</span> -"+b}},b}(i["default"]);i["default"].registerComponent("RemainingTimeDisplay",n),c["default"]=n,b.exports=c["default"]},{"../../component.js":58,"../../utils/dom.js":118,"../../utils/format-time.js":121}],84:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../../component.js"),h=d(g),i=function(a){function b(){e(this,b),a.apply(this,arguments)}return f(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-time-control vjs-time-divider",innerHTML:"<div><span>/</span></div>"})},b}(h["default"]);h["default"].registerComponent("TimeDivider",i),c["default"]=i,b.exports=c["default"]},{"../../component.js":58}],85:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../../slider/slider.js"),i=e(h),j=a("../../component.js"),k=e(j),l=a("../../utils/fn.js"),m=d(l),n=a("./volume-level.js"),o=(e(n),function(a){function b(c,d){f(this,b),a.call(this,c,d),this.on(c,"volumechange",this.updateARIAAttributes),c.ready(m.bind(this,this.updateARIAAttributes))}return g(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-volume-bar vjs-slider-bar"},{"aria-label":"volume level"})},b.prototype.handleMouseMove=function(a){this.player_.muted()&&this.player_.muted(!1),this.player_.volume(this.calculateDistance(a))},b.prototype.getPercent=function(){return this.player_.muted()?0:this.player_.volume()},b.prototype.stepForward=function(){this.player_.volume(this.player_.volume()+.1)},b.prototype.stepBack=function(){this.player_.volume(this.player_.volume()-.1)},b.prototype.updateARIAAttributes=function(){var a=(100*this.player_.volume()).toFixed(2);this.el_.setAttribute("aria-valuenow",a),this.el_.setAttribute("aria-valuetext",a+"%")},b}(i["default"]));o.prototype.options_={children:["volumeLevel"],barName:"volumeLevel"},o.prototype.playerEvent="volumechange",k["default"].registerComponent("VolumeBar",o),c["default"]=o,b.exports=c["default"]},{"../../component.js":58,"../../slider/slider.js":102,"../../utils/fn.js":120,"./volume-level.js":87}],86:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../../component.js"),h=d(g),i=a("./volume-bar.js"),j=(d(i),function(a){function b(c,d){e(this,b),a.call(this,c,d),c.tech_&&c.tech_.featuresVolumeControl===!1&&this.addClass("vjs-hidden"),this.on(c,"loadstart",function(){c.tech_.featuresVolumeControl===!1?this.addClass("vjs-hidden"):this.removeClass("vjs-hidden")})}return f(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-volume-control vjs-control"})},b}(h["default"]));j.prototype.options_={children:["volumeBar"]},h["default"].registerComponent("VolumeControl",j),c["default"]=j,b.exports=c["default"]},{"../../component.js":58,"./volume-bar.js":85}],87:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../../component.js"),h=d(g),i=function(a){function b(){e(this,b),a.apply(this,arguments)}return f(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-volume-level",innerHTML:'<span class="vjs-control-text"></span>'})},b}(h["default"]);h["default"].registerComponent("VolumeLevel",i),c["default"]=i,b.exports=c["default"]},{"../../component.js":58}],88:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../button.js"),h=(d(g),a("../component.js")),i=d(h),j=a("../menu/menu.js"),k=d(j),l=a("../menu/menu-button.js"),m=d(l),n=a("./mute-toggle.js"),o=d(n),p=a("./volume-control/volume-bar.js"),q=d(p),r=function(a){function b(c){function d(){c.tech_&&c.tech_.featuresVolumeControl===!1?this.addClass("vjs-hidden"):this.removeClass("vjs-hidden")}var f=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];e(this,b),void 0===f.inline&&(f.inline=!0),void 0===f.vertical&&(f.vertical=f.inline?!1:!0),f.volumeBar=f.volumeBar||{},f.volumeBar.vertical=!!f.vertical,a.call(this,c,f),this.on(c,"volumechange",this.volumeUpdate),this.on(c,"loadstart",this.volumeUpdate),d.call(this),this.on(c,"loadstart",d),this.on(this.volumeBar,["slideractive","focus"],function(){this.addClass("vjs-slider-active")}),this.on(this.volumeBar,["sliderinactive","blur"],function(){this.removeClass("vjs-slider-active")})}return f(b,a),b.prototype.buildCSSClass=function(){var b="";return b=this.options_.vertical?"vjs-volume-menu-button-vertical":"vjs-volume-menu-button-horizontal","vjs-volume-menu-button "+a.prototype.buildCSSClass.call(this)+" "+b},b.prototype.createMenu=function(){var a=new k["default"](this.player_,{contentElType:"div"}),b=new q["default"](this.player_,this.options_.volumeBar);return a.addChild(b),this.volumeBar=b,a},b.prototype.handleClick=function(){o["default"].prototype.handleClick.call(this),a.prototype.handleClick.call(this)},b}(m["default"]);r.prototype.volumeUpdate=o["default"].prototype.update,r.prototype.controlText_="Mute",i["default"].registerComponent("VolumeMenuButton",r),c["default"]=r,b.exports=c["default"]},{"../button.js":57,"../component.js":58,"../menu/menu-button.js":95,"../menu/menu.js":97,"./mute-toggle.js":62,"./volume-control/volume-bar.js":85}],89:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("./component"),i=e(h),j=a("./utils/dom.js"),k=d(j),l=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.update(),this.on(c,"error",this.update)}return g(b,a),b.prototype.createEl=function(){var b=a.prototype.createEl.call(this,"div",{className:"vjs-error-display"});return this.contentEl_=k.createEl("div"),b.appendChild(this.contentEl_),b},b.prototype.update=function(){this.player().error()&&(this.contentEl_.innerHTML=this.localize(this.player().error().message))},b}(i["default"]);i["default"].registerComponent("ErrorDisplay",l),c["default"]=l,b.exports=c["default"]},{"./component":58,"./utils/dom.js":118}],90:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}c.__esModule=!0;var e=a("./utils/events.js"),f=d(e),g=function(){};g.prototype.allowedEvents_={},g.prototype.on=function(a,b){var c=this.addEventListener;this.addEventListener=Function.prototype,f.on(this,a,b),this.addEventListener=c},g.prototype.addEventListener=g.prototype.on,g.prototype.off=function(a,b){f.off(this,a,b)},g.prototype.removeEventListener=g.prototype.off,g.prototype.one=function(a,b){f.one(this,a,b)},g.prototype.trigger=function(a){var b=a.type||a;"string"==typeof a&&(a={type:b}),a=f.fixEvent(a),this.allowedEvents_[b]&&this["on"+b]&&this["on"+b](a),f.trigger(this,a)},g.prototype.dispatchEvent=g.prototype.trigger,c["default"]=g,b.exports=c["default"]},{"./utils/events.js":119}],91:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var e=a("./utils/log"),f=d(e),g=function(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(a.super_=b)},h=function(a){var b=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],c=function(){a.apply(this,arguments)},d={};"object"==typeof b?("function"==typeof b.init&&(f["default"].warn("Constructor logic via init() is deprecated; please use constructor() instead."),b.constructor=b.init),b.constructor!==Object.prototype.constructor&&(c=b.constructor),d=b):"function"==typeof b&&(c=b),g(c,a);for(var e in d)d.hasOwnProperty(e)&&(c.prototype[e]=d[e]);return c};c["default"]=h,b.exports=c["default"]},{"./utils/log":123}],92:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;for(var e=a("global/document"),f=d(e),g={},h=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],i=h[0],j=void 0,k=0;k<h.length;k++)if(h[k][1]in f["default"]){j=h[k];break}if(j)for(var k=0;k<j.length;k++)g[i[k]]=j[k];c["default"]=g,b.exports=c["default"]},{"global/document":1}],93:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("./component"),h=d(g),i=function(a){function b(){e(this,b),a.apply(this,arguments)}return f(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-loading-spinner"})},b}(h["default"]);h["default"].registerComponent("LoadingSpinner",i),c["default"]=i,b.exports=c["default"]},{"./component":58}],94:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var e=a("object.assign"),f=d(e),g=function i(a){"number"==typeof a?this.code=a:"string"==typeof a?this.message=a:"object"==typeof a&&f["default"](this,a),this.message||(this.message=i.defaultMessages[this.code]||"")};g.prototype.code=0,g.prototype.message="",g.prototype.status=null,g.errorTypes=["MEDIA_ERR_CUSTOM","MEDIA_ERR_ABORTED","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED","MEDIA_ERR_ENCRYPTED"],g.defaultMessages={1:"You aborted the media playback",2:"A network error caused the media download to fail part-way.",3:"The media playback was aborted due to a corruption problem or because the media used features your browser did not support.",4:"The media could not be loaded, either because the server or network failed or because the format is not supported.",5:"The media is encrypted and we do not have the keys to decrypt it."};for(var h=0;h<g.errorTypes.length;h++)g[g.errorTypes[h]]=h,g.prototype[g.errorTypes[h]]=h;c["default"]=g,b.exports=c["default"]},{"object.assign":43}],95:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../button.js"),i=e(h),j=a("../component.js"),k=e(j),l=a("./menu.js"),m=e(l),n=a("../utils/dom.js"),o=d(n),p=a("../utils/fn.js"),q=d(p),r=a("../utils/to-title-case.js"),s=e(r),t=function(a){function b(c){var d=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];f(this,b),a.call(this,c,d),this.update(),this.on("keydown",this.handleKeyPress),this.el_.setAttribute("aria-haspopup",!0),this.el_.setAttribute("role","button")}return g(b,a),b.prototype.update=function(){var a=this.createMenu();this.menu&&this.removeChild(this.menu),this.menu=a,this.addChild(a),this.buttonPressed_=!1,this.items&&0===this.items.length?this.hide():this.items&&this.items.length>1&&this.show()},b.prototype.createMenu=function(){var a=new m["default"](this.player_);if(this.options_.title&&a.contentEl().appendChild(o.createEl("li",{className:"vjs-menu-title",innerHTML:s["default"](this.options_.title),tabIndex:-1})),this.items=this.createItems(),this.items)for(var b=0;b<this.items.length;b++)a.addItem(this.items[b]);return a},b.prototype.createItems=function(){},b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:this.buildCSSClass()})},b.prototype.buildCSSClass=function(){var b="vjs-menu-button";return b+=this.options_.inline===!0?"-inline":"-popup","vjs-menu-button "+b+" "+a.prototype.buildCSSClass.call(this)},b.prototype.handleFocus=function(){},b.prototype.handleBlur=function(){},b.prototype.handleClick=function(){this.one("mouseout",q.bind(this,function(){this.menu.unlockShowing(),this.el_.blur()})),this.buttonPressed_?this.unpressButton():this.pressButton()},b.prototype.handleKeyPress=function(a){32===a.which||13===a.which?(this.buttonPressed_?this.unpressButton():this.pressButton(),a.preventDefault()):27===a.which&&(this.buttonPressed_&&this.unpressButton(),a.preventDefault())},b.prototype.pressButton=function(){this.buttonPressed_=!0,this.menu.lockShowing(),this.el_.setAttribute("aria-pressed",!0),this.items&&this.items.length>0&&this.items[0].el().focus()},b.prototype.unpressButton=function(){this.buttonPressed_=!1,this.menu.unlockShowing(),this.el_.setAttribute("aria-pressed",!1)},b}(i["default"]);k["default"].registerComponent("MenuButton",t),c["default"]=t,b.exports=c["default"]},{"../button.js":57,"../component.js":58,"../utils/dom.js":118,"../utils/fn.js":120,"../utils/to-title-case.js":127,"./menu.js":97}],96:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../button.js"),h=d(g),i=a("../component.js"),j=d(i),k=a("object.assign"),l=d(k),m=function(a){function b(c,d){e(this,b),a.call(this,c,d),this.selected(d.selected)}return f(b,a),b.prototype.createEl=function(b,c,d){return a.prototype.createEl.call(this,"li",l["default"]({className:"vjs-menu-item",innerHTML:this.localize(this.options_.label)},c),d)},b.prototype.handleClick=function(){this.selected(!0)},b.prototype.selected=function(a){a?(this.addClass("vjs-selected"),this.el_.setAttribute("aria-selected",!0)):(this.removeClass("vjs-selected"),this.el_.setAttribute("aria-selected",!1))},b}(h["default"]);j["default"].registerComponent("MenuItem",m),c["default"]=m,b.exports=c["default"]},{"../button.js":57,"../component.js":58,"object.assign":43}],97:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../component.js"),i=e(h),j=a("../utils/dom.js"),k=d(j),l=a("../utils/fn.js"),m=d(l),n=a("../utils/events.js"),o=d(n),p=function(a){function b(){f(this,b),a.apply(this,arguments)}return g(b,a),b.prototype.addItem=function(a){this.addChild(a),a.on("click",m.bind(this,function(){this.unlockShowing()}))},b.prototype.createEl=function(){var b=this.options_.contentElType||"ul";this.contentEl_=k.createEl(b,{className:"vjs-menu-content"});var c=a.prototype.createEl.call(this,"div",{append:this.contentEl_,className:"vjs-menu"});return c.appendChild(this.contentEl_),o.on(c,"click",function(a){a.preventDefault(),a.stopImmediatePropagation()}),c},b}(i["default"]);i["default"].registerComponent("Menu",p),c["default"]=p,b.exports=c["default"]},{"../component.js":58,"../utils/dom.js":118,"../utils/events.js":119,"../utils/fn.js":120}],98:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("./component.js"),i=e(h),j=a("global/document"),k=e(j),l=a("global/window"),m=e(l),n=a("./utils/events.js"),o=d(n),p=a("./utils/dom.js"),q=d(p),r=a("./utils/fn.js"),s=d(r),t=a("./utils/guid.js"),u=d(t),v=a("./utils/browser.js"),w=(d(v),
 
a("./utils/log.js")),x=e(w),y=a("./utils/to-title-case.js"),z=e(y),A=a("./utils/time-ranges.js"),B=a("./utils/buffer.js"),C=a("./utils/stylesheet.js"),D=d(C),E=a("./fullscreen-api.js"),F=e(E),G=a("./media-error.js"),H=e(G),I=a("safe-json-parse/tuple"),J=e(I),K=a("object.assign"),L=e(K),M=a("./utils/merge-options.js"),N=e(M),O=a("./tracks/text-track-list-converter.js"),P=e(O),Q=a("./tech/loader.js"),R=(e(Q),a("./poster-image.js")),S=(e(R),a("./tracks/text-track-display.js")),T=(e(S),a("./loading-spinner.js")),U=(e(T),a("./big-play-button.js")),V=(e(U),a("./control-bar/control-bar.js")),W=(e(V),a("./error-display.js")),X=(e(W),a("./tracks/text-track-settings.js")),Y=(e(X),a("./tech/html5.js")),Z=(e(Y),function(a){function b(c,d,e){var g=this;if(f(this,b),c.id=c.id||"vjs_video_"+u.newGUID(),d=L["default"](b.getTagSettings(c),d),d.initChildren=!1,d.createEl=!1,d.reportTouchActivity=!1,a.call(this,null,d,e),!this.options_||!this.options_.techOrder||!this.options_.techOrder.length)throw new Error("No techOrder specified. Did you overwrite videojs.options instead of just changing the properties you want to override?");this.tag=c,this.tagAttributes=c&&q.getElAttributes(c),this.language(this.options_.language),d.languages?!function(){var a={};Object.getOwnPropertyNames(d.languages).forEach(function(b){a[b.toLowerCase()]=d.languages[b]}),g.languages_=a}():this.languages_=b.prototype.options_.languages,this.cache_={},this.poster_=d.poster||"",this.controls_=!!d.controls,c.controls=!1,this.scrubbing_=!1,this.el_=this.createEl();var h=N["default"](this.options_);d.plugins&&!function(){var a=d.plugins;Object.getOwnPropertyNames(a).forEach(function(b){"function"==typeof this[b]?this[b](a[b]):x["default"].error("Unable to find plugin:",b)},g)}(),this.options_.playerOptions=h,this.initChildren(),this.isAudio("audio"===c.nodeName.toLowerCase()),this.addClass(this.controls()?"vjs-controls-enabled":"vjs-controls-disabled"),this.isAudio()&&this.addClass("vjs-audio"),this.flexNotSupported_()&&this.addClass("vjs-no-flex"),b.players[this.id_]=this,this.userActive(!0),this.reportUserActivity(),this.listenForUserActivity_(),this.on("fullscreenchange",this.handleFullscreenChange_),this.on("stageclick",this.handleStageClick_)}return g(b,a),b.prototype.dispose=function(){this.trigger("dispose"),this.off("dispose"),this.styleEl_&&this.styleEl_.parentNode.removeChild(this.styleEl_),b.players[this.id_]=null,this.tag&&this.tag.player&&(this.tag.player=null),this.el_&&this.el_.player&&(this.el_.player=null),this.tech_&&this.tech_.dispose(),a.prototype.dispose.call(this)},b.prototype.createEl=function(){var b=this.el_=a.prototype.createEl.call(this,"div"),c=this.tag;c.removeAttribute("width"),c.removeAttribute("height");var d=q.getElAttributes(c);Object.getOwnPropertyNames(d).forEach(function(a){"class"===a?b.className=d[a]:b.setAttribute(a,d[a])}),c.id+="_html5_api",c.className="vjs-tech",c.player=b.player=this,this.addClass("vjs-paused"),this.styleEl_=D.createStyleElement("vjs-styles-dimensions");var e=k["default"].querySelector(".vjs-styles-defaults"),f=k["default"].querySelector("head");return f.insertBefore(this.styleEl_,e?e.nextSibling:f.firstChild),this.width(this.options_.width),this.height(this.options_.height),this.fluid(this.options_.fluid),this.aspectRatio(this.options_.aspectRatio),c.initNetworkState_=c.networkState,c.parentNode&&c.parentNode.insertBefore(b,c),q.insertElFirst(c,b),this.el_=b,b},b.prototype.width=function(a){return this.dimension("width",a)},b.prototype.height=function(a){return this.dimension("height",a)},b.prototype.dimension=function(a,b){var c=a+"_";if(void 0===b)return this[c]||0;if(""===b)this[c]=void 0;else{var d=parseFloat(b);if(isNaN(d))return x["default"].error('Improper value "'+b+'" supplied for for '+a),this;this[c]=d}return this.updateStyleEl_(),this},b.prototype.fluid=function(a){return void 0===a?!!this.fluid_:(this.fluid_=!!a,void(a?this.addClass("vjs-fluid"):this.removeClass("vjs-fluid")))},b.prototype.aspectRatio=function(a){if(void 0===a)return this.aspectRatio_;if(!/^\d+\:\d+$/.test(a))throw new Error("Improper value supplied for aspect ratio. The format should be width:height, for example 16:9.");this.aspectRatio_=a,this.fluid(!0),this.updateStyleEl_()},b.prototype.updateStyleEl_=function(){var a=void 0,b=void 0,c=void 0;c=void 0!==this.aspectRatio_&&"auto"!==this.aspectRatio_?this.aspectRatio_:this.videoWidth()?this.videoWidth()+":"+this.videoHeight():"16:9";var d=c.split(":"),e=d[1]/d[0];a=void 0!==this.width_?this.width_:void 0!==this.height_?this.height_/e:this.videoWidth()||300,b=void 0!==this.height_?this.height_:a*e;var f=this.id()+"-dimensions";this.addClass(f),D.setTextContent(this.styleEl_,"\n      ."+f+" {\n        width: "+a+"px;\n        height: "+b+"px;\n      }\n\n      ."+f+".vjs-fluid {\n        padding-top: "+100*e+"%;\n      }\n    ")},b.prototype.loadTech_=function(a,b){this.tech_&&this.unloadTech_(),"Html5"!==a&&this.tag&&(i["default"].getComponent("Html5").disposeMediaElement(this.tag),this.tag.player=null,this.tag=null),this.techName_=a,this.isReady_=!1;var c=L["default"]({nativeControlsForTouch:this.options_.nativeControlsForTouch,source:b,playerId:this.id(),techId:this.id()+"_"+a+"_api",textTracks:this.textTracks_,autoplay:this.options_.autoplay,preload:this.options_.preload,loop:this.options_.loop,muted:this.options_.muted,poster:this.poster(),language:this.language(),"vtt.js":this.options_["vtt.js"]},this.options_[a.toLowerCase()]);this.tag&&(c.tag=this.tag),b&&(this.currentType_=b.type,b.src===this.cache_.src&&this.cache_.currentTime>0&&(c.startTime=this.cache_.currentTime),this.cache_.src=b.src);var d=i["default"].getComponent(a);this.tech_=new d(c),this.tech_.ready(s.bind(this,this.handleTechReady_),!0),P["default"].jsonToTextTracks(this.textTracksJson_||[],this.tech_),this.on(this.tech_,"loadstart",this.handleTechLoadStart_),this.on(this.tech_,"waiting",this.handleTechWaiting_),this.on(this.tech_,"canplay",this.handleTechCanPlay_),this.on(this.tech_,"canplaythrough",this.handleTechCanPlayThrough_),this.on(this.tech_,"playing",this.handleTechPlaying_),this.on(this.tech_,"ended",this.handleTechEnded_),this.on(this.tech_,"seeking",this.handleTechSeeking_),this.on(this.tech_,"seeked",this.handleTechSeeked_),this.on(this.tech_,"play",this.handleTechPlay_),this.on(this.tech_,"firstplay",this.handleTechFirstPlay_),this.on(this.tech_,"pause",this.handleTechPause_),this.on(this.tech_,"progress",this.handleTechProgress_),this.on(this.tech_,"durationchange",this.handleTechDurationChange_),this.on(this.tech_,"fullscreenchange",this.handleTechFullscreenChange_),this.on(this.tech_,"error",this.handleTechError_),this.on(this.tech_,"suspend",this.handleTechSuspend_),this.on(this.tech_,"abort",this.handleTechAbort_),this.on(this.tech_,"emptied",this.handleTechEmptied_),this.on(this.tech_,"stalled",this.handleTechStalled_),this.on(this.tech_,"loadedmetadata",this.handleTechLoadedMetaData_),this.on(this.tech_,"loadeddata",this.handleTechLoadedData_),this.on(this.tech_,"timeupdate",this.handleTechTimeUpdate_),this.on(this.tech_,"ratechange",this.handleTechRateChange_),this.on(this.tech_,"volumechange",this.handleTechVolumeChange_),this.on(this.tech_,"texttrackchange",this.handleTechTextTrackChange_),this.on(this.tech_,"loadedmetadata",this.updateStyleEl_),this.on(this.tech_,"posterchange",this.handleTechPosterChange_),this.usingNativeControls(this.techGet_("controls")),this.controls()&&!this.usingNativeControls()&&this.addTechControlsListeners_(),this.tech_.el().parentNode===this.el()||"Html5"===a&&this.tag||q.insertElFirst(this.tech_.el(),this.el()),this.tag&&(this.tag.player=null,this.tag=null)},b.prototype.unloadTech_=function(){this.textTracks_=this.textTracks(),this.textTracksJson_=P["default"].textTracksToJson(this),this.isReady_=!1,this.tech_.dispose(),this.tech_=!1},b.prototype.addTechControlsListeners_=function(){this.removeTechControlsListeners_(),this.on(this.tech_,"mousedown",this.handleTechClick_),this.on(this.tech_,"touchstart",this.handleTechTouchStart_),this.on(this.tech_,"touchmove",this.handleTechTouchMove_),this.on(this.tech_,"touchend",this.handleTechTouchEnd_),this.on(this.tech_,"tap",this.handleTechTap_)},b.prototype.removeTechControlsListeners_=function(){this.off(this.tech_,"tap",this.handleTechTap_),this.off(this.tech_,"touchstart",this.handleTechTouchStart_),this.off(this.tech_,"touchmove",this.handleTechTouchMove_),this.off(this.tech_,"touchend",this.handleTechTouchEnd_),this.off(this.tech_,"mousedown",this.handleTechClick_)},b.prototype.handleTechReady_=function(){this.triggerReady(),this.cache_.volume&&this.techCall_("setVolume",this.cache_.volume),this.handleTechPosterChange_(),this.handleTechDurationChange_(),this.tag&&this.options_.autoplay&&this.paused()&&(delete this.tag.poster,this.play())},b.prototype.handleTechLoadStart_=function(){this.removeClass("vjs-ended"),this.error(null),this.paused()?(this.hasStarted(!1),this.trigger("loadstart")):(this.trigger("loadstart"),this.trigger("firstplay"))},b.prototype.hasStarted=function(a){return void 0!==a?(this.hasStarted_!==a&&(this.hasStarted_=a,a?(this.addClass("vjs-has-started"),this.trigger("firstplay")):this.removeClass("vjs-has-started")),this):!!this.hasStarted_},b.prototype.handleTechPlay_=function(){this.removeClass("vjs-ended"),this.removeClass("vjs-paused"),this.addClass("vjs-playing"),this.hasStarted(!0),this.trigger("play")},b.prototype.handleTechWaiting_=function(){this.addClass("vjs-waiting"),this.trigger("waiting")},b.prototype.handleTechCanPlay_=function(){this.removeClass("vjs-waiting"),this.trigger("canplay")},b.prototype.handleTechCanPlayThrough_=function(){this.removeClass("vjs-waiting"),this.trigger("canplaythrough")},b.prototype.handleTechPlaying_=function(){this.removeClass("vjs-waiting"),this.trigger("playing")},b.prototype.handleTechSeeking_=function(){this.addClass("vjs-seeking"),this.trigger("seeking")},b.prototype.handleTechSeeked_=function(){this.removeClass("vjs-seeking"),this.trigger("seeked")},b.prototype.handleTechFirstPlay_=function(){this.options_.starttime&&this.currentTime(this.options_.starttime),this.addClass("vjs-has-started"),this.trigger("firstplay")},b.prototype.handleTechPause_=function(){this.removeClass("vjs-playing"),this.addClass("vjs-paused"),this.trigger("pause")},b.prototype.handleTechProgress_=function(){this.trigger("progress")},b.prototype.handleTechEnded_=function(){this.addClass("vjs-ended"),this.options_.loop?(this.currentTime(0),this.play()):this.paused()||this.pause(),this.trigger("ended")},b.prototype.handleTechDurationChange_=function(){this.duration(this.techGet_("duration"))},b.prototype.handleTechClick_=function(a){0===a.button&&this.controls()&&(this.paused()?this.play():this.pause())},b.prototype.handleTechTap_=function(){this.userActive(!this.userActive())},b.prototype.handleTechTouchStart_=function(){this.userWasActive=this.userActive()},b.prototype.handleTechTouchMove_=function(){this.userWasActive&&this.reportUserActivity()},b.prototype.handleTechTouchEnd_=function(a){a.preventDefault()},b.prototype.handleFullscreenChange_=function(){this.isFullscreen()?this.addClass("vjs-fullscreen"):this.removeClass("vjs-fullscreen")},b.prototype.handleStageClick_=function(){this.reportUserActivity()},b.prototype.handleTechFullscreenChange_=function(a,b){b&&this.isFullscreen(b.isFullscreen),this.trigger("fullscreenchange")},b.prototype.handleTechError_=function(){var a=this.tech_.error();this.error(a&&a.code)},b.prototype.handleTechSuspend_=function(){this.trigger("suspend")},b.prototype.handleTechAbort_=function(){this.trigger("abort")},b.prototype.handleTechEmptied_=function(){this.trigger("emptied")},b.prototype.handleTechStalled_=function(){this.trigger("stalled")},b.prototype.handleTechLoadedMetaData_=function(){this.trigger("loadedmetadata")},b.prototype.handleTechLoadedData_=function(){this.trigger("loadeddata")},b.prototype.handleTechTimeUpdate_=function(){this.trigger("timeupdate")},b.prototype.handleTechRateChange_=function(){this.trigger("ratechange")},b.prototype.handleTechVolumeChange_=function(){this.trigger("volumechange")},b.prototype.handleTechTextTrackChange_=function(){this.trigger("texttrackchange")},b.prototype.getCache=function(){return this.cache_},b.prototype.techCall_=function(a,b){if(this.tech_&&!this.tech_.isReady_)this.tech_.ready(function(){this[a](b)},!0);else try{this.tech_[a](b)}catch(c){throw x["default"](c),c}},b.prototype.techGet_=function(a){if(this.tech_&&this.tech_.isReady_)try{return this.tech_[a]()}catch(b){throw void 0===this.tech_[a]?x["default"]("Video.js: "+a+" method not defined for "+this.techName_+" playback technology.",b):"TypeError"===b.name?(x["default"]("Video.js: "+a+" unavailable on "+this.techName_+" playback technology element.",b),this.tech_.isReady_=!1):x["default"](b),b}},b.prototype.play=function(){return this.techCall_("play"),this},b.prototype.pause=function(){return this.techCall_("pause"),this},b.prototype.paused=function(){return this.techGet_("paused")===!1?!1:!0},b.prototype.scrubbing=function(a){return void 0!==a?(this.scrubbing_=!!a,a?this.addClass("vjs-scrubbing"):this.removeClass("vjs-scrubbing"),this):this.scrubbing_},b.prototype.currentTime=function(a){return void 0!==a?(this.techCall_("setCurrentTime",a),this):this.cache_.currentTime=this.techGet_("currentTime")||0},b.prototype.duration=function(a){return void 0===a?this.cache_.duration||0:(a=parseFloat(a)||0,0>a&&(a=1/0),a!==this.cache_.duration&&(this.cache_.duration=a,a===1/0?this.addClass("vjs-live"):this.removeClass("vjs-live"),this.trigger("durationchange")),this)},b.prototype.remainingTime=function(){return this.duration()-this.currentTime()},b.prototype.buffered=function c(){var c=this.techGet_("buffered");return c&&c.length||(c=A.createTimeRange(0,0)),c},b.prototype.bufferedPercent=function(){return B.bufferedPercent(this.buffered(),this.duration())},b.prototype.bufferedEnd=function(){var a=this.buffered(),b=this.duration(),c=a.end(a.length-1);return c>b&&(c=b),c},b.prototype.volume=function(a){var b=void 0;return void 0!==a?(b=Math.max(0,Math.min(1,parseFloat(a))),this.cache_.volume=b,this.techCall_("setVolume",b),this):(b=parseFloat(this.techGet_("volume")),isNaN(b)?1:b)},b.prototype.muted=function(a){return void 0!==a?(this.techCall_("setMuted",a),this):this.techGet_("muted")||!1},b.prototype.supportsFullScreen=function(){return this.techGet_("supportsFullScreen")||!1},b.prototype.isFullscreen=function(a){return void 0!==a?(this.isFullscreen_=!!a,this):!!this.isFullscreen_},b.prototype.requestFullscreen=function(){var a=F["default"];return this.isFullscreen(!0),a.requestFullscreen?(o.on(k["default"],a.fullscreenchange,s.bind(this,function b(){this.isFullscreen(k["default"][a.fullscreenElement]),this.isFullscreen()===!1&&o.off(k["default"],a.fullscreenchange,b),this.trigger("fullscreenchange")})),this.el_[a.requestFullscreen]()):this.tech_.supportsFullScreen()?this.techCall_("enterFullScreen"):(this.enterFullWindow(),this.trigger("fullscreenchange")),this},b.prototype.exitFullscreen=function(){var a=F["default"];return this.isFullscreen(!1),a.requestFullscreen?k["default"][a.exitFullscreen]():this.tech_.supportsFullScreen()?this.techCall_("exitFullScreen"):(this.exitFullWindow(),this.trigger("fullscreenchange")),this},b.prototype.enterFullWindow=function(){this.isFullWindow=!0,this.docOrigOverflow=k["default"].documentElement.style.overflow,o.on(k["default"],"keydown",s.bind(this,this.fullWindowOnEscKey)),k["default"].documentElement.style.overflow="hidden",q.addElClass(k["default"].body,"vjs-full-window"),this.trigger("enterFullWindow")},b.prototype.fullWindowOnEscKey=function(a){27===a.keyCode&&(this.isFullscreen()===!0?this.exitFullscreen():this.exitFullWindow())},b.prototype.exitFullWindow=function(){this.isFullWindow=!1,o.off(k["default"],"keydown",this.fullWindowOnEscKey),k["default"].documentElement.style.overflow=this.docOrigOverflow,q.removeElClass(k["default"].body,"vjs-full-window"),this.trigger("exitFullWindow")},b.prototype.selectSource=function(a){for(var b=0,c=this.options_.techOrder;b<c.length;b++){var d=z["default"](c[b]),e=i["default"].getComponent(d);if(e){if(e.isSupported())for(var f=0,g=a;f<g.length;f++){var h=g[f];if(e.canPlaySource(h))return{source:h,tech:d}}}else x["default"].error('The "'+d+'" tech is undefined. Skipped browser support check for that tech.')}return!1},b.prototype.src=function(a){if(void 0===a)return this.techGet_("src");var b=i["default"].getComponent(this.techName_);return Array.isArray(a)?this.sourceList_(a):"string"==typeof a?this.src({src:a}):a instanceof Object&&(a.type&&!b.canPlaySource(a)?this.sourceList_([a]):(this.cache_.src=a.src,this.currentType_=a.type||"",this.ready(function(){b.prototype.hasOwnProperty("setSource")?this.techCall_("setSource",a):this.techCall_("src",a.src),"auto"===this.options_.preload&&this.load(),this.options_.autoplay&&this.play()},!0))),this},b.prototype.sourceList_=function(a){var b=this.selectSource(a);b?b.tech===this.techName_?this.src(b.source):this.loadTech_(b.tech,b.source):(this.setTimeout(function(){this.error({code:4,message:this.localize(this.options_.notSupportedMessage)})},0),this.triggerReady())},b.prototype.load=function(){return this.techCall_("load"),this},b.prototype.currentSrc=function(){return this.techGet_("currentSrc")||this.cache_.src||""},b.prototype.currentType=function(){return this.currentType_||""},b.prototype.preload=function(a){return void 0!==a?(this.techCall_("setPreload",a),this.options_.preload=a,this):this.techGet_("preload")},b.prototype.autoplay=function(a){return void 0!==a?(this.techCall_("setAutoplay",a),this.options_.autoplay=a,this):this.techGet_("autoplay",a)},b.prototype.loop=function(a){return void 0!==a?(this.techCall_("setLoop",a),this.options_.loop=a,this):this.techGet_("loop")},b.prototype.poster=function(a){return void 0===a?this.poster_:(a||(a=""),this.poster_=a,this.techCall_("setPoster",a),this.trigger("posterchange"),this)},b.prototype.handleTechPosterChange_=function(){!this.poster_&&this.tech_&&this.tech_.poster&&(this.poster_=this.tech_.poster()||"",this.trigger("posterchange"))},b.prototype.controls=function(a){return void 0!==a?(a=!!a,this.controls_!==a&&(this.controls_=a,this.usingNativeControls()&&this.techCall_("setControls",a),a?(this.removeClass("vjs-controls-disabled"),this.addClass("vjs-controls-enabled"),this.trigger("controlsenabled"),this.usingNativeControls()||this.addTechControlsListeners_()):(this.removeClass("vjs-controls-enabled"),this.addClass("vjs-controls-disabled"),this.trigger("controlsdisabled"),this.usingNativeControls()||this.removeTechControlsListeners_())),this):!!this.controls_},b.prototype.usingNativeControls=function(a){return void 0!==a?(a=!!a,this.usingNativeControls_!==a&&(this.usingNativeControls_=a,a?(this.addClass("vjs-using-native-controls"),this.trigger("usingnativecontrols")):(this.removeClass("vjs-using-native-controls"),this.trigger("usingcustomcontrols"))),this):!!this.usingNativeControls_},b.prototype.error=function(a){return void 0===a?this.error_||null:null===a?(this.error_=a,this.removeClass("vjs-error"),this):(this.error_=a instanceof H["default"]?a:new H["default"](a),this.trigger("error"),this.addClass("vjs-error"),x["default"].error("(CODE:"+this.error_.code+" "+H["default"].errorTypes[this.error_.code]+")",this.error_.message,this.error_),this)},b.prototype.ended=function(){return this.techGet_("ended")},b.prototype.seeking=function(){return this.techGet_("seeking")},b.prototype.seekable=function(){return this.techGet_("seekable")},b.prototype.reportUserActivity=function(){this.userActivity_=!0},b.prototype.userActive=function(a){return void 0!==a?(a=!!a,a!==this.userActive_&&(this.userActive_=a,a?(this.userActivity_=!0,this.removeClass("vjs-user-inactive"),this.addClass("vjs-user-active"),this.trigger("useractive")):(this.userActivity_=!1,this.tech_&&this.tech_.one("mousemove",function(a){a.stopPropagation(),a.preventDefault()}),this.removeClass("vjs-user-active"),this.addClass("vjs-user-inactive"),this.trigger("userinactive"))),this):this.userActive_},b.prototype.listenForUserActivity_=function(){var a=void 0,b=void 0,c=void 0,d=s.bind(this,this.reportUserActivity),e=function(a){(a.screenX!==b||a.screenY!==c)&&(b=a.screenX,c=a.screenY,d())},f=function(){d(),this.clearInterval(a),a=this.setInterval(d,250)},g=function(){d(),this.clearInterval(a)};this.on("mousedown",f),this.on("mousemove",e),this.on("mouseup",g),this.on("keydown",d),this.on("keyup",d);{var h=void 0;this.setInterval(function(){if(this.userActivity_){this.userActivity_=!1,this.userActive(!0),this.clearTimeout(h);var a=this.options_.inactivityTimeout;a>0&&(h=this.setTimeout(function(){this.userActivity_||this.userActive(!1)},a))}},250)}},b.prototype.playbackRate=function(a){return void 0!==a?(this.techCall_("setPlaybackRate",a),this):this.tech_&&this.tech_.featuresPlaybackRate?this.techGet_("playbackRate"):1},b.prototype.isAudio=function(a){return void 0!==a?(this.isAudio_=!!a,this):!!this.isAudio_},b.prototype.networkState=function(){return this.techGet_("networkState")},b.prototype.readyState=function(){return this.techGet_("readyState")},b.prototype.textTracks=function(){return this.tech_&&this.tech_.textTracks()},b.prototype.remoteTextTracks=function(){return this.tech_&&this.tech_.remoteTextTracks()},b.prototype.addTextTrack=function(a,b,c){return this.tech_&&this.tech_.addTextTrack(a,b,c)},b.prototype.addRemoteTextTrack=function(a){return this.tech_&&this.tech_.addRemoteTextTrack(a)},b.prototype.removeRemoteTextTrack=function(a){this.tech_&&this.tech_.removeRemoteTextTrack(a)},b.prototype.videoWidth=function(){return this.tech_&&this.tech_.videoWidth&&this.tech_.videoWidth()||0},b.prototype.videoHeight=function(){return this.tech_&&this.tech_.videoHeight&&this.tech_.videoHeight()||0},b.prototype.language=function(a){return void 0===a?this.language_:(this.language_=(""+a).toLowerCase(),this)},b.prototype.languages=function(){return N["default"](b.prototype.options_.languages,this.languages_)},b.prototype.toJSON=function(){var a=N["default"](this.options_),b=a.tracks;a.tracks=[];for(var c=0;c<b.length;c++){var d=b[c];d=N["default"](d),d.player=void 0,a.tracks[c]=d}return a},b.getTagSettings=function(a){var b={sources:[],tracks:[]},c=q.getElAttributes(a),d=c["data-setup"];if(null!==d){var e=J["default"](d||"{}"),f=e[0],g=e[1];f&&x["default"].error(f),L["default"](c,g)}if(L["default"](b,c),a.hasChildNodes())for(var h=a.childNodes,i=0,j=h.length;j>i;i++){var k=h[i],l=k.nodeName.toLowerCase();"source"===l?b.sources.push(q.getElAttributes(k)):"track"===l&&b.tracks.push(q.getElAttributes(k))}return b},b}(i["default"]));Z.players={};var $=m["default"].navigator;Z.prototype.options_={techOrder:["html5","flash"],html5:{},flash:{},defaultVolume:0,inactivityTimeout:2e3,playbackRates:[],children:["mediaLoader","posterImage","textTrackDisplay","loadingSpinner","bigPlayButton","controlBar","errorDisplay","textTrackSettings"],language:k["default"].getElementsByTagName("html")[0].getAttribute("lang")||$.languages&&$.languages[0]||$.userLanguage||$.language||"en",languages:{},notSupportedMessage:"No compatible source was found for this video."},Z.prototype.handleLoadedMetaData_,Z.prototype.handleLoadedData_,Z.prototype.handleUserActive_,Z.prototype.handleUserInactive_,Z.prototype.handleTimeUpdate_,Z.prototype.handleVolumeChange_,Z.prototype.handleError_,Z.prototype.flexNotSupported_=function(){var a=k["default"].createElement("i");return!("flexBasis"in a.style||"webkitFlexBasis"in a.style||"mozFlexBasis"in a.style||"msFlexBasis"in a.style||"msFlexOrder"in a.style)},i["default"].registerComponent("Player",Z),c["default"]=Z,b.exports=c["default"]},{"./big-play-button.js":56,"./component.js":58,"./control-bar/control-bar.js":59,"./error-display.js":89,"./fullscreen-api.js":92,"./loading-spinner.js":93,"./media-error.js":94,"./poster-image.js":100,"./tech/html5.js":105,"./tech/loader.js":106,"./tracks/text-track-display.js":109,"./tracks/text-track-list-converter.js":111,"./tracks/text-track-settings.js":113,"./utils/browser.js":115,"./utils/buffer.js":116,"./utils/dom.js":118,"./utils/events.js":119,"./utils/fn.js":120,"./utils/guid.js":122,"./utils/log.js":123,"./utils/merge-options.js":124,"./utils/stylesheet.js":125,"./utils/time-ranges.js":126,"./utils/to-title-case.js":127,"global/document":1,"global/window":2,"object.assign":43,"safe-json-parse/tuple":48}],99:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var e=a("./player.js"),f=d(e),g=function(a,b){f["default"].prototype[a]=b};c["default"]=g,b.exports=c["default"]},{"./player.js":98}],100:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("./button.js"),i=e(h),j=a("./component.js"),k=e(j),l=a("./utils/fn.js"),m=d(l),n=a("./utils/dom.js"),o=d(n),p=a("./utils/browser.js"),q=d(p),r=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.update(),c.on("posterchange",m.bind(this,this.update))}return g(b,a),b.prototype.dispose=function(){this.player().off("posterchange",this.update),a.prototype.dispose.call(this)},b.prototype.createEl=function(){var a=o.createEl("div",{className:"vjs-poster",tabIndex:-1});return q.BACKGROUND_SIZE_SUPPORTED||(this.fallbackImg_=o.createEl("img"),a.appendChild(this.fallbackImg_)),a},b.prototype.update=function(){var a=this.player().poster();this.setSrc(a),a?this.show():this.hide()},b.prototype.setSrc=function(a){if(this.fallbackImg_)this.fallbackImg_.src=a;else{var b="";a&&(b='url("'+a+'")'),this.el_.style.backgroundImage=b}},b.prototype.handleClick=function(){this.player_.paused()?this.player_.play():this.player_.pause()},b}(i["default"]);k["default"].registerComponent("PosterImage",r),c["default"]=r,b.exports=c["default"]},{"./button.js":57,"./component.js":58,"./utils/browser.js":115,"./utils/dom.js":118,"./utils/fn.js":120}],101:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}c.__esModule=!0;var f=a("./utils/events.js"),g=e(f),h=a("global/document"),i=d(h),j=a("global/window"),k=d(j),l=!1,m=void 0,n=function(){var a=i["default"].getElementsByTagName("video"),b=i["default"].getElementsByTagName("audio"),c=[];if(a&&a.length>0)for(var d=0,e=a.length;e>d;d++)c.push(a[d]);if(b&&b.length>0)for(var d=0,e=b.length;e>d;d++)c.push(b[d]);if(c&&c.length>0)for(var d=0,e=c.length;e>d;d++){var f=c[d];if(!f||!f.getAttribute){o(1);break}if(void 0===f.player){var g=f.getAttribute("data-setup");if(null!==g){m(f)}}}else l||o(1)},o=function(a,b){m=b,setTimeout(n,a)};"complete"===i["default"].readyState?l=!0:g.one(k["default"],"load",function(){l=!0});var p=function(){return l};c.autoSetup=n,c.autoSetupTimeout=o,c.hasLoaded=p},{"./utils/events.js":119,"global/document":1,"global/window":2}],102:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../component.js"),i=e(h),j=a("../utils/dom.js"),k=d(j),l=a("global/document"),m=e(l),n=a("object.assign"),o=e(n),p=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.bar=this.getChild(this.options_.barName),this.vertical(!!this.options_.vertical),this.on("mousedown",this.handleMouseDown),this.on("touchstart",this.handleMouseDown),this.on("focus",this.handleFocus),this.on("blur",this.handleBlur),this.on("click",this.handleClick),this.on(c,"controlsvisible",this.update),this.on(c,this.playerEvent,this.update)}return g(b,a),b.prototype.createEl=function(b){var c=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],d=arguments.length<=2||void 0===arguments[2]?{}:arguments[2];return c.className=c.className+" vjs-slider",c=o["default"]({tabIndex:0},c),d=o["default"]({role:"slider","aria-valuenow":0,"aria-valuemin":0,"aria-valuemax":100,tabIndex:0},d),a.prototype.createEl.call(this,b,c,d)},b.prototype.handleMouseDown=function(a){a.preventDefault(),k.blockTextSelection(),this.addClass("vjs-sliding"),this.trigger("slideractive"),this.on(m["default"],"mousemove",this.handleMouseMove),this.on(m["default"],"mouseup",this.handleMouseUp),this.on(m["default"],"touchmove",this.handleMouseMove),this.on(m["default"],"touchend",this.handleMouseUp),this.handleMouseMove(a)},b.prototype.handleMouseMove=function(){},b.prototype.handleMouseUp=function(){k.unblockTextSelection(),this.removeClass("vjs-sliding"),this.trigger("sliderinactive"),this.off(m["default"],"mousemove",this.handleMouseMove),this.off(m["default"],"mouseup",this.handleMouseUp),this.off(m["default"],"touchmove",this.handleMouseMove),this.off(m["default"],"touchend",this.handleMouseUp),this.update()},b.prototype.update=function(){if(this.el_){var a=this.getPercent(),b=this.bar;if(b){("number"!=typeof a||a!==a||0>a||a===1/0)&&(a=0);var c=(100*a).toFixed(2)+"%";this.vertical()?b.el().style.height=c:b.el().style.width=c}}},b.prototype.calculateDistance=function(a){var b=k.getPointerPosition(this.el_,a);return this.vertical()?b.y:b.x},b.prototype.handleFocus=function(){this.on(m["default"],"keydown",this.handleKeyPress)},b.prototype.handleKeyPress=function(a){37===a.which||40===a.which?(a.preventDefault(),this.stepBack()):(38===a.which||39===a.which)&&(a.preventDefault(),this.stepForward())},b.prototype.handleBlur=function(){this.off(m["default"],"keydown",this.handleKeyPress)},b.prototype.handleClick=function(a){a.stopImmediatePropagation(),a.preventDefault()},b.prototype.vertical=function(a){return void 0===a?this.vertical_||!1:(this.vertical_=!!a,this.addClass(this.vertical_?"vjs-slider-vertical":"vjs-slider-horizontal"),this)},b}(i["default"]);i["default"].registerComponent("Slider",p),c["default"]=p,b.exports=c["default"]},{"../component.js":58,"../utils/dom.js":118,"global/document":1,"object.assign":43}],103:[function(a,b,c){"use strict";function d(a){return a.streamingFormats={"rtmp/mp4":"MP4","rtmp/flv":"FLV"},a.streamFromParts=function(a,b){return a+"&"+b},a.streamToParts=function(a){var b={connection:"",stream:""};if(!a)return b;var c=a.indexOf("&"),d=void 0;return-1!==c?d=c+1:(c=d=a.lastIndexOf("/")+1,0===c&&(c=d=a.length)),b.connection=a.substring(0,c),b.stream=a.substring(d,a.length),b},a.isStreamingType=function(b){return b in a.streamingFormats},a.RTMP_RE=/^rtmp[set]?:\/\//i,a.isStreamingSrc=function(b){return a.RTMP_RE.test(b)},a.rtmpSourceHandler={},a.rtmpSourceHandler.canHandleSource=function(b){return a.isStreamingType(b.type)||a.isStreamingSrc(b.src)?"maybe":""},a.rtmpSourceHandler.handleSource=function(b,c){var d=a.streamToParts(b.src);c.setRtmpConnection(d.connection),c.setRtmpStream(d.stream)},a.registerSourceHandler(a.rtmpSourceHandler),a}c.__esModule=!0,c["default"]=d,b.exports=c["default"]},{}],104:[function(a,b,c){
 
"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}function h(a){var b=a.charAt(0).toUpperCase()+a.slice(1);A["set"+b]=function(b){return this.el_.vjs_setProperty(a,b)}}function i(a){A[a]=function(){return this.el_.vjs_getProperty(a)}}c.__esModule=!0;for(var j=a("./tech"),k=e(j),l=a("../utils/dom.js"),m=d(l),n=a("../utils/url.js"),o=d(n),p=a("../utils/time-ranges.js"),q=a("./flash-rtmp"),r=e(q),s=a("../component"),t=e(s),u=a("global/window"),v=e(u),w=a("object.assign"),x=e(w),y=v["default"].navigator,z=function(a){function b(c,d){f(this,b),a.call(this,c,d),c.source&&this.ready(function(){this.setSource(c.source)},!0),c.startTime&&this.ready(function(){this.load(),this.play(),this.currentTime(c.startTime)},!0),v["default"].videojs=v["default"].videojs||{},v["default"].videojs.Flash=v["default"].videojs.Flash||{},v["default"].videojs.Flash.onReady=b.onReady,v["default"].videojs.Flash.onEvent=b.onEvent,v["default"].videojs.Flash.onError=b.onError,this.on("seeked",function(){this.lastSeekTarget_=void 0})}return g(b,a),b.prototype.createEl=function(){var a=this.options_;a.swf||(a.swf="//vjs.zencdn.net/swf/5.0.0-rc1/video-js.swf");var c=a.techId,d=x["default"]({readyFunction:"videojs.Flash.onReady",eventProxyFunction:"videojs.Flash.onEvent",errorEventProxyFunction:"videojs.Flash.onError",autoplay:a.autoplay,preload:a.preload,loop:a.loop,muted:a.muted},a.flashVars),e=x["default"]({wmode:"opaque",bgcolor:"#000000"},a.params),f=x["default"]({id:c,name:c,"class":"vjs-tech"},a.attributes);return this.el_=b.embed(a.swf,d,e,f),this.el_.tech=this,this.el_},b.prototype.play=function(){this.ended()&&this.setCurrentTime(0),this.el_.vjs_play()},b.prototype.pause=function(){this.el_.vjs_pause()},b.prototype.src=function(a){return void 0===a?this.currentSrc():this.setSrc(a)},b.prototype.setSrc=function(a){if(a=o.getAbsoluteURL(a),this.el_.vjs_src(a),this.autoplay()){var b=this;this.setTimeout(function(){b.play()},0)}},b.prototype.seeking=function(){return void 0!==this.lastSeekTarget_},b.prototype.setCurrentTime=function(b){var c=this.seekable();c.length&&(b=b>c.start(0)?b:c.start(0),b=b<c.end(c.length-1)?b:c.end(c.length-1),this.lastSeekTarget_=b,this.trigger("seeking"),this.el_.vjs_setProperty("currentTime",b),a.prototype.setCurrentTime.call(this))},b.prototype.currentTime=function(){return this.seeking()?this.lastSeekTarget_||0:this.el_.vjs_getProperty("currentTime")},b.prototype.currentSrc=function(){return this.currentSource_?this.currentSource_.src:this.el_.vjs_getProperty("currentSrc")},b.prototype.load=function(){this.el_.vjs_load()},b.prototype.poster=function(){this.el_.vjs_getProperty("poster")},b.prototype.setPoster=function(){},b.prototype.seekable=function(){var a=this.duration();return 0===a?p.createTimeRange():p.createTimeRange(0,a)},b.prototype.buffered=function(){var a=this.el_.vjs_getProperty("buffered");return 0===a.length?p.createTimeRange():p.createTimeRange(a[0][0],a[0][1])},b.prototype.supportsFullScreen=function(){return!1},b.prototype.enterFullScreen=function(){return!1},b}(k["default"]),A=z.prototype,B="rtmpConnection,rtmpStream,preload,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted".split(","),C="networkState,readyState,initialTime,duration,startOffsetTime,paused,ended,videoTracks,audioTracks,videoWidth,videoHeight".split(","),D=0;D<B.length;D++)i(B[D]),h(B[D]);for(var D=0;D<C.length;D++)i(C[D]);z.isSupported=function(){return z.version()[0]>=10},k["default"].withSourceHandlers(z),z.nativeSourceHandler={},z.nativeSourceHandler.canHandleSource=function(a){function b(a){var b=o.getFileExtension(a);return b?"video/"+b:""}var c;return c=a.type?a.type.replace(/;.*/,"").toLowerCase():b(a.src),c in z.formats?"maybe":""},z.nativeSourceHandler.handleSource=function(a,b){b.setSrc(a.src)},z.nativeSourceHandler.dispose=function(){},z.registerSourceHandler(z.nativeSourceHandler),z.formats={"video/flv":"FLV","video/x-flv":"FLV","video/mp4":"MP4","video/m4v":"MP4"},z.onReady=function(a){var b=m.getEl(a),c=b&&b.tech;c&&c.el()&&z.checkReady(c)},z.checkReady=function(a){a.el()&&(a.el().vjs_getProperty?a.triggerReady():this.setTimeout(function(){z.checkReady(a)},50))},z.onEvent=function(a,b){var c=m.getEl(a).tech;c.trigger(b)},z.onError=function(a,b){var c=m.getEl(a).tech;return"srcnotfound"===b?c.error(4):void c.error("FLASH: "+b)},z.version=function(){var a="0,0,0";try{a=new v["default"].ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version").replace(/\D+/g,",").match(/^,?(.+),?$/)[1]}catch(b){try{y.mimeTypes["application/x-shockwave-flash"].enabledPlugin&&(a=(y.plugins["Shockwave Flash 2.0"]||y.plugins["Shockwave Flash"]).description.replace(/\D+/g,",").match(/^,?(.+),?$/)[1])}catch(c){}}return a.split(",")},z.embed=function(a,b,c,d){var e=z.getEmbedCode(a,b,c,d),f=m.createEl("div",{innerHTML:e}).childNodes[0];return f},z.getEmbedCode=function(a,b,c,d){var e='<object type="application/x-shockwave-flash" ',f="",g="",h="";return b&&Object.getOwnPropertyNames(b).forEach(function(a){f+=a+"="+b[a]+"&amp;"}),c=x["default"]({movie:a,flashvars:f,allowScriptAccess:"always",allowNetworking:"all"},c),Object.getOwnPropertyNames(c).forEach(function(a){g+='<param name="'+a+'" value="'+c[a]+'" />'}),d=x["default"]({data:a,width:"100%",height:"100%"},d),Object.getOwnPropertyNames(d).forEach(function(a){h+=a+'="'+d[a]+'" '}),""+e+h+">"+g+"</object>"},r["default"](z),t["default"].registerComponent("Flash",z),c["default"]=z,b.exports=c["default"]},{"../component":58,"../utils/dom.js":118,"../utils/time-ranges.js":126,"../utils/url.js":128,"./flash-rtmp":103,"./tech":107,"global/window":2,"object.assign":43}],105:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("./tech.js"),i=e(h),j=a("../component"),k=e(j),l=a("../utils/dom.js"),m=d(l),n=a("../utils/url.js"),o=d(n),p=a("../utils/fn.js"),q=d(p),r=a("../utils/log.js"),s=e(r),t=a("../utils/browser.js"),u=d(t),v=a("global/document"),w=e(v),x=a("global/window"),y=e(x),z=a("object.assign"),A=e(z),B=a("../utils/merge-options.js"),C=e(B),D=function(a){function b(c,d){f(this,b),a.call(this,c,d);var e=c.source;if(e&&(this.el_.currentSrc!==e.src||c.tag&&3===c.tag.initNetworkState_)?this.setSource(e):this.handleLateInit_(this.el_),this.el_.hasChildNodes()){for(var g=this.el_.childNodes,h=g.length,i=[];h--;){var j=g[h],k=j.nodeName.toLowerCase();"track"===k&&(this.featuresNativeTextTracks?this.remoteTextTracks().addTrack_(j.track):i.push(j))}for(var l=0;l<i.length;l++)this.el_.removeChild(i[l])}this.featuresNativeTextTracks&&(this.handleTextTrackChange_=q.bind(this,this.handleTextTrackChange),this.handleTextTrackAdd_=q.bind(this,this.handleTextTrackAdd),this.handleTextTrackRemove_=q.bind(this,this.handleTextTrackRemove),this.proxyNativeTextTracks_()),(u.TOUCH_ENABLED&&c.nativeControlsForTouch===!0||u.IS_IPHONE||u.IS_NATIVE_ANDROID)&&this.setControls(!0),this.triggerReady()}return g(b,a),b.prototype.dispose=function(){var c=this.el().textTracks,d=this.textTracks();c&&c.removeEventListener&&(c.removeEventListener("change",this.handleTextTrackChange_),c.removeEventListener("addtrack",this.handleTextTrackAdd_),c.removeEventListener("removetrack",this.handleTextTrackRemove_));for(var e=d.length;e--;)d.removeTrack_(d[e]);b.disposeMediaElement(this.el_),a.prototype.dispose.call(this)},b.prototype.createEl=function(){var a=this.options_.tag;if(!a||this.movingMediaElementInDOM===!1)if(a){var c=a.cloneNode(!0);a.parentNode.insertBefore(c,a),b.disposeMediaElement(a),a=c}else{a=w["default"].createElement("video");var d=this.options_.tag&&m.getElAttributes(this.options_.tag),e=C["default"]({},d);u.TOUCH_ENABLED&&this.options_.nativeControlsForTouch===!0||delete e.controls,m.setElAttributes(a,A["default"](e,{id:this.options_.techId,"class":"vjs-tech"}))}for(var f=["autoplay","preload","loop","muted"],g=f.length-1;g>=0;g--){var h=f[g],i={};"undefined"!=typeof this.options_[h]&&(i[h]=this.options_[h]),m.setElAttributes(a,i)}return a},b.prototype.handleLateInit_=function(a){var b=this;if(0!==a.networkState&&3!==a.networkState){if(0===a.readyState){var c=function(){var a=!1,c=function(){a=!0};b.on("loadstart",c);var d=function(){a||this.trigger("loadstart")};return b.on("loadedmetadata",d),b.ready(function(){this.off("loadstart",c),this.off("loadedmetadata",d),a||this.trigger("loadstart")}),{v:void 0}}();if("object"==typeof c)return c.v}var d=["loadstart"];d.push("loadedmetadata"),a.readyState>=2&&d.push("loadeddata"),a.readyState>=3&&d.push("canplay"),a.readyState>=4&&d.push("canplaythrough"),this.ready(function(){d.forEach(function(a){this.trigger(a)},this)})}},b.prototype.proxyNativeTextTracks_=function(){var a=this.el().textTracks;a&&a.addEventListener&&(a.addEventListener("change",this.handleTextTrackChange_),a.addEventListener("addtrack",this.handleTextTrackAdd_),a.addEventListener("removetrack",this.handleTextTrackRemove_))},b.prototype.handleTextTrackChange=function(){var a=this.textTracks();this.textTracks().trigger({type:"change",target:a,currentTarget:a,srcElement:a})},b.prototype.handleTextTrackAdd=function(a){this.textTracks().addTrack_(a.track)},b.prototype.handleTextTrackRemove=function(a){this.textTracks().removeTrack_(a.track)},b.prototype.play=function(){this.el_.play()},b.prototype.pause=function(){this.el_.pause()},b.prototype.paused=function(){return this.el_.paused},b.prototype.currentTime=function(){return this.el_.currentTime},b.prototype.setCurrentTime=function(a){try{this.el_.currentTime=a}catch(b){s["default"](b,"Video is not ready. (Video.js)")}},b.prototype.duration=function(){return this.el_.duration||0},b.prototype.buffered=function(){return this.el_.buffered},b.prototype.volume=function(){return this.el_.volume},b.prototype.setVolume=function(a){this.el_.volume=a},b.prototype.muted=function(){return this.el_.muted},b.prototype.setMuted=function(a){this.el_.muted=a},b.prototype.width=function(){return this.el_.offsetWidth},b.prototype.height=function(){return this.el_.offsetHeight},b.prototype.supportsFullScreen=function(){if("function"==typeof this.el_.webkitEnterFullScreen){var a=y["default"].navigator.userAgent;if(/Android/.test(a)||!/Chrome|Mac OS X 10.5/.test(a))return!0}return!1},b.prototype.enterFullScreen=function(){var a=this.el_;"webkitDisplayingFullscreen"in a&&this.one("webkitbeginfullscreen",function(){this.one("webkitendfullscreen",function(){this.trigger("fullscreenchange",{isFullscreen:!1})}),this.trigger("fullscreenchange",{isFullscreen:!0})}),a.paused&&a.networkState<=a.HAVE_METADATA?(this.el_.play(),this.setTimeout(function(){a.pause(),a.webkitEnterFullScreen()},0)):a.webkitEnterFullScreen()},b.prototype.exitFullScreen=function(){this.el_.webkitExitFullScreen()},b.prototype.src=function(a){return void 0===a?this.el_.src:void this.setSrc(a)},b.prototype.setSrc=function(a){this.el_.src=a},b.prototype.load=function(){this.el_.load()},b.prototype.currentSrc=function(){return this.el_.currentSrc},b.prototype.poster=function(){return this.el_.poster},b.prototype.setPoster=function(a){this.el_.poster=a},b.prototype.preload=function(){return this.el_.preload},b.prototype.setPreload=function(a){this.el_.preload=a},b.prototype.autoplay=function(){return this.el_.autoplay},b.prototype.setAutoplay=function(a){this.el_.autoplay=a},b.prototype.controls=function(){return this.el_.controls},b.prototype.setControls=function(a){this.el_.controls=!!a},b.prototype.loop=function(){return this.el_.loop},b.prototype.setLoop=function(a){this.el_.loop=a},b.prototype.error=function(){return this.el_.error},b.prototype.seeking=function(){return this.el_.seeking},b.prototype.seekable=function(){return this.el_.seekable},b.prototype.ended=function(){return this.el_.ended},b.prototype.defaultMuted=function(){return this.el_.defaultMuted},b.prototype.playbackRate=function(){return this.el_.playbackRate},b.prototype.played=function(){return this.el_.played},b.prototype.setPlaybackRate=function(a){this.el_.playbackRate=a},b.prototype.networkState=function(){return this.el_.networkState},b.prototype.readyState=function(){return this.el_.readyState},b.prototype.videoWidth=function(){return this.el_.videoWidth},b.prototype.videoHeight=function(){return this.el_.videoHeight},b.prototype.textTracks=function(){return a.prototype.textTracks.call(this)},b.prototype.addTextTrack=function(b,c,d){return this.featuresNativeTextTracks?this.el_.addTextTrack(b,c,d):a.prototype.addTextTrack.call(this,b,c,d)},b.prototype.addRemoteTextTrack=function(){var b=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];if(!this.featuresNativeTextTracks)return a.prototype.addRemoteTextTrack.call(this,b);var c=w["default"].createElement("track");return b.kind&&(c.kind=b.kind),b.label&&(c.label=b.label),(b.language||b.srclang)&&(c.srclang=b.language||b.srclang),b["default"]&&(c["default"]=b["default"]),b.id&&(c.id=b.id),b.src&&(c.src=b.src),this.el().appendChild(c),this.remoteTextTracks().addTrack_(c.track),c},b.prototype.removeRemoteTextTrack=function(b){if(!this.featuresNativeTextTracks)return a.prototype.removeRemoteTextTrack.call(this,b);var c,d;for(this.remoteTextTracks().removeTrack_(b),c=this.el().querySelectorAll("track"),d=c.length;d--;)(b===c[d]||b===c[d].track)&&this.el().removeChild(c[d])},b}(i["default"]);D.TEST_VID=w["default"].createElement("video");var E=w["default"].createElement("track");E.kind="captions",E.srclang="en",E.label="English",D.TEST_VID.appendChild(E),D.isSupported=function(){try{D.TEST_VID.volume=.5}catch(a){return!1}return!!D.TEST_VID.canPlayType},i["default"].withSourceHandlers(D),D.nativeSourceHandler={},D.nativeSourceHandler.canHandleSource=function(a){function b(a){try{return D.TEST_VID.canPlayType(a)}catch(b){return""}}var c;return a.type?b(a.type):a.src?(c=o.getFileExtension(a.src),b("video/"+c)):""},D.nativeSourceHandler.handleSource=function(a,b){b.setSrc(a.src)},D.nativeSourceHandler.dispose=function(){},D.registerSourceHandler(D.nativeSourceHandler),D.canControlVolume=function(){var a=D.TEST_VID.volume;return D.TEST_VID.volume=a/2+.1,a!==D.TEST_VID.volume},D.canControlPlaybackRate=function(){var a=D.TEST_VID.playbackRate;return D.TEST_VID.playbackRate=a/2+.1,a!==D.TEST_VID.playbackRate},D.supportsNativeTextTracks=function(){var a;return a=!!D.TEST_VID.textTracks,a&&D.TEST_VID.textTracks.length>0&&(a="number"!=typeof D.TEST_VID.textTracks[0].mode),a&&u.IS_FIREFOX&&(a=!1),!a||"onremovetrack"in D.TEST_VID.textTracks||(a=!1),a},D.Events=["loadstart","suspend","abort","error","emptied","stalled","loadedmetadata","loadeddata","canplay","canplaythrough","playing","waiting","seeking","seeked","ended","durationchange","timeupdate","progress","play","pause","ratechange","volumechange"],D.prototype.featuresVolumeControl=D.canControlVolume(),D.prototype.featuresPlaybackRate=D.canControlPlaybackRate(),D.prototype.movingMediaElementInDOM=!u.IS_IOS,D.prototype.featuresFullscreenResize=!0,D.prototype.featuresProgressEvents=!0,D.prototype.featuresNativeTextTracks=D.supportsNativeTextTracks();var F=void 0,G=/^application\/(?:x-|vnd\.apple\.)mpegurl/i,H=/^video\/mp4/i;D.patchCanPlayType=function(){u.ANDROID_VERSION>=4&&(F||(F=D.TEST_VID.constructor.prototype.canPlayType),D.TEST_VID.constructor.prototype.canPlayType=function(a){return a&&G.test(a)?"maybe":F.call(this,a)}),u.IS_OLD_ANDROID&&(F||(F=D.TEST_VID.constructor.prototype.canPlayType),D.TEST_VID.constructor.prototype.canPlayType=function(a){return a&&H.test(a)?"maybe":F.call(this,a)})},D.unpatchCanPlayType=function(){var a=D.TEST_VID.constructor.prototype.canPlayType;return D.TEST_VID.constructor.prototype.canPlayType=F,F=null,a},D.patchCanPlayType(),D.disposeMediaElement=function(a){if(a){for(a.parentNode&&a.parentNode.removeChild(a);a.hasChildNodes();)a.removeChild(a.firstChild);a.removeAttribute("src"),"function"==typeof a.load&&!function(){try{a.load()}catch(b){}}()}},k["default"].registerComponent("Html5",D),c["default"]=D,b.exports=c["default"]},{"../component":58,"../utils/browser.js":115,"../utils/dom.js":118,"../utils/fn.js":120,"../utils/log.js":123,"../utils/merge-options.js":124,"../utils/url.js":128,"./tech.js":107,"global/document":1,"global/window":2,"object.assign":43}],106:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var g=a("../component"),h=d(g),i=a("global/window"),j=(d(i),a("../utils/to-title-case.js")),k=d(j),l=function(a){function b(c,d,f){if(e(this,b),a.call(this,c,d,f),d.playerOptions.sources&&0!==d.playerOptions.sources.length)c.src(d.playerOptions.sources);else for(var g=0,i=d.playerOptions.techOrder;g<i.length;g++){var j=k["default"](i[g]),l=h["default"].getComponent(j);if(l&&l.isSupported()){c.loadTech_(j);break}}}return f(b,a),b}(h["default"]);h["default"].registerComponent("MediaLoader",l),c["default"]=l,b.exports=c["default"]},{"../component":58,"../utils/to-title-case.js":127,"global/window":2}],107:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}c.__esModule=!0;var h=a("../component"),i=e(h),j=a("../tracks/text-track"),k=e(j),l=a("../tracks/text-track-list"),m=e(l),n=a("../utils/fn.js"),o=d(n),p=a("../utils/log.js"),q=e(p),r=a("../utils/time-ranges.js"),s=a("../utils/buffer.js"),t=a("../media-error.js"),u=e(t),v=a("global/window"),w=e(v),x=a("global/document"),y=e(x),z=function(a){function b(){var c=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],d=arguments.length<=1||void 0===arguments[1]?function(){}:arguments[1];f(this,b),c.reportTouchActivity=!1,a.call(this,null,c,d),this.hasStarted_=!1,this.on("playing",function(){this.hasStarted_=!0}),this.on("loadstart",function(){this.hasStarted_=!1}),this.textTracks_=c.textTracks,this.featuresProgressEvents||this.manualProgressOn(),this.featuresTimeupdateEvents||this.manualTimeUpdatesOn(),(c.nativeCaptions===!1||c.nativeTextTracks===!1)&&(this.featuresNativeTextTracks=!1),this.featuresNativeTextTracks||this.emulateTextTracks(),this.initTextTrackListeners(),this.emitTapEvents()}/*! Time Tracking -------------------------------------------------------------- */
 
return g(b,a),b.prototype.manualProgressOn=function(){this.on("durationchange",this.onDurationChange),this.manualProgress=!0,this.one("ready",this.trackProgress)},b.prototype.manualProgressOff=function(){this.manualProgress=!1,this.stopTrackingProgress(),this.off("durationchange",this.onDurationChange)},b.prototype.trackProgress=function(){this.stopTrackingProgress(),this.progressInterval=this.setInterval(o.bind(this,function(){var a=this.bufferedPercent();this.bufferedPercent_!==a&&this.trigger("progress"),this.bufferedPercent_=a,1===a&&this.stopTrackingProgress()}),500)},b.prototype.onDurationChange=function(){this.duration_=this.duration()},b.prototype.buffered=function(){return r.createTimeRange(0,0)},b.prototype.bufferedPercent=function(){return s.bufferedPercent(this.buffered(),this.duration_)},b.prototype.stopTrackingProgress=function(){this.clearInterval(this.progressInterval)},b.prototype.manualTimeUpdatesOn=function(){this.manualTimeUpdates=!0,this.on("play",this.trackCurrentTime),this.on("pause",this.stopTrackingCurrentTime)},b.prototype.manualTimeUpdatesOff=function(){this.manualTimeUpdates=!1,this.stopTrackingCurrentTime(),this.off("play",this.trackCurrentTime),this.off("pause",this.stopTrackingCurrentTime)},b.prototype.trackCurrentTime=function(){this.currentTimeInterval&&this.stopTrackingCurrentTime(),this.currentTimeInterval=this.setInterval(function(){this.trigger({type:"timeupdate",target:this,manuallyTriggered:!0})},250)},b.prototype.stopTrackingCurrentTime=function(){this.clearInterval(this.currentTimeInterval),this.trigger({type:"timeupdate",target:this,manuallyTriggered:!0})},b.prototype.dispose=function(){var b=this.textTracks();if(b)for(var c=b.length;c--;)this.removeRemoteTextTrack(b[c]);this.manualProgress&&this.manualProgressOff(),this.manualTimeUpdates&&this.manualTimeUpdatesOff(),a.prototype.dispose.call(this)},b.prototype.error=function(a){return void 0!==a&&(this.error_=a instanceof u["default"]?a:new u["default"](a),this.trigger("error")),this.error_},b.prototype.played=function(){return this.hasStarted_?r.createTimeRange(0,0):r.createTimeRange()},b.prototype.setCurrentTime=function(){this.manualTimeUpdates&&this.trigger({type:"timeupdate",target:this,manuallyTriggered:!0})},b.prototype.initTextTrackListeners=function(){var a=o.bind(this,function(){this.trigger("texttrackchange")}),b=this.textTracks();b&&(b.addEventListener("removetrack",a),b.addEventListener("addtrack",a),this.on("dispose",o.bind(this,function(){b.removeEventListener("removetrack",a),b.removeEventListener("addtrack",a)})))},b.prototype.emulateTextTracks=function(){if(!w["default"].WebVTT&&null!=this.el().parentNode){var a=y["default"].createElement("script");a.src=this.options_["vtt.js"]||"../node_modules/vtt.js/dist/vtt.js",this.el().parentNode.appendChild(a),w["default"].WebVTT=!0}var b=this.textTracks();if(b){var c=o.bind(this,function(){var a=this,c=function(){return a.trigger("texttrackchange")};c();for(var d=0;d<b.length;d++){var e=b[d];e.removeEventListener("cuechange",c),"showing"===e.mode&&e.addEventListener("cuechange",c)}});b.addEventListener("change",c),this.on("dispose",function(){b.removeEventListener("change",c)})}},b.prototype.textTracks=function(){return this.textTracks_=this.textTracks_||new m["default"],this.textTracks_},b.prototype.remoteTextTracks=function(){return this.remoteTextTracks_=this.remoteTextTracks_||new m["default"],this.remoteTextTracks_},b.prototype.addTextTrack=function(a,b,c){if(!a)throw new Error("TextTrack kind is required but was not provided");return A(this,a,b,c)},b.prototype.addRemoteTextTrack=function(a){var b=A(this,a.kind,a.label,a.language,a);return this.remoteTextTracks().addTrack_(b),{track:b}},b.prototype.removeRemoteTextTrack=function(a){this.textTracks().removeTrack_(a),this.remoteTextTracks().removeTrack_(a)},b.prototype.setPoster=function(){},b}(i["default"]);z.prototype.textTracks_;var A=function(a,b,c,d){var e=arguments.length<=4||void 0===arguments[4]?{}:arguments[4],f=a.textTracks();e.kind=b,c&&(e.label=c),d&&(e.language=d),e.tech=a;var g=new k["default"](e);return f.addTrack_(g),g};z.prototype.featuresVolumeControl=!0,z.prototype.featuresFullscreenResize=!1,z.prototype.featuresPlaybackRate=!1,z.prototype.featuresProgressEvents=!1,z.prototype.featuresTimeupdateEvents=!1,z.prototype.featuresNativeTextTracks=!1,z.withSourceHandlers=function(a){a.registerSourceHandler=function(b,c){var d=a.sourceHandlers;d||(d=a.sourceHandlers=[]),void 0===c&&(c=d.length),d.splice(c,0,b)},a.selectSourceHandler=function(b){for(var c=a.sourceHandlers||[],d=void 0,e=0;e<c.length;e++)if(d=c[e].canHandleSource(b))return c[e];return null},a.canPlaySource=function(b){var c=a.selectSourceHandler(b);return c?c.canHandleSource(b):""};var b=a.prototype.seekable;a.prototype.seekable=function(){return this.sourceHandler_&&this.sourceHandler_.seekable?this.sourceHandler_.seekable():b.call(this)},a.prototype.setSource=function(b){var c=a.selectSourceHandler(b);return c||(a.nativeSourceHandler?c=a.nativeSourceHandler:q["default"].error("No source hander found for the current source.")),this.disposeSourceHandler(),this.off("dispose",this.disposeSourceHandler),this.currentSource_=b,this.sourceHandler_=c.handleSource(b,this),this.on("dispose",this.disposeSourceHandler),this},a.prototype.disposeSourceHandler=function(){this.sourceHandler_&&this.sourceHandler_.dispose&&this.sourceHandler_.dispose()}},i["default"].registerComponent("Tech",z),i["default"].registerComponent("MediaTechController",z),c["default"]=z,b.exports=c["default"]},{"../component":58,"../media-error.js":94,"../tracks/text-track":114,"../tracks/text-track-list":112,"../utils/buffer.js":116,"../utils/fn.js":120,"../utils/log.js":123,"../utils/time-ranges.js":126,"global/document":1,"global/window":2}],108:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}c.__esModule=!0;var f=a("../utils/browser.js"),g=e(f),h=a("global/document"),i=d(h),j=function k(a){var b=this;if(g.IS_IE8){b=i["default"].createElement("custom");for(var c in k.prototype)b[c]=k.prototype[c]}return k.prototype.setCues_.call(b,a),Object.defineProperty(b,"length",{get:function(){return this.length_}}),g.IS_IE8?b:void 0};j.prototype.setCues_=function(a){var b=this.length||0,c=0,d=a.length;this.cues_=a,this.length_=a.length;var e=function(a){""+a in this||Object.defineProperty(this,""+a,{get:function(){return this.cues_[a]}})};if(d>b)for(c=b;d>c;c++)e.call(this,c)},j.prototype.getCueById=function(a){for(var b=null,c=0,d=this.length;d>c;c++){var e=this[c];if(e.id===a){b=e;break}}return b},c["default"]=j,b.exports=c["default"]},{"../utils/browser.js":115,"global/document":1}],109:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}function h(a,b){return"rgba("+parseInt(a[1]+a[1],16)+","+parseInt(a[2]+a[2],16)+","+parseInt(a[3]+a[3],16)+","+b+")"}function i(a,b,c){try{a.style[b]=c}catch(d){}}c.__esModule=!0;var j=a("../component"),k=e(j),l=a("../menu/menu.js"),m=(e(l),a("../menu/menu-item.js")),n=(e(m),a("../menu/menu-button.js")),o=(e(n),a("../utils/fn.js")),p=d(o),q=a("global/document"),r=(e(q),a("global/window")),s=e(r),t="#222",u="#ccc",v={monospace:"monospace",sansSerif:"sans-serif",serif:"serif",monospaceSansSerif:'"Andale Mono", "Lucida Console", monospace',monospaceSerif:'"Courier New", monospace',proportionalSansSerif:"sans-serif",proportionalSerif:"serif",casual:'"Comic Sans MS", Impact, fantasy',script:'"Monotype Corsiva", cursive',smallcaps:'"Andale Mono", "Lucida Console", monospace, sans-serif'},w=function(a){function b(c,d,e){f(this,b),a.call(this,c,d,e),c.on("loadstart",p.bind(this,this.toggleDisplay)),c.on("texttrackchange",p.bind(this,this.updateDisplay)),c.ready(p.bind(this,function(){if(c.tech_&&c.tech_.featuresNativeTextTracks)return void this.hide();c.on("fullscreenchange",p.bind(this,this.updateDisplay));for(var a=this.options_.playerOptions.tracks||[],b=0;b<a.length;b++){var d=a[b];this.player_.addRemoteTextTrack(d)}}))}return g(b,a),b.prototype.toggleDisplay=function(){this.player_.tech_&&this.player_.tech_.featuresNativeTextTracks?this.hide():this.show()},b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-text-track-display"})},b.prototype.clearDisplay=function(){"function"==typeof s["default"].WebVTT&&s["default"].WebVTT.processCues(s["default"],[],this.el_)},b.prototype.updateDisplay=function(){var a=this.player_.textTracks();if(this.clearDisplay(),a)for(var b=0;b<a.length;b++){var c=a[b];"showing"===c.mode&&this.updateForTrack(c)}},b.prototype.updateForTrack=function(a){if("function"==typeof s["default"].WebVTT&&a.activeCues){for(var b=this.player_.textTrackSettings.getValues(),c=[],d=0;d<a.activeCues.length;d++)c.push(a.activeCues[d]);s["default"].WebVTT.processCues(s["default"],a.activeCues,this.el_);for(var e=c.length;e--;){var f=c[e].displayState;if(b.color&&(f.firstChild.style.color=b.color),b.textOpacity&&i(f.firstChild,"color",h(b.color||"#fff",b.textOpacity)),b.backgroundColor&&(f.firstChild.style.backgroundColor=b.backgroundColor),b.backgroundOpacity&&i(f.firstChild,"backgroundColor",h(b.backgroundColor||"#000",b.backgroundOpacity)),b.windowColor&&(b.windowOpacity?i(f,"backgroundColor",h(b.windowColor,b.windowOpacity)):f.style.backgroundColor=b.windowColor),b.edgeStyle&&("dropshadow"===b.edgeStyle?f.firstChild.style.textShadow="2px 2px 3px "+t+", 2px 2px 4px "+t+", 2px 2px 5px "+t:"raised"===b.edgeStyle?f.firstChild.style.textShadow="1px 1px "+t+", 2px 2px "+t+", 3px 3px "+t:"depressed"===b.edgeStyle?f.firstChild.style.textShadow="1px 1px "+u+", 0 1px "+u+", -1px -1px "+t+", 0 -1px "+t:"uniform"===b.edgeStyle&&(f.firstChild.style.textShadow="0 0 4px "+t+", 0 0 4px "+t+", 0 0 4px "+t+", 0 0 4px "+t)),b.fontPercent&&1!==b.fontPercent){var g=s["default"].parseFloat(f.style.fontSize);f.style.fontSize=g*b.fontPercent+"px",f.style.height="auto",f.style.top="auto",f.style.bottom="2px"}b.fontFamily&&"default"!==b.fontFamily&&("small-caps"===b.fontFamily?f.firstChild.style.fontVariant="small-caps":f.firstChild.style.fontFamily=v[b.fontFamily])}}},b}(k["default"]);k["default"].registerComponent("TextTrackDisplay",w),c["default"]=w,b.exports=c["default"]},{"../component":58,"../menu/menu-button.js":95,"../menu/menu-item.js":96,"../menu/menu.js":97,"../utils/fn.js":120,"global/document":1,"global/window":2}],110:[function(a,b,c){"use strict";c.__esModule=!0;var d={disabled:"disabled",hidden:"hidden",showing:"showing"},e={subtitles:"subtitles",captions:"captions",descriptions:"descriptions",chapters:"chapters",metadata:"metadata"};c.TextTrackMode=d,c.TextTrackKind=e},{}],111:[function(a,b,c){"use strict";c.__esModule=!0;var d=function(a){return{kind:a.kind,label:a.label,language:a.language,id:a.id,inBandMetadataTrackDispatchType:a.inBandMetadataTrackDispatchType,mode:a.mode,cues:a.cues&&Array.prototype.map.call(a.cues,function(a){return{startTime:a.startTime,endTime:a.endTime,text:a.text,id:a.id}}),src:a.src}},e=function(a){var b=a.el().querySelectorAll("track"),c=Array.prototype.map.call(b,function(a){return a.track}),e=Array.prototype.map.call(b,function(a){var b=d(a.track);return b.src=a.src,b});return e.concat(Array.prototype.filter.call(a.textTracks(),function(a){return-1===c.indexOf(a)}).map(d))},f=function(a,b){return a.forEach(function(a){var c=b.addRemoteTextTrack(a).track;!a.src&&a.cues&&a.cues.forEach(function(a){return c.addCue(a)})}),b.textTracks()};c["default"]={textTracksToJson:e,jsonToTextTracks:f,trackToJson_:d},b.exports=c["default"]},{}],112:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var f=a("../event-target"),g=e(f),h=a("../utils/fn.js"),i=d(h),j=a("../utils/browser.js"),k=d(j),l=a("global/document"),m=e(l),n=function p(a){var b=this;if(k.IS_IE8){b=m["default"].createElement("custom");for(var c in p.prototype)b[c]=p.prototype[c]}a=a||[],b.tracks_=[],Object.defineProperty(b,"length",{get:function(){return this.tracks_.length}});for(var d=0;d<a.length;d++)b.addTrack_(a[d]);return k.IS_IE8?b:void 0};n.prototype=Object.create(g["default"].prototype),n.prototype.constructor=n,n.prototype.allowedEvents_={change:"change",addtrack:"addtrack",removetrack:"removetrack"};for(var o in n.prototype.allowedEvents_)n.prototype["on"+o]=null;n.prototype.addTrack_=function(a){var b=this.tracks_.length;""+b in this||Object.defineProperty(this,b,{get:function(){return this.tracks_[b]}}),a.addEventListener("modechange",i.bind(this,function(){this.trigger("change")})),this.tracks_.push(a),this.trigger({type:"addtrack",track:a})},n.prototype.removeTrack_=function(a){for(var b=void 0,c=0,d=this.length;d>c;c++)if(b=this[c],b===a){this.tracks_.splice(c,1);break}this.trigger({type:"removetrack",track:b})},n.prototype.getTrackById=function(a){for(var b=null,c=0,d=this.length;d>c;c++){var e=this[c];if(e.id===a){b=e;break}}return b},c["default"]=n,b.exports=c["default"]},{"../event-target":90,"../utils/browser.js":115,"../utils/fn.js":120,"global/document":1}],113:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}function h(a){var b=void 0;return a.selectedOptions?b=a.selectedOptions[0]:a.options&&(b=a.options[a.options.selectedIndex]),b.value}function i(a,b){if(b){var c=void 0;for(c=0;c<a.options.length;c++){var d=a.options[c];if(d.value===b)break}a.selectedIndex=c}}function j(){var a='<div class="vjs-tracksettings">\n      <div class="vjs-tracksettings-colors">\n        <div class="vjs-fg-color vjs-tracksetting">\n            <label class="vjs-label">Foreground</label>\n            <select>\n              <option value="">---</option>\n              <option value="#FFF">White</option>\n              <option value="#000">Black</option>\n              <option value="#F00">Red</option>\n              <option value="#0F0">Green</option>\n              <option value="#00F">Blue</option>\n              <option value="#FF0">Yellow</option>\n              <option value="#F0F">Magenta</option>\n              <option value="#0FF">Cyan</option>\n            </select>\n            <span class="vjs-text-opacity vjs-opacity">\n              <select>\n                <option value="">---</option>\n                <option value="1">Opaque</option>\n                <option value="0.5">Semi-Opaque</option>\n              </select>\n            </span>\n        </div> <!-- vjs-fg-color -->\n        <div class="vjs-bg-color vjs-tracksetting">\n            <label class="vjs-label">Background</label>\n            <select>\n              <option value="">---</option>\n              <option value="#FFF">White</option>\n              <option value="#000">Black</option>\n              <option value="#F00">Red</option>\n              <option value="#0F0">Green</option>\n              <option value="#00F">Blue</option>\n              <option value="#FF0">Yellow</option>\n              <option value="#F0F">Magenta</option>\n              <option value="#0FF">Cyan</option>\n            </select>\n            <span class="vjs-bg-opacity vjs-opacity">\n                <select>\n                  <option value="">---</option>\n                  <option value="1">Opaque</option>\n                  <option value="0.5">Semi-Transparent</option>\n                  <option value="0">Transparent</option>\n                </select>\n            </span>\n        </div> <!-- vjs-bg-color -->\n        <div class="window-color vjs-tracksetting">\n            <label class="vjs-label">Window</label>\n            <select>\n              <option value="">---</option>\n              <option value="#FFF">White</option>\n              <option value="#000">Black</option>\n              <option value="#F00">Red</option>\n              <option value="#0F0">Green</option>\n              <option value="#00F">Blue</option>\n              <option value="#FF0">Yellow</option>\n              <option value="#F0F">Magenta</option>\n              <option value="#0FF">Cyan</option>\n            </select>\n            <span class="vjs-window-opacity vjs-opacity">\n                <select>\n                  <option value="">---</option>\n                  <option value="1">Opaque</option>\n                  <option value="0.5">Semi-Transparent</option>\n                  <option value="0">Transparent</option>\n                </select>\n            </span>\n        </div> <!-- vjs-window-color -->\n      </div> <!-- vjs-tracksettings -->\n      <div class="vjs-tracksettings-font">\n        <div class="vjs-font-percent vjs-tracksetting">\n          <label class="vjs-label">Font Size</label>\n          <select>\n            <option value="0.50">50%</option>\n            <option value="0.75">75%</option>\n            <option value="1.00" selected>100%</option>\n            <option value="1.25">125%</option>\n            <option value="1.50">150%</option>\n            <option value="1.75">175%</option>\n            <option value="2.00">200%</option>\n            <option value="3.00">300%</option>\n            <option value="4.00">400%</option>\n          </select>\n        </div> <!-- vjs-font-percent -->\n        <div class="vjs-edge-style vjs-tracksetting">\n          <label class="vjs-label">Text Edge Style</label>\n          <select>\n            <option value="none">None</option>\n            <option value="raised">Raised</option>\n            <option value="depressed">Depressed</option>\n            <option value="uniform">Uniform</option>\n            <option value="dropshadow">Dropshadow</option>\n          </select>\n        </div> <!-- vjs-edge-style -->\n        <div class="vjs-font-family vjs-tracksetting">\n          <label class="vjs-label">Font Family</label>\n          <select>\n            <option value="">Default</option>\n            <option value="monospaceSerif">Monospace Serif</option>\n            <option value="proportionalSerif">Proportional Serif</option>\n            <option value="monospaceSansSerif">Monospace Sans-Serif</option>\n            <option value="proportionalSansSerif">Proportional Sans-Serif</option>\n            <option value="casual">Casual</option>\n            <option value="script">Script</option>\n            <option value="small-caps">Small Caps</option>\n          </select>\n        </div> <!-- vjs-font-family -->\n      </div>\n    </div>\n    <div class="vjs-tracksettings-controls">\n      <button class="vjs-default-button">Defaults</button>\n      <button class="vjs-done-button">Done</button>\n    </div>';return a}c.__esModule=!0;var k=a("../component"),l=e(k),m=a("../utils/events.js"),n=d(m),o=a("../utils/fn.js"),p=d(o),q=a("../utils/log.js"),r=e(q),s=a("safe-json-parse/tuple"),t=e(s),u=a("global/window"),v=e(u),w=function(a){function b(c,d){f(this,b),a.call(this,c,d),this.hide(),void 0===d.persistTextTrackSettings&&(this.options_.persistTextTrackSettings=this.options_.playerOptions.persistTextTrackSettings),n.on(this.el().querySelector(".vjs-done-button"),"click",p.bind(this,function(){this.saveSettings(),this.hide()})),n.on(this.el().querySelector(".vjs-default-button"),"click",p.bind(this,function(){this.el().querySelector(".vjs-fg-color > select").selectedIndex=0,this.el().querySelector(".vjs-bg-color > select").selectedIndex=0,this.el().querySelector(".window-color > select").selectedIndex=0,this.el().querySelector(".vjs-text-opacity > select").selectedIndex=0,this.el().querySelector(".vjs-bg-opacity > select").selectedIndex=0,this.el().querySelector(".vjs-window-opacity > select").selectedIndex=0,this.el().querySelector(".vjs-edge-style select").selectedIndex=0,this.el().querySelector(".vjs-font-family select").selectedIndex=0,this.el().querySelector(".vjs-font-percent select").selectedIndex=2,this.updateDisplay()})),n.on(this.el().querySelector(".vjs-fg-color > select"),"change",p.bind(this,this.updateDisplay)),n.on(this.el().querySelector(".vjs-bg-color > select"),"change",p.bind(this,this.updateDisplay)),n.on(this.el().querySelector(".window-color > select"),"change",p.bind(this,this.updateDisplay)),n.on(this.el().querySelector(".vjs-text-opacity > select"),"change",p.bind(this,this.updateDisplay)),n.on(this.el().querySelector(".vjs-bg-opacity > select"),"change",p.bind(this,this.updateDisplay)),n.on(this.el().querySelector(".vjs-window-opacity > select"),"change",p.bind(this,this.updateDisplay)),n.on(this.el().querySelector(".vjs-font-percent select"),"change",p.bind(this,this.updateDisplay)),n.on(this.el().querySelector(".vjs-edge-style select"),"change",p.bind(this,this.updateDisplay)),n.on(this.el().querySelector(".vjs-font-family select"),"change",p.bind(this,this.updateDisplay)),this.options_.persistTextTrackSettings&&this.restoreSettings()}return g(b,a),b.prototype.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-caption-settings vjs-modal-overlay",innerHTML:j()})},b.prototype.getValues=function(){var a=this.el(),b=h(a.querySelector(".vjs-edge-style select")),c=h(a.querySelector(".vjs-font-family select")),d=h(a.querySelector(".vjs-fg-color > select")),e=h(a.querySelector(".vjs-text-opacity > select")),f=h(a.querySelector(".vjs-bg-color > select")),g=h(a.querySelector(".vjs-bg-opacity > select")),i=h(a.querySelector(".window-color > select")),j=h(a.querySelector(".vjs-window-opacity > select")),k=v["default"].parseFloat(h(a.querySelector(".vjs-font-percent > select"))),l={backgroundOpacity:g,textOpacity:e,windowOpacity:j,edgeStyle:b,fontFamily:c,color:d,backgroundColor:f,windowColor:i,fontPercent:k};for(var m in l)(""===l[m]||"none"===l[m]||"fontPercent"===m&&1===l[m])&&delete l[m];return l},b.prototype.setValues=function(a){var b=this.el();i(b.querySelector(".vjs-edge-style select"),a.edgeStyle),i(b.querySelector(".vjs-font-family select"),a.fontFamily),i(b.querySelector(".vjs-fg-color > select"),a.color),i(b.querySelector(".vjs-text-opacity > select"),a.textOpacity),i(b.querySelector(".vjs-bg-color > select"),a.backgroundColor),i(b.querySelector(".vjs-bg-opacity > select"),a.backgroundOpacity),i(b.querySelector(".window-color > select"),a.windowColor),i(b.querySelector(".vjs-window-opacity > select"),a.windowOpacity);var c=a.fontPercent;c&&(c=c.toFixed(2)),i(b.querySelector(".vjs-font-percent > select"),c)},b.prototype.restoreSettings=function(){var a=t["default"](v["default"].localStorage.getItem("vjs-text-track-settings")),b=a[0],c=a[1];b&&r["default"].error(b),c&&this.setValues(c)},b.prototype.saveSettings=function(){if(this.options_.persistTextTrackSettings){var a=this.getValues();try{Object.getOwnPropertyNames(a).length>0?v["default"].localStorage.setItem("vjs-text-track-settings",JSON.stringify(a)):v["default"].localStorage.removeItem("vjs-text-track-settings")}catch(b){}}},b.prototype.updateDisplay=function(){var a=this.player_.getChild("textTrackDisplay");a&&a.updateDisplay()},b}(l["default"]);l["default"].registerComponent("TextTrackSettings",w),c["default"]=w,b.exports=c["default"]},{"../component":58,"../utils/events.js":119,"../utils/fn.js":120,"../utils/log.js":123,"global/window":2,"safe-json-parse/tuple":48}],114:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var f=a("./text-track-cue-list"),g=e(f),h=a("../utils/fn.js"),i=d(h),j=a("../utils/guid.js"),k=d(j),l=a("../utils/browser.js"),m=d(l),n=a("./text-track-enums"),o=d(n),p=a("../utils/log.js"),q=e(p),r=a("../event-target"),s=e(r),t=a("global/document"),u=e(t),v=a("global/window"),w=e(v),x=a("../utils/url.js"),y=a("xhr"),z=e(y),A=function E(){var a=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];if(!a.tech)throw new Error("A tech was not provided.");var b=this;if(m.IS_IE8){b=u["default"].createElement("custom");for(var c in E.prototype)b[c]=E.prototype[c]}b.tech_=a.tech;var d=o.TextTrackMode[a.mode]||"disabled",e=o.TextTrackKind[a.kind]||"subtitles",f=a.label||"",h=a.language||a.srclang||"",j=a.id||"vjs_text_track_"+k.newGUID();("metadata"===e||"chapters"===e)&&(d="hidden"),b.cues_=[],b.activeCues_=[];var l=new g["default"](b.cues_),n=new g["default"](b.activeCues_),p=!1,q=i.bind(b,function(){this.activeCues,p&&(this.trigger("cuechange"),p=!1)});return"disabled"!==d&&b.tech_.on("timeupdate",q),Object.defineProperty(b,"kind",{get:function(){return e},set:Function.prototype}),Object.defineProperty(b,"label",{get:function(){return f},set:Function.prototype}),Object.defineProperty(b,"language",{get:function(){return h},set:Function.prototype}),Object.defineProperty(b,"id",{get:function(){return j},set:Function.prototype}),Object.defineProperty(b,"mode",{get:function(){return d},set:function(a){o.TextTrackMode[a]&&(d=a,"showing"===d&&this.tech_.on("timeupdate",q),this.trigger("modechange"))}}),Object.defineProperty(b,"cues",{get:function(){return this.loaded_?l:null},set:Function.prototype}),Object.defineProperty(b,"activeCues",{get:function(){if(!this.loaded_)return null;if(0===this.cues.length)return n;for(var a=this.tech_.currentTime(),b=[],c=0,d=this.cues.length;d>c;c++){var e=this.cues[c];e.startTime<=a&&e.endTime>=a?b.push(e):e.startTime===e.endTime&&e.startTime<=a&&e.startTime+.5>=a&&b.push(e)}if(p=!1,b.length!==this.activeCues_.length)p=!0;else for(var c=0;c<b.length;c++)-1===D.call(this.activeCues_,b[c])&&(p=!0);return this.activeCues_=b,n.setCues_(this.activeCues_),n},set:Function.prototype}),a.src?(b.src=a.src,C(a.src,b)):b.loaded_=!0,m.IS_IE8?b:void 0};A.prototype=Object.create(s["default"].prototype),A.prototype.constructor=A,A.prototype.allowedEvents_={cuechange:"cuechange"},A.prototype.addCue=function(a){var b=this.tech_.textTracks();if(b)for(var c=0;c<b.length;c++)b[c]!==this&&b[c].removeCue(a);this.cues_.push(a),this.cues.setCues_(this.cues_)},A.prototype.removeCue=function(a){for(var b=!1,c=0,d=this.cues_.length;d>c;c++){var e=this.cues_[c];e===a&&(this.cues_.splice(c,1),b=!0)}b&&this.cues.setCues_(this.cues_)};var B=function F(a,b){if("function"!=typeof w["default"].WebVTT)return w["default"].setTimeout(function(){F(a,b)},25);var c=new w["default"].WebVTT.Parser(w["default"],w["default"].vttjs,w["default"].WebVTT.StringDecoder());c.oncue=function(a){b.addCue(a)},c.onparsingerror=function(a){q["default"].error(a)},c.parse(a),c.flush()},C=function(a,b){var c={uri:a},d=x.isCrossOrigin(a);d&&(c.cors=d),z["default"](c,i.bind(this,function(a,c,d){return a?q["default"].error(a,c):(b.loaded_=!0,void B(d,b))}))},D=function(a,b){if(null==this)throw new TypeError('"this" is null or not defined');var c=Object(this),d=c.length>>>0;if(0===d)return-1;var e=+b||0;if(Math.abs(e)===1/0&&(e=0),e>=d)return-1;for(var f=Math.max(e>=0?e:d-Math.abs(e),0);d>f;){if(f in c&&c[f]===a)return f;f++}return-1};c["default"]=A,b.exports=c["default"]},{"../event-target":90,"../utils/browser.js":115,"../utils/fn.js":120,"../utils/guid.js":122,"../utils/log.js":123,"../utils/url.js":128,"./text-track-cue-list":108,"./text-track-enums":110,"global/document":1,"global/window":2,xhr:50}],115:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var e=a("global/document"),f=d(e),g=a("global/window"),h=d(g),i=h["default"].navigator.userAgent,j=/AppleWebKit\/([\d.]+)/i.exec(i),k=j?parseFloat(j.pop()):null,l=/iPhone/i.test(i);c.IS_IPHONE=l;var m=/iPad/i.test(i);c.IS_IPAD=m;var n=/iPod/i.test(i);c.IS_IPOD=n;var o=l||m||n;c.IS_IOS=o;var p=function(){var a=i.match(/OS (\d+)_/i);return a&&a[1]?a[1]:void 0}();c.IOS_VERSION=p;var q=/Android/i.test(i);c.IS_ANDROID=q;var r=function(){var a,b,c=i.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i);return c?(a=c[1]&&parseFloat(c[1]),b=c[2]&&parseFloat(c[2]),a&&b?parseFloat(c[1]+"."+c[2]):a?a:null):null}();c.ANDROID_VERSION=r;var s=q&&/webkit/i.test(i)&&2.3>r;c.IS_OLD_ANDROID=s;var t=q&&5>r&&537>k;c.IS_NATIVE_ANDROID=t;var u=/Firefox/i.test(i);c.IS_FIREFOX=u;var v=/Chrome/i.test(i);c.IS_CHROME=v;var w=/MSIE\s8\.0/.test(i);c.IS_IE8=w;var x=!!("ontouchstart"in h["default"]||h["default"].DocumentTouch&&f["default"]instanceof h["default"].DocumentTouch);c.TOUCH_ENABLED=x;var y="backgroundSize"in f["default"].createElement("video").style;c.BACKGROUND_SIZE_SUPPORTED=y},{"global/document":1,"global/window":2}],116:[function(a,b,c){"use strict";function d(a,b){var c,d,f=0;if(!b)return 0;a&&a.length||(a=e.createTimeRange(0,0));for(var g=0;g<a.length;g++)c=a.start(g),d=a.end(g),d>b&&(d=b),f+=d-c;return f/b}c.__esModule=!0,c.bufferedPercent=d;var e=a("./time-ranges.js")},{"./time-ranges.js":126}],117:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var e=a("./log.js"),f=d(e),g={get:function(a,b){return a[b]},set:function(a,b,c){return a[b]=c,!0}};c["default"]=function(a){var b=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];if("function"==typeof Proxy){var c=function(){var c={};return Object.keys(b).forEach(function(a){g.hasOwnProperty(a)&&(c[a]=function(){return f["default"].warn(b[a]),g[a].apply(this,arguments)})}),{v:new Proxy(a,c)}}();if("object"==typeof c)return c.v}return a},b.exports=c["default"]},{"./log.js":123}],118:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){return a.raw=b,a}function g(a){return 0===a.indexOf("#")&&(a=a.slice(1)),x["default"].getElementById(a)}function h(){var a=arguments.length<=0||void 0===arguments[0]?"div":arguments[0],b=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],c=arguments.length<=2||void 0===arguments[2]?{}:arguments[2],d=x["default"].createElement(a);return Object.getOwnPropertyNames(b).forEach(function(a){var c=b[a];-1!==a.indexOf("aria-")||"role"===a||"type"===a?(D["default"].warn(F["default"](v,a,c)),d.setAttribute(a,c)):d[a]=c}),Object.getOwnPropertyNames(c).forEach(function(a){c[a];d.setAttribute(a,c[a])}),d}function i(a,b){b.firstChild?b.insertBefore(a,b.firstChild):b.appendChild(a)}function j(a){var b=a[H];return b||(b=a[H]=B.newGUID()),G[b]||(G[b]={}),G[b]}function k(a){var b=a[H];return b?!!Object.getOwnPropertyNames(G[b]).length:!1}function l(a){var b=a[H];if(b){delete G[b];try{delete a[H]}catch(c){a.removeAttribute?a.removeAttribute(H):a[H]=null}}}function m(a,b){return-1!==(" "+a.className+" ").indexOf(" "+b+" ")}function n(a,b){m(a,b)||(a.className=""===a.className?b:a.className+" "+b)}function o(a,b){if(m(a,b)){for(var c=a.className.split(" "),d=c.length-1;d>=0;d--)c[d]===b&&c.splice(d,1);
 

	
 
a.className=c.join(" ")}}function p(a,b){Object.getOwnPropertyNames(b).forEach(function(c){var d=b[c];null===d||"undefined"==typeof d||d===!1?a.removeAttribute(c):a.setAttribute(c,d===!0?"":d)})}function q(a){var b,c,d,e,f;if(b={},c=",autoplay,controls,loop,muted,default,",a&&a.attributes&&a.attributes.length>0){d=a.attributes;for(var g=d.length-1;g>=0;g--)e=d[g].name,f=d[g].value,("boolean"==typeof a[e]||-1!==c.indexOf(","+e+","))&&(f=null!==f?!0:!1),b[e]=f}return b}function r(){x["default"].body.focus(),x["default"].onselectstart=function(){return!1}}function s(){x["default"].onselectstart=function(){return!0}}function t(a){var b=void 0;if(a.getBoundingClientRect&&a.parentNode&&(b=a.getBoundingClientRect()),!b)return{left:0,top:0};var c=x["default"].documentElement,d=x["default"].body,e=c.clientLeft||d.clientLeft||0,f=z["default"].pageXOffset||d.scrollLeft,g=b.left+f-e,h=c.clientTop||d.clientTop||0,i=z["default"].pageYOffset||d.scrollTop,j=b.top+i-h;return{left:Math.round(g),top:Math.round(j)}}function u(a,b){var c={},d=t(a),e=a.offsetWidth,f=a.offsetHeight,g=d.top,h=d.left,i=b.pageY,j=b.pageX;return b.changedTouches&&(j=b.changedTouches[0].pageX,i=b.changedTouches[0].pageY),c.y=Math.max(0,Math.min(1,(g-i+f)/f)),c.x=Math.max(0,Math.min(1,(j-h)/e)),c}c.__esModule=!0,c.getEl=g,c.createEl=h,c.insertElFirst=i,c.getElData=j,c.hasElData=k,c.removeElData=l,c.hasElClass=m,c.addElClass=n,c.removeElClass=o,c.setElAttributes=p,c.getElAttributes=q,c.blockTextSelection=r,c.unblockTextSelection=s,c.findElPosition=t,c.getPointerPosition=u;var v=f(["Setting attributes in the second argument of createEl()\n                has been deprecated. Use the third argument instead.\n                createEl(type, properties, attributes). Attempting to set "," to ","."],["Setting attributes in the second argument of createEl()\n                has been deprecated. Use the third argument instead.\n                createEl(type, properties, attributes). Attempting to set "," to ","."]),w=a("global/document"),x=e(w),y=a("global/window"),z=e(y),A=a("./guid.js"),B=d(A),C=a("./log.js"),D=e(C),E=a("tsml"),F=e(E),G={},H="vdata"+(new Date).getTime()},{"./guid.js":122,"./log.js":123,"global/document":1,"global/window":2,tsml:49}],119:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function f(a,b,c){if(Array.isArray(b))return l(f,a,b,c);var d=n.getElData(a);d.handlers||(d.handlers={}),d.handlers[b]||(d.handlers[b]=[]),c.guid||(c.guid=p.newGUID()),d.handlers[b].push(c),d.dispatcher||(d.disabled=!1,d.dispatcher=function(b,c){if(!d.disabled){b=j(b);var e=d.handlers[b.type];if(e)for(var f=e.slice(0),g=0,h=f.length;h>g&&!b.isImmediatePropagationStopped();g++)f[g].call(a,b,c)}}),1===d.handlers[b].length&&(a.addEventListener?a.addEventListener(b,d.dispatcher,!1):a.attachEvent&&a.attachEvent("on"+b,d.dispatcher))}function g(a,b,c){if(n.hasElData(a)){var d=n.getElData(a);if(d.handlers){if(Array.isArray(b))return l(g,a,b,c);var e=function(b){d.handlers[b]=[],k(a,b)};if(b){var f=d.handlers[b];if(f){if(!c)return void e(b);if(c.guid)for(var h=0;h<f.length;h++)f[h].guid===c.guid&&f.splice(h--,1);k(a,b)}}else for(var i in d.handlers)e(i)}}}function h(a,b,c){var d=n.hasElData(a)?n.getElData(a):{},e=a.parentNode||a.ownerDocument;if("string"==typeof b&&(b={type:b,target:a}),b=j(b),d.dispatcher&&d.dispatcher.call(a,b,c),e&&!b.isPropagationStopped()&&b.bubbles===!0)h.call(null,e,b,c);else if(!e&&!b.defaultPrevented){var f=n.getElData(b.target);b.target[b.type]&&(f.disabled=!0,"function"==typeof b.target[b.type]&&b.target[b.type](),f.disabled=!1)}return!b.defaultPrevented}function i(a,b,c){if(Array.isArray(b))return l(i,a,b,c);var d=function e(){g(a,b,e),c.apply(this,arguments)};d.guid=c.guid=c.guid||p.newGUID(),f(a,b,d)}function j(a){function b(){return!0}function c(){return!1}if(!a||!a.isPropagationStopped){var d=a||r["default"].event;a={};for(var e in d)"layerX"!==e&&"layerY"!==e&&"keyLocation"!==e&&"webkitMovementX"!==e&&"webkitMovementY"!==e&&("returnValue"===e&&d.preventDefault||(a[e]=d[e]));if(a.target||(a.target=a.srcElement||t["default"]),a.relatedTarget||(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement),a.preventDefault=function(){d.preventDefault&&d.preventDefault(),a.returnValue=!1,d.returnValue=!1,a.defaultPrevented=!0},a.defaultPrevented=!1,a.stopPropagation=function(){d.stopPropagation&&d.stopPropagation(),a.cancelBubble=!0,d.cancelBubble=!0,a.isPropagationStopped=b},a.isPropagationStopped=c,a.stopImmediatePropagation=function(){d.stopImmediatePropagation&&d.stopImmediatePropagation(),a.isImmediatePropagationStopped=b,a.stopPropagation()},a.isImmediatePropagationStopped=c,null!=a.clientX){var f=t["default"].documentElement,g=t["default"].body;a.pageX=a.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=a.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)}a.which=a.charCode||a.keyCode,null!=a.button&&(a.button=1&a.button?0:4&a.button?1:2&a.button?2:0)}return a}function k(a,b){var c=n.getElData(a);0===c.handlers[b].length&&(delete c.handlers[b],a.removeEventListener?a.removeEventListener(b,c.dispatcher,!1):a.detachEvent&&a.detachEvent("on"+b,c.dispatcher)),Object.getOwnPropertyNames(c.handlers).length<=0&&(delete c.handlers,delete c.dispatcher,delete c.disabled),0===Object.getOwnPropertyNames(c).length&&n.removeElData(a)}function l(a,b,c,d){c.forEach(function(c){a(b,c,d)})}c.__esModule=!0,c.on=f,c.off=g,c.trigger=h,c.one=i,c.fixEvent=j;var m=a("./dom.js"),n=e(m),o=a("./guid.js"),p=e(o),q=a("global/window"),r=d(q),s=a("global/document"),t=d(s)},{"./dom.js":118,"./guid.js":122,"global/document":1,"global/window":2}],120:[function(a,b,c){"use strict";c.__esModule=!0;var d=a("./guid.js"),e=function(a,b,c){b.guid||(b.guid=d.newGUID());var e=function(){return b.apply(a,arguments)};return e.guid=c?c+"_"+b.guid:b.guid,e};c.bind=e},{"./guid.js":122}],121:[function(a,b,c){"use strict";function d(a){var b=arguments.length<=1||void 0===arguments[1]?a:arguments[1];return function(){var c=Math.floor(a%60),d=Math.floor(a/60%60),e=Math.floor(a/3600),f=Math.floor(b/60%60),g=Math.floor(b/3600);return(isNaN(a)||a===1/0)&&(e=d=c="-"),e=e>0||g>0?e+":":"",d=((e||f>=10)&&10>d?"0"+d:d)+":",c=10>c?"0"+c:c,e+d+c}()}c.__esModule=!0,c["default"]=d,b.exports=c["default"]},{}],122:[function(a,b,c){"use strict";function d(){return e++}c.__esModule=!0,c.newGUID=d;var e=1},{}],123:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){var c=Array.prototype.slice.call(b),d=function(){},e=g["default"].console||{log:d,warn:d,error:d};a?c.unshift(a.toUpperCase()+":"):a="log",h.history.push(c),c.unshift("VIDEOJS:"),e[a].apply?e[a].apply(e,c):e[a](c.join(" "))}c.__esModule=!0;var f=a("global/window"),g=d(f),h=function(){e(null,arguments)};h.history=[],h.error=function(){e("error",arguments)},h.warn=function(){e("warn",arguments)},c["default"]=h,b.exports=c["default"]},{"global/window":2}],124:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a){return!!a&&"object"==typeof a&&"[object Object]"===a.toString()&&a.constructor===Object}function f(){var a=Array.prototype.slice.call(arguments);return a.unshift({}),a.push(i),h["default"].apply(null,a),a[0]}c.__esModule=!0,c["default"]=f;var g=a("lodash-compat/object/merge"),h=d(g),i=function(a,b){return e(b)?e(a)?void 0:f(b):b};b.exports=c["default"]},{"lodash-compat/object/merge":40}],125:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var e=a("global/document"),f=d(e),g=function(a){var b=f["default"].createElement("style");return b.className=a,b};c.createStyleElement=g;var h=function(a,b){a.styleSheet?a.styleSheet.cssText=b:a.textContent=b};c.setTextContent=h},{"global/document":1}],126:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){return Array.isArray(a)?f(a):void 0===a||void 0===b?f():f([[a,b]])}function f(a){return void 0===a||0===a.length?{length:0,start:function(){throw new Error("This TimeRanges object is empty")},end:function(){throw new Error("This TimeRanges object is empty")}}:{length:a.length,start:g.bind(null,"start",0,a),end:g.bind(null,"end",1,a)}}function g(a,b,c,d){return void 0===d&&(j["default"].warn("DEPRECATED: Function '"+a+"' on 'TimeRanges' called without an index argument."),d=0),h(a,d,c.length-1),c[d][b]}function h(a,b,c){if(0>b||b>c)throw new Error("Failed to execute '"+a+"' on 'TimeRanges': The index provided ("+b+") is greater than or equal to the maximum bound ("+c+").")}c.__esModule=!0,c.createTimeRanges=e;var i=a("./log.js"),j=d(i);c.createTimeRange=e},{"./log.js":123}],127:[function(a,b,c){"use strict";function d(a){return a.charAt(0).toUpperCase()+a.slice(1)}c.__esModule=!0,c["default"]=d,b.exports=c["default"]},{}],128:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}c.__esModule=!0;var e=a("global/document"),f=d(e),g=a("global/window"),h=d(g),i=function(a){var b=["protocol","hostname","port","pathname","search","hash","host"],c=f["default"].createElement("a");c.href=a;var d=""===c.host&&"file:"!==c.protocol,e=void 0;d&&(e=f["default"].createElement("div"),e.innerHTML='<a href="'+a+'"></a>',c=e.firstChild,e.setAttribute("style","display:none; position:absolute;"),f["default"].body.appendChild(e));for(var g={},h=0;h<b.length;h++)g[b[h]]=c[b[h]];return"http:"===g.protocol&&(g.host=g.host.replace(/:80$/,"")),"https:"===g.protocol&&(g.host=g.host.replace(/:443$/,"")),d&&f["default"].body.removeChild(e),g};c.parseUrl=i;var j=function(a){if(!a.match(/^https?:\/\//)){var b=f["default"].createElement("div");b.innerHTML='<a href="'+a+'">x</a>',a=b.firstChild.href}return a};c.getAbsoluteURL=j;var k=function(a){if("string"==typeof a){var b=/^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/\?]+)))(?:[\/]*|[\?].*)$/i,c=b.exec(a);if(c)return c.pop().toLowerCase()}return""};c.getFileExtension=k;var l=function(a){var b=i(a),c=h["default"].location,d=":"===b.protocol?c.protocol:b.protocol,e=d+b.host!==c.protocol+c.host;return e};c.isCrossOrigin=l},{"global/document":1,"global/window":2}],129:[function(b,c,d){"use strict";function e(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function f(a){return a&&a.__esModule?a:{"default":a}}d.__esModule=!0;{var g=b("global/document"),h=f(g),i=b("./setup"),j=e(i),k=b("./utils/stylesheet.js"),l=e(k),m=b("./component"),n=f(m),o=b("./event-target"),p=f(o),q=b("./utils/events.js"),r=e(q),s=b("./player"),t=f(s),u=b("./plugins.js"),v=f(u),w=b("../../src/js/utils/merge-options.js"),x=f(w),y=b("./utils/fn.js"),z=e(y),A=b("./tracks/text-track.js"),B=f(A),C=b("object.assign"),D=(f(C),b("./utils/time-ranges.js")),E=b("./utils/format-time.js"),F=f(E),G=b("./utils/log.js"),H=f(G),I=b("./utils/dom.js"),J=e(I),K=b("./utils/browser.js"),L=e(K),M=b("./utils/url.js"),N=e(M),O=b("./extend.js"),P=f(O),Q=b("lodash-compat/object/merge"),R=f(Q),S=b("./utils/create-deprecation-proxy.js"),T=f(S),U=b("xhr"),V=f(U),W=b("./tech/html5.js"),X=(f(W),b("./tech/flash.js"));f(X)}"undefined"==typeof HTMLVideoElement&&(h["default"].createElement("video"),h["default"].createElement("audio"),h["default"].createElement("track"));var Y=function _(a,b,c){var d;if("string"==typeof a){if(0===a.indexOf("#")&&(a=a.slice(1)),_.getPlayers()[a])return b&&H["default"].warn('Player "'+a+'" is already initialised. Options will not be applied.'),c&&_.getPlayers()[a].ready(c),_.getPlayers()[a];d=J.getEl(a)}else d=a;if(!d||!d.nodeName)throw new TypeError("The element or ID supplied is not valid. (videojs)");return d.player||new t["default"](d,b,c)},Z=h["default"].querySelector(".vjs-styles-defaults");if(!Z){Z=l.createStyleElement("vjs-styles-defaults");var $=h["default"].querySelector("head");$.insertBefore(Z,$.firstChild),l.setTextContent(Z,"\n    .video-js {\n      width: 300px;\n      height: 150px;\n    }\n\n    .vjs-fluid {\n      padding-top: 56.25%\n    }\n  ")}j.autoSetupTimeout(1,Y),Y.VERSION="5.0.0",Y.options=t["default"].prototype.options_,Y.getPlayers=function(){return t["default"].players},Y.players=T["default"](t["default"].players,{get:"Access to videojs.players is deprecated; use videojs.getPlayers instead",set:"Modification of videojs.players is deprecated"}),Y.getComponent=n["default"].getComponent,Y.registerComponent=n["default"].registerComponent,Y.browser=L,Y.TOUCH_ENABLED=L.TOUCH_ENABLED,Y.extend=P["default"],Y.mergeOptions=x["default"],Y.bind=z.bind,Y.plugin=v["default"],Y.addLanguage=function(a,b){var c;return a=(""+a).toLowerCase(),R["default"](Y.options.languages,(c={},c[a]=b,c))[a]},Y.log=H["default"],Y.createTimeRange=Y.createTimeRanges=D.createTimeRanges,Y.formatTime=F["default"],Y.parseUrl=N.parseUrl,Y.isCrossOrigin=N.isCrossOrigin,Y.EventTarget=p["default"],Y.on=r.on,Y.one=r.one,Y.off=r.off,Y.trigger=r.trigger,Y.xhr=V["default"],Y.TextTrack=B["default"],"function"==typeof a&&a.amd?a("videojs",[],function(){return Y}):"object"==typeof d&&"object"==typeof c&&(c.exports=Y),d["default"]=Y,c.exports=d["default"]},{"../../src/js/utils/merge-options.js":124,"./component":58,"./event-target":90,"./extend.js":91,"./player":98,"./plugins.js":99,"./setup":101,"./tech/flash.js":104,"./tech/html5.js":105,"./tracks/text-track.js":114,"./utils/browser.js":115,"./utils/create-deprecation-proxy.js":117,"./utils/dom.js":118,"./utils/events.js":119,"./utils/fn.js":120,"./utils/format-time.js":121,"./utils/log.js":123,"./utils/stylesheet.js":125,"./utils/time-ranges.js":126,"./utils/url.js":128,"global/document":1,"lodash-compat/object/merge":40,"object.assign":43,xhr:50}]},{},[129])(129)}),function(a){var b=a.vttjs={},c=b.VTTCue,d=b.VTTRegion,e=a.VTTCue,f=a.VTTRegion;b.shim=function(){b.VTTCue=c,b.VTTRegion=d},b.restore=function(){b.VTTCue=e,b.VTTRegion=f}}(this),function(a,b){function c(a){if("string"!=typeof a)return!1;var b=h[a.toLowerCase()];return b?a.toLowerCase():!1}function d(a){if("string"!=typeof a)return!1;var b=i[a.toLowerCase()];return b?a.toLowerCase():!1}function e(a){for(var b=1;b<arguments.length;b++){var c=arguments[b];for(var d in c)a[d]=c[d]}return a}function f(a,b,f){var h=this,i=/MSIE\s8\.0/.test(navigator.userAgent),j={};i?h=document.createElement("custom"):j.enumerable=!0,h.hasBeenReset=!1;var k="",l=!1,m=a,n=b,o=f,p=null,q="",r=!0,s="auto",t="start",u=50,v="middle",w=50,x="middle";return Object.defineProperty(h,"id",e({},j,{get:function(){return k},set:function(a){k=""+a}})),Object.defineProperty(h,"pauseOnExit",e({},j,{get:function(){return l},set:function(a){l=!!a}})),Object.defineProperty(h,"startTime",e({},j,{get:function(){return m},set:function(a){if("number"!=typeof a)throw new TypeError("Start time must be set to a number.");m=a,this.hasBeenReset=!0}})),Object.defineProperty(h,"endTime",e({},j,{get:function(){return n},set:function(a){if("number"!=typeof a)throw new TypeError("End time must be set to a number.");n=a,this.hasBeenReset=!0}})),Object.defineProperty(h,"text",e({},j,{get:function(){return o},set:function(a){o=""+a,this.hasBeenReset=!0}})),Object.defineProperty(h,"region",e({},j,{get:function(){return p},set:function(a){p=a,this.hasBeenReset=!0}})),Object.defineProperty(h,"vertical",e({},j,{get:function(){return q},set:function(a){var b=c(a);if(b===!1)throw new SyntaxError("An invalid or illegal string was specified.");q=b,this.hasBeenReset=!0}})),Object.defineProperty(h,"snapToLines",e({},j,{get:function(){return r},set:function(a){r=!!a,this.hasBeenReset=!0}})),Object.defineProperty(h,"line",e({},j,{get:function(){return s},set:function(a){if("number"!=typeof a&&a!==g)throw new SyntaxError("An invalid number or illegal string was specified.");s=a,this.hasBeenReset=!0}})),Object.defineProperty(h,"lineAlign",e({},j,{get:function(){return t},set:function(a){var b=d(a);if(!b)throw new SyntaxError("An invalid or illegal string was specified.");t=b,this.hasBeenReset=!0}})),Object.defineProperty(h,"position",e({},j,{get:function(){return u},set:function(a){if(0>a||a>100)throw new Error("Position must be between 0 and 100.");u=a,this.hasBeenReset=!0}})),Object.defineProperty(h,"positionAlign",e({},j,{get:function(){return v},set:function(a){var b=d(a);if(!b)throw new SyntaxError("An invalid or illegal string was specified.");v=b,this.hasBeenReset=!0}})),Object.defineProperty(h,"size",e({},j,{get:function(){return w},set:function(a){if(0>a||a>100)throw new Error("Size must be between 0 and 100.");w=a,this.hasBeenReset=!0}})),Object.defineProperty(h,"align",e({},j,{get:function(){return x},set:function(a){var b=d(a);if(!b)throw new SyntaxError("An invalid or illegal string was specified.");x=b,this.hasBeenReset=!0}})),h.displayState=void 0,i?h:void 0}var g="auto",h={"":!0,lr:!0,rl:!0},i={start:!0,middle:!0,end:!0,left:!0,right:!0};f.prototype.getCueAsHTML=function(){return WebVTT.convertCueToDOMTree(window,this.text)},a.VTTCue=a.VTTCue||f,b.VTTCue=f}(this,this.vttjs||{}),function(a,b){function c(a){if("string"!=typeof a)return!1;var b=f[a.toLowerCase()];return b?a.toLowerCase():!1}function d(a){return"number"==typeof a&&a>=0&&100>=a}function e(){var a=100,b=3,e=0,f=100,g=0,h=100,i="";Object.defineProperties(this,{width:{enumerable:!0,get:function(){return a},set:function(b){if(!d(b))throw new Error("Width must be between 0 and 100.");a=b}},lines:{enumerable:!0,get:function(){return b},set:function(a){if("number"!=typeof a)throw new TypeError("Lines must be set to a number.");b=a}},regionAnchorY:{enumerable:!0,get:function(){return f},set:function(a){if(!d(a))throw new Error("RegionAnchorX must be between 0 and 100.");f=a}},regionAnchorX:{enumerable:!0,get:function(){return e},set:function(a){if(!d(a))throw new Error("RegionAnchorY must be between 0 and 100.");e=a}},viewportAnchorY:{enumerable:!0,get:function(){return h},set:function(a){if(!d(a))throw new Error("ViewportAnchorY must be between 0 and 100.");h=a}},viewportAnchorX:{enumerable:!0,get:function(){return g},set:function(a){if(!d(a))throw new Error("ViewportAnchorX must be between 0 and 100.");g=a}},scroll:{enumerable:!0,get:function(){return i},set:function(a){var b=c(a);if(b===!1)throw new SyntaxError("An invalid or illegal string was specified.");i=b}}})}var f={"":!0,up:!0};a.VTTRegion=a.VTTRegion||e,b.VTTRegion=e}(this,this.vttjs||{}),function(a){function b(a,b){this.name="ParsingError",this.code=a.code,this.message=b||a.message}function c(a){function b(a,b,c,d){return 3600*(0|a)+60*(0|b)+(0|c)+(0|d)/1e3}var c=a.match(/^(\d+):(\d{2})(:\d{2})?\.(\d{3})/);return c?c[3]?b(c[1],c[2],c[3].replace(":",""),c[4]):c[1]>59?b(c[1],c[2],0,c[4]):b(0,c[1],c[2],c[4]):null}function d(){this.values=o(null)}function e(a,b,c,d){var e=d?a.split(d):[a];for(var f in e)if("string"==typeof e[f]){var g=e[f].split(c);if(2===g.length){var h=g[0],i=g[1];b(h,i)}}}function f(a,f,g){function h(){var d=c(a);if(null===d)throw new b(b.Errors.BadTimeStamp,"Malformed timestamp: "+k);return a=a.replace(/^[^\sa-zA-Z-]+/,""),d}function i(a,b){var c=new d;e(a,function(a,b){switch(a){case"region":for(var d=g.length-1;d>=0;d--)if(g[d].id===b){c.set(a,g[d].region);break}break;case"vertical":c.alt(a,b,["rl","lr"]);break;case"line":var e=b.split(","),f=e[0];c.integer(a,f),c.percent(a,f)?c.set("snapToLines",!1):null,c.alt(a,f,["auto"]),2===e.length&&c.alt("lineAlign",e[1],["start","middle","end"]);break;case"position":e=b.split(","),c.percent(a,e[0]),2===e.length&&c.alt("positionAlign",e[1],["start","middle","end"]);break;case"size":c.percent(a,b);break;case"align":c.alt(a,b,["start","middle","end","left","right"])}},/:/,/\s/),b.region=c.get("region",null),b.vertical=c.get("vertical",""),b.line=c.get("line","auto"),b.lineAlign=c.get("lineAlign","start"),b.snapToLines=c.get("snapToLines",!0),b.size=c.get("size",100),b.align=c.get("align","middle"),b.position=c.get("position",{start:0,left:0,middle:50,end:100,right:100},b.align),b.positionAlign=c.get("positionAlign",{start:"start",left:"start",middle:"middle",end:"end",right:"end"},b.align)}function j(){a=a.replace(/^\s+/,"")}var k=a;if(j(),f.startTime=h(),j(),"-->"!==a.substr(0,3))throw new b(b.Errors.BadTimeStamp,"Malformed time stamp (time stamps must be separated by '-->'): "+k);a=a.substr(3),j(),f.endTime=h(),j(),i(a,f)}function g(a,b){function d(){function a(a){return b=b.substr(a.length),a}if(!b)return null;var c=b.match(/^([^<]*)(<[^>]+>?)?/);return a(c[1]?c[1]:c[2])}function e(a){return p[a]}function f(a){for(;o=a.match(/&(amp|lt|gt|lrm|rlm|nbsp);/);)a=a.replace(o[0],e);return a}function g(a,b){return!s[b.localName]||s[b.localName]===a.localName}function h(b,c){var d=q[b];if(!d)return null;var e=a.document.createElement(d);e.localName=d;var f=r[b];return f&&c&&(e[f]=c.trim()),e}for(var i,j=a.document.createElement("div"),k=j,l=[];null!==(i=d());)if("<"!==i[0])k.appendChild(a.document.createTextNode(f(i)));else{if("/"===i[1]){l.length&&l[l.length-1]===i.substr(2).replace(">","")&&(l.pop(),k=k.parentNode);continue}var m,n=c(i.substr(1,i.length-2));if(n){m=a.document.createProcessingInstruction("timestamp",n),k.appendChild(m);continue}var o=i.match(/^<([^.\s/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/);if(!o)continue;if(m=h(o[1],o[3]),!m)continue;if(!g(k,m))continue;o[2]&&(m.className=o[2].substr(1).replace("."," ")),l.push(o[1]),k.appendChild(m),k=m}return j}function h(a){function b(a,b){for(var c=b.childNodes.length-1;c>=0;c--)a.push(b.childNodes[c])}function c(a){if(!a||!a.length)return null;var d=a.pop(),e=d.textContent||d.innerText;if(e){var f=e.match(/^.*(\n|\r)/);return f?(a.length=0,f[0]):e}return"ruby"===d.tagName?c(a):d.childNodes?(b(a,d),c(a)):void 0}var d,e=[],f="";if(!a||!a.childNodes)return"ltr";for(b(e,a);f=c(e);)for(var g=0;g<f.length;g++){d=f.charCodeAt(g);for(var h=0;h<t.length;h++)if(t[h]===d)return"rtl"}return"ltr"}function i(a){if("number"==typeof a.line&&(a.snapToLines||a.line>=0&&a.line<=100))return a.line;if(!a.track||!a.track.textTrackList||!a.track.textTrackList.mediaElement)return-1;for(var b=a.track,c=b.textTrackList,d=0,e=0;e<c.length&&c[e]!==b;e++)"showing"===c[e].mode&&d++;return-1*++d}function j(){}function k(a,b,c){var d=/MSIE\s8\.0/.test(navigator.userAgent),e="rgba(255, 255, 255, 1)",f="rgba(0, 0, 0, 0.8)";d&&(e="rgb(255, 255, 255)",f="rgb(0, 0, 0)"),j.call(this),this.cue=b,this.cueDiv=g(a,b.text);var i={color:e,backgroundColor:f,position:"relative",left:0,right:0,top:0,bottom:0,display:"inline"};d||(i.writingMode=""===b.vertical?"horizontal-tb":"lr"===b.vertical?"vertical-lr":"vertical-rl",i.unicodeBidi="plaintext"),this.applyStyles(i,this.cueDiv),this.div=a.document.createElement("div"),i={textAlign:"middle"===b.align?"center":b.align,font:c.font,whiteSpace:"pre-line",position:"absolute"},d||(i.direction=h(this.cueDiv),i.writingMode=""===b.vertical?"horizontal-tb":"lr"===b.vertical?"vertical-lr":"vertical-rl".stylesunicodeBidi="plaintext"),this.applyStyles(i),this.div.appendChild(this.cueDiv);var k=0;switch(b.positionAlign){case"start":k=b.position;break;case"middle":k=b.position-b.size/2;break;case"end":k=b.position-b.size}this.applyStyles(""===b.vertical?{left:this.formatStyle(k,"%"),width:this.formatStyle(b.size,"%")}:{top:this.formatStyle(k,"%"),height:this.formatStyle(b.size,"%")}),this.move=function(a){this.applyStyles({top:this.formatStyle(a.top,"px"),bottom:this.formatStyle(a.bottom,"px"),left:this.formatStyle(a.left,"px"),right:this.formatStyle(a.right,"px"),height:this.formatStyle(a.height,"px"),width:this.formatStyle(a.width,"px")})}}function l(a){var b,c,d,e,f=/MSIE\s8\.0/.test(navigator.userAgent);if(a.div){c=a.div.offsetHeight,d=a.div.offsetWidth,e=a.div.offsetTop;var g=(g=a.div.childNodes)&&(g=g[0])&&g.getClientRects&&g.getClientRects();a=a.div.getBoundingClientRect(),b=g?Math.max(g[0]&&g[0].height||0,a.height/g.length):0}this.left=a.left,this.right=a.right,this.top=a.top||e,this.height=a.height||c,this.bottom=a.bottom||e+(a.height||c),this.width=a.width||d,this.lineHeight=void 0!==b?b:a.lineHeight,f&&!this.lineHeight&&(this.lineHeight=13)}function m(a,b,c,d){function e(a,b){for(var e,f=new l(a),g=1,h=0;h<b.length;h++){for(;a.overlapsOppositeAxis(c,b[h])||a.within(c)&&a.overlapsAny(d);)a.move(b[h]);if(a.within(c))return a;var i=a.intersectPercentage(c);g>i&&(e=new l(a),g=i),a=new l(f)}return e||f}var f=new l(b),g=b.cue,h=i(g),j=[];if(g.snapToLines){var k;switch(g.vertical){case"":j=["+y","-y"],k="height";break;case"rl":j=["+x","-x"],k="width";break;case"lr":j=["-x","+x"],k="width"}var m=f.lineHeight,n=m*Math.round(h),o=c[k]+m,p=j[0];Math.abs(n)>o&&(n=0>n?-1:1,n*=Math.ceil(o/m)*m),0>h&&(n+=""===g.vertical?c.height:c.width,j=j.reverse()),f.move(p,n)}else{var q=f.lineHeight/c.height*100;switch(g.lineAlign){case"middle":h-=q/2;break;case"end":h-=q}switch(g.vertical){case"":b.applyStyles({top:b.formatStyle(h,"%")});break;case"rl":b.applyStyles({left:b.formatStyle(h,"%")});break;case"lr":b.applyStyles({right:b.formatStyle(h,"%")})}j=["+y","-x","+x","-y"],f=new l(b)}var r=e(f,j);b.move(r.toCSSCompatValues(c))}function n(){}var o=Object.create||function(){function a(){}return function(b){if(1!==arguments.length)throw new Error("Object.create shim only accepts one parameter.");return a.prototype=b,new a}}();b.prototype=o(Error.prototype),b.prototype.constructor=b,b.Errors={BadSignature:{code:0,message:"Malformed WebVTT signature."},BadTimeStamp:{code:1,message:"Malformed time stamp."}},d.prototype={set:function(a,b){this.get(a)||""===b||(this.values[a]=b)},get:function(a,b,c){return c?this.has(a)?this.values[a]:b[c]:this.has(a)?this.values[a]:b},has:function(a){return a in this.values},alt:function(a,b,c){for(var d=0;d<c.length;++d)if(b===c[d]){this.set(a,b);break}},integer:function(a,b){/^-?\d+$/.test(b)&&this.set(a,parseInt(b,10))},percent:function(a,b){var c;return(c=b.match(/^([\d]{1,3})(\.[\d]*)?%$/))&&(b=parseFloat(b),b>=0&&100>=b)?(this.set(a,b),!0):!1}};var p={"&amp;":"&","&lt;":"<","&gt;":">","&lrm;":"‎","&rlm;":"‏","&nbsp;":" "},q={c:"span",i:"i",b:"b",u:"u",ruby:"ruby",rt:"rt",v:"span",lang:"span"},r={v:"title",lang:"lang"},s={rt:"ruby"},t=[1470,1472,1475,1478,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1520,1521,1522,1523,1524,1544,1547,1549,1563,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1645,1646,1647,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1765,1766,1774,1775,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1807,1808,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1969,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2e3,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2036,2037,2042,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2074,2084,2088,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2142,2208,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,8207,64285,64287,64288,64289,64290,64291,64292,64293,64294,64295,64296,64298,64299,64300,64301,64302,64303,64304,64305,64306,64307,64308,64309,64310,64312,64313,64314,64315,64316,64318,64320,64321,64323,64324,64326,64327,64328,64329,64330,64331,64332,64333,64334,64335,64336,64337,64338,64339,64340,64341,64342,64343,64344,64345,64346,64347,64348,64349,64350,64351,64352,64353,64354,64355,64356,64357,64358,64359,64360,64361,64362,64363,64364,64365,64366,64367,64368,64369,64370,64371,64372,64373,64374,64375,64376,64377,64378,64379,64380,64381,64382,64383,64384,64385,64386,64387,64388,64389,64390,64391,64392,64393,64394,64395,64396,64397,64398,64399,64400,64401,64402,64403,64404,64405,64406,64407,64408,64409,64410,64411,64412,64413,64414,64415,64416,64417,64418,64419,64420,64421,64422,64423,64424,64425,64426,64427,64428,64429,64430,64431,64432,64433,64434,64435,64436,64437,64438,64439,64440,64441,64442,64443,64444,64445,64446,64447,64448,64449,64467,64468,64469,64470,64471,64472,64473,64474,64475,64476,64477,64478,64479,64480,64481,64482,64483,64484,64485,64486,64487,64488,64489,64490,64491,64492,64493,64494,64495,64496,64497,64498,64499,64500,64501,64502,64503,64504,64505,64506,64507,64508,64509,64510,64511,64512,64513,64514,64515,64516,64517,64518,64519,64520,64521,64522,64523,64524,64525,64526,64527,64528,64529,64530,64531,64532,64533,64534,64535,64536,64537,64538,64539,64540,64541,64542,64543,64544,64545,64546,64547,64548,64549,64550,64551,64552,64553,64554,64555,64556,64557,64558,64559,64560,64561,64562,64563,64564,64565,64566,64567,64568,64569,64570,64571,64572,64573,64574,64575,64576,64577,64578,64579,64580,64581,64582,64583,64584,64585,64586,64587,64588,64589,64590,64591,64592,64593,64594,64595,64596,64597,64598,64599,64600,64601,64602,64603,64604,64605,64606,64607,64608,64609,64610,64611,64612,64613,64614,64615,64616,64617,64618,64619,64620,64621,64622,64623,64624,64625,64626,64627,64628,64629,64630,64631,64632,64633,64634,64635,64636,64637,64638,64639,64640,64641,64642,64643,64644,64645,64646,64647,64648,64649,64650,64651,64652,64653,64654,64655,64656,64657,64658,64659,64660,64661,64662,64663,64664,64665,64666,64667,64668,64669,64670,64671,64672,64673,64674,64675,64676,64677,64678,64679,64680,64681,64682,64683,64684,64685,64686,64687,64688,64689,64690,64691,64692,64693,64694,64695,64696,64697,64698,64699,64700,64701,64702,64703,64704,64705,64706,64707,64708,64709,64710,64711,64712,64713,64714,64715,64716,64717,64718,64719,64720,64721,64722,64723,64724,64725,64726,64727,64728,64729,64730,64731,64732,64733,64734,64735,64736,64737,64738,64739,64740,64741,64742,64743,64744,64745,64746,64747,64748,64749,64750,64751,64752,64753,64754,64755,64756,64757,64758,64759,64760,64761,64762,64763,64764,64765,64766,64767,64768,64769,64770,64771,64772,64773,64774,64775,64776,64777,64778,64779,64780,64781,64782,64783,64784,64785,64786,64787,64788,64789,64790,64791,64792,64793,64794,64795,64796,64797,64798,64799,64800,64801,64802,64803,64804,64805,64806,64807,64808,64809,64810,64811,64812,64813,64814,64815,64816,64817,64818,64819,64820,64821,64822,64823,64824,64825,64826,64827,64828,64829,64848,64849,64850,64851,64852,64853,64854,64855,64856,64857,64858,64859,64860,64861,64862,64863,64864,64865,64866,64867,64868,64869,64870,64871,64872,64873,64874,64875,64876,64877,64878,64879,64880,64881,64882,64883,64884,64885,64886,64887,64888,64889,64890,64891,64892,64893,64894,64895,64896,64897,64898,64899,64900,64901,64902,64903,64904,64905,64906,64907,64908,64909,64910,64911,64914,64915,64916,64917,64918,64919,64920,64921,64922,64923,64924,64925,64926,64927,64928,64929,64930,64931,64932,64933,64934,64935,64936,64937,64938,64939,64940,64941,64942,64943,64944,64945,64946,64947,64948,64949,64950,64951,64952,64953,64954,64955,64956,64957,64958,64959,64960,64961,64962,64963,64964,64965,64966,64967,65008,65009,65010,65011,65012,65013,65014,65015,65016,65017,65018,65019,65020,65136,65137,65138,65139,65140,65142,65143,65144,65145,65146,65147,65148,65149,65150,65151,65152,65153,65154,65155,65156,65157,65158,65159,65160,65161,65162,65163,65164,65165,65166,65167,65168,65169,65170,65171,65172,65173,65174,65175,65176,65177,65178,65179,65180,65181,65182,65183,65184,65185,65186,65187,65188,65189,65190,65191,65192,65193,65194,65195,65196,65197,65198,65199,65200,65201,65202,65203,65204,65205,65206,65207,65208,65209,65210,65211,65212,65213,65214,65215,65216,65217,65218,65219,65220,65221,65222,65223,65224,65225,65226,65227,65228,65229,65230,65231,65232,65233,65234,65235,65236,65237,65238,65239,65240,65241,65242,65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,65263,65264,65265,65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,67584,67585,67586,67587,67588,67589,67592,67594,67595,67596,67597,67598,67599,67600,67601,67602,67603,67604,67605,67606,67607,67608,67609,67610,67611,67612,67613,67614,67615,67616,67617,67618,67619,67620,67621,67622,67623,67624,67625,67626,67627,67628,67629,67630,67631,67632,67633,67634,67635,67636,67637,67639,67640,67644,67647,67648,67649,67650,67651,67652,67653,67654,67655,67656,67657,67658,67659,67660,67661,67662,67663,67664,67665,67666,67667,67668,67669,67671,67672,67673,67674,67675,67676,67677,67678,67679,67840,67841,67842,67843,67844,67845,67846,67847,67848,67849,67850,67851,67852,67853,67854,67855,67856,67857,67858,67859,67860,67861,67862,67863,67864,67865,67866,67867,67872,67873,67874,67875,67876,67877,67878,67879,67880,67881,67882,67883,67884,67885,67886,67887,67888,67889,67890,67891,67892,67893,67894,67895,67896,67897,67903,67968,67969,67970,67971,67972,67973,67974,67975,67976,67977,67978,67979,67980,67981,67982,67983,67984,67985,67986,67987,67988,67989,67990,67991,67992,67993,67994,67995,67996,67997,67998,67999,68e3,68001,68002,68003,68004,68005,68006,68007,68008,68009,68010,68011,68012,68013,68014,68015,68016,68017,68018,68019,68020,68021,68022,68023,68030,68031,68096,68112,68113,68114,68115,68117,68118,68119,68121,68122,68123,68124,68125,68126,68127,68128,68129,68130,68131,68132,68133,68134,68135,68136,68137,68138,68139,68140,68141,68142,68143,68144,68145,68146,68147,68160,68161,68162,68163,68164,68165,68166,68167,68176,68177,68178,68179,68180,68181,68182,68183,68184,68192,68193,68194,68195,68196,68197,68198,68199,68200,68201,68202,68203,68204,68205,68206,68207,68208,68209,68210,68211,68212,68213,68214,68215,68216,68217,68218,68219,68220,68221,68222,68223,68352,68353,68354,68355,68356,68357,68358,68359,68360,68361,68362,68363,68364,68365,68366,68367,68368,68369,68370,68371,68372,68373,68374,68375,68376,68377,68378,68379,68380,68381,68382,68383,68384,68385,68386,68387,68388,68389,68390,68391,68392,68393,68394,68395,68396,68397,68398,68399,68400,68401,68402,68403,68404,68405,68416,68417,68418,68419,68420,68421,68422,68423,68424,68425,68426,68427,68428,68429,68430,68431,68432,68433,68434,68435,68436,68437,68440,68441,68442,68443,68444,68445,68446,68447,68448,68449,68450,68451,68452,68453,68454,68455,68456,68457,68458,68459,68460,68461,68462,68463,68464,68465,68466,68472,68473,68474,68475,68476,68477,68478,68479,68608,68609,68610,68611,68612,68613,68614,68615,68616,68617,68618,68619,68620,68621,68622,68623,68624,68625,68626,68627,68628,68629,68630,68631,68632,68633,68634,68635,68636,68637,68638,68639,68640,68641,68642,68643,68644,68645,68646,68647,68648,68649,68650,68651,68652,68653,68654,68655,68656,68657,68658,68659,68660,68661,68662,68663,68664,68665,68666,68667,68668,68669,68670,68671,68672,68673,68674,68675,68676,68677,68678,68679,68680,126464,126465,126466,126467,126469,126470,126471,126472,126473,126474,126475,126476,126477,126478,126479,126480,126481,126482,126483,126484,126485,126486,126487,126488,126489,126490,126491,126492,126493,126494,126495,126497,126498,126500,126503,126505,126506,126507,126508,126509,126510,126511,126512,126513,126514,126516,126517,126518,126519,126521,126523,126530,126535,126537,126539,126541,126542,126543,126545,126546,126548,126551,126553,126555,126557,126559,126561,126562,126564,126567,126568,126569,126570,126572,126573,126574,126575,126576,126577,126578,126580,126581,126582,126583,126585,126586,126587,126588,126590,126592,126593,126594,126595,126596,126597,126598,126599,126600,126601,126603,126604,126605,126606,126607,126608,126609,126610,126611,126612,126613,126614,126615,126616,126617,126618,126619,126625,126626,126627,126629,126630,126631,126632,126633,126635,126636,126637,126638,126639,126640,126641,126642,126643,126644,126645,126646,126647,126648,126649,126650,126651,1114109];
 

	
 
j.prototype.applyStyles=function(a,b){b=b||this.div;for(var c in a)a.hasOwnProperty(c)&&(b.style[c]=a[c])},j.prototype.formatStyle=function(a,b){return 0===a?0:a+b},k.prototype=o(j.prototype),k.prototype.constructor=k,l.prototype.move=function(a,b){switch(b=void 0!==b?b:this.lineHeight,a){case"+x":this.left+=b,this.right+=b;break;case"-x":this.left-=b,this.right-=b;break;case"+y":this.top+=b,this.bottom+=b;break;case"-y":this.top-=b,this.bottom-=b}},l.prototype.overlaps=function(a){return this.left<a.right&&this.right>a.left&&this.top<a.bottom&&this.bottom>a.top},l.prototype.overlapsAny=function(a){for(var b=0;b<a.length;b++)if(this.overlaps(a[b]))return!0;return!1},l.prototype.within=function(a){return this.top>=a.top&&this.bottom<=a.bottom&&this.left>=a.left&&this.right<=a.right},l.prototype.overlapsOppositeAxis=function(a,b){switch(b){case"+x":return this.left<a.left;case"-x":return this.right>a.right;case"+y":return this.top<a.top;case"-y":return this.bottom>a.bottom}},l.prototype.intersectPercentage=function(a){var b=Math.max(0,Math.min(this.right,a.right)-Math.max(this.left,a.left)),c=Math.max(0,Math.min(this.bottom,a.bottom)-Math.max(this.top,a.top)),d=b*c;return d/(this.height*this.width)},l.prototype.toCSSCompatValues=function(a){return{top:this.top-a.top,bottom:a.bottom-this.bottom,left:this.left-a.left,right:a.right-this.right,height:this.height,width:this.width}},l.getSimpleBoxPosition=function(a){var b=a.div?a.div.offsetHeight:a.tagName?a.offsetHeight:0,c=a.div?a.div.offsetWidth:a.tagName?a.offsetWidth:0,d=a.div?a.div.offsetTop:a.tagName?a.offsetTop:0;a=a.div?a.div.getBoundingClientRect():a.tagName?a.getBoundingClientRect():a;var e={left:a.left,right:a.right,top:a.top||d,height:a.height||b,bottom:a.bottom||d+(a.height||b),width:a.width||c};return e},n.StringDecoder=function(){return{decode:function(a){if(!a)return"";if("string"!=typeof a)throw new Error("Error - expected string data.");return decodeURIComponent(encodeURIComponent(a))}}},n.convertCueToDOMTree=function(a,b){return a&&b?g(a,b):null};var u=.05,v="sans-serif",w="1.5%";n.processCues=function(a,b,c){function d(a){for(var b=0;b<a.length;b++)if(a[b].hasBeenReset||!a[b].displayState)return!0;return!1}if(!a||!b||!c)return null;for(;c.firstChild;)c.removeChild(c.firstChild);var e=a.document.createElement("div");if(e.style.position="absolute",e.style.left="0",e.style.right="0",e.style.top="0",e.style.bottom="0",e.style.margin=w,c.appendChild(e),d(b)){var f=[],g=l.getSimpleBoxPosition(e),h=Math.round(g.height*u*100)/100,i={font:h+"px "+v};!function(){for(var c,d,h=0;h<b.length;h++)d=b[h],c=new k(a,d,i),e.appendChild(c.div),m(a,c,g,f),d.displayState=c.div,f.push(l.getSimpleBoxPosition(c))}()}else for(var j=0;j<b.length;j++)e.appendChild(b[j].displayState)},n.Parser=function(a,b,c){c||(c=b,b={}),b||(b={}),this.window=a,this.vttjs=b,this.state="INITIAL",this.buffer="",this.decoder=c||new TextDecoder("utf8"),this.regionList=[]},n.Parser.prototype={reportOrThrowError:function(a){if(!(a instanceof b))throw a;this.onparsingerror&&this.onparsingerror(a)},parse:function(a){function c(){for(var a=i.buffer,b=0;b<a.length&&"\r"!==a[b]&&"\n"!==a[b];)++b;var c=a.substr(0,b);return"\r"===a[b]&&++b,"\n"===a[b]&&++b,i.buffer=a.substr(b),c}function g(a){var b=new d;if(e(a,function(a,c){switch(a){case"id":b.set(a,c);break;case"width":b.percent(a,c);break;case"lines":b.integer(a,c);break;case"regionanchor":case"viewportanchor":var e=c.split(",");if(2!==e.length)break;var f=new d;if(f.percent("x",e[0]),f.percent("y",e[1]),!f.has("x")||!f.has("y"))break;b.set(a+"X",f.get("x")),b.set(a+"Y",f.get("y"));break;case"scroll":b.alt(a,c,["up"])}},/=/,/\s/),b.has("id")){var c=new(i.vttjs.VTTRegion||i.window.VTTRegion);c.width=b.get("width",100),c.lines=b.get("lines",3),c.regionAnchorX=b.get("regionanchorX",0),c.regionAnchorY=b.get("regionanchorY",100),c.viewportAnchorX=b.get("viewportanchorX",0),c.viewportAnchorY=b.get("viewportanchorY",100),c.scroll=b.get("scroll",""),i.onregion&&i.onregion(c),i.regionList.push({id:b.get("id"),region:c})}}function h(a){e(a,function(a,b){switch(a){case"Region":g(b)}},/:/)}var i=this;a&&(i.buffer+=i.decoder.decode(a,{stream:!0}));try{var j;if("INITIAL"===i.state){if(!/\r\n|\n/.test(i.buffer))return this;j=c();var k=j.match(/^WEBVTT([ \t].*)?$/);if(!k||!k[0])throw new b(b.Errors.BadSignature);i.state="HEADER"}for(var l=!1;i.buffer;){if(!/\r\n|\n/.test(i.buffer))return this;switch(l?l=!1:j=c(),i.state){case"HEADER":/:/.test(j)?h(j):j||(i.state="ID");continue;case"NOTE":j||(i.state="ID");continue;case"ID":if(/^NOTE($|[ \t])/.test(j)){i.state="NOTE";break}if(!j)continue;if(i.cue=new(i.vttjs.VTTCue||i.window.VTTCue)(0,0,""),i.state="CUE",-1===j.indexOf("-->")){i.cue.id=j;continue}case"CUE":try{f(j,i.cue,i.regionList)}catch(m){i.reportOrThrowError(m),i.cue=null,i.state="BADCUE";continue}i.state="CUETEXT";continue;case"CUETEXT":var n=-1!==j.indexOf("-->");if(!j||n&&(l=!0)){i.oncue&&i.oncue(i.cue),i.cue=null,i.state="ID";continue}i.cue.text&&(i.cue.text+="\n"),i.cue.text+=j;continue;case"BADCUE":j||(i.state="ID");continue}}}catch(m){i.reportOrThrowError(m),"CUETEXT"===i.state&&i.cue&&i.oncue&&i.oncue(i.cue),i.cue=null,i.state="INITIAL"===i.state?"BADWEBVTT":"BADCUE"}return this},flush:function(){var a=this;try{if(a.buffer+=a.decoder.decode(),(a.cue||"HEADER"===a.state)&&(a.buffer+="\n\n",a.parse()),"INITIAL"===a.state)throw new b(b.Errors.BadSignature)}catch(c){a.reportOrThrowError(c)}return a.onflush&&a.onflush(),this}},a.WebVTT=n}(this,this.vttjs||{});
 
//# sourceMappingURL=video.min.js.map
 
\ No newline at end of file
ennstatus/static/js/video.js/dist/video.min.js.map
Show inline comments
 
new file 100644
 
{"version":3,"file":"video.min.js","sources":["node_modules/grunt-browserify/node_modules/browserify/node_modules/browser-pack/_prelude.js","node_modules/global/document.js","node_modules/global/window.js","node_modules/grunt-browserify/node_modules/browserify/node_modules/browser-resolve/empty.js","node_modules/lodash-compat/date/now.js","node_modules/lodash-compat/function/debounce.js","node_modules/lodash-compat/function/restParam.js","node_modules/lodash-compat/function/throttle.js","node_modules/lodash-compat/internal/arrayCopy.js","node_modules/lodash-compat/internal/arrayEach.js","node_modules/lodash-compat/internal/baseCopy.js","node_modules/lodash-compat/internal/baseFor.js","node_modules/lodash-compat/internal/baseForIn.js","node_modules/lodash-compat/internal/baseMerge.js","node_modules/lodash-compat/internal/baseMergeDeep.js","node_modules/lodash-compat/internal/baseProperty.js","node_modules/lodash-compat/internal/bindCallback.js","node_modules/lodash-compat/internal/createAssigner.js","node_modules/lodash-compat/internal/createBaseFor.js","node_modules/lodash-compat/internal/getLength.js","node_modules/lodash-compat/internal/getNative.js","node_modules/lodash-compat/internal/isArrayLike.js","node_modules/lodash-compat/internal/isHostObject.js","node_modules/lodash-compat/internal/isIndex.js","node_modules/lodash-compat/internal/isIterateeCall.js","node_modules/lodash-compat/internal/isLength.js","node_modules/lodash-compat/internal/isObjectLike.js","node_modules/lodash-compat/internal/shimKeys.js","node_modules/lodash-compat/internal/toObject.js","node_modules/lodash-compat/lang/isArguments.js","node_modules/lodash-compat/lang/isArray.js","node_modules/lodash-compat/lang/isFunction.js","node_modules/lodash-compat/lang/isNative.js","node_modules/lodash-compat/lang/isObject.js","node_modules/lodash-compat/lang/isPlainObject.js","node_modules/lodash-compat/lang/isString.js","node_modules/lodash-compat/lang/isTypedArray.js","node_modules/lodash-compat/lang/toPlainObject.js","node_modules/lodash-compat/object/keys.js","node_modules/lodash-compat/object/keysIn.js","node_modules/lodash-compat/object/merge.js","node_modules/lodash-compat/support.js","node_modules/lodash-compat/utility/identity.js","node_modules/object.assign/index.js","node_modules/object.assign/node_modules/define-properties/index.js","node_modules/object.assign/node_modules/define-properties/node_modules/foreach/index.js","node_modules/object.assign/node_modules/object-keys/index.js","node_modules/object.assign/node_modules/object-keys/isArguments.js","node_modules/safe-json-parse/tuple.js","node_modules/tsml/tsml.js","node_modules/xhr/index.js","node_modules/xhr/node_modules/once/once.js","node_modules/xhr/node_modules/parse-headers/node_modules/for-each/index.js","node_modules/xhr/node_modules/parse-headers/node_modules/for-each/node_modules/is-function/index.js","node_modules/xhr/node_modules/parse-headers/node_modules/trim/index.js","node_modules/xhr/node_modules/parse-headers/parse-headers.js","src/js/big-play-button.js","src/js/button.js","src/js/component.js","src/js/control-bar/control-bar.js","src/js/control-bar/fullscreen-toggle.js","src/js/control-bar/live-display.js","src/js/control-bar/mute-toggle.js","src/js/control-bar/play-toggle.js","src/js/control-bar/playback-rate-menu/playback-rate-menu-button.js","src/js/control-bar/playback-rate-menu/playback-rate-menu-item.js","src/js/control-bar/progress-control/load-progress-bar.js","src/js/control-bar/progress-control/mouse-time-display.js","src/js/control-bar/progress-control/play-progress-bar.js","src/js/control-bar/progress-control/progress-control.js","src/js/control-bar/progress-control/seek-bar.js","src/js/control-bar/spacer-controls/custom-control-spacer.js","src/js/control-bar/spacer-controls/spacer.js","src/js/control-bar/text-track-controls/caption-settings-menu-item.js","src/js/control-bar/text-track-controls/captions-button.js","src/js/control-bar/text-track-controls/chapters-button.js","src/js/control-bar/text-track-controls/chapters-track-menu-item.js","src/js/control-bar/text-track-controls/off-text-track-menu-item.js","src/js/control-bar/text-track-controls/subtitles-button.js","src/js/control-bar/text-track-controls/text-track-button.js","src/js/control-bar/text-track-controls/text-track-menu-item.js","src/js/control-bar/time-controls/current-time-display.js","src/js/control-bar/time-controls/duration-display.js","src/js/control-bar/time-controls/remaining-time-display.js","src/js/control-bar/time-controls/time-divider.js","src/js/control-bar/volume-control/volume-bar.js","src/js/control-bar/volume-control/volume-control.js","src/js/control-bar/volume-control/volume-level.js","src/js/control-bar/volume-menu-button.js","src/js/error-display.js","src/js/event-target.js","src/js/extend.js","src/js/fullscreen-api.js","src/js/loading-spinner.js","src/js/media-error.js","src/js/menu/menu-button.js","src/js/menu/menu-item.js","src/js/menu/menu.js","src/js/player.js","src/js/plugins.js","src/js/poster-image.js","src/js/setup.js","src/js/slider/slider.js","src/js/tech/flash-rtmp.js","src/js/tech/flash.js","src/js/tech/html5.js","src/js/tech/loader.js","src/js/tech/tech.js","src/js/tracks/text-track-cue-list.js","src/js/tracks/text-track-display.js","src/js/tracks/text-track-enums.js","src/js/tracks/text-track-list-converter.js","src/js/tracks/text-track-list.js","src/js/tracks/text-track-settings.js","src/js/tracks/text-track.js","src/js/utils/browser.js","src/js/utils/buffer.js","src/js/utils/create-deprecation-proxy.js","src/js/utils/dom.js","src/js/utils/events.js","src/js/utils/fn.js","src/js/utils/format-time.js","src/js/utils/guid.js","src/js/utils/log.js","src/js/utils/merge-options.js","src/js/utils/stylesheet.js","src/js/utils/time-ranges.js","src/js/utils/to-title-case.js","src/js/utils/url.js","src/js/video.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","videojs","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length",1,"_dereq_","topLevel","minDoc","document","doccy","min-document",2,3,4,"getNative","nativeNow","Date","now","getTime","../internal/getNative",5,"debounce","func","wait","options","cancel","timeoutId","clearTimeout","maxTimeoutId","lastCalled","trailingCall","undefined","complete","isCalled","id","result","apply","thisArg","args","delayed","remaining","stamp","setTimeout","maxDelayed","trailing","debounced","arguments","leading","maxWait","leadingCall","TypeError","FUNC_ERROR_TEXT","isObject","nativeMax","Math","max","../date/now","../lang/isObject",6,"restParam","start","index","rest","Array","otherArgs",7,"throttle","./debounce",8,"arrayCopy","source","array",9,"arrayEach","iteratee",10,"baseCopy","props","object","key",11,"createBaseFor","baseFor","./createBaseFor",12,"baseForIn","keysIn","../object/keysIn","./baseFor",13,"baseMerge","customizer","stackA","stackB","isSrcArr","isArrayLike","isArray","isTypedArray","keys","srcValue","isObjectLike","baseMergeDeep","value","isCommon","../lang/isArray","../lang/isTypedArray","../object/keys","./arrayEach","./baseMergeDeep","./isArrayLike","./isObjectLike",14,"mergeFunc","isPlainObject","isArguments","toPlainObject","push","../lang/isArguments","../lang/isPlainObject","../lang/toPlainObject","./arrayCopy",15,"baseProperty","toObject","./toObject",16,"bindCallback","argCount","identity","collection","accumulator","other","../utility/identity",17,"createAssigner","assigner","sources","guard","isIterateeCall","../function/restParam","./bindCallback","./isIterateeCall",18,"fromRight","keysFunc","iterable",19,"getLength","./baseProperty",20,"isNative","../lang/isNative",21,"isLength","./getLength","./isLength",22,"isHostObject","Object","toString",23,"isIndex","reIsUint","test","MAX_SAFE_INTEGER",24,"type","./isIndex",25,26,27,"shimKeys","propsLength","allowIndexes","isString","hasOwnProperty","objectProto","prototype","../lang/isString",28,"support","unindexedChars","charAt","../support",29,"propertyIsEnumerable","../internal/isArrayLike","../internal/isObjectLike",30,"arrayTag","objToString","nativeIsArray","../internal/isLength",31,"isFunction","funcTag","./isObject",32,"reIsNative","fnToString","reIsHostCtor","Function","RegExp","replace","../internal/isHostObject","./isFunction",33,34,"Ctor","objectTag","constructor","ownLast","subValue","../internal/baseForIn","./isArguments",35,"stringTag",36,"typedArrayTags","argsTag","boolTag","dateTag","errorTag","mapTag","numberTag","regexpTag","setTag","weakMapTag","arrayBufferTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag",37,"../internal/baseCopy",38,"nativeKeys","enumPrototypes","../internal/shimKeys",39,"proto","isProto","skipIndexes","skipErrorProps","enumErrorProps","errorProto","skipProto","nonEnumShadows","tag","stringProto","nonEnums","nonEnumProps","shadowProps","nonEnum","String","toLocaleString","valueOf","../internal/arrayEach","../internal/isIndex","../lang/isFunction",40,"merge","../internal/baseMerge","../internal/createAssigner",41,"arrayProto","splice","x","0","y","spliceObjects",42,43,"canBeObject","obj","hasSymbols","Symbol","defineProperties","propIsEnumerable","assignShim","target","syms","objTarget","getOwnPropertySymbols","shim","assignHasPendingExceptions","assign","preventExtensions","thrower","define-properties","object-keys",44,"foreach","toStr","fn","arePropertyDescriptorsSupported","defineProperty","enumerable","_","supportsDescriptors","name","predicate","configurable","writable","map","predicates","concat",45,"hasOwn","ctx","k",46,"has","slice","isArgs","hasDontEnumBug","hasProtoEnumBug","dontEnums","equalsConstructorPrototype","ctor","blacklistedKeys","$window","$console","$parent","$self","$frames","$webkitIndexedDB","$webkitStorageInfo","hasAutomationEqualityBug","equalsConstructorPrototypeIfNotBuggy","keysShim","theKeys","j","skipConstructor","keysWorksWithArguments","originalKeys",47,"str","callee",48,"SafeParseTuple","reviver","error","json","JSON","parse","err",49,"clean","sa",50,"isEmpty","createXHR","callback","readystatechange","xhr","readyState","loadFunc","getBody","body","response","responseType","responseText","responseXML","isJson","errorFunc","evt","timeoutTimer","statusCode","failureResponse","aborted","status","useXDR","method","headers","url","uri","rawRequest","getAllResponseHeaders","parseHeaders","once","cors","XDomainRequest","XMLHttpRequest","data","sync","stringify","onreadystatechange","onload","onerror","onprogress","ontimeout","open","username","password","withCredentials","timeout","abort","setRequestHeader","beforeSend","send","noop","global/window","parse-headers",51,"called",52,"forEach","list","iterator","context","forEachArray","forEachString","forEachObject","len","string","is-function",53,"alert","confirm","prompt",54,"trim","left","right",55,"arg","split","row","indexOf","toLowerCase","_componentJs2","_interopRequireDefault","_componentJs","_classCallCheck","BigPlayButton","_Button","player","buildCSSClass","__esModule","newObj","default","Constructor","instance","_inherits","subClass","superClass","create","setPrototypeOf","__proto__","_component2","_component","_objectAssign","Button","_Component","on","handleBlur","createEl","attributes","_objectAssign2","tabIndex","el","controlTextEl_","innerHTML","localize","controlText_","handleFocus","Events","_globalDocument2","Fn","bind","handleKeyPress","event","which","preventDefault","handleClick","_interopRequireWildcard","_globalWindow2","_globalWindow","Dom","_utilsDomJs","Component","player_","id_","Guid","newGUID","el_","childIndex_","childNameIndex_","reportTouchActivity","trigger","bubbles","children_","dispose","removeElData","tagName","properties","languages","language","children","getChildById","addChild","child","componentName","componentClassName","componentClass","_utilsToTitleCaseJs2","ComponentClass","getComponent","component","removeChild","getChild","childFound","options_","parentOptions","_this","handleAdd","opts","playerOptions","_name","first","second","removeOnDispose","_this2","off","cleanRemover","guid","third","nodeName","one","_this3","_arguments","newFunc","ready","isReady_","triggerReady","readyQueue","readyQueue_","hasClass","classToCheck","hasElClass","addElClass","classToAdd","removeClass","classToRemove","removeElClass","show","dimension","num","skipListeners","widthOrHeight","val","style","emitTapEvents","touchStart","touchTimeThreshold","couldBeTap","touches","firstTouch","xdiff","pageX","touchDistance","tapMovementThreshold","noTap","touchTime","enableTouchActivity","report","reportUserActivity","touchHolding","clearInterval","setInterval","touchEnd","intervalId","comp","init","subObj","extend","_name2","_spacerControlsCustomControlSpacerJs","ControlBar","className","FullscreenToggle","isFullscreen","controlText","updateShowing","LiveDisplay","contentEl_","aria-live","MuteToggle","update","tech_","addClass","vol","muted","level","toMute","handlePlay","handlePause","PlayToggle","play","pause","_menuMenuJs2","_menuMenuJs","PlaybackRateMenuButton","_MenuButton","updateVisibility","appendChild","labelEl_","menu","setAttribute","playbackRate","currentRate","newRate","playbackRates","playbackRateSupported","updateLabel","PlaybackRateMenuItem","_MenuItem","label","rate","buffered","percentify","time","end","percent","part","width","bufferedEnd","_lodashCompatFunctionThrottle2","_lodashCompatFunctionThrottle","MouseTimeDisplay","controlBar","progressControl","handleMouseMove","duration","position","findElPosition","parentNode","newTime","_utilsFormatTimeJs","updateDataAttr","_mouseTimeDisplayJs","ProgressControl","_Slider","updateARIAAttributes","aria-label","scrubbing","getCache","currentTime","getPercent","toFixed","_utilsFormatTimeJs2","SeekBar","videoWasPlaying","stepForward","stepBack","CustomControlSpacer","_Spacer","Spacer","_TextTrackMenuItem","CaptionSettingsMenuItem","_captionSettingsMenuItemJs2","_captionSettingsMenuItemJs","_TextTrackButton","CaptionsButton","threshold","hide","items","kind","kind_","_textTrackMenuItemJs2","_textTrackMenuItemJs","_chaptersTrackMenuItemJs2","_chaptersTrackMenuItemJs","ChaptersButton","createItems","tracks","textTracks","createMenu","track","cues","chaptersTrack","contentEl","cue","mi","_utilsFnJs","ChaptersTrackMenuItem","addEventListener","startTime","OffTextTrackMenuItem","selected","handleTracksChange","_offTextTrackMenuItemJs","TextTrackButton","updateHandler","removeEventListener","_offTextTrackMenuItemJs2","_globalDocument","TextTrackMenuItem","onchange","Event","dispatchEvent","updateContent","DurationDisplay","formattedTime","remainingTime","localizedText","TimeDivider","_sliderSliderJs","_volumeLevelJs","volume","calculateDistance","VolumeBar","VolumeControl","_volumeBarJs","VolumeLevel","_volumeControlVolumeBarJs","VolumeMenuButton","inline","vertical","volumeBar","volumeUpdate","orientationClass","vb","./utils/dom.js",90,"_utilsEventsJs","EventTarget","allowedEvents_","ael","_utilsLog","_utilsLog2","subClassMethods","methods","FullscreenApi","apiMap","browserApi","LoadingSpinner","MediaError","message","errorTypes","_buttonJs2","_buttonJs","_utilsToTitleCaseJs","MenuButton","title","buttonPressed_","unpressButton","focus","MenuItem","_selected","Menu","unlockShowing","contentElType","append","_utilsBrowserJs","_utilsLogJs2","_utilsLogJs","_utilsMergeOptionsJs","_tracksTextTrackListConverterJs","_controlBarControlBarJs","tagAttributes","getElAttributes","languagesToLower","_utilsMergeOptionsJs2","plugins","getOwnPropertyNames","playerOptionsCopy","isAudio","controls","Player","styleEl_","players","removeAttribute","defaultsStyleEl","querySelector","height","aspectRatio","privDimension","_dimension","parsedVal","parseFloat","updateStyleEl_","fluid","bool","ratio","aspectRatio_","videoWidth","videoHeight","ratioParts","width_","height_","ratioMultiplier","loadTech_","techName","disposeMediaElement","techName_","techOptions","nativeControlsForTouch","playerId","techId","textTracks_","preload","loop","poster","src","cache_","techComponent","handleTechReady_","_tracksTextTrackListConverterJs2","jsonToTextTracks","textTracksJson_","handleTechLoadStart_","handleTechWaiting_","handleTechCanPlay_","handleTechCanPlayThrough_","handleTechPlaying_","handleTechEnded_","handleTechSeeking_","handleTechSeeked_","handleTechPlay_","handleTechFirstPlay_","handleTechPause_","handleTechProgress_","handleTechDurationChange_","handleTechFullscreenChange_","handleTechError_","handleTechAbort_","handleTechStalled_","handleTechLoadedMetaData_","handleTechLoadedData_","handleTechTextTrackChange_","handleTechPosterChange_","usingNativeControls","addTechControlsListeners_","removeTechControlsListeners_","handleTechClick_","handleTechTouchMove_","handleTechTouchEnd_","hasStarted","_hasStarted","hasStarted_","handleTechTap_","userActive","handleTechTouchStart_","userWasActive","handleStageClick_","handleTechSuspend_","handleTechEmptied_","handleTechTimeUpdate_","handleTechRateChange_","handleTechVolumeChange_","techCall_","techGet_","isScrubbing","scrubbing_","seconds","bufferedPercent","_utilsBufferJs","percentAsDecimal","fsApi","fullscreenchange","documentFullscreenChange","requestFullscreen","supportsFullScreen","exitFullscreen","isFullWindow","docOrigOverflow","documentElement","overflow","exitFullWindow","tech","b","currentTech","sourceList_","currentType_","load","sourceTech","selectSource","controls_","usingNativeControls_","error_","_mediaErrorJs2","ended","seeking","seekable","userActivity_","userActive_","stopPropagation","listenForUserActivity_","mouseInProgress","lastMoveX","lastMoveY","handleActivity","screenX","screenY","handleMouseDown","handleMouseUp","inactivityTimeout","addTextTrack","addRemoteTextTrack","removeRemoteTextTrack","languages_","toJSON","tagOptions","dataSetup","_safeParseTuple","baseOptions","hasChildNodes","childNodes","childName","_playerJs","PosterImage","fallbackImg_","setSrc","_windowLoaded","autoSetup","vids","getElementsByTagName","mediaEls","audios","mediaEl","getAttribute","autoSetupTimeout","vjs","Slider","bar","barName","playerEvent","progress","percentage","stopImmediatePropagation","vertical_","registerComponent","FlashRtmpDecorator","Flash","streamingFormats","streamToParts","parts","connection","stream","connEnd","streamBegin","lastIndexOf","substring","rtmpSourceHandler","attrUpper","attr","toUpperCase","_api","vjs_setProperty","vjs_getProperty","_tech","_utilsUrlJs","_Tech","setSource","swf","objId","eventProxyFunction","errorEventProxyFunction","flashVars","params","wmode","embed","setCurrentTime","vjs_pause","lastSeekTarget_","currentSource_","setPoster","_utilsTimeRangesJs","createTimeRange","ranges","enterFullScreen","_tech2","_readWrite","_readOnly","_createGetter","nativeSourceHandler","canHandleSource","guessMimeType","ext","Url","getFileExtension","video/flv","video/mp4","checkReady","onEvent","swfID","eventName","getEl","version","navigator","description","match","getEmbedCode","flashVarsString","paramsString","attrsString","flashvars","_techJs2","_techJs","Html5","currentSrc","initNetworkState_","handleLateInit_","nodesLength","nodes","node","featuresNativeTextTracks","remoteTextTracks","addTrack_","removeNodes","handleTextTrackChange_","handleTextTrackChange","handleTextTrackRemove_","handleTextTrackRemove","proxyNativeTextTracks_","emulatedTt","tt","handleTextTrackAdd_","clone","cloneNode","createElement","browser","TOUCH_ENABLED","setElAttributes","class","settingsAttrs","overwriteAttrs","_ret","loadstartFired","setLoadstartFired","triggerLoadstart","eventsToTrigger","paused","setVolume","setMuted","offsetWidth","offsetHeight","video","networkState","HAVE_METADATA","webkitEnterFullScreen","exitFullScreen","webkitExitFullScreen","_src","setPreload","autoplay","setAutoplay","setControls","setLoop","defaultMuted","played","removeTrack_","TEST_VID","srclang","isSupported","canPlayType","registerSourceHandler","canControlVolume","canControlPlaybackRate","supportsNativeTextTracks","supportsTextTracks","mpegurlRE","patchCanPlayType","IS_OLD_ANDROID","mp4RE","unpatchCanPlayType","firstChild","MediaLoader","_tracksTextTrackList","Tech","manualProgressOn","featuresTimeupdateEvents","nativeCaptions","nativeTextTracks","manualProgress","stopTrackingProgress","progressInterval","numBufferedPercent","onDurationChange","duration_","manualTimeUpdates","trackCurrentTime","stopTrackingCurrentTime","currentTimeInterval","manuallyTriggered","initTextTrackListeners","textTrackListChanges","script","textTracksChanges","updateDisplay","_tracksTextTrackList2","createTrackHelper","withSourceHandlers","handler","handlers","sourceHandlers","selectSourceHandler","sh","srcObj","sourceHandler_","disposeSourceHandler","handleSource","../tracks/text-track","../tracks/text-track-list","../utils/buffer.js","../utils/fn.js","../utils/log.js","../utils/time-ranges.js","global/document",108,"IS_IE8","prop","TextTrackCueList","get","length_","setCues_","cues_","oldLength","defineProp","parseInt","color","opacity","darkGray","lightGray","TextTrackDisplay","clearDisplay","updateForTrack","overrides","getValues","_i","cueDiv","displayState","textOpacity","tryUpdateStyle","constructColor","backgroundColor","backgroundOpacity","windowColor","windowOpacity","edgeStyle","textShadow","fontPercent","fontSize","bottom","fontFamily","fontVariant","fontMap","../component","../menu/menu-button.js","../menu/menu-item.js","../menu/menu.js",110,"TextTrackMode","disabled","hidden","showing","trackToJson_","inBandMetadataTrackDispatchType","textTracksToJson","trackEls","querySelectorAll","trackObjs","TextTrackList","tracks_","_eventTarget2","change","addtrack","removetrack","_event","rtrack","getTrackById","getSelectedOptionValue","selectedOption","selectedOptions","selectedIndex","option","TextTrackSettings","persistTextTrackSettings","saveSettings","restoreSettings","textEdge","fgColor","bgColor","bgOpacity","setValues","values","setSelectedOption","_safeJsonParseTuple2","localStorage","getItem","removeItem","ttDisplay","safe-json-parse/tuple",114,"_textTrackCueList2","_textTrackCueList","_eventTarget","TextTrack","TextTrackEnum","TextTrackKind","mode","activeCues_","activeCues","changed","timeupdateHandler","set","newMode","loaded_","ct","active","addCue","removeCue","removed","parseCues","srcContent","parser","loadTrack","crossOrigin","isCrossOrigin","_xhr2","responseBody","O","fromIndex","abs","webkitVersionMap","exec","USER_AGENT","IS_IPHONE","IS_IPAD","IS_IPOD","IOS_VERSION","IS_ANDROID","ANDROID_VERSION","major","minor","IS_NATIVE_ANDROID","appleWebkitVersion","bufferedDuration","_timeRangesJs","_logJs","_logJs2","messages","Proxy","warn","defaultBehaviors","_taggedTemplateLiteralLoose","strings","raw","getElementById","propName","_tsml2","_templateObject","parent","getElData","elData","elIdAttr","element","classNames","join","knownBooleans","attrs","attrName","attrVal","onselectstart","getBoundingClientRect","box","top","docEl","clientLeft","scrollLeft","pageXOffset","getPointerPosition","boxH","boxX","pageY","unblockTextSelection","_tsml","elem","_handleMultipleEvents","dispatcher","hash","fixEvent","m","handlersCopy","isImmediatePropagationStopped","removeType","ownerDocument","isPropagationStopped","defaultPrevented","targetData","returnTrue","returnFalse","old","srcElement","relatedTarget","returnValue","cancelBubble","doc","clientX","_cleanUpEvents","detachEvent","ret","guide","h","floor",122,"_logType","console","log","history","argsArray","isPlain","mergeOptions","destination","lodash-compat/object/merge",125,"createStyleElement","createTimeRanges","createTimeRangesObj","getRange","fnName","valueIndex","rangeIndex","parseUrl","href","addToBody","div","details","protocol",129,"stylesheet","_utilsStylesheetJs","_player2","_player","_tracksTextTrackJs","_lodashCompatObjectMerge","_utilsCreateDeprecationProxyJs","_techHtml5Js","getPlayers","setTextContent","addLanguage"],"mappings":"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iB,EAAS60C,aAAA/xC,GAAAwf,MAAAA,oBAMV7R,GAAAuO,EAAA8f,MAAAh8B,OAKD2N,GAAA3N,CAIF,KAAK2N,IAAOA,EAAAwR,SAEV,KAAQ,IAAGne,WAAA,kRAuBbuwC,EAAQS,eAAUrxB,EAAc,qNAkC9BzjB,EAAK60C,WAAA,WACL,MAAKN,GAAA,WAAAljB,wZA2NPrxB,EAAQ+0C,YAAG,SAAAn0C,EAAOqY,gHAsBlBjZ,EAAQ29B,gBAAU39B,EAAAwzC,iBAAc9V,EAAA8V;AhIhYhC;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})","(function (global){\nvar topLevel = typeof global !== 'undefined' ? global :\n    typeof window !== 'undefined' ? window : {}\nvar minDoc = require('min-document');\n\nif (typeof document !== 'undefined') {\n    module.exports = document;\n} else {\n    var doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];\n\n    if (!doccy) {\n        doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;\n    }\n\n    module.exports = doccy;\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9nbG9iYWwvZG9jdW1lbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9wTGV2ZWwgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6XG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB7fVxudmFyIG1pbkRvYyA9IHJlcXVpcmUoJ21pbi1kb2N1bWVudCcpO1xuXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQ7XG59IGVsc2Uge1xuICAgIHZhciBkb2NjeSA9IHRvcExldmVsWydfX0dMT0JBTF9ET0NVTUVOVF9DQUNIRUA0J107XG5cbiAgICBpZiAoIWRvY2N5KSB7XG4gICAgICAgIGRvY2N5ID0gdG9wTGV2ZWxbJ19fR0xPQkFMX0RPQ1VNRU5UX0NBQ0hFQDQnXSA9IG1pbkRvYztcbiAgICB9XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IGRvY2N5O1xufVxuIl19","(function (global){\nif (typeof window !== \"undefined\") {\n    module.exports = window;\n} else if (typeof global !== \"undefined\") {\n    module.exports = global;\n} else if (typeof self !== \"undefined\"){\n    module.exports = self;\n} else {\n    module.exports = {};\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9nbG9iYWwvd2luZG93LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBzZWxmO1xufSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHt9O1xufVxuIl19",null,"var getNative = require('../internal/getNative');\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeNow = getNative(Date, 'now');\n\n/**\n * Gets the number of milliseconds that have elapsed since the Unix epoch\n * (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @category Date\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => logs the number of milliseconds it took for the deferred function to be invoked\n */\nvar now = nativeNow || function() {\n  return new Date().getTime();\n};\n\nmodule.exports = now;\n","var isObject = require('../lang/isObject'),\n    now = require('../date/now');\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed invocations. Provide an options object to indicate that `func`\n * should be invoked on the leading and/or trailing edge of the `wait` timeout.\n * Subsequent calls to the debounced function return the result of the last\n * `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the debounced function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=false] Specify invoking on the leading\n *  edge of the timeout.\n * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n *  delayed before it's invoked.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n *  edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // avoid costly calculations while the window size is in flux\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // invoke `sendMail` when the click event is fired, debouncing subsequent calls\n * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // ensure `batchLog` is invoked once after 1 second of debounced calls\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', _.debounce(batchLog, 250, {\n *   'maxWait': 1000\n * }));\n *\n * // cancel a debounced call\n * var todoChanges = _.debounce(batchLog, 1000);\n * Object.observe(models.todo, todoChanges);\n *\n * Object.observe(models, function(changes) {\n *   if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {\n *     todoChanges.cancel();\n *   }\n * }, ['delete']);\n *\n * // ...at some point `models.todo` is changed\n * models.todo.completed = true;\n *\n * // ...before 1 second has passed `models.todo` is deleted\n * // which cancels the debounced `todoChanges` call\n * delete models.todo;\n */\nfunction debounce(func, wait, options) {\n  var args,\n      maxTimeoutId,\n      result,\n      stamp,\n      thisArg,\n      timeoutId,\n      trailingCall,\n      lastCalled = 0,\n      maxWait = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = wait < 0 ? 0 : (+wait || 0);\n  if (options === true) {\n    var leading = true;\n    trailing = false;\n  } else if (isObject(options)) {\n    leading = !!options.leading;\n    maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function cancel() {\n    if (timeoutId) {\n      clearTimeout(timeoutId);\n    }\n    if (maxTimeoutId) {\n      clearTimeout(maxTimeoutId);\n    }\n    lastCalled = 0;\n    maxTimeoutId = timeoutId = trailingCall = undefined;\n  }\n\n  function complete(isCalled, id) {\n    if (id) {\n      clearTimeout(id);\n    }\n    maxTimeoutId = timeoutId = trailingCall = undefined;\n    if (isCalled) {\n      lastCalled = now();\n      result = func.apply(thisArg, args);\n      if (!timeoutId && !maxTimeoutId) {\n        args = thisArg = undefined;\n      }\n    }\n  }\n\n  function delayed() {\n    var remaining = wait - (now() - stamp);\n    if (remaining <= 0 || remaining > wait) {\n      complete(trailingCall, maxTimeoutId);\n    } else {\n      timeoutId = setTimeout(delayed, remaining);\n    }\n  }\n\n  function maxDelayed() {\n    complete(trailing, timeoutId);\n  }\n\n  function debounced() {\n    args = arguments;\n    stamp = now();\n    thisArg = this;\n    trailingCall = trailing && (timeoutId || !leading);\n\n    if (maxWait === false) {\n      var leadingCall = leading && !timeoutId;\n    } else {\n      if (!maxTimeoutId && !leading) {\n        lastCalled = stamp;\n      }\n      var remaining = maxWait - (stamp - lastCalled),\n          isCalled = remaining <= 0 || remaining > maxWait;\n\n      if (isCalled) {\n        if (maxTimeoutId) {\n          maxTimeoutId = clearTimeout(maxTimeoutId);\n        }\n        lastCalled = stamp;\n        result = func.apply(thisArg, args);\n      }\n      else if (!maxTimeoutId) {\n        maxTimeoutId = setTimeout(maxDelayed, remaining);\n      }\n    }\n    if (isCalled && timeoutId) {\n      timeoutId = clearTimeout(timeoutId);\n    }\n    else if (!timeoutId && wait !== maxWait) {\n      timeoutId = setTimeout(delayed, wait);\n    }\n    if (leadingCall) {\n      isCalled = true;\n      result = func.apply(thisArg, args);\n    }\n    if (isCalled && !timeoutId && !maxTimeoutId) {\n      args = thisArg = undefined;\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  return debounced;\n}\n\nmodule.exports = debounce;\n","/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as an array.\n *\n * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters).\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.restParam(function(what, names) {\n *   return what + ' ' + _.initial(names).join(', ') +\n *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\nfunction restParam(func, start) {\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        rest = Array(length);\n\n    while (++index < length) {\n      rest[index] = args[start + index];\n    }\n    switch (start) {\n      case 0: return func.call(this, rest);\n      case 1: return func.call(this, args[0], rest);\n      case 2: return func.call(this, args[0], args[1], rest);\n    }\n    var otherArgs = Array(start + 1);\n    index = -1;\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = rest;\n    return func.apply(this, otherArgs);\n  };\n}\n\nmodule.exports = restParam;\n","var debounce = require('./debounce'),\n    isObject = require('../lang/isObject');\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed invocations. Provide an options object to indicate\n * that `func` should be invoked on the leading and/or trailing edge of the\n * `wait` timeout. Subsequent calls to the throttled function return the\n * result of the last `func` call.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the throttled function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=true] Specify invoking on the leading\n *  edge of the timeout.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n *  edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // avoid excessively updating the position while scrolling\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\n *   'trailing': false\n * }));\n *\n * // cancel a trailing throttled call\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n  var leading = true,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  if (options === false) {\n    leading = false;\n  } else if (isObject(options)) {\n    leading = 'leading' in options ? !!options.leading : leading;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n  return debounce(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing });\n}\n\nmodule.exports = throttle;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction arrayCopy(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayCopy;\n","/**\n * A specialized version of `_.forEach` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (iteratee(array[index], index, array) === false) {\n      break;\n    }\n  }\n  return array;\n}\n\nmodule.exports = arrayEach;\n","/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property names to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @returns {Object} Returns `object`.\n */\nfunction baseCopy(source, props, object) {\n  object || (object = {});\n\n  var index = -1,\n      length = props.length;\n\n  while (++index < length) {\n    var key = props[index];\n    object[key] = source[key];\n  }\n  return object;\n}\n\nmodule.exports = baseCopy;\n","var createBaseFor = require('./createBaseFor');\n\n/**\n * The base implementation of `baseForIn` and `baseForOwn` which iterates\n * over `object` properties returned by `keysFunc` invoking `iteratee` for\n * each property. Iteratee functions may exit iteration early by explicitly\n * returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","var baseFor = require('./baseFor'),\n    keysIn = require('../object/keysIn');\n\n/**\n * The base implementation of `_.forIn` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForIn(object, iteratee) {\n  return baseFor(object, iteratee, keysIn);\n}\n\nmodule.exports = baseForIn;\n","var arrayEach = require('./arrayEach'),\n    baseMergeDeep = require('./baseMergeDeep'),\n    isArray = require('../lang/isArray'),\n    isArrayLike = require('./isArrayLike'),\n    isObject = require('../lang/isObject'),\n    isObjectLike = require('./isObjectLike'),\n    isTypedArray = require('../lang/isTypedArray'),\n    keys = require('../object/keys');\n\n/**\n * The base implementation of `_.merge` without support for argument juggling,\n * multiple sources, and `this` binding `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Array} [stackA=[]] Tracks traversed source objects.\n * @param {Array} [stackB=[]] Associates values with source counterparts.\n * @returns {Object} Returns `object`.\n */\nfunction baseMerge(object, source, customizer, stackA, stackB) {\n  if (!isObject(object)) {\n    return object;\n  }\n  var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),\n      props = isSrcArr ? undefined : keys(source);\n\n  arrayEach(props || source, function(srcValue, key) {\n    if (props) {\n      key = srcValue;\n      srcValue = source[key];\n    }\n    if (isObjectLike(srcValue)) {\n      stackA || (stackA = []);\n      stackB || (stackB = []);\n      baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);\n    }\n    else {\n      var value = object[key],\n          result = customizer ? customizer(value, srcValue, key, object, source) : undefined,\n          isCommon = result === undefined;\n\n      if (isCommon) {\n        result = srcValue;\n      }\n      if ((result !== undefined || (isSrcArr && !(key in object))) &&\n          (isCommon || (result === result ? (result !== value) : (value === value)))) {\n        object[key] = result;\n      }\n    }\n  });\n  return object;\n}\n\nmodule.exports = baseMerge;\n","var arrayCopy = require('./arrayCopy'),\n    isArguments = require('../lang/isArguments'),\n    isArray = require('../lang/isArray'),\n    isArrayLike = require('./isArrayLike'),\n    isPlainObject = require('../lang/isPlainObject'),\n    isTypedArray = require('../lang/isTypedArray'),\n    toPlainObject = require('../lang/toPlainObject');\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Array} [stackA=[]] Tracks traversed source objects.\n * @param {Array} [stackB=[]] Associates values with source counterparts.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {\n  var length = stackA.length,\n      srcValue = source[key];\n\n  while (length--) {\n    if (stackA[length] == srcValue) {\n      object[key] = stackB[length];\n      return;\n    }\n  }\n  var value = object[key],\n      result = customizer ? customizer(value, srcValue, key, object, source) : undefined,\n      isCommon = result === undefined;\n\n  if (isCommon) {\n    result = srcValue;\n    if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) {\n      result = isArray(value)\n        ? value\n        : (isArrayLike(value) ? arrayCopy(value) : []);\n    }\n    else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n      result = isArguments(value)\n        ? toPlainObject(value)\n        : (isPlainObject(value) ? value : {});\n    }\n    else {\n      isCommon = false;\n    }\n  }\n  // Add the source value to the stack of traversed objects and associate\n  // it with its merged value.\n  stackA.push(srcValue);\n  stackB.push(result);\n\n  if (isCommon) {\n    // Recursively merge objects and arrays (susceptible to call stack limits).\n    object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);\n  } else if (result === result ? (result !== value) : (value === value)) {\n    object[key] = result;\n  }\n}\n\nmodule.exports = baseMergeDeep;\n","var toObject = require('./toObject');\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n  return function(object) {\n    return object == null ? undefined : toObject(object)[key];\n  };\n}\n\nmodule.exports = baseProperty;\n","var identity = require('../utility/identity');\n\n/**\n * A specialized version of `baseCallback` which only supports `this` binding\n * and specifying the number of arguments to provide to `func`.\n *\n * @private\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {number} [argCount] The number of arguments to provide to `func`.\n * @returns {Function} Returns the callback.\n */\nfunction bindCallback(func, thisArg, argCount) {\n  if (typeof func != 'function') {\n    return identity;\n  }\n  if (thisArg === undefined) {\n    return func;\n  }\n  switch (argCount) {\n    case 1: return function(value) {\n      return func.call(thisArg, value);\n    };\n    case 3: return function(value, index, collection) {\n      return func.call(thisArg, value, index, collection);\n    };\n    case 4: return function(accumulator, value, index, collection) {\n      return func.call(thisArg, accumulator, value, index, collection);\n    };\n    case 5: return function(value, other, key, object, source) {\n      return func.call(thisArg, value, other, key, object, source);\n    };\n  }\n  return function() {\n    return func.apply(thisArg, arguments);\n  };\n}\n\nmodule.exports = bindCallback;\n","var bindCallback = require('./bindCallback'),\n    isIterateeCall = require('./isIterateeCall'),\n    restParam = require('../function/restParam');\n\n/**\n * Creates a `_.assign`, `_.defaults`, or `_.merge` function.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n  return restParam(function(object, sources) {\n    var index = -1,\n        length = object == null ? 0 : sources.length,\n        customizer = length > 2 ? sources[length - 2] : undefined,\n        guard = length > 2 ? sources[2] : undefined,\n        thisArg = length > 1 ? sources[length - 1] : undefined;\n\n    if (typeof customizer == 'function') {\n      customizer = bindCallback(customizer, thisArg, 5);\n      length -= 2;\n    } else {\n      customizer = typeof thisArg == 'function' ? thisArg : undefined;\n      length -= (customizer ? 1 : 0);\n    }\n    if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n      customizer = length < 3 ? undefined : customizer;\n      length = 1;\n    }\n    while (++index < length) {\n      var source = sources[index];\n      if (source) {\n        assigner(object, source, customizer);\n      }\n    }\n    return object;\n  });\n}\n\nmodule.exports = createAssigner;\n","var toObject = require('./toObject');\n\n/**\n * Creates a base function for `_.forIn` or `_.forInRight`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n  return function(object, iteratee, keysFunc) {\n    var iterable = toObject(object),\n        props = keysFunc(object),\n        length = props.length,\n        index = fromRight ? length : -1;\n\n    while ((fromRight ? index-- : ++index < length)) {\n      var key = props[index];\n      if (iteratee(iterable[key], key, iterable) === false) {\n        break;\n      }\n    }\n    return object;\n  };\n}\n\nmodule.exports = createBaseFor;\n","var baseProperty = require('./baseProperty');\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\nmodule.exports = getLength;\n","var isNative = require('../lang/isNative');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = object == null ? undefined : object[key];\n  return isNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var getLength = require('./getLength'),\n    isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(getLength(value));\n}\n\nmodule.exports = isArrayLike;\n","/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    // IE < 9 presents many host objects as `Object` objects that can coerce\n    // to strings despite having improperly defined `toString` methods.\n    return typeof value.toString != 'function' && typeof (value + '') == 'string';\n  };\n}());\n\nmodule.exports = isHostObject;\n","/** Used to detect unsigned integer values. */\nvar reIsUint = /^\\d+$/;\n\n/**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n  return value > -1 && value % 1 == 0 && value < length;\n}\n\nmodule.exports = isIndex;\n","var isArrayLike = require('./isArrayLike'),\n    isIndex = require('./isIndex'),\n    isObject = require('../lang/isObject');\n\n/**\n * Checks if the provided arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n  if (!isObject(object)) {\n    return false;\n  }\n  var type = typeof index;\n  if (type == 'number'\n      ? (isArrayLike(object) && isIndex(index, object.length))\n      : (type == 'string' && index in object)) {\n    var other = object[index];\n    return value === value ? (value === other) : (other !== other);\n  }\n  return false;\n}\n\nmodule.exports = isIterateeCall;\n","/**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n  return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","/**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\nfunction isObjectLike(value) {\n  return !!value && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var isArguments = require('../lang/isArguments'),\n    isArray = require('../lang/isArray'),\n    isIndex = require('./isIndex'),\n    isLength = require('./isLength'),\n    isString = require('../lang/isString'),\n    keysIn = require('../object/keysIn');\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A fallback implementation of `Object.keys` which creates an array of the\n * own enumerable property names of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction shimKeys(object) {\n  var props = keysIn(object),\n      propsLength = props.length,\n      length = propsLength && object.length;\n\n  var allowIndexes = !!length && isLength(length) &&\n    (isArray(object) || isArguments(object) || isString(object));\n\n  var index = -1,\n      result = [];\n\n  while (++index < propsLength) {\n    var key = props[index];\n    if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = shimKeys;\n","var isObject = require('../lang/isObject'),\n    isString = require('../lang/isString'),\n    support = require('../support');\n\n/**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\nfunction toObject(value) {\n  if (support.unindexedChars && isString(value)) {\n    var index = -1,\n        length = value.length,\n        result = Object(value);\n\n    while (++index < length) {\n      result[index] = value.charAt(index);\n    }\n    return result;\n  }\n  return isObject(value) ? value : Object(value);\n}\n\nmodule.exports = toObject;\n","var isArrayLike = require('../internal/isArrayLike'),\n    isObjectLike = require('../internal/isObjectLike');\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Native method references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is classified as an `arguments` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n  return isObjectLike(value) && isArrayLike(value) &&\n    hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');\n}\n\nmodule.exports = isArguments;\n","var getNative = require('../internal/getNative'),\n    isLength = require('../internal/isLength'),\n    isObjectLike = require('../internal/isObjectLike');\n\n/** `Object#toString` result references. */\nvar arrayTag = '[object Array]';\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeIsArray = getNative(Array, 'isArray');\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(function() { return arguments; }());\n * // => false\n */\nvar isArray = nativeIsArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;\n};\n\nmodule.exports = isArray;\n","var isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]';\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in older versions of Chrome and Safari which return 'function' for regexes\n  // and Safari 8 which returns 'object' for typed array constructors.\n  return isObject(value) && objToString.call(value) == funcTag;\n}\n\nmodule.exports = isFunction;\n","var isFunction = require('./isFunction'),\n    isHostObject = require('../internal/isHostObject'),\n    isObjectLike = require('../internal/isObjectLike');\n\n/** Used to detect host constructors (Safari > 5). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar fnToString = Function.prototype.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  fnToString.call(hasOwnProperty).replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * Checks if `value` is a native function.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\nfunction isNative(value) {\n  if (value == null) {\n    return false;\n  }\n  if (isFunction(value)) {\n    return reIsNative.test(fnToString.call(value));\n  }\n  return isObjectLike(value) && (isHostObject(value) ? reIsNative : reIsHostCtor).test(value);\n}\n\nmodule.exports = isNative;\n","/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(1);\n * // => false\n */\nfunction isObject(value) {\n  // Avoid a V8 JIT bug in Chrome 19-20.\n  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n  var type = typeof value;\n  return !!value && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseForIn = require('../internal/baseForIn'),\n    isArguments = require('./isArguments'),\n    isHostObject = require('../internal/isHostObject'),\n    isObjectLike = require('../internal/isObjectLike'),\n    support = require('../support');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * **Note:** This method assumes objects created by the `Object` constructor\n * have no inherited enumerable properties.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n  var Ctor;\n\n  // Exit early for non `Object` objects.\n  if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isHostObject(value) && !isArguments(value)) ||\n      (!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {\n    return false;\n  }\n  // IE < 9 iterates inherited properties before own properties. If the first\n  // iterated property is an object's own property then there are no inherited\n  // enumerable properties.\n  var result;\n  if (support.ownLast) {\n    baseForIn(value, function(subValue, key, object) {\n      result = hasOwnProperty.call(object, key);\n      return false;\n    });\n    return result !== false;\n  }\n  // In most environments an object's own properties are iterated before\n  // its inherited properties. If the last iterated property is an object's\n  // own property then there are no inherited enumerable properties.\n  baseForIn(value, function(subValue, key) {\n    result = key;\n  });\n  return result === undefined || hasOwnProperty.call(value, result);\n}\n\nmodule.exports = isPlainObject;\n","var isObjectLike = require('../internal/isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n  return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);\n}\n\nmodule.exports = isString;\n","var isLength = require('../internal/isLength'),\n    isObjectLike = require('../internal/isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nmodule.exports = isTypedArray;\n","var baseCopy = require('../internal/baseCopy'),\n    keysIn = require('../object/keysIn');\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable\n * properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n  return baseCopy(value, keysIn(value));\n}\n\nmodule.exports = toPlainObject;\n","var getNative = require('../internal/getNative'),\n    isArrayLike = require('../internal/isArrayLike'),\n    isObject = require('../lang/isObject'),\n    shimKeys = require('../internal/shimKeys'),\n    support = require('../support');\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = getNative(Object, 'keys');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nvar keys = !nativeKeys ? shimKeys : function(object) {\n  var Ctor = object == null ? undefined : object.constructor;\n  if ((typeof Ctor == 'function' && Ctor.prototype === object) ||\n      (typeof object == 'function' ? support.enumPrototypes : isArrayLike(object))) {\n    return shimKeys(object);\n  }\n  return isObject(object) ? nativeKeys(object) : [];\n};\n\nmodule.exports = keys;\n","var arrayEach = require('../internal/arrayEach'),\n    isArguments = require('../lang/isArguments'),\n    isArray = require('../lang/isArray'),\n    isFunction = require('../lang/isFunction'),\n    isIndex = require('../internal/isIndex'),\n    isLength = require('../internal/isLength'),\n    isObject = require('../lang/isObject'),\n    isString = require('../lang/isString'),\n    support = require('../support');\n\n/** `Object#toString` result references. */\nvar arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    stringTag = '[object String]';\n\n/** Used to fix the JScript `[[DontEnum]]` bug. */\nvar shadowProps = [\n  'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',\n  'toLocaleString', 'toString', 'valueOf'\n];\n\n/** Used for native method references. */\nvar errorProto = Error.prototype,\n    objectProto = Object.prototype,\n    stringProto = String.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/** Used to avoid iterating over non-enumerable properties in IE < 9. */\nvar nonEnumProps = {};\nnonEnumProps[arrayTag] = nonEnumProps[dateTag] = nonEnumProps[numberTag] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };\nnonEnumProps[boolTag] = nonEnumProps[stringTag] = { 'constructor': true, 'toString': true, 'valueOf': true };\nnonEnumProps[errorTag] = nonEnumProps[funcTag] = nonEnumProps[regexpTag] = { 'constructor': true, 'toString': true };\nnonEnumProps[objectTag] = { 'constructor': true };\n\narrayEach(shadowProps, function(key) {\n  for (var tag in nonEnumProps) {\n    if (hasOwnProperty.call(nonEnumProps, tag)) {\n      var props = nonEnumProps[tag];\n      props[key] = hasOwnProperty.call(props, key);\n    }\n  }\n});\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n  if (object == null) {\n    return [];\n  }\n  if (!isObject(object)) {\n    object = Object(object);\n  }\n  var length = object.length;\n\n  length = (length && isLength(length) &&\n    (isArray(object) || isArguments(object) || isString(object)) && length) || 0;\n\n  var Ctor = object.constructor,\n      index = -1,\n      proto = (isFunction(Ctor) && Ctor.prototype) || objectProto,\n      isProto = proto === object,\n      result = Array(length),\n      skipIndexes = length > 0,\n      skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error),\n      skipProto = support.enumPrototypes && isFunction(object);\n\n  while (++index < length) {\n    result[index] = (index + '');\n  }\n  // lodash skips the `constructor` property when it infers it's iterating\n  // over a `prototype` object because IE < 9 can't set the `[[Enumerable]]`\n  // attribute of an existing property and the `constructor` property of a\n  // prototype defaults to non-enumerable.\n  for (var key in object) {\n    if (!(skipProto && key == 'prototype') &&\n        !(skipErrorProps && (key == 'message' || key == 'name')) &&\n        !(skipIndexes && isIndex(key, length)) &&\n        !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n      result.push(key);\n    }\n  }\n  if (support.nonEnumShadows && object !== objectProto) {\n    var tag = object === stringProto ? stringTag : (object === errorProto ? errorTag : objToString.call(object)),\n        nonEnums = nonEnumProps[tag] || nonEnumProps[objectTag];\n\n    if (tag == objectTag) {\n      proto = objectProto;\n    }\n    length = shadowProps.length;\n    while (length--) {\n      key = shadowProps[length];\n      var nonEnum = nonEnums[key];\n      if (!(isProto && nonEnum) &&\n          (nonEnum ? hasOwnProperty.call(object, key) : object[key] !== proto[key])) {\n        result.push(key);\n      }\n    }\n  }\n  return result;\n}\n\nmodule.exports = keysIn;\n","var baseMerge = require('../internal/baseMerge'),\n    createAssigner = require('../internal/createAssigner');\n\n/**\n * Recursively merges own enumerable properties of the source object(s), that\n * don't resolve to `undefined` into the destination object. Subsequent sources\n * overwrite property assignments of previous sources. If `customizer` is\n * provided it's invoked to produce the merged values of the destination and\n * source properties. If `customizer` returns `undefined` merging is handled\n * by the method instead. The `customizer` is bound to `thisArg` and invoked\n * with five arguments: (objectValue, sourceValue, key, object, source).\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var users = {\n *   'data': [{ 'user': 'barney' }, { 'user': 'fred' }]\n * };\n *\n * var ages = {\n *   'data': [{ 'age': 36 }, { 'age': 40 }]\n * };\n *\n * _.merge(users, ages);\n * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }\n *\n * // using a customizer callback\n * var object = {\n *   'fruits': ['apple'],\n *   'vegetables': ['beet']\n * };\n *\n * var other = {\n *   'fruits': ['banana'],\n *   'vegetables': ['carrot']\n * };\n *\n * _.merge(object, other, function(a, b) {\n *   if (_.isArray(a)) {\n *     return a.concat(b);\n *   }\n * });\n * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }\n */\nvar merge = createAssigner(baseMerge);\n\nmodule.exports = merge;\n","/** Used for native method references. */\nvar arrayProto = Array.prototype,\n    errorProto = Error.prototype,\n    objectProto = Object.prototype;\n\n/** Native method references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable,\n    splice = arrayProto.splice;\n\n/**\n * An object environment feature flags.\n *\n * @static\n * @memberOf _\n * @type Object\n */\nvar support = {};\n\n(function(x) {\n  var Ctor = function() { this.x = x; },\n      object = { '0': x, 'length': x },\n      props = [];\n\n  Ctor.prototype = { 'valueOf': x, 'y': x };\n  for (var key in new Ctor) { props.push(key); }\n\n  /**\n   * Detect if `name` or `message` properties of `Error.prototype` are\n   * enumerable by default (IE < 9, Safari < 5.1).\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') ||\n    propertyIsEnumerable.call(errorProto, 'name');\n\n  /**\n   * Detect if `prototype` properties are enumerable by default.\n   *\n   * Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1\n   * (if the prototype or a property on the prototype has been set)\n   * incorrectly set the `[[Enumerable]]` value of a function's `prototype`\n   * property to `true`.\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.enumPrototypes = propertyIsEnumerable.call(Ctor, 'prototype');\n\n  /**\n   * Detect if properties shadowing those on `Object.prototype` are non-enumerable.\n   *\n   * In IE < 9 an object's own properties, shadowing non-enumerable ones,\n   * are made non-enumerable as well (a.k.a the JScript `[[DontEnum]]` bug).\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.nonEnumShadows = !/valueOf/.test(props);\n\n  /**\n   * Detect if own properties are iterated after inherited properties (IE < 9).\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.ownLast = props[0] != 'x';\n\n  /**\n   * Detect if `Array#shift` and `Array#splice` augment array-like objects\n   * correctly.\n   *\n   * Firefox < 10, compatibility modes of IE 8, and IE < 9 have buggy Array\n   * `shift()` and `splice()` functions that fail to remove the last element,\n   * `value[0]`, of array-like objects even though the \"length\" property is\n   * set to `0`. The `shift()` method is buggy in compatibility modes of IE 8,\n   * while `splice()` is buggy regardless of mode in IE < 9.\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.spliceObjects = (splice.call(object, 0, 1), !object[0]);\n\n  /**\n   * Detect lack of support for accessing string characters by index.\n   *\n   * IE < 8 can't access characters by index. IE 8 can only access characters\n   * by index on string literals, not string objects.\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.unindexedChars = ('x'[0] + Object('x')[0]) != 'xx';\n}(1, 0));\n\nmodule.exports = support;\n","/**\n * This method returns the first argument provided to it.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'user': 'fred' };\n *\n * _.identity(object) === object;\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n","'use strict';\n\n// modified from https://github.com/es-shims/es6-shim\nvar keys = require('object-keys');\nvar canBeObject = function (obj) {\n\treturn typeof obj !== 'undefined' && obj !== null;\n};\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';\nvar defineProperties = require('define-properties');\nvar toObject = Object;\nvar push = Array.prototype.push;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nvar assignShim = function assign(target, source1) {\n\tif (!canBeObject(target)) { throw new TypeError('target must be an object'); }\n\tvar objTarget = toObject(target);\n\tvar s, source, i, props, syms;\n\tfor (s = 1; s < arguments.length; ++s) {\n\t\tsource = toObject(arguments[s]);\n\t\tprops = keys(source);\n\t\tif (hasSymbols && Object.getOwnPropertySymbols) {\n\t\t\tsyms = Object.getOwnPropertySymbols(source);\n\t\t\tfor (i = 0; i < syms.length; ++i) {\n\t\t\t\tif (propIsEnumerable.call(source, syms[i])) {\n\t\t\t\t\tpush.call(props, syms[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (i = 0; i < props.length; ++i) {\n\t\t\tobjTarget[props[i]] = source[props[i]];\n\t\t}\n\t}\n\treturn objTarget;\n};\n\ndefineProperties(assignShim, {\n\tshim: function shimObjectAssign() {\n\t\tvar assignHasPendingExceptions = function () {\n\t\t\tif (!Object.assign || !Object.preventExtensions) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Firefox 37 still has \"pending exception\" logic in its Object.assign implementation,\n\t\t\t// which is 72% slower than our shim, and Firefox 40's native implementation.\n\t\t\tvar thrower = Object.preventExtensions({ 1: 2 });\n\t\t\ttry {\n\t\t\t\tObject.assign(thrower, 'xy');\n\t\t\t} catch (e) {\n\t\t\t\treturn thrower[1] === 'y';\n\t\t\t}\n\t\t};\n\t\tdefineProperties(\n\t\t\tObject,\n\t\t\t{ assign: assignShim },\n\t\t\t{ assign: assignHasPendingExceptions }\n\t\t);\n\t\treturn Object.assign || assignShim;\n\t}\n});\n\nmodule.exports = assignShim;\n","'use strict';\n\nvar keys = require('object-keys');\nvar foreach = require('foreach');\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';\n\nvar toStr = Object.prototype.toString;\n\nvar isFunction = function (fn) {\n\treturn typeof fn === 'function' && toStr.call(fn) === '[object Function]';\n};\n\nvar arePropertyDescriptorsSupported = function () {\n\tvar obj = {};\n\ttry {\n\t\tObject.defineProperty(obj, 'x', { value: obj, enumerable: false });\n        /* eslint-disable no-unused-vars */\n        for (var _ in obj) { return false; }\n        /* eslint-enable no-unused-vars */\n\t\treturn obj.x === obj;\n\t} catch (e) { /* this is IE 8. */\n\t\treturn false;\n\t}\n};\nvar supportsDescriptors = Object.defineProperty && arePropertyDescriptorsSupported();\n\nvar defineProperty = function (object, name, value, predicate) {\n\tif (name in object && (!isFunction(predicate) || !predicate())) {\n\t\treturn;\n\t}\n\tif (supportsDescriptors) {\n\t\tObject.defineProperty(object, name, {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\twritable: true,\n\t\t\tvalue: value\n\t\t});\n\t} else {\n\t\tobject[name] = value;\n\t}\n};\n\nvar defineProperties = function (object, map) {\n\tvar predicates = arguments.length > 2 ? arguments[2] : {};\n\tvar props = keys(map);\n\tif (hasSymbols) {\n\t\tprops = props.concat(Object.getOwnPropertySymbols(map));\n\t}\n\tforeach(props, function (name) {\n\t\tdefineProperty(object, name, map[name], predicates[name]);\n\t});\n};\n\ndefineProperties.supportsDescriptors = !!supportsDescriptors;\n\nmodule.exports = defineProperties;\n","\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar toString = Object.prototype.toString;\n\nmodule.exports = function forEach (obj, fn, ctx) {\n    if (toString.call(fn) !== '[object Function]') {\n        throw new TypeError('iterator must be a function');\n    }\n    var l = obj.length;\n    if (l === +l) {\n        for (var i = 0; i < l; i++) {\n            fn.call(ctx, obj[i], i, obj);\n        }\n    } else {\n        for (var k in obj) {\n            if (hasOwn.call(obj, k)) {\n                fn.call(ctx, obj[k], k, obj);\n            }\n        }\n    }\n};\n\n","'use strict';\n\n// modified from https://github.com/es-shims/es5-shim\nvar has = Object.prototype.hasOwnProperty;\nvar toStr = Object.prototype.toString;\nvar slice = Array.prototype.slice;\nvar isArgs = require('./isArguments');\nvar hasDontEnumBug = !({ 'toString': null }).propertyIsEnumerable('toString');\nvar hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype');\nvar dontEnums = [\n\t'toString',\n\t'toLocaleString',\n\t'valueOf',\n\t'hasOwnProperty',\n\t'isPrototypeOf',\n\t'propertyIsEnumerable',\n\t'constructor'\n];\nvar equalsConstructorPrototype = function (o) {\n\tvar ctor = o.constructor;\n\treturn ctor && ctor.prototype === o;\n};\nvar blacklistedKeys = {\n\t$window: true,\n\t$console: true,\n\t$parent: true,\n\t$self: true,\n\t$frames: true,\n\t$webkitIndexedDB: true,\n\t$webkitStorageInfo: true\n};\nvar hasAutomationEqualityBug = (function () {\n\t/* global window */\n\tif (typeof window === 'undefined') { return false; }\n\tfor (var k in window) {\n\t\tif (!blacklistedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {\n\t\t\ttry {\n\t\t\t\tequalsConstructorPrototype(window[k]);\n\t\t\t} catch (e) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}());\nvar equalsConstructorPrototypeIfNotBuggy = function (o) {\n\t/* global window */\n\tif (typeof window === 'undefined' && !hasAutomationEqualityBug) {\n\t\treturn equalsConstructorPrototype(o);\n\t}\n\ttry {\n\t\treturn equalsConstructorPrototype(o);\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\nvar keysShim = function keys(object) {\n\tvar isObject = object !== null && typeof object === 'object';\n\tvar isFunction = toStr.call(object) === '[object Function]';\n\tvar isArguments = isArgs(object);\n\tvar isString = isObject && toStr.call(object) === '[object String]';\n\tvar theKeys = [];\n\n\tif (!isObject && !isFunction && !isArguments) {\n\t\tthrow new TypeError('Object.keys called on a non-object');\n\t}\n\n\tvar skipProto = hasProtoEnumBug && isFunction;\n\tif (isString && object.length > 0 && !has.call(object, 0)) {\n\t\tfor (var i = 0; i < object.length; ++i) {\n\t\t\ttheKeys.push(String(i));\n\t\t}\n\t}\n\n\tif (isArguments && object.length > 0) {\n\t\tfor (var j = 0; j < object.length; ++j) {\n\t\t\ttheKeys.push(String(j));\n\t\t}\n\t} else {\n\t\tfor (var name in object) {\n\t\t\tif (!(skipProto && name === 'prototype') && has.call(object, name)) {\n\t\t\t\ttheKeys.push(String(name));\n\t\t\t}\n\t\t}\n\t}\n\n\tif (hasDontEnumBug) {\n\t\tvar skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);\n\n\t\tfor (var k = 0; k < dontEnums.length; ++k) {\n\t\t\tif (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {\n\t\t\t\ttheKeys.push(dontEnums[k]);\n\t\t\t}\n\t\t}\n\t}\n\treturn theKeys;\n};\n\nkeysShim.shim = function shimObjectKeys() {\n\tif (!Object.keys) {\n\t\tObject.keys = keysShim;\n\t} else {\n\t\tvar keysWorksWithArguments = (function () {\n\t\t\t// Safari 5.0 bug\n\t\t\treturn (Object.keys(arguments) || '').length === 2;\n\t\t}(1, 2));\n\t\tif (!keysWorksWithArguments) {\n\t\t\tvar originalKeys = Object.keys;\n\t\t\tObject.keys = function keys(object) {\n\t\t\t\tif (isArgs(object)) {\n\t\t\t\t\treturn originalKeys(slice.call(object));\n\t\t\t\t} else {\n\t\t\t\t\treturn originalKeys(object);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n\treturn Object.keys || keysShim;\n};\n\nmodule.exports = keysShim;\n","'use strict';\n\nvar toStr = Object.prototype.toString;\n\nmodule.exports = function isArguments(value) {\n\tvar str = toStr.call(value);\n\tvar isArgs = str === '[object Arguments]';\n\tif (!isArgs) {\n\t\tisArgs = str !== '[object Array]' &&\n\t\t\tvalue !== null &&\n\t\t\ttypeof value === 'object' &&\n\t\t\ttypeof value.length === 'number' &&\n\t\t\tvalue.length >= 0 &&\n\t\t\ttoStr.call(value.callee) === '[object Function]';\n\t}\n\treturn isArgs;\n};\n","module.exports = SafeParseTuple\n\nfunction SafeParseTuple(obj, reviver) {\n    var json\n    var error = null\n\n    try {\n        json = JSON.parse(obj, reviver)\n    } catch (err) {\n        error = err\n    }\n\n    return [error, json]\n}\n","function clean (s) {\n  return s.replace(/\\n\\r?\\s*/g, '')\n}\n\n\nmodule.exports = function tsml (sa) {\n  var s = ''\n    , i = 0\n\n  for (; i < arguments.length; i++)\n    s += clean(sa[i]) + (arguments[i + 1] || '')\n\n  return s\n}","\"use strict\";\nvar window = require(\"global/window\")\nvar once = require(\"once\")\nvar parseHeaders = require(\"parse-headers\")\n\n\n\nmodule.exports = createXHR\ncreateXHR.XMLHttpRequest = window.XMLHttpRequest || noop\ncreateXHR.XDomainRequest = \"withCredentials\" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window.XDomainRequest\n\n\nfunction isEmpty(obj){\n    for(var i in obj){\n        if(obj.hasOwnProperty(i)) return false\n    }\n    return true\n}\n\nfunction createXHR(options, callback) {\n    function readystatechange() {\n        if (xhr.readyState === 4) {\n            loadFunc()\n        }\n    }\n\n    function getBody() {\n        // Chrome with requestType=blob throws errors arround when even testing access to responseText\n        var body = undefined\n\n        if (xhr.response) {\n            body = xhr.response\n        } else if (xhr.responseType === \"text\" || !xhr.responseType) {\n            body = xhr.responseText || xhr.responseXML\n        }\n\n        if (isJson) {\n            try {\n                body = JSON.parse(body)\n            } catch (e) {}\n        }\n\n        return body\n    }\n\n    var failureResponse = {\n                body: undefined,\n                headers: {},\n                statusCode: 0,\n                method: method,\n                url: uri,\n                rawRequest: xhr\n            }\n\n    function errorFunc(evt) {\n        clearTimeout(timeoutTimer)\n        if(!(evt instanceof Error)){\n            evt = new Error(\"\" + (evt || \"Unknown XMLHttpRequest Error\") )\n        }\n        evt.statusCode = 0\n        callback(evt, failureResponse)\n    }\n\n    // will load the data & process the response in a special response object\n    function loadFunc() {\n        if (aborted) return\n        var status\n        clearTimeout(timeoutTimer)\n        if(options.useXDR && xhr.status===undefined) {\n            //IE8 CORS GET successful response doesn't have a status field, but body is fine\n            status = 200\n        } else {\n            status = (xhr.status === 1223 ? 204 : xhr.status)\n        }\n        var response = failureResponse\n        var err = null\n\n        if (status !== 0){\n            response = {\n                body: getBody(),\n                statusCode: status,\n                method: method,\n                headers: {},\n                url: uri,\n                rawRequest: xhr\n            }\n            if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE\n                response.headers = parseHeaders(xhr.getAllResponseHeaders())\n            }\n        } else {\n            err = new Error(\"Internal XMLHttpRequest Error\")\n        }\n        callback(err, response, response.body)\n\n    }\n\n    if (typeof options === \"string\") {\n        options = { uri: options }\n    }\n\n    options = options || {}\n    if(typeof callback === \"undefined\"){\n        throw new Error(\"callback argument missing\")\n    }\n    callback = once(callback)\n\n    var xhr = options.xhr || null\n\n    if (!xhr) {\n        if (options.cors || options.useXDR) {\n            xhr = new createXHR.XDomainRequest()\n        }else{\n            xhr = new createXHR.XMLHttpRequest()\n        }\n    }\n\n    var key\n    var aborted\n    var uri = xhr.url = options.uri || options.url\n    var method = xhr.method = options.method || \"GET\"\n    var body = options.body || options.data\n    var headers = xhr.headers = options.headers || {}\n    var sync = !!options.sync\n    var isJson = false\n    var timeoutTimer\n\n    if (\"json\" in options) {\n        isJson = true\n        headers[\"accept\"] || headers[\"Accept\"] || (headers[\"Accept\"] = \"application/json\") //Don't override existing accept header declared by user\n        if (method !== \"GET\" && method !== \"HEAD\") {\n            headers[\"content-type\"] || headers[\"Content-Type\"] || (headers[\"Content-Type\"] = \"application/json\") //Don't override existing accept header declared by user\n            body = JSON.stringify(options.json)\n        }\n    }\n\n    xhr.onreadystatechange = readystatechange\n    xhr.onload = loadFunc\n    xhr.onerror = errorFunc\n    // IE9 must have onprogress be set to a unique function.\n    xhr.onprogress = function () {\n        // IE must die\n    }\n    xhr.ontimeout = errorFunc\n    xhr.open(method, uri, !sync, options.username, options.password)\n    //has to be after open\n    if(!sync) {\n        xhr.withCredentials = !!options.withCredentials\n    }\n    // Cannot set timeout with sync request\n    // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly\n    // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent\n    if (!sync && options.timeout > 0 ) {\n        timeoutTimer = setTimeout(function(){\n            aborted=true//IE9 may still call readystatechange\n            xhr.abort(\"timeout\")\n            var e = new Error(\"XMLHttpRequest timeout\")\n            e.code = \"ETIMEDOUT\"\n            errorFunc(e)\n        }, options.timeout )\n    }\n\n    if (xhr.setRequestHeader) {\n        for(key in headers){\n            if(headers.hasOwnProperty(key)){\n                xhr.setRequestHeader(key, headers[key])\n            }\n        }\n    } else if (options.headers && !isEmpty(options.headers)) {\n        throw new Error(\"Headers cannot be set on an XDomainRequest object\")\n    }\n\n    if (\"responseType\" in options) {\n        xhr.responseType = options.responseType\n    }\n\n    if (\"beforeSend\" in options &&\n        typeof options.beforeSend === \"function\"\n    ) {\n        options.beforeSend(xhr)\n    }\n\n    xhr.send(body)\n\n    return xhr\n\n\n}\n\nfunction noop() {}\n","module.exports = once\n\nonce.proto = once(function () {\n  Object.defineProperty(Function.prototype, 'once', {\n    value: function () {\n      return once(this)\n    },\n    configurable: true\n  })\n})\n\nfunction once (fn) {\n  var called = false\n  return function () {\n    if (called) return\n    called = true\n    return fn.apply(this, arguments)\n  }\n}\n","var isFunction = require('is-function')\n\nmodule.exports = forEach\n\nvar toString = Object.prototype.toString\nvar hasOwnProperty = Object.prototype.hasOwnProperty\n\nfunction forEach(list, iterator, context) {\n    if (!isFunction(iterator)) {\n        throw new TypeError('iterator must be a function')\n    }\n\n    if (arguments.length < 3) {\n        context = this\n    }\n    \n    if (toString.call(list) === '[object Array]')\n        forEachArray(list, iterator, context)\n    else if (typeof list === 'string')\n        forEachString(list, iterator, context)\n    else\n        forEachObject(list, iterator, context)\n}\n\nfunction forEachArray(array, iterator, context) {\n    for (var i = 0, len = array.length; i < len; i++) {\n        if (hasOwnProperty.call(array, i)) {\n            iterator.call(context, array[i], i, array)\n        }\n    }\n}\n\nfunction forEachString(string, iterator, context) {\n    for (var i = 0, len = string.length; i < len; i++) {\n        // no such thing as a sparse string.\n        iterator.call(context, string.charAt(i), i, string)\n    }\n}\n\nfunction forEachObject(object, iterator, context) {\n    for (var k in object) {\n        if (hasOwnProperty.call(object, k)) {\n            iterator.call(context, object[k], k, object)\n        }\n    }\n}\n","module.exports = isFunction\n\nvar toString = Object.prototype.toString\n\nfunction isFunction (fn) {\n  var string = toString.call(fn)\n  return string === '[object Function]' ||\n    (typeof fn === 'function' && string !== '[object RegExp]') ||\n    (typeof window !== 'undefined' &&\n     // IE8 and below\n     (fn === window.setTimeout ||\n      fn === window.alert ||\n      fn === window.confirm ||\n      fn === window.prompt))\n};\n","\nexports = module.exports = trim;\n\nfunction trim(str){\n  return str.replace(/^\\s*|\\s*$/g, '');\n}\n\nexports.left = function(str){\n  return str.replace(/^\\s*/, '');\n};\n\nexports.right = function(str){\n  return str.replace(/\\s*$/, '');\n};\n","var trim = require('trim')\n  , forEach = require('for-each')\n  , isArray = function(arg) {\n      return Object.prototype.toString.call(arg) === '[object Array]';\n    }\n\nmodule.exports = function (headers) {\n  if (!headers)\n    return {}\n\n  var result = {}\n\n  forEach(\n      trim(headers).split('\\n')\n    , function (row) {\n        var index = row.indexOf(':')\n          , key = trim(row.slice(0, index)).toLowerCase()\n          , value = trim(row.slice(index + 1))\n\n        if (typeof(result[key]) === 'undefined') {\n          result[key] = value\n        } else if (isArray(result[key])) {\n          result[key].push(value)\n        } else {\n          result[key] = [ result[key], value ]\n        }\n      }\n  )\n\n  return result\n}","/**\n * @file big-play-button.js\n */\nimport Button from './button.js';\nimport Component from './component.js';\n\n/**\n * Initial play button. Shows before the video has played. The hiding of the\n * big play button is done via CSS and player states.\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @extends Button\n * @class BigPlayButton\n */\nclass BigPlayButton extends Button {\n\n  constructor(player, options) {\n    super(player, options);\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return 'vjs-big-play-button';\n  }\n\n  /**\n   * Handles click for play\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    this.player_.play();\n  }\n\n}\n\nBigPlayButton.prototype.controlText_ = 'Play Video';\n\nComponent.registerComponent('BigPlayButton', BigPlayButton);\nexport default BigPlayButton;\n","/**\n * @file button.js\n */\nimport Component from './component';\nimport * as Dom from './utils/dom.js';\nimport * as Events from './utils/events.js';\nimport * as Fn from './utils/fn.js';\nimport document from 'global/document';\nimport assign from 'object.assign';\n\n/**\n * Base class for all buttons\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @extends Component\n * @class Button\n */\nclass Button extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n\n    this.emitTapEvents();\n\n    this.on('tap', this.handleClick);\n    this.on('click', this.handleClick);\n    this.on('focus', this.handleFocus);\n    this.on('blur', this.handleBlur);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @param {String=} type Element's node type. e.g. 'div'\n   * @param {Object=} props An object of element attributes that should be set on the element Tag name\n   * @return {Element}\n   * @method createEl\n   */\n  createEl(tag='button', props={}, attributes={}) {\n    props = assign({\n      className: this.buildCSSClass(),\n      tabIndex: 0\n    }, props);\n\n    // Add standard Aria info\n    attributes = assign({\n      role: 'button',\n      type: 'button', // Necessary since the default button type is \"submit\"\n      'aria-live': 'polite' // let the screen reader user know that the text of the button may change\n    }, attributes);\n\n    let el = super.createEl(tag, props, attributes);\n\n    this.controlTextEl_ = Dom.createEl('span', {\n      className: 'vjs-control-text'\n    });\n\n    el.appendChild(this.controlTextEl_);\n\n    this.controlText(this.controlText_);\n\n    return el;\n  }\n\n  /**\n   * Controls text - both request and localize\n   *\n   * @param {String} text Text for button\n   * @return {String}\n   * @method controlText\n   */\n  controlText(text) {\n    if (!text) return this.controlText_ || 'Need Text';\n\n    this.controlText_ = text;\n    this.controlTextEl_.innerHTML = this.localize(this.controlText_);\n\n    return this;\n  }\n\n  /**\n   * Allows sub components to stack CSS class names\n   *\n   * @return {String}\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-control vjs-button ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Handle Click - Override with specific functionality for button\n   *\n   * @method handleClick\n   */\n  handleClick() {}\n\n  /**\n   * Handle Focus - Add keyboard functionality to element\n   *\n   * @method handleFocus\n   */\n  handleFocus() {\n    Events.on(document, 'keydown', Fn.bind(this, this.handleKeyPress));\n  }\n\n  /**\n   * Handle KeyPress (document level) - Trigger click when keys are pressed\n   *\n   * @method handleKeyPress\n   */\n  handleKeyPress(event) {\n    // Check for space bar (32) or enter (13) keys\n    if (event.which === 32 || event.which === 13) {\n      event.preventDefault();\n      this.handleClick(event);\n    }\n  }\n\n  /**\n   * Handle Blur - Remove keyboard triggers\n   *\n   * @method handleBlur\n   */\n  handleBlur() {\n    Events.off(document, 'keydown', Fn.bind(this, this.handleKeyPress));\n  }\n\n}\n\n\nComponent.registerComponent('Button', Button);\nexport default Button;\n","/**\n * @file component.js\n *\n * Player Component - Base class for all UI objects\n */\n\nimport window from 'global/window';\nimport * as Dom from './utils/dom.js';\nimport * as Fn from './utils/fn.js';\nimport * as Guid from './utils/guid.js';\nimport * as Events from './utils/events.js';\nimport log from './utils/log.js';\nimport toTitleCase from './utils/to-title-case.js';\nimport assign from 'object.assign';\nimport mergeOptions from './utils/merge-options.js';\n\n\n/**\n * Base UI Component class\n * Components are embeddable UI objects that are represented by both a\n * javascript object and an element in the DOM. They can be children of other\n * components, and can have many children themselves.\n * ```js\n *     // adding a button to the player\n *     var button = player.addChild('button');\n *     button.el(); // -> button element\n * ```\n * ```html\n *     <div class=\"video-js\">\n *       <div class=\"vjs-button\">Button</div>\n *     </div>\n * ```\n * Components are also event targets.\n * ```js\n *     button.on('click', function(){\n *       console.log('Button Clicked!');\n *     });\n *     button.trigger('customevent');\n * ```\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @class Component\n */\nclass Component {\n\n  constructor(player, options, ready) {\n\n    // The component might be the player itself and we can't pass `this` to super\n    if (!player && this.play) {\n      this.player_ = player = this; // eslint-disable-line\n    } else {\n      this.player_ = player;\n    }\n\n    // Make a copy of prototype.options_ to protect against overriding defaults\n    this.options_ = mergeOptions({}, this.options_);\n\n    // Updated options with supplied options\n    options = this.options_ = mergeOptions(this.options_, options);\n\n    // Get ID from options or options element if one is supplied\n    this.id_ = options.id || (options.el && options.el.id);\n\n    // If there was no ID from the options, generate one\n    if (!this.id_) {\n      // Don't require the player ID function in the case of mock players\n      let id = player && player.id && player.id() || 'no_player';\n\n      this.id_ = `${id}_component_${Guid.newGUID()}`;\n    }\n\n    this.name_ = options.name || null;\n\n    // Create element if one wasn't provided in options\n    if (options.el) {\n      this.el_ = options.el;\n    } else if (options.createEl !== false) {\n      this.el_ = this.createEl();\n    }\n\n    this.children_ = [];\n    this.childIndex_ = {};\n    this.childNameIndex_ = {};\n\n    // Add any child components in options\n    if (options.initChildren !== false) {\n      this.initChildren();\n    }\n\n    this.ready(ready);\n    // Don't want to trigger ready here or it will before init is actually\n    // finished for all children that run this constructor\n\n    if (options.reportTouchActivity !== false) {\n      this.enableTouchActivity();\n    }\n  }\n\n  /**\n   * Dispose of the component and all child components\n   *\n   * @method dispose\n   */\n  dispose() {\n    this.trigger({ type: 'dispose', bubbles: false });\n\n    // Dispose all children.\n    if (this.children_) {\n      for (let i = this.children_.length - 1; i >= 0; i--) {\n        if (this.children_[i].dispose) {\n          this.children_[i].dispose();\n        }\n      }\n    }\n\n    // Delete child references\n    this.children_ = null;\n    this.childIndex_ = null;\n    this.childNameIndex_ = null;\n\n    // Remove all event listeners.\n    this.off();\n\n    // Remove element from DOM\n    if (this.el_.parentNode) {\n      this.el_.parentNode.removeChild(this.el_);\n    }\n\n    Dom.removeElData(this.el_);\n    this.el_ = null;\n  }\n\n  /**\n   * Return the component's player\n   *\n   * @return {Player}\n   * @method player\n   */\n  player() {\n    return this.player_;\n  }\n\n  /**\n   * Deep merge of options objects\n   * Whenever a property is an object on both options objects\n   * the two properties will be merged using mergeOptions.\n   *\n   * ```js\n   *     Parent.prototype.options_ = {\n   *       optionSet: {\n   *         'childOne': { 'foo': 'bar', 'asdf': 'fdsa' },\n   *         'childTwo': {},\n   *         'childThree': {}\n   *       }\n   *     }\n   *     newOptions = {\n   *       optionSet: {\n   *         'childOne': { 'foo': 'baz', 'abc': '123' }\n   *         'childTwo': null,\n   *         'childFour': {}\n   *       }\n   *     }\n   *\n   *     this.options(newOptions);\n   * ```\n   * RESULT\n   * ```js\n   *     {\n   *       optionSet: {\n   *         'childOne': { 'foo': 'baz', 'asdf': 'fdsa', 'abc': '123' },\n   *         'childTwo': null, // Disabled. Won't be initialized.\n   *         'childThree': {},\n   *         'childFour': {}\n   *       }\n   *     }\n   * ```\n   *\n   * @param  {Object} obj Object of new option values\n   * @return {Object}     A NEW object of this.options_ and obj merged\n   * @method options\n   */\n  options(obj) {\n    log.warn('this.options() has been deprecated and will be moved to the constructor in 6.0');\n\n    if (!obj) {\n      return this.options_;\n    }\n\n    this.options_ = mergeOptions(this.options_, obj);\n    return this.options_;\n  }\n\n  /**\n   * Get the component's DOM element\n   * ```js\n   *     var domEl = myComponent.el();\n   * ```\n   *\n   * @return {Element}\n   * @method el\n   */\n  el() {\n    return this.el_;\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @param  {String=} tagName  Element's node type. e.g. 'div'\n   * @param  {Object=} properties An object of properties that should be set\n   * @param  {Object=} attributes An object of attributes that should be set\n   * @return {Element}\n   * @method createEl\n   */\n  createEl(tagName, properties, attributes) {\n    return Dom.createEl(tagName, properties, attributes);\n  }\n\n  localize(string) {\n    let code = this.player_.language && this.player_.language();\n    let languages = this.player_.languages && this.player_.languages();\n\n    if (!code || !languages) {\n      return string;\n    }\n\n    let language = languages[code];\n\n    if (language && language[string]) {\n      return language[string];\n    }\n\n    let primaryCode = code.split('-')[0];\n    let primaryLang = languages[primaryCode];\n\n    if (primaryLang && primaryLang[string]) {\n      return primaryLang[string];\n    }\n\n    return string;\n  }\n\n  /**\n   * Return the component's DOM element where children are inserted.\n   * Will either be the same as el() or a new element defined in createEl().\n   *\n   * @return {Element}\n   * @method contentEl\n   */\n  contentEl() {\n    return this.contentEl_ || this.el_;\n  }\n\n  /**\n   * Get the component's ID\n   * ```js\n   *     var id = myComponent.id();\n   * ```\n   *\n   * @return {String}\n   * @method id\n   */\n  id() {\n    return this.id_;\n  }\n\n  /**\n   * Get the component's name. The name is often used to reference the component.\n   * ```js\n   *     var name = myComponent.name();\n   * ```\n   *\n   * @return {String}\n   * @method name\n   */\n  name() {\n    return this.name_;\n  }\n\n  /**\n   * Get an array of all child components\n   * ```js\n   *     var kids = myComponent.children();\n   * ```\n   *\n   * @return {Array} The children\n   * @method children\n   */\n  children() {\n    return this.children_;\n  }\n\n  /**\n   * Returns a child component with the provided ID\n   *\n   * @return {Component}\n   * @method getChildById\n   */\n  getChildById(id) {\n    return this.childIndex_[id];\n  }\n\n  /**\n   * Returns a child component with the provided name\n   *\n   * @return {Component}\n   * @method getChild\n   */\n  getChild(name) {\n    return this.childNameIndex_[name];\n  }\n\n  /**\n   * Adds a child component inside this component\n   * ```js\n   *     myComponent.el();\n   *     // -> <div class='my-component'></div>\n   *     myComponent.children();\n   *     // [empty array]\n   *\n   *     var myButton = myComponent.addChild('MyButton');\n   *     // -> <div class='my-component'><div class=\"my-button\">myButton<div></div>\n   *     // -> myButton === myComponent.children()[0];\n   * ```\n   * Pass in options for child constructors and options for children of the child\n   * ```js\n   *     var myButton = myComponent.addChild('MyButton', {\n   *       text: 'Press Me',\n   *       buttonChildExample: {\n   *         buttonChildOption: true\n   *       }\n   *     });\n   * ```\n   *\n   * @param {String|Component} child The class name or instance of a child to add\n   * @param {Object=} options Options, including options to be passed to children of the child.\n   * @return {Component} The child component (created by this process if a string was used)\n   * @method addChild\n   */\n  addChild(child, options={}) {\n    let component;\n    let componentName;\n\n    // If child is a string, create nt with options\n    if (typeof child === 'string') {\n      componentName = child;\n\n      // Options can also be specified as a boolean, so convert to an empty object if false.\n      if (!options) {\n        options = {};\n      }\n\n      // Same as above, but true is deprecated so show a warning.\n      if (options === true) {\n        log.warn('Initializing a child component with `true` is deprecated. Children should be defined in an array when possible, but if necessary use an object instead of `true`.');\n        options = {};\n      }\n\n      // If no componentClass in options, assume componentClass is the name lowercased\n      // (e.g. playButton)\n      let componentClassName = options.componentClass || toTitleCase(componentName);\n\n      // Set name through options\n      options.name = componentName;\n\n      // Create a new object & element for this controls set\n      // If there's no .player_, this is a player\n      let ComponentClass = Component.getComponent(componentClassName);\n\n      component = new ComponentClass(this.player_ || this, options);\n\n    // child is a component instance\n    } else {\n      component = child;\n    }\n\n    this.children_.push(component);\n\n    if (typeof component.id === 'function') {\n      this.childIndex_[component.id()] = component;\n    }\n\n    // If a name wasn't used to create the component, check if we can use the\n    // name function of the component\n    componentName = componentName || (component.name && component.name());\n\n    if (componentName) {\n      this.childNameIndex_[componentName] = component;\n    }\n\n    // Add the UI object's element to the container div (box)\n    // Having an element is not required\n    if (typeof component.el === 'function' && component.el()) {\n      this.contentEl().appendChild(component.el());\n    }\n\n    // Return so it can stored on parent object if desired.\n    return component;\n  }\n\n  /**\n   * Remove a child component from this component's list of children, and the\n   * child component's element from this component's element\n   *\n   * @param  {Component} component Component to remove\n   * @method removeChild\n   */\n  removeChild(component) {\n    if (typeof component === 'string') {\n      component = this.getChild(component);\n    }\n\n    if (!component || !this.children_) {\n      return;\n    }\n\n    let childFound = false;\n\n    for (let i = this.children_.length - 1; i >= 0; i--) {\n      if (this.children_[i] === component) {\n        childFound = true;\n        this.children_.splice(i, 1);\n        break;\n      }\n    }\n\n    if (!childFound) {\n      return;\n    }\n\n    this.childIndex_[component.id()] = null;\n    this.childNameIndex_[component.name()] = null;\n\n    let compEl = component.el();\n\n    if (compEl && compEl.parentNode === this.contentEl()) {\n      this.contentEl().removeChild(component.el());\n    }\n  }\n\n  /**\n   * Add and initialize default child components from options\n   * ```js\n   *     // when an instance of MyComponent is created, all children in options\n   *     // will be added to the instance by their name strings and options\n   *     MyComponent.prototype.options_ = {\n   *       children: [\n   *         'myChildComponent'\n   *       ],\n   *       myChildComponent: {\n   *         myChildOption: true\n   *       }\n   *     };\n   *\n   *     // Or when creating the component\n   *     var myComp = new MyComponent(player, {\n   *       children: [\n   *         'myChildComponent'\n   *       ],\n   *       myChildComponent: {\n   *         myChildOption: true\n   *       }\n   *     });\n   * ```\n   * The children option can also be an array of\n   * child options objects (that also include a 'name' key).\n   * This can be used if you have two child components of the\n   * same type that need different options.\n   * ```js\n   *     var myComp = new MyComponent(player, {\n   *       children: [\n   *         'button',\n   *         {\n   *           name: 'button',\n   *           someOtherOption: true\n   *         },\n   *         {\n   *           name: 'button',\n   *           someOtherOption: false\n   *         }\n   *       ]\n   *     });\n   * ```\n   *\n   * @method initChildren\n   */\n  initChildren() {\n    let children = this.options_.children;\n\n    if (children) {\n      // `this` is `parent`\n      let parentOptions = this.options_;\n\n      let handleAdd = (name, opts) => {\n        // Allow options for children to be set at the parent options\n        // e.g. videojs(id, { controlBar: false });\n        // instead of videojs(id, { children: { controlBar: false });\n        if (parentOptions[name] !== undefined) {\n          opts = parentOptions[name];\n        }\n\n        // Allow for disabling default components\n        // e.g. options['children']['posterImage'] = false\n        if (opts === false) {\n          return;\n        }\n\n        // Allow options to be passed as a simple boolean if no configuration\n        // is necessary.\n        if (opts === true) {\n          opts = {};\n        }\n\n        // We also want to pass the original player options to each component as well so they don't need to\n        // reach back into the player for options later.\n        opts.playerOptions = this.options_.playerOptions;\n\n        // Create and add the child component.\n        // Add a direct reference to the child by name on the parent instance.\n        // If two of the same component are used, different names should be supplied\n        // for each\n        this[name] = this.addChild(name, opts);\n      };\n\n      // Allow for an array of children details to passed in the options\n      if (Array.isArray(children)) {\n        for (let i = 0; i < children.length; i++) {\n          let child = children[i];\n          let name;\n          let opts;\n\n          if (typeof child === 'string') {\n            // ['myComponent']\n            name = child;\n            opts = {};\n          } else {\n            // [{ name: 'myComponent', otherOption: true }]\n            name = child.name;\n            opts = child;\n          }\n\n          handleAdd(name, opts);\n        }\n      } else {\n        Object.getOwnPropertyNames(children).forEach(function(name){\n          handleAdd(name, children[name]);\n        });\n      }\n    }\n  }\n\n  /**\n   * Allows sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    // Child classes can include a function that does:\n    // return 'CLASS NAME' + this._super();\n    return '';\n  }\n\n  /**\n   * Add an event listener to this component's element\n   * ```js\n   *     var myFunc = function(){\n   *       var myComponent = this;\n   *       // Do something when the event is fired\n   *     };\n   *\n   *     myComponent.on('eventType', myFunc);\n   * ```\n   * The context of myFunc will be myComponent unless previously bound.\n   * Alternatively, you can add a listener to another element or component.\n   * ```js\n   *     myComponent.on(otherElement, 'eventName', myFunc);\n   *     myComponent.on(otherComponent, 'eventName', myFunc);\n   * ```\n   * The benefit of using this over `VjsEvents.on(otherElement, 'eventName', myFunc)`\n   * and `otherComponent.on('eventName', myFunc)` is that this way the listeners\n   * will be automatically cleaned up when either component is disposed.\n   * It will also bind myComponent as the context of myFunc.\n   * **NOTE**: When using this on elements in the page other than window\n   * and document (both permanent), if you remove the element from the DOM\n   * you need to call `myComponent.trigger(el, 'dispose')` on it to clean up\n   * references to it and allow the browser to garbage collect it.\n   *\n   * @param  {String|Component} first   The event type or other component\n   * @param  {Function|String}      second  The event handler or event type\n   * @param  {Function}             third   The event handler\n   * @return {Component}\n   * @method on\n   */\n  on(first, second, third) {\n    if (typeof first === 'string' || Array.isArray(first)) {\n      Events.on(this.el_, first, Fn.bind(this, second));\n\n    // Targeting another component or element\n    } else {\n      const target = first;\n      const type = second;\n      const fn = Fn.bind(this, third);\n\n      // When this component is disposed, remove the listener from the other component\n      const removeOnDispose = () => this.off(target, type, fn);\n\n      // Use the same function ID so we can remove it later it using the ID\n      // of the original listener\n      removeOnDispose.guid = fn.guid;\n      this.on('dispose', removeOnDispose);\n\n      // If the other component is disposed first we need to clean the reference\n      // to the other component in this component's removeOnDispose listener\n      // Otherwise we create a memory leak.\n      const cleanRemover = () => this.off('dispose', removeOnDispose);\n\n      // Add the same function ID so we can easily remove it later\n      cleanRemover.guid = fn.guid;\n\n      // Check if this is a DOM node\n      if (first.nodeName) {\n        // Add the listener to the other element\n        Events.on(target, type, fn);\n        Events.on(target, 'dispose', cleanRemover);\n\n      // Should be a component\n      // Not using `instanceof Component` because it makes mock players difficult\n      } else if (typeof first.on === 'function') {\n        // Add the listener to the other component\n        target.on(type, fn);\n        target.on('dispose', cleanRemover);\n      }\n    }\n\n    return this;\n  }\n\n  /**\n   * Remove an event listener from this component's element\n   * ```js\n   *     myComponent.off('eventType', myFunc);\n   * ```\n   * If myFunc is excluded, ALL listeners for the event type will be removed.\n   * If eventType is excluded, ALL listeners will be removed from the component.\n   * Alternatively you can use `off` to remove listeners that were added to other\n   * elements or components using `myComponent.on(otherComponent...`.\n   * In this case both the event type and listener function are REQUIRED.\n   * ```js\n   *     myComponent.off(otherElement, 'eventType', myFunc);\n   *     myComponent.off(otherComponent, 'eventType', myFunc);\n   * ```\n   *\n   * @param  {String=|Component}  first  The event type or other component\n   * @param  {Function=|String}       second The listener function or event type\n   * @param  {Function=}              third  The listener for other component\n   * @return {Component}\n   * @method off\n   */\n  off(first, second, third) {\n    if (!first || typeof first === 'string' || Array.isArray(first)) {\n      Events.off(this.el_, first, second);\n    } else {\n      const target = first;\n      const type = second;\n      // Ensure there's at least a guid, even if the function hasn't been used\n      const fn = Fn.bind(this, third);\n\n      // Remove the dispose listener on this component,\n      // which was given the same guid as the event listener\n      this.off('dispose', fn);\n\n      if (first.nodeName) {\n        // Remove the listener\n        Events.off(target, type, fn);\n        // Remove the listener for cleaning the dispose listener\n        Events.off(target, 'dispose', fn);\n      } else {\n        target.off(type, fn);\n        target.off('dispose', fn);\n      }\n    }\n\n    return this;\n  }\n\n  /**\n   * Add an event listener to be triggered only once and then removed\n   * ```js\n   *     myComponent.one('eventName', myFunc);\n   * ```\n   * Alternatively you can add a listener to another element or component\n   * that will be triggered only once.\n   * ```js\n   *     myComponent.one(otherElement, 'eventName', myFunc);\n   *     myComponent.one(otherComponent, 'eventName', myFunc);\n   * ```\n   *\n   * @param  {String|Component}  first   The event type or other component\n   * @param  {Function|String}       second  The listener function or event type\n   * @param  {Function=}             third   The listener function for other component\n   * @return {Component}\n   * @method one\n   */\n  one(first, second, third) {\n    if (typeof first === 'string' || Array.isArray(first)) {\n      Events.one(this.el_, first, Fn.bind(this, second));\n    } else {\n      const target = first;\n      const type = second;\n      const fn = Fn.bind(this, third);\n\n      const newFunc = () => {\n        this.off(target, type, newFunc);\n        fn.apply(null, arguments);\n      };\n\n      // Keep the same function ID so we can remove it later\n      newFunc.guid = fn.guid;\n\n      this.on(target, type, newFunc);\n    }\n\n    return this;\n  }\n\n  /**\n   * Trigger an event on an element\n   * ```js\n   *     myComponent.trigger('eventName');\n   *     myComponent.trigger({'type':'eventName'});\n   *     myComponent.trigger('eventName', {data: 'some data'});\n   *     myComponent.trigger({'type':'eventName'}, {data: 'some data'});\n   * ```\n   *\n   * @param  {Event|Object|String} event  A string (the type) or an event object with a type attribute\n   * @param  {Object} [hash] data hash to pass along with the event\n   * @return {Component}       self\n   * @method trigger\n   */\n  trigger(event, hash) {\n    Events.trigger(this.el_, event, hash);\n    return this;\n  }\n\n  /**\n   * Bind a listener to the component's ready state.\n   * Different from event listeners in that if the ready event has already happened\n   * it will trigger the function immediately.\n   *\n   * @param  {Function} fn Ready listener\n   * @param  {Boolean} sync Exec the listener synchronously if component is ready\n   * @return {Component}\n   * @method ready\n   */\n  ready(fn, sync=false) {\n    if (fn) {\n      if (this.isReady_) {\n        if (sync) {\n          fn.call(this);\n        } else {\n          // Call the function asynchronously by default for consistency\n          this.setTimeout(fn, 1);\n        }\n      } else {\n        this.readyQueue_ = this.readyQueue_ || [];\n        this.readyQueue_.push(fn);\n      }\n    }\n    return this;\n  }\n\n  /**\n   * Trigger the ready listeners\n   *\n   * @return {Component}\n   * @method triggerReady\n   */\n  triggerReady() {\n    this.isReady_ = true;\n\n    // Ensure ready is triggerd asynchronously\n    this.setTimeout(function(){\n      let readyQueue = this.readyQueue_;\n\n      // Reset Ready Queue\n      this.readyQueue_ = [];\n\n      if (readyQueue && readyQueue.length > 0) {\n        readyQueue.forEach(function(fn){\n          fn.call(this);\n        }, this);\n      }\n\n      // Allow for using event listeners also\n      this.trigger('ready');\n    }, 1);\n  }\n\n  /**\n   * Check if a component's element has a CSS class name\n   *\n   * @param {String} classToCheck Classname to check\n   * @return {Component}\n   * @method hasClass\n   */\n  hasClass(classToCheck) {\n    return Dom.hasElClass(this.el_, classToCheck);\n  }\n\n  /**\n   * Add a CSS class name to the component's element\n   *\n   * @param {String} classToAdd Classname to add\n   * @return {Component}\n   * @method addClass\n   */\n  addClass(classToAdd) {\n    Dom.addElClass(this.el_, classToAdd);\n    return this;\n  }\n\n  /**\n   * Remove and return a CSS class name from the component's element\n   *\n   * @param {String} classToRemove Classname to remove\n   * @return {Component}\n   * @method removeClass\n   */\n  removeClass(classToRemove) {\n    Dom.removeElClass(this.el_, classToRemove);\n    return this;\n  }\n\n  /**\n   * Show the component element if hidden\n   *\n   * @return {Component}\n   * @method show\n   */\n  show() {\n    this.removeClass('vjs-hidden');\n    return this;\n  }\n\n  /**\n   * Hide the component element if currently showing\n   *\n   * @return {Component}\n   * @method hide\n   */\n  hide() {\n    this.addClass('vjs-hidden');\n    return this;\n  }\n\n  /**\n   * Lock an item in its visible state\n   * To be used with fadeIn/fadeOut.\n   *\n   * @return {Component}\n   * @private\n   * @method lockShowing\n   */\n  lockShowing() {\n    this.addClass('vjs-lock-showing');\n    return this;\n  }\n\n  /**\n   * Unlock an item to be hidden\n   * To be used with fadeIn/fadeOut.\n   *\n   * @return {Component}\n   * @private\n   * @method unlockShowing\n   */\n  unlockShowing() {\n    this.removeClass('vjs-lock-showing');\n    return this;\n  }\n\n  /**\n   * Set or get the width of the component (CSS values)\n   * Setting the video tag dimension values only works with values in pixels.\n   * Percent values will not work.\n   * Some percents can be used, but width()/height() will return the number + %,\n   * not the actual computed width/height.\n   *\n   * @param  {Number|String=} num   Optional width number\n   * @param  {Boolean} skipListeners Skip the 'resize' event trigger\n   * @return {Component} This component, when setting the width\n   * @return {Number|String} The width, when getting\n   * @method width\n   */\n  width(num, skipListeners) {\n    return this.dimension('width', num, skipListeners);\n  }\n\n  /**\n   * Get or set the height of the component (CSS values)\n   * Setting the video tag dimension values only works with values in pixels.\n   * Percent values will not work.\n   * Some percents can be used, but width()/height() will return the number + %,\n   * not the actual computed width/height.\n   *\n   * @param  {Number|String=} num     New component height\n   * @param  {Boolean=} skipListeners Skip the resize event trigger\n   * @return {Component} This component, when setting the height\n   * @return {Number|String} The height, when getting\n   * @method height\n   */\n  height(num, skipListeners) {\n    return this.dimension('height', num, skipListeners);\n  }\n\n  /**\n   * Set both width and height at the same time\n   *\n   * @param  {Number|String} width Width of player\n   * @param  {Number|String} height Height of player\n   * @return {Component} The component\n   * @method dimensions\n   */\n  dimensions(width, height) {\n    // Skip resize listeners on width for optimization\n    return this.width(width, true).height(height);\n  }\n\n  /**\n   * Get or set width or height\n   * This is the shared code for the width() and height() methods.\n   * All for an integer, integer + 'px' or integer + '%';\n   * Known issue: Hidden elements officially have a width of 0. We're defaulting\n   * to the style.width value and falling back to computedStyle which has the\n   * hidden element issue. Info, but probably not an efficient fix:\n   * http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/\n   *\n   * @param  {String} widthOrHeight  'width' or 'height'\n   * @param  {Number|String=} num     New dimension\n   * @param  {Boolean=} skipListeners Skip resize event trigger\n   * @return {Component} The component if a dimension was set\n   * @return {Number|String} The dimension if nothing was set\n   * @private\n   * @method dimension\n   */\n  dimension(widthOrHeight, num, skipListeners) {\n    if (num !== undefined) {\n      // Set to zero if null or literally NaN (NaN !== NaN)\n      if (num === null || num !== num) {\n        num = 0;\n      }\n\n      // Check if using css width/height (% or px) and adjust\n      if (('' + num).indexOf('%') !== -1 || ('' + num).indexOf('px') !== -1) {\n        this.el_.style[widthOrHeight] = num;\n      } else if (num === 'auto') {\n        this.el_.style[widthOrHeight] = '';\n      } else {\n        this.el_.style[widthOrHeight] = num + 'px';\n      }\n\n      // skipListeners allows us to avoid triggering the resize event when setting both width and height\n      if (!skipListeners) {\n        this.trigger('resize');\n      }\n\n      // Return component\n      return this;\n    }\n\n    // Not setting a value, so getting it\n    // Make sure element exists\n    if (!this.el_) {\n      return 0;\n    }\n\n    // Get dimension value from style\n    let val = this.el_.style[widthOrHeight];\n    let pxIndex = val.indexOf('px');\n\n    if (pxIndex !== -1) {\n      // Return the pixel value with no 'px'\n      return parseInt(val.slice(0, pxIndex), 10);\n    }\n\n    // No px so using % or no style was set, so falling back to offsetWidth/height\n    // If component has display:none, offset will return 0\n    // TODO: handle display:none and no dimension style using px\n    return parseInt(this.el_['offset' + toTitleCase(widthOrHeight)], 10);\n  }\n\n  /**\n   * Emit 'tap' events when touch events are supported\n   * This is used to support toggling the controls through a tap on the video.\n   * We're requiring them to be enabled because otherwise every component would\n   * have this extra overhead unnecessarily, on mobile devices where extra\n   * overhead is especially bad.\n   *\n   * @private\n   * @method emitTapEvents\n   */\n  emitTapEvents() {\n    // Track the start time so we can determine how long the touch lasted\n    let touchStart = 0;\n    let firstTouch = null;\n\n    // Maximum movement allowed during a touch event to still be considered a tap\n    // Other popular libs use anywhere from 2 (hammer.js) to 15, so 10 seems like a nice, round number.\n    const tapMovementThreshold = 10;\n\n    // The maximum length a touch can be while still being considered a tap\n    const touchTimeThreshold = 200;\n\n    let couldBeTap;\n\n    this.on('touchstart', function(event) {\n      // If more than one finger, don't consider treating this as a click\n      if (event.touches.length === 1) {\n        // Copy the touches object to prevent modifying the original\n        firstTouch = assign({}, event.touches[0]);\n        // Record start time so we can detect a tap vs. \"touch and hold\"\n        touchStart = new Date().getTime();\n        // Reset couldBeTap tracking\n        couldBeTap = true;\n      }\n    });\n\n    this.on('touchmove', function(event) {\n      // If more than one finger, don't consider treating this as a click\n      if (event.touches.length > 1) {\n        couldBeTap = false;\n      } else if (firstTouch) {\n        // Some devices will throw touchmoves for all but the slightest of taps.\n        // So, if we moved only a small distance, this could still be a tap\n        const xdiff = event.touches[0].pageX - firstTouch.pageX;\n        const ydiff = event.touches[0].pageY - firstTouch.pageY;\n        const touchDistance = Math.sqrt(xdiff  * xdiff + ydiff  * ydiff);\n\n        if (touchDistance > tapMovementThreshold) {\n          couldBeTap = false;\n        }\n      }\n    });\n\n    const noTap = function() {\n      couldBeTap = false;\n    };\n\n    // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s\n    this.on('touchleave', noTap);\n    this.on('touchcancel', noTap);\n\n    // When the touch ends, measure how long it took and trigger the appropriate\n    // event\n    this.on('touchend', function(event) {\n      firstTouch = null;\n      // Proceed only if the touchmove/leave/cancel event didn't happen\n      if (couldBeTap === true) {\n        // Measure how long the touch lasted\n        const touchTime = new Date().getTime() - touchStart;\n\n        // Make sure the touch was less than the threshold to be considered a tap\n        if (touchTime < touchTimeThreshold) {\n          // Don't let browser turn this into a click\n          event.preventDefault();\n          this.trigger('tap');\n          // It may be good to copy the touchend event object and change the\n          // type to tap, if the other event properties aren't exact after\n          // Events.fixEvent runs (e.g. event.target)\n        }\n      }\n    });\n  }\n\n  /**\n   * Report user touch activity when touch events occur\n   * User activity is used to determine when controls should show/hide. It's\n   * relatively simple when it comes to mouse events, because any mouse event\n   * should show the controls. So we capture mouse events that bubble up to the\n   * player and report activity when that happens.\n   * With touch events it isn't as easy. We can't rely on touch events at the\n   * player level, because a tap (touchstart + touchend) on the video itself on\n   * mobile devices is meant to turn controls off (and on). User activity is\n   * checked asynchronously, so what could happen is a tap event on the video\n   * turns the controls off, then the touchend event bubbles up to the player,\n   * which if it reported user activity, would turn the controls right back on.\n   * (We also don't want to completely block touch events from bubbling up)\n   * Also a touchmove, touch+hold, and anything other than a tap is not supposed\n   * to turn the controls back on on a mobile device.\n   * Here we're setting the default component behavior to report user activity\n   * whenever touch events happen, and this can be turned off by components that\n   * want touch events to act differently.\n   *\n   * @method enableTouchActivity\n   */\n  enableTouchActivity() {\n    // Don't continue if the root player doesn't support reporting user activity\n    if (!this.player() || !this.player().reportUserActivity) {\n      return;\n    }\n\n    // listener for reporting that the user is active\n    const report = Fn.bind(this.player(), this.player().reportUserActivity);\n\n    let touchHolding;\n\n    this.on('touchstart', function() {\n      report();\n      // For as long as the they are touching the device or have their mouse down,\n      // we consider them active even if they're not moving their finger or mouse.\n      // So we want to continue to update that they are active\n      this.clearInterval(touchHolding);\n      // report at the same interval as activityCheck\n      touchHolding = this.setInterval(report, 250);\n    });\n\n    const touchEnd = function(event) {\n      report();\n      // stop the interval that maintains activity if the touch is holding\n      this.clearInterval(touchHolding);\n    };\n\n    this.on('touchmove', report);\n    this.on('touchend', touchEnd);\n    this.on('touchcancel', touchEnd);\n  }\n\n  /**\n   * Creates timeout and sets up disposal automatically.\n   *\n   * @param {Function} fn The function to run after the timeout.\n   * @param {Number} timeout Number of ms to delay before executing specified function.\n   * @return {Number} Returns the timeout ID\n   * @method setTimeout\n   */\n  setTimeout(fn, timeout) {\n    fn = Fn.bind(this, fn);\n\n    // window.setTimeout would be preferable here, but due to some bizarre issue with Sinon and/or Phantomjs, we can't.\n    let timeoutId = window.setTimeout(fn, timeout);\n\n    const disposeFn = function() {\n      this.clearTimeout(timeoutId);\n    };\n\n    disposeFn.guid = `vjs-timeout-${timeoutId}`;\n\n    this.on('dispose', disposeFn);\n\n    return timeoutId;\n  }\n\n  /**\n   * Clears a timeout and removes the associated dispose listener\n   *\n   * @param {Number} timeoutId The id of the timeout to clear\n   * @return {Number} Returns the timeout ID\n   * @method clearTimeout\n   */\n  clearTimeout(timeoutId) {\n    window.clearTimeout(timeoutId);\n\n    const disposeFn = function() {};\n\n    disposeFn.guid = `vjs-timeout-${timeoutId}`;\n\n    this.off('dispose', disposeFn);\n\n    return timeoutId;\n  }\n\n  /**\n   * Creates an interval and sets up disposal automatically.\n   *\n   * @param {Function} fn The function to run every N seconds.\n   * @param {Number} interval Number of ms to delay before executing specified function.\n   * @return {Number} Returns the interval ID\n   * @method setInterval\n   */\n  setInterval(fn, interval) {\n    fn = Fn.bind(this, fn);\n\n    let intervalId = window.setInterval(fn, interval);\n\n    const disposeFn = function() {\n      this.clearInterval(intervalId);\n    };\n\n    disposeFn.guid = `vjs-interval-${intervalId}`;\n\n    this.on('dispose', disposeFn);\n\n    return intervalId;\n  }\n\n  /**\n   * Clears an interval and removes the associated dispose listener\n   *\n   * @param {Number} intervalId The id of the interval to clear\n   * @return {Number} Returns the interval ID\n   * @method clearInterval\n   */\n  clearInterval(intervalId) {\n    window.clearInterval(intervalId);\n\n    const disposeFn = function() {};\n\n    disposeFn.guid = `vjs-interval-${intervalId}`;\n\n    this.off('dispose', disposeFn);\n\n    return intervalId;\n  }\n\n  /**\n   * Registers a component\n   *\n   * @param {String} name Name of the component to register\n   * @param {Object} comp The component to register\n   * @static\n   * @method registerComponent\n   */\n  static registerComponent(name, comp) {\n    if (!Component.components_) {\n      Component.components_ = {};\n    }\n\n    Component.components_[name] = comp;\n    return comp;\n  }\n\n  /**\n   * Gets a component by name\n   *\n   * @param {String} name Name of the component to get\n   * @return {Component}\n   * @static\n   * @method getComponent\n   */\n  static getComponent(name) {\n    if (Component.components_ && Component.components_[name]) {\n      return Component.components_[name];\n    }\n\n    if (window && window.videojs && window.videojs[name]) {\n      log.warn(`The ${name} component was added to the videojs object when it should be registered using videojs.registerComponent(name, component)`);\n      return window.videojs[name];\n    }\n  }\n\n  /**\n   * Sets up the constructor using the supplied init method\n   * or uses the init of the parent object\n   *\n   * @param {Object} props An object of properties\n   * @static\n   * @deprecated\n   * @method extend\n   */\n  static extend(props) {\n    props = props || {};\n\n    log.warn('Component.extend({}) has been deprecated, use videojs.extend(Component, {}) instead');\n\n    // Set up the constructor using the supplied init method\n    // or using the init of the parent object\n    // Make sure to check the unobfuscated version for external libs\n    let init = props.init || props.init || this.prototype.init || this.prototype.init || function() {};\n    // In Resig's simple class inheritance (previously used) the constructor\n    //  is a function that calls `this.init.apply(arguments)`\n    // However that would prevent us from using `ParentObject.call(this);`\n    //  in a Child constructor because the `this` in `this.init`\n    //  would still refer to the Child and cause an infinite loop.\n    // We would instead have to do\n    //    `ParentObject.prototype.init.apply(this, arguments);`\n    //  Bleh. We're not creating a _super() function, so it's good to keep\n    //  the parent constructor reference simple.\n    let subObj = function() {\n      init.apply(this, arguments);\n    };\n\n    // Inherit from this object's prototype\n    subObj.prototype = Object.create(this.prototype);\n    // Reset the constructor property for subObj otherwise\n    // instances of subObj would have the constructor of the parent Object\n    subObj.prototype.constructor = subObj;\n\n    // Make the class extendable\n    subObj.extend = Component.extend;\n\n    // Extend subObj's prototype with functions and other properties from props\n    for (let name in props) {\n      if (props.hasOwnProperty(name)) {\n        subObj.prototype[name] = props[name];\n      }\n    }\n\n    return subObj;\n  }\n}\n\nComponent.registerComponent('Component', Component);\nexport default Component;\n","/**\n * @file control-bar.js\n */\nimport Component from '../component.js';\n\n// Required children\nimport PlayToggle from './play-toggle.js';\nimport CurrentTimeDisplay from './time-controls/current-time-display.js';\nimport DurationDisplay from './time-controls/duration-display.js';\nimport TimeDivider from './time-controls/time-divider.js';\nimport RemainingTimeDisplay from './time-controls/remaining-time-display.js';\nimport LiveDisplay from './live-display.js';\nimport ProgressControl from './progress-control/progress-control.js';\nimport FullscreenToggle from './fullscreen-toggle.js';\nimport VolumeControl from './volume-control/volume-control.js';\nimport VolumeMenuButton from './volume-menu-button.js';\nimport MuteToggle from './mute-toggle.js';\nimport ChaptersButton from './text-track-controls/chapters-button.js';\nimport SubtitlesButton from './text-track-controls/subtitles-button.js';\nimport CaptionsButton from './text-track-controls/captions-button.js';\nimport PlaybackRateMenuButton from './playback-rate-menu/playback-rate-menu-button.js';\nimport CustomControlSpacer from './spacer-controls/custom-control-spacer.js';\n\n/**\n * Container of main controls\n *\n * @extends Component\n * @class ControlBar\n */\nclass ControlBar extends Component {\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-control-bar'\n    });\n  }\n}\n\nControlBar.prototype.options_ = {\n  loadEvent: 'play',\n  children: [\n    'playToggle',\n    'volumeMenuButton',\n    'currentTimeDisplay',\n    'timeDivider',\n    'durationDisplay',\n    'progressControl',\n    'liveDisplay',\n    'remainingTimeDisplay',\n    'customControlSpacer',\n    'playbackRateMenuButton',\n    'chaptersButton',\n    'subtitlesButton',\n    'captionsButton',\n    'fullscreenToggle'\n  ]\n};\n\nComponent.registerComponent('ControlBar', ControlBar);\nexport default ControlBar;\n","/**\n * @file fullscreen-toggle.js\n */\nimport Button from '../button.js';\nimport Component from '../component.js';\n\n/**\n * Toggle fullscreen video\n *\n * @extends Button\n * @class FullscreenToggle\n */\nclass FullscreenToggle extends Button {\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-fullscreen-control ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Handles click for full screen\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    if (!this.player_.isFullscreen()) {\n      this.player_.requestFullscreen();\n      this.controlText('Non-Fullscreen');\n    } else {\n      this.player_.exitFullscreen();\n      this.controlText('Fullscreen');\n    }\n  }\n\n}\n\nFullscreenToggle.prototype.controlText_ = 'Fullscreen';\n\nComponent.registerComponent('FullscreenToggle', FullscreenToggle);\nexport default FullscreenToggle;\n","/**\n * @file live-display.js\n */\nimport Component from '../component';\nimport * as Dom from '../utils/dom.js';\n\n/**\n * Displays the live indicator\n * TODO - Future make it click to snap to live\n *\n * @extends Component\n * @class LiveDisplay\n */\nclass LiveDisplay extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n\n    this.updateShowing();\n    this.on(this.player(), 'durationchange', this.updateShowing);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    var el = super.createEl('div', {\n      className: 'vjs-live-control vjs-control'\n    });\n\n    this.contentEl_ = Dom.createEl('div', {\n      className: 'vjs-live-display',\n      innerHTML: `<span class=\"vjs-control-text\">${this.localize('Stream Type')}</span>${this.localize('LIVE')}`\n    }, {\n      'aria-live': 'off'\n    });\n\n    el.appendChild(this.contentEl_);\n    return el;\n  }\n\n  updateShowing() {\n    if (this.player().duration() === Infinity) {\n      this.show();\n    } else {\n      this.hide();\n    }\n  }\n\n}\n\nComponent.registerComponent('LiveDisplay', LiveDisplay);\nexport default LiveDisplay;\n","/**\n * @file mute-toggle.js\n */\nimport Button from '../button';\nimport Component from '../component';\nimport * as Dom from '../utils/dom.js';\n\n/**\n * A button component for muting the audio\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Button\n * @class MuteToggle\n */\nclass MuteToggle extends Button {\n\n  constructor(player, options) {\n    super(player, options);\n\n    this.on(player, 'volumechange', this.update);\n\n    // hide mute toggle if the current tech doesn't support volume control\n    if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {\n      this.addClass('vjs-hidden');\n    }\n\n    this.on(player, 'loadstart', function() {\n      this.update(); // We need to update the button to account for a default muted state.\n\n      if (player.tech_['featuresVolumeControl'] === false) {\n        this.addClass('vjs-hidden');\n      } else {\n        this.removeClass('vjs-hidden');\n      }\n    });\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-mute-control ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Handle click on mute\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    this.player_.muted( this.player_.muted() ? false : true );\n  }\n\n  /**\n   * Update volume\n   *\n   * @method update\n   */\n  update() {\n    var vol = this.player_.volume(),\n        level = 3;\n\n    if (vol === 0 || this.player_.muted()) {\n      level = 0;\n    } else if (vol < 0.33) {\n      level = 1;\n    } else if (vol < 0.67) {\n      level = 2;\n    }\n\n    // Don't rewrite the button text if the actual text doesn't change.\n    // This causes unnecessary and confusing information for screen reader users.\n    // This check is needed because this function gets called every time the volume level is changed.\n    let toMute = this.player_.muted() ? 'Unmute' : 'Mute';\n    let localizedMute = this.localize(toMute);\n    if (this.controlText() !== localizedMute) {\n      this.controlText(localizedMute);\n    }\n\n    /* TODO improve muted icon classes */\n    for (var i = 0; i < 4; i++) {\n      Dom.removeElClass(this.el_, `vjs-vol-${i}`);\n    }\n    Dom.addElClass(this.el_, `vjs-vol-${level}`);\n  }\n\n}\n\nMuteToggle.prototype.controlText_ = 'Mute';\n\nComponent.registerComponent('MuteToggle', MuteToggle);\nexport default MuteToggle;\n","/**\n * @file play-toggle.js\n */\nimport Button from '../button.js';\nimport Component from '../component.js';\n\n/**\n * Button to toggle between play and pause\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Button\n * @class PlayToggle\n */\nclass PlayToggle extends Button {\n\n  constructor(player, options){\n    super(player, options);\n\n    this.on(player, 'play', this.handlePlay);\n    this.on(player, 'pause', this.handlePause);\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-play-control ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Handle click to toggle between play and pause\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    if (this.player_.paused()) {\n      this.player_.play();\n    } else {\n      this.player_.pause();\n    }\n  }\n\n  /**\n   * Add the vjs-playing class to the element so it can change appearance\n   *\n   * @method handlePlay\n   */\n  handlePlay() {\n    this.removeClass('vjs-paused');\n    this.addClass('vjs-playing');\n    this.controlText('Pause'); // change the button text to \"Pause\"\n  }\n\n  /**\n   * Add the vjs-paused class to the element so it can change appearance\n   *\n   * @method handlePause\n   */\n  handlePause() {\n    this.removeClass('vjs-playing');\n    this.addClass('vjs-paused');\n    this.controlText('Play'); // change the button text to \"Play\"\n  }\n\n}\n\nPlayToggle.prototype.controlText_ = 'Play';\n\nComponent.registerComponent('PlayToggle', PlayToggle);\nexport default PlayToggle;\n","/**\n * @file playback-rate-menu-button.js\n */\nimport MenuButton from '../../menu/menu-button.js';\nimport Menu from '../../menu/menu.js';\nimport PlaybackRateMenuItem from './playback-rate-menu-item.js';\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\n\n/**\n * The component for controlling the playback rate\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuButton\n * @class PlaybackRateMenuButton\n */\nclass PlaybackRateMenuButton extends MenuButton {\n\n  constructor(player, options){\n    super(player, options);\n\n    this.updateVisibility();\n    this.updateLabel();\n\n    this.on(player, 'loadstart', this.updateVisibility);\n    this.on(player, 'ratechange', this.updateLabel);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = super.createEl();\n\n    this.labelEl_ = Dom.createEl('div', {\n      className: 'vjs-playback-rate-value',\n      innerHTML: 1.0\n    });\n\n    el.appendChild(this.labelEl_);\n\n    return el;\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-playback-rate ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Create the playback rate menu\n   *\n   * @return {Menu} Menu object populated with items\n   * @method createMenu\n   */\n  createMenu() {\n    let menu = new Menu(this.player());\n    let rates = this.playbackRates();\n\n    if (rates) {\n      for (let i = rates.length - 1; i >= 0; i--) {\n        menu.addChild(\n          new PlaybackRateMenuItem(this.player(), { 'rate': rates[i] + 'x'})\n        );\n      }\n    }\n\n    return menu;\n  }\n\n  /**\n   * Updates ARIA accessibility attributes\n   *\n   * @method updateARIAAttributes\n   */\n  updateARIAAttributes() {\n    // Current playback rate\n    this.el().setAttribute('aria-valuenow', this.player().playbackRate());\n  }\n\n  /**\n   * Handle menu item click\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    // select next rate option\n    let currentRate = this.player().playbackRate();\n    let rates = this.playbackRates();\n\n    // this will select first one if the last one currently selected\n    let newRate = rates[0];\n    for (let i = 0; i < rates.length ; i++) {\n      if (rates[i] > currentRate) {\n        newRate = rates[i];\n        break;\n      }\n    }\n    this.player().playbackRate(newRate);\n  }\n\n  /**\n   * Get possible playback rates\n   *\n   * @return {Array} Possible playback rates\n   * @method playbackRates\n   */\n  playbackRates() {\n    return this.options_['playbackRates'] || (this.options_.playerOptions && this.options_.playerOptions['playbackRates']);\n  }\n\n  /**\n   * Get supported playback rates\n   *\n   * @return {Array} Supported playback rates\n   * @method playbackRateSupported\n   */\n  playbackRateSupported() {\n    return this.player().tech_\n      && this.player().tech_['featuresPlaybackRate']\n      && this.playbackRates()\n      && this.playbackRates().length > 0\n    ;\n  }\n\n  /**\n   * Hide playback rate controls when they're no playback rate options to select\n   *\n   * @method updateVisibility\n   */\n  updateVisibility() {\n    if (this.playbackRateSupported()) {\n      this.removeClass('vjs-hidden');\n    } else {\n      this.addClass('vjs-hidden');\n    }\n  }\n\n  /**\n   * Update button label when rate changed\n   *\n   * @method updateLabel\n   */\n  updateLabel() {\n    if (this.playbackRateSupported()) {\n      this.labelEl_.innerHTML = this.player().playbackRate() + 'x';\n    }\n  }\n\n}\n\nPlaybackRateMenuButton.prototype.controlText_ = 'Playback Rate';\n\nComponent.registerComponent('PlaybackRateMenuButton', PlaybackRateMenuButton);\nexport default PlaybackRateMenuButton;\n","/**\n * @file playback-rate-menu-item.js\n */\nimport MenuItem from '../../menu/menu-item.js';\nimport Component from '../../component.js';\n\n/**\n * The specific menu item type for selecting a playback rate\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuItem\n * @class PlaybackRateMenuItem\n */\nclass PlaybackRateMenuItem extends MenuItem {\n\n  constructor(player, options){\n    let label = options['rate'];\n    let rate = parseFloat(label, 10);\n\n    // Modify options for parent MenuItem class's init.\n    options['label'] = label;\n    options['selected'] = rate === 1;\n    super(player, options);\n\n    this.label = label;\n    this.rate = rate;\n\n    this.on(player, 'ratechange', this.update);\n  }\n\n  /**\n   * Handle click on menu item\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    super.handleClick();\n    this.player().playbackRate(this.rate);\n  }\n\n  /**\n   * Update playback rate with selected rate\n   *\n   * @method update\n   */\n  update() {\n    this.selected(this.player().playbackRate() === this.rate);\n  }\n\n}\n\nPlaybackRateMenuItem.prototype.contentElType = 'button';\n\nComponent.registerComponent('PlaybackRateMenuItem', PlaybackRateMenuItem);\nexport default PlaybackRateMenuItem;\n","/**\n * @file load-progress-bar.js\n */\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\n\n/**\n * Shows load progress\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class LoadProgressBar\n */\nclass LoadProgressBar extends Component {\n\n  constructor(player, options){\n    super(player, options);\n    this.on(player, 'progress', this.update);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-load-progress',\n      innerHTML: `<span class=\"vjs-control-text\"><span>${this.localize('Loaded')}</span>: 0%</span>`\n    });\n  }\n\n  /**\n   * Update progress bar\n   *\n   * @method update\n   */\n  update() {\n    let buffered = this.player_.buffered();\n    let duration = this.player_.duration();\n    let bufferedEnd = this.player_.bufferedEnd();\n    let children = this.el_.children;\n\n    // get the percent width of a time compared to the total end\n    let percentify = function (time, end){\n      let percent = (time / end) || 0; // no NaN\n      return ((percent >= 1 ? 1 : percent) * 100) + '%';\n    };\n\n    // update the width of the progress bar\n    this.el_.style.width = percentify(bufferedEnd, duration);\n\n    // add child elements to represent the individual buffered time ranges\n    for (let i = 0; i < buffered.length; i++) {\n      let start = buffered.start(i);\n      let end = buffered.end(i);\n      let part = children[i];\n\n      if (!part) {\n        part = this.el_.appendChild(Dom.createEl());\n      }\n\n      // set the percent based on the width of the progress bar (bufferedEnd)\n      part.style.left = percentify(start, bufferedEnd);\n      part.style.width = percentify(end - start, bufferedEnd);\n    }\n\n    // remove unused buffered range elements\n    for (let i = children.length; i > buffered.length; i--) {\n      this.el_.removeChild(children[i-1]);\n    }\n  }\n\n}\n\nComponent.registerComponent('LoadProgressBar', LoadProgressBar);\nexport default LoadProgressBar;\n","/**\n * @file mouse-time-display.js\n */\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\nimport * as Fn from '../../utils/fn.js';\nimport formatTime from '../../utils/format-time.js';\nimport throttle from 'lodash-compat/function/throttle';\n\n/**\n * The Mouse Time Display component shows the time you will seek to\n * when hovering over the progress bar\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class MouseTimeDisplay\n */\nclass MouseTimeDisplay extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n\n    this.update(0, 0);\n\n    player.on('ready', () => {\n      this.on(player.controlBar.progressControl.el(), 'mousemove', throttle(Fn.bind(this, this.handleMouseMove), 25));\n    });\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-mouse-display'\n    });\n  }\n\n  handleMouseMove(event) {\n    let duration = this.player_.duration();\n    let newTime = this.calculateDistance(event) * duration;\n    let position = event.pageX - Dom.findElPosition(this.el().parentNode).left;\n\n    this.update(newTime, position);\n  }\n\n  update(newTime, position) {\n    let time = formatTime(newTime, this.player_.duration());\n\n    this.el().style.left = position + 'px';\n    this.el().setAttribute('data-current-time', time);\n  }\n\n  calculateDistance(event) {\n    return Dom.getPointerPosition(this.el().parentNode, event).x;\n  }\n}\n\nComponent.registerComponent('MouseTimeDisplay', MouseTimeDisplay);\nexport default MouseTimeDisplay;\n","/**\n * @file play-progress-bar.js\n */\nimport Component from '../../component.js';\nimport * as Fn from '../../utils/fn.js';\nimport formatTime from '../../utils/format-time.js';\n\n/**\n * Shows play progress\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class PlayProgressBar\n */\nclass PlayProgressBar extends Component {\n\n  constructor(player, options){\n    super(player, options);\n    this.updateDataAttr();\n    this.on(player, 'timeupdate', this.updateDataAttr);\n    player.ready(Fn.bind(this, this.updateDataAttr));\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-play-progress vjs-slider-bar',\n      innerHTML: `<span class=\"vjs-control-text\"><span>${this.localize('Progress')}</span>: 0%</span>`\n    });\n  }\n\n  updateDataAttr() {\n    let time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();\n    this.el_.setAttribute('data-current-time', formatTime(time, this.player_.duration()));\n  }\n\n}\n\nComponent.registerComponent('PlayProgressBar', PlayProgressBar);\nexport default PlayProgressBar;\n","/**\n * @file progress-control.js\n */\nimport Component from '../../component.js';\nimport SeekBar from './seek-bar.js';\nimport MouseTimeDisplay from './mouse-time-display.js';\n\n/**\n * The Progress Control component contains the seek bar, load progress,\n * and play progress\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class ProgressControl\n */\nclass ProgressControl extends Component {\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-progress-control vjs-control'\n    });\n  }\n}\n\nProgressControl.prototype.options_ = {\n  children: [\n    'seekBar'\n  ]\n};\n\nComponent.registerComponent('ProgressControl', ProgressControl);\nexport default ProgressControl;\n","/**\n * @file seek-bar.js\n */\nimport Slider from '../../slider/slider.js';\nimport Component from '../../component.js';\nimport LoadProgressBar from './load-progress-bar.js';\nimport PlayProgressBar from './play-progress-bar.js';\nimport * as Fn from '../../utils/fn.js';\nimport formatTime from '../../utils/format-time.js';\nimport assign from 'object.assign';\n\n/**\n * Seek Bar and holder for the progress bars\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Slider\n * @class SeekBar\n */\nclass SeekBar extends Slider {\n\n  constructor(player, options){\n    super(player, options);\n    this.on(player, 'timeupdate', this.updateARIAAttributes);\n    player.ready(Fn.bind(this, this.updateARIAAttributes));\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-progress-holder'\n    }, {\n      'aria-label': 'video progress bar'\n    });\n  }\n\n  /**\n   * Update ARIA accessibility attributes\n   *\n   * @method updateARIAAttributes\n   */\n  updateARIAAttributes() {\n      // Allows for smooth scrubbing, when player can't keep up.\n      let time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();\n      this.el_.setAttribute('aria-valuenow', (this.getPercent() * 100).toFixed(2)); // machine readable value of progress bar (percentage complete)\n      this.el_.setAttribute('aria-valuetext', formatTime(time, this.player_.duration())); // human readable value of progress bar (time complete)\n  }\n\n  /**\n   * Get percentage of video played\n   *\n   * @return {Number} Percentage played\n   * @method getPercent\n   */\n  getPercent() {\n    let percent = this.player_.currentTime() / this.player_.duration();\n    return percent >= 1 ? 1 : percent;\n  }\n\n  /**\n   * Handle mouse down on seek bar\n   *\n   * @method handleMouseDown\n   */\n  handleMouseDown(event) {\n    super.handleMouseDown(event);\n\n    this.player_.scrubbing(true);\n\n    this.videoWasPlaying = !this.player_.paused();\n    this.player_.pause();\n  }\n\n  /**\n   * Handle mouse move on seek bar\n   *\n   * @method handleMouseMove\n   */\n  handleMouseMove(event) {\n    let newTime = this.calculateDistance(event) * this.player_.duration();\n\n    // Don't let video end while scrubbing.\n    if (newTime === this.player_.duration()) { newTime = newTime - 0.1; }\n\n    // Set new time (tell player to seek to new time)\n    this.player_.currentTime(newTime);\n  }\n\n  /**\n   * Handle mouse up on seek bar\n   *\n   * @method handleMouseUp\n   */\n  handleMouseUp(event) {\n    super.handleMouseUp(event);\n\n    this.player_.scrubbing(false);\n    if (this.videoWasPlaying) {\n      this.player_.play();\n    }\n  }\n\n  /**\n   * Move more quickly fast forward for keyboard-only users\n   *\n   * @method stepForward\n   */\n  stepForward() {\n    this.player_.currentTime(this.player_.currentTime() + 5); // more quickly fast forward for keyboard-only users\n  }\n\n  /**\n   * Move more quickly rewind for keyboard-only users\n   *\n   * @method stepBack\n   */\n  stepBack() {\n    this.player_.currentTime(this.player_.currentTime() - 5); // more quickly rewind for keyboard-only users\n  }\n\n}\n\nSeekBar.prototype.options_ = {\n  children: [\n    'loadProgressBar',\n    'mouseTimeDisplay',\n    'playProgressBar'\n  ],\n  'barName': 'playProgressBar'\n};\n\nSeekBar.prototype.playerEvent = 'timeupdate';\n\nComponent.registerComponent('SeekBar', SeekBar);\nexport default SeekBar;\n","/**\n * @file custom-control-spacer.js\n */\nimport Spacer from './spacer.js';\nimport Component from '../../component.js';\n\n/**\n * Spacer specifically meant to be used as an insertion point for new plugins, etc.\n *\n * @extends Spacer\n * @class CustomControlSpacer\n */\nclass CustomControlSpacer extends Spacer {\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-custom-control-spacer ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = super.createEl({\n      className: this.buildCSSClass(),\n    });\n\n    // No-flex/table-cell mode requires there be some content\n    // in the cell to fill the remaining space of the table.\n    el.innerHTML = '&nbsp;';\n    return el;\n  }\n}\n\nComponent.registerComponent('CustomControlSpacer', CustomControlSpacer);\nexport default CustomControlSpacer;\n","/**\n * @file spacer.js\n */\nimport Component from '../../component.js';\n\n/**\n * Just an empty spacer element that can be used as an append point for plugins, etc.\n * Also can be used to create space between elements when necessary.\n *\n * @extends Component\n * @class Spacer\n */\nclass Spacer extends Component {\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-spacer ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: this.buildCSSClass()\n    });\n  }\n}\n\nComponent.registerComponent('Spacer', Spacer);\n\nexport default Spacer;\n","/**\n * @file caption-settings-menu-item.js\n */\nimport TextTrackMenuItem from './text-track-menu-item.js';\nimport Component from '../../component.js';\n\n/**\n * The menu item for caption track settings menu\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends TextTrackMenuItem\n * @class CaptionSettingsMenuItem\n */\n class CaptionSettingsMenuItem extends TextTrackMenuItem {\n\n  constructor(player, options) {\n    options['track'] = {\n      'kind': options['kind'],\n      'player': player,\n      'label': options['kind'] + ' settings',\n      'default': false,\n      mode: 'disabled'\n    };\n\n    super(player, options);\n    this.addClass('vjs-texttrack-settings');\n  }\n\n  /**\n   * Handle click on menu item\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    this.player().getChild('textTrackSettings').show();\n  }\n\n}\n\nComponent.registerComponent('CaptionSettingsMenuItem', CaptionSettingsMenuItem);\nexport default CaptionSettingsMenuItem;\n","/**\n * @file captions-button.js\n */\nimport TextTrackButton from './text-track-button.js';\nimport Component from '../../component.js';\nimport CaptionSettingsMenuItem from './caption-settings-menu-item.js';\n\n/**\n * The button component for toggling and selecting captions\n *\n * @param {Object} player  Player object\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends TextTrackButton\n * @class CaptionsButton\n */\nclass CaptionsButton extends TextTrackButton {\n\n  constructor(player, options, ready){\n    super(player, options, ready);\n    this.el_.setAttribute('aria-label','Captions Menu');\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-captions-button ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Update caption menu items\n   *\n   * @method update\n   */\n  update() {\n    let threshold = 2;\n    super.update();\n\n    // if native, then threshold is 1 because no settings button\n    if (this.player().tech_ && this.player().tech_['featuresNativeTextTracks']) {\n      threshold = 1;\n    }\n\n    if (this.items && this.items.length > threshold) {\n      this.show();\n    } else {\n      this.hide();\n    }\n  }\n\n  /**\n   * Create caption menu items\n   *\n   * @return {Array} Array of menu items\n   * @method createItems\n   */\n  createItems() {\n    let items = [];\n\n    if (!(this.player().tech_ && this.player().tech_['featuresNativeTextTracks'])) {\n      items.push(new CaptionSettingsMenuItem(this.player_, { 'kind': this.kind_ }));\n    }\n\n    return super.createItems(items);\n  }\n\n}\n\nCaptionsButton.prototype.kind_ = 'captions';\nCaptionsButton.prototype.controlText_ = 'Captions';\n\nComponent.registerComponent('CaptionsButton', CaptionsButton);\nexport default CaptionsButton;\n","/**\n * @file chapters-button.js\n */\nimport TextTrackButton from './text-track-button.js';\nimport Component from '../../component.js';\nimport TextTrackMenuItem from './text-track-menu-item.js';\nimport ChaptersTrackMenuItem from './chapters-track-menu-item.js';\nimport Menu from '../../menu/menu.js';\nimport * as Dom from '../../utils/dom.js';\nimport * as Fn from '../../utils/fn.js';\nimport toTitleCase from '../../utils/to-title-case.js';\nimport window from 'global/window';\n\n/**\n * The button component for toggling and selecting chapters\n * Chapters act much differently than other text tracks\n * Cues are navigation vs. other tracks of alternative languages\n *\n * @param {Object} player  Player object\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends TextTrackButton\n * @class ChaptersButton\n */\nclass ChaptersButton extends TextTrackButton {\n\n  constructor(player, options, ready){\n    super(player, options, ready);\n    this.el_.setAttribute('aria-label','Chapters Menu');\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-chapters-button ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Create a menu item for each text track\n   *\n   * @return {Array} Array of menu items\n   * @method createItems\n   */\n  createItems() {\n    let items = [];\n\n    let tracks = this.player_.textTracks();\n\n    if (!tracks) {\n      return items;\n    }\n\n    for (let i = 0; i < tracks.length; i++) {\n      let track = tracks[i];\n      if (track['kind'] === this.kind_) {\n        items.push(new TextTrackMenuItem(this.player_, {\n          'track': track\n        }));\n      }\n    }\n\n    return items;\n  }\n\n  /**\n   * Create menu from chapter buttons\n   *\n   * @return {Menu} Menu of chapter buttons\n   * @method createMenu\n   */\n  createMenu() {\n    let tracks = this.player_.textTracks() || [];\n    let chaptersTrack;\n    let items = this.items = [];\n\n    for (let i = 0, l = tracks.length; i < l; i++) {\n      let track = tracks[i];\n      if (track['kind'] === this.kind_) {\n        if (!track.cues) {\n          track['mode'] = 'hidden';\n          /* jshint loopfunc:true */\n          // TODO see if we can figure out a better way of doing this https://github.com/videojs/video.js/issues/1864\n          window.setTimeout(Fn.bind(this, function() {\n            this.createMenu();\n          }), 100);\n          /* jshint loopfunc:false */\n        } else {\n          chaptersTrack = track;\n          break;\n        }\n      }\n    }\n\n    let menu = this.menu;\n    if (menu === undefined) {\n      menu = new Menu(this.player_);\n      menu.contentEl().appendChild(Dom.createEl('li', {\n        className: 'vjs-menu-title',\n        innerHTML: toTitleCase(this.kind_),\n        tabIndex: -1\n      }));\n    }\n\n    if (chaptersTrack) {\n      let cues = chaptersTrack['cues'], cue;\n\n      for (let i = 0, l = cues.length; i < l; i++) {\n        cue = cues[i];\n\n        let mi = new ChaptersTrackMenuItem(this.player_, {\n          'track': chaptersTrack,\n          'cue': cue\n        });\n\n        items.push(mi);\n\n        menu.addChild(mi);\n      }\n      this.addChild(menu);\n    }\n\n    if (this.items.length > 0) {\n      this.show();\n    }\n\n    return menu;\n  }\n\n}\n\nChaptersButton.prototype.kind_ = 'chapters';\nChaptersButton.prototype.controlText_ = 'Chapters';\n\nComponent.registerComponent('ChaptersButton', ChaptersButton);\nexport default ChaptersButton;\n","/**\n * @file chapters-track-menu-item.js\n */\nimport MenuItem from '../../menu/menu-item.js';\nimport Component from '../../component.js';\nimport * as Fn from '../../utils/fn.js';\n\n/**\n * The chapter track menu item\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuItem\n * @class ChaptersTrackMenuItem\n */\nclass ChaptersTrackMenuItem extends MenuItem {\n\n  constructor(player, options){\n    let track = options['track'];\n    let cue = options['cue'];\n    let currentTime = player.currentTime();\n\n    // Modify options for parent MenuItem class's init.\n    options['label'] = cue.text;\n    options['selected'] = (cue['startTime'] <= currentTime && currentTime < cue['endTime']);\n    super(player, options);\n\n    this.track = track;\n    this.cue = cue;\n    track.addEventListener('cuechange', Fn.bind(this, this.update));\n  }\n\n  /**\n   * Handle click on menu item\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    super.handleClick();\n    this.player_.currentTime(this.cue.startTime);\n    this.update(this.cue.startTime);\n  }\n\n  /**\n   * Update chapter menu item\n   *\n   * @method update\n   */\n  update() {\n    let cue = this.cue;\n    let currentTime = this.player_.currentTime();\n\n    // vjs.log(currentTime, cue.startTime);\n    this.selected(cue['startTime'] <= currentTime && currentTime < cue['endTime']);\n  }\n\n}\n\nComponent.registerComponent('ChaptersTrackMenuItem', ChaptersTrackMenuItem);\nexport default ChaptersTrackMenuItem;\n","/**\n * @file off-text-track-menu-item.js\n */\nimport TextTrackMenuItem from './text-track-menu-item.js';\nimport Component from '../../component.js';\n\n/**\n * A special menu item for turning of a specific type of text track\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends TextTrackMenuItem\n * @class OffTextTrackMenuItem\n */\nclass OffTextTrackMenuItem extends TextTrackMenuItem {\n\n  constructor(player, options){\n    // Create pseudo track info\n    // Requires options['kind']\n    options['track'] = {\n      'kind': options['kind'],\n      'player': player,\n      'label': options['kind'] + ' off',\n      'default': false,\n      'mode': 'disabled'\n    };\n\n    super(player, options);\n    this.selected(true);\n  }\n\n  /**\n   * Handle text track change\n   *\n   * @param {Object} event Event object\n   * @method handleTracksChange\n   */\n  handleTracksChange(event){\n    let tracks = this.player().textTracks();\n    let selected = true;\n\n    for (let i = 0, l = tracks.length; i < l; i++) {\n      let track = tracks[i];\n      if (track['kind'] === this.track['kind'] && track['mode'] === 'showing') {\n        selected = false;\n        break;\n      }\n    }\n\n    this.selected(selected);\n  }\n\n}\n\nComponent.registerComponent('OffTextTrackMenuItem', OffTextTrackMenuItem);\nexport default OffTextTrackMenuItem;\n","/**\n * @file subtitles-button.js\n */\nimport TextTrackButton from './text-track-button.js';\nimport Component from '../../component.js';\n\n/**\n * The button component for toggling and selecting subtitles\n *\n * @param {Object} player  Player object\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends TextTrackButton\n * @class SubtitlesButton\n */\nclass SubtitlesButton extends TextTrackButton {\n\n  constructor(player, options, ready){\n    super(player, options, ready);\n    this.el_.setAttribute('aria-label','Subtitles Menu');\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    return `vjs-subtitles-button ${super.buildCSSClass()}`;\n  }\n\n}\n\nSubtitlesButton.prototype.kind_ = 'subtitles';\nSubtitlesButton.prototype.controlText_ = 'Subtitles';\n\nComponent.registerComponent('SubtitlesButton', SubtitlesButton);\nexport default SubtitlesButton;\n","/**\n * @file text-track-button.js\n */\nimport MenuButton from '../../menu/menu-button.js';\nimport Component from '../../component.js';\nimport * as Fn from '../../utils/fn.js';\nimport TextTrackMenuItem from './text-track-menu-item.js';\nimport OffTextTrackMenuItem from './off-text-track-menu-item.js';\n\n/**\n * The base class for buttons that toggle specific text track types (e.g. subtitles)\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuButton\n * @class TextTrackButton\n */\nclass TextTrackButton extends MenuButton {\n\n  constructor(player, options){\n    super(player, options);\n\n    let tracks = this.player_.textTracks();\n\n    if (this.items.length <= 1) {\n      this.hide();\n    }\n\n    if (!tracks) {\n      return;\n    }\n\n    let updateHandler = Fn.bind(this, this.update);\n    tracks.addEventListener('removetrack', updateHandler);\n    tracks.addEventListener('addtrack', updateHandler);\n\n    this.player_.on('dispose', function() {\n      tracks.removeEventListener('removetrack', updateHandler);\n      tracks.removeEventListener('addtrack', updateHandler);\n    });\n  }\n\n  // Create a menu item for each text track\n  createItems(items=[]) {\n    // Add an OFF menu item to turn all tracks off\n    items.push(new OffTextTrackMenuItem(this.player_, { 'kind': this.kind_ }));\n\n    let tracks = this.player_.textTracks();\n\n    if (!tracks) {\n      return items;\n    }\n\n    for (let i = 0; i < tracks.length; i++) {\n      let track = tracks[i];\n\n      // only add tracks that are of the appropriate kind and have a label\n      if (track['kind'] === this.kind_) {\n        items.push(new TextTrackMenuItem(this.player_, {\n          'track': track\n        }));\n      }\n    }\n\n    return items;\n  }\n\n}\n\nComponent.registerComponent('TextTrackButton', TextTrackButton);\nexport default TextTrackButton;\n","/**\n * @file text-track-menu-item.js\n */\nimport MenuItem from '../../menu/menu-item.js';\nimport Component from '../../component.js';\nimport * as Fn from '../../utils/fn.js';\nimport window from 'global/window';\nimport document from 'global/document';\n\n/**\n * The specific menu item type for selecting a language within a text track kind\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuItem\n * @class TextTrackMenuItem\n */\nclass TextTrackMenuItem extends MenuItem {\n\n  constructor(player, options){\n    let track = options['track'];\n    let tracks = player.textTracks();\n\n    // Modify options for parent MenuItem class's init.\n    options['label'] = track['label'] || track['language'] || 'Unknown';\n    options['selected'] = track['default'] || track['mode'] === 'showing';\n    super(player, options);\n\n    this.track = track;\n\n    if (tracks) {\n      let changeHandler = Fn.bind(this, this.handleTracksChange);\n\n      tracks.addEventListener('change', changeHandler);\n      this.on('dispose', function() {\n        tracks.removeEventListener('change', changeHandler);\n      });\n    }\n\n    // iOS7 doesn't dispatch change events to TextTrackLists when an\n    // associated track's mode changes. Without something like\n    // Object.observe() (also not present on iOS7), it's not\n    // possible to detect changes to the mode attribute and polyfill\n    // the change event. As a poor substitute, we manually dispatch\n    // change events whenever the controls modify the mode.\n    if (tracks && tracks.onchange === undefined) {\n      let event;\n\n      this.on(['tap', 'click'], function() {\n        if (typeof window.Event !== 'object') {\n          // Android 2.3 throws an Illegal Constructor error for window.Event\n          try {\n            event = new window.Event('change');\n          } catch(err){}\n        }\n\n        if (!event) {\n          event = document.createEvent('Event');\n          event.initEvent('change', true, true);\n        }\n\n        tracks.dispatchEvent(event);\n      });\n    }\n  }\n\n  /**\n   * Handle click on text track\n   *\n   * @method handleClick\n   */\n  handleClick(event) {\n    let kind = this.track['kind'];\n    let tracks = this.player_.textTracks();\n\n    super.handleClick(event);\n\n    if (!tracks) return;\n\n    for (let i = 0; i < tracks.length; i++) {\n      let track = tracks[i];\n\n      if (track['kind'] !== kind) {\n        continue;\n      }\n\n      if (track === this.track) {\n        track['mode'] = 'showing';\n      } else {\n        track['mode'] = 'disabled';\n      }\n    }\n  }\n\n  /**\n   * Handle text track change\n   *\n   * @method handleTracksChange\n   */\n  handleTracksChange(event){\n    this.selected(this.track['mode'] === 'showing');\n  }\n\n}\n\nComponent.registerComponent('TextTrackMenuItem', TextTrackMenuItem);\nexport default TextTrackMenuItem;\n","/**\n * @file current-time-display.js\n */\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\nimport formatTime from '../../utils/format-time.js';\n\n/**\n * Displays the current time\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class CurrentTimeDisplay\n */\nclass CurrentTimeDisplay extends Component {\n\n  constructor(player, options){\n    super(player, options);\n\n    this.on(player, 'timeupdate', this.updateContent);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = super.createEl('div', {\n      className: 'vjs-current-time vjs-time-control vjs-control'\n    });\n\n    this.contentEl_ = Dom.createEl('div', {\n      className: 'vjs-current-time-display',\n      // label the current time for screen reader users\n      innerHTML: '<span class=\"vjs-control-text\">Current Time </span>' + '0:00',\n    }, {\n      // tell screen readers not to automatically read the time as it changes\n      'aria-live': 'off'\n    });\n\n    el.appendChild(this.contentEl_);\n    return el;\n  }\n\n  /**\n   * Update current time display\n   *\n   * @method updateContent\n   */\n  updateContent() {\n    // Allows for smooth scrubbing, when player can't keep up.\n    let time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();\n    let localizedText = this.localize('Current Time');\n    let formattedTime = formatTime(time, this.player_.duration());\n    this.contentEl_.innerHTML = `<span class=\"vjs-control-text\">${localizedText}</span> ${formattedTime}`;\n  }\n\n}\n\nComponent.registerComponent('CurrentTimeDisplay', CurrentTimeDisplay);\nexport default CurrentTimeDisplay;\n","/**\n * @file duration-display.js\n */\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\nimport formatTime from '../../utils/format-time.js';\n\n/**\n * Displays the duration\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class DurationDisplay\n */\nclass DurationDisplay extends Component {\n\n  constructor(player, options){\n    super(player, options);\n\n    // this might need to be changed to 'durationchange' instead of 'timeupdate' eventually,\n    // however the durationchange event fires before this.player_.duration() is set,\n    // so the value cannot be written out using this method.\n    // Once the order of durationchange and this.player_.duration() being set is figured out,\n    // this can be updated.\n    this.on(player, 'timeupdate', this.updateContent);\n    this.on(player, 'loadedmetadata', this.updateContent);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = super.createEl('div', {\n      className: 'vjs-duration vjs-time-control vjs-control'\n    });\n\n    this.contentEl_ = Dom.createEl('div', {\n      className: 'vjs-duration-display',\n      // label the duration time for screen reader users\n      innerHTML: `<span class=\"vjs-control-text\">${this.localize('Duration Time')}</span> 0:00`\n    }, {\n      // tell screen readers not to automatically read the time as it changes\n      'aria-live': 'off'\n    });\n\n    el.appendChild(this.contentEl_);\n    return el;\n  }\n\n  /**\n   * Update duration time display\n   *\n   * @method updateContent\n   */\n  updateContent() {\n    let duration = this.player_.duration();\n    if (duration) {\n      let localizedText = this.localize('Duration Time');\n      let formattedTime = formatTime(duration);\n      this.contentEl_.innerHTML = `<span class=\"vjs-control-text\">${localizedText}</span> ${formattedTime}`; // label the duration time for screen reader users\n    }\n  }\n\n}\n\nComponent.registerComponent('DurationDisplay', DurationDisplay);\nexport default DurationDisplay;\n","/**\n * @file remaining-time-display.js\n */\nimport Component from '../../component.js';\nimport * as Dom from '../../utils/dom.js';\nimport formatTime from '../../utils/format-time.js';\n\n/**\n * Displays the time left in the video\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class RemainingTimeDisplay\n */\nclass RemainingTimeDisplay extends Component {\n\n  constructor(player, options){\n    super(player, options);\n\n    this.on(player, 'timeupdate', this.updateContent);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = super.createEl('div', {\n      className: 'vjs-remaining-time vjs-time-control vjs-control'\n    });\n\n    this.contentEl_ = Dom.createEl('div', {\n      className: 'vjs-remaining-time-display',\n      // label the remaining time for screen reader users\n      innerHTML: `<span class=\"vjs-control-text\">${this.localize('Remaining Time')}</span> -0:00`,\n    }, {\n      // tell screen readers not to automatically read the time as it changes\n      'aria-live': 'off'\n    });\n\n    el.appendChild(this.contentEl_);\n    return el;\n  }\n\n  /**\n   * Update remaining time display\n   *\n   * @method updateContent\n   */\n  updateContent() {\n    if (this.player_.duration()) {\n      const localizedText = this.localize('Remaining Time');\n      const formattedTime = formatTime(this.player_.remainingTime());\n      this.contentEl_.innerHTML = `<span class=\"vjs-control-text\">${localizedText}</span> -${formattedTime}`;\n    }\n\n    // Allows for smooth scrubbing, when player can't keep up.\n    // var time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();\n    // this.contentEl_.innerHTML = vjs.formatTime(time, this.player_.duration());\n  }\n\n}\n\nComponent.registerComponent('RemainingTimeDisplay', RemainingTimeDisplay);\nexport default RemainingTimeDisplay;\n","/**\n * @file time-divider.js\n */\nimport Component from '../../component.js';\n\n/**\n * The separator between the current time and duration.\n * Can be hidden if it's not needed in the design.\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class TimeDivider\n */\nclass TimeDivider extends Component {\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-time-control vjs-time-divider',\n      innerHTML: '<div><span>/</span></div>'\n    });\n  }\n\n}\n\nComponent.registerComponent('TimeDivider', TimeDivider);\nexport default TimeDivider;\n","/**\n * @file volume-bar.js\n */\nimport Slider from '../../slider/slider.js';\nimport Component from '../../component.js';\nimport * as Fn from '../../utils/fn.js';\n\n// Required children\nimport VolumeLevel from './volume-level.js';\n\n/**\n * The bar that contains the volume level and can be clicked on to adjust the level\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Slider\n * @class VolumeBar\n */\nclass VolumeBar extends Slider {\n\n  constructor(player, options){\n    super(player, options);\n    this.on(player, 'volumechange', this.updateARIAAttributes);\n    player.ready(Fn.bind(this, this.updateARIAAttributes));\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-volume-bar vjs-slider-bar'\n    }, {\n      'aria-label': 'volume level'\n    });\n  }\n\n  /**\n   * Handle mouse move on volume bar\n   *\n   * @method handleMouseMove\n   */\n  handleMouseMove(event) {\n    if (this.player_.muted()) {\n      this.player_.muted(false);\n    }\n\n    this.player_.volume(this.calculateDistance(event));\n  }\n\n  /**\n   * Get percent of volume level\n   *\n   * @retun {Number} Volume level percent\n   * @method getPercent\n   */\n  getPercent() {\n    if (this.player_.muted()) {\n      return 0;\n    } else {\n      return this.player_.volume();\n    }\n  }\n\n  /**\n   * Increase volume level for keyboard users\n   *\n   * @method stepForward\n   */\n  stepForward() {\n    this.player_.volume(this.player_.volume() + 0.1);\n  }\n\n  /**\n   * Decrease volume level for keyboard users\n   *\n   * @method stepBack\n   */\n  stepBack() {\n    this.player_.volume(this.player_.volume() - 0.1);\n  }\n\n  /**\n   * Update ARIA accessibility attributes\n   *\n   * @method updateARIAAttributes\n   */\n  updateARIAAttributes() {\n    // Current value of volume bar as a percentage\n    let volume = (this.player_.volume() * 100).toFixed(2);\n    this.el_.setAttribute('aria-valuenow', volume);\n    this.el_.setAttribute('aria-valuetext', volume + '%');\n  }\n\n}\n\nVolumeBar.prototype.options_ = {\n  children: [\n    'volumeLevel'\n  ],\n  'barName': 'volumeLevel'\n};\n\nVolumeBar.prototype.playerEvent = 'volumechange';\n\nComponent.registerComponent('VolumeBar', VolumeBar);\nexport default VolumeBar;\n","/**\n * @file volume-control.js\n */\nimport Component from '../../component.js';\n\n// Required children\nimport VolumeBar from './volume-bar.js';\n\n/**\n * The component for controlling the volume level\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class VolumeControl\n */\nclass VolumeControl extends Component {\n\n  constructor(player, options){\n    super(player, options);\n\n    // hide volume controls when they're not supported by the current tech\n    if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {\n      this.addClass('vjs-hidden');\n    }\n    this.on(player, 'loadstart', function(){\n      if (player.tech_['featuresVolumeControl'] === false) {\n        this.addClass('vjs-hidden');\n      } else {\n        this.removeClass('vjs-hidden');\n      }\n    });\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-volume-control vjs-control'\n    });\n  }\n\n}\n\nVolumeControl.prototype.options_ = {\n  children: [\n    'volumeBar'\n  ]\n};\n\nComponent.registerComponent('VolumeControl', VolumeControl);\nexport default VolumeControl;\n","/**\n * @file volume-level.js\n */\nimport Component from '../../component.js';\n\n/**\n * Shows volume level\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class VolumeLevel\n */\nclass VolumeLevel extends Component {\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-volume-level',\n      innerHTML: '<span class=\"vjs-control-text\"></span>'\n    });\n  }\n\n}\n\nComponent.registerComponent('VolumeLevel', VolumeLevel);\nexport default VolumeLevel;\n","/**\n * @file volume-menu-button.js\n */\nimport Button from '../button.js';\nimport Component from '../component.js';\nimport Menu from '../menu/menu.js';\nimport MenuButton from '../menu/menu-button.js';\nimport MuteToggle from './mute-toggle.js';\nimport VolumeBar from './volume-control/volume-bar.js';\n\n/**\n * Button for volume menu\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends MenuButton\n * @class VolumeMenuButton\n */\nclass VolumeMenuButton extends MenuButton {\n\n  constructor(player, options={}){\n    // Default to inline\n    if (options.inline === undefined) {\n      options.inline = true;\n    }\n\n    // If the vertical option isn't passed at all, default to true.\n    if (options.vertical === undefined) {\n      // If an inline volumeMenuButton is used, we should default to using\n      // a horizontal slider for obvious reasons.\n      if (options.inline) {\n        options.vertical = false;\n      } else {\n        options.vertical = true;\n      }\n    }\n\n    // The vertical option needs to be set on the volumeBar as well,\n    // since that will need to be passed along to the VolumeBar constructor\n    options.volumeBar = options.volumeBar || {};\n    options.volumeBar.vertical = !!options.vertical;\n\n    super(player, options);\n\n    // Same listeners as MuteToggle\n    this.on(player, 'volumechange', this.volumeUpdate);\n    this.on(player, 'loadstart', this.volumeUpdate);\n\n    // hide mute toggle if the current tech doesn't support volume control\n    function updateVisibility() {\n      if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {\n        this.addClass('vjs-hidden');\n      } else {\n        this.removeClass('vjs-hidden');\n      }\n    }\n\n    updateVisibility.call(this);\n    this.on(player, 'loadstart', updateVisibility);\n\n    this.on(this.volumeBar, ['slideractive', 'focus'], function(){\n      this.addClass('vjs-slider-active');\n    });\n\n    this.on(this.volumeBar, ['sliderinactive', 'blur'], function(){\n      this.removeClass('vjs-slider-active');\n    });\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    let orientationClass = '';\n    if (!!this.options_.vertical) {\n      orientationClass = 'vjs-volume-menu-button-vertical';\n    } else {\n      orientationClass = 'vjs-volume-menu-button-horizontal';\n    }\n\n    return `vjs-volume-menu-button ${super.buildCSSClass()} ${orientationClass}`;\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {Menu} The volume menu button\n   * @method createMenu\n   */\n  createMenu() {\n    let menu = new Menu(this.player_, {\n      contentElType: 'div'\n    });\n\n    let vb = new VolumeBar(this.player_, this.options_.volumeBar);\n\n    menu.addChild(vb);\n\n    this.volumeBar = vb;\n    return menu;\n  }\n\n  /**\n   * Handle click on volume menu and calls super\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    MuteToggle.prototype.handleClick.call(this);\n    super.handleClick();\n  }\n\n}\n\nVolumeMenuButton.prototype.volumeUpdate = MuteToggle.prototype.update;\nVolumeMenuButton.prototype.controlText_ = 'Mute';\n\nComponent.registerComponent('VolumeMenuButton', VolumeMenuButton);\nexport default VolumeMenuButton;\n","/**\n * @file error-display.js\n */\nimport Component from './component';\nimport  * as Dom from './utils/dom.js';\n\n/**\n * Display that an error has occurred making the video unplayable\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @extends Component\n * @class ErrorDisplay\n */\nclass ErrorDisplay extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n\n    this.update();\n    this.on(player, 'error', this.update);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    var el = super.createEl('div', {\n      className: 'vjs-error-display'\n    });\n\n    this.contentEl_ = Dom.createEl('div');\n    el.appendChild(this.contentEl_);\n\n    return el;\n  }\n\n  /**\n   * Update the error message in localized language\n   *\n   * @method update\n   */\n  update() {\n    if (this.player().error()) {\n      this.contentEl_.innerHTML = this.localize(this.player().error().message);\n    }\n  }\n}\n\nComponent.registerComponent('ErrorDisplay', ErrorDisplay);\nexport default ErrorDisplay;\n","/**\n * @file event-target.js\n */\nimport * as Events from './utils/events.js';\n\nvar EventTarget = function() {};\n\nEventTarget.prototype.allowedEvents_ = {};\n\nEventTarget.prototype.on = function(type, fn) {\n  // Remove the addEventListener alias before calling Events.on\n  // so we don't get into an infinite type loop\n  let ael = this.addEventListener;\n  this.addEventListener = Function.prototype;\n  Events.on(this, type, fn);\n  this.addEventListener = ael;\n};\nEventTarget.prototype.addEventListener = EventTarget.prototype.on;\n\nEventTarget.prototype.off = function(type, fn) {\n  Events.off(this, type, fn);\n};\nEventTarget.prototype.removeEventListener = EventTarget.prototype.off;\n\nEventTarget.prototype.one = function(type, fn) {\n  Events.one(this, type, fn);\n};\n\nEventTarget.prototype.trigger = function(event) {\n  let type = event.type || event;\n\n  if (typeof event === 'string') {\n    event = {\n      type: type\n    };\n  }\n  event = Events.fixEvent(event);\n\n  if (this.allowedEvents_[type] && this['on' + type]) {\n    this['on' + type](event);\n  }\n\n  Events.trigger(this, event);\n};\n// The standard DOM EventTarget.dispatchEvent() is aliased to trigger()\nEventTarget.prototype.dispatchEvent = EventTarget.prototype.trigger;\n\nexport default EventTarget;\n","import log from './utils/log';\n\n/*\n * @file extend.js\n *\n * A combination of node inherits and babel's inherits (after transpile).\n * Both work the same but node adds `super_` to the subClass\n * and Bable adds the superClass as __proto__. Both seem useful.\n */\nconst _inherits = function (subClass, superClass) {\n  if (typeof superClass !== 'function' && superClass !== null) {\n    throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n\n  if (superClass) {\n    // node\n    subClass.super_ = superClass;\n  }\n};\n\n/*\n * Function for subclassing using the same inheritance that\n * videojs uses internally\n * ```js\n * var Button = videojs.getComponent('Button');\n * ```\n * ```js\n * var MyButton = videojs.extend(Button, {\n *   constructor: function(player, options) {\n *     Button.call(this, player, options);\n *   },\n *   onClick: function() {\n *     // doSomething\n *   }\n * });\n * ```\n */\nconst extendFn = function(superClass, subClassMethods={}) {\n  let subClass = function() {\n    superClass.apply(this, arguments);\n  };\n  let methods = {};\n\n  if (typeof subClassMethods === 'object') {\n    if (typeof subClassMethods.init === 'function') {\n      log.warn('Constructor logic via init() is deprecated; please use constructor() instead.');\n      subClassMethods.constructor = subClassMethods.init;\n    }\n    if (subClassMethods.constructor !== Object.prototype.constructor) {\n      subClass = subClassMethods.constructor;\n    }\n    methods = subClassMethods;\n  } else if (typeof subClassMethods === 'function') {\n    subClass = subClassMethods;\n  }\n\n  _inherits(subClass, superClass);\n\n  // Extend subObj's prototype with functions and other properties from props\n  for (var name in methods) {\n    if (methods.hasOwnProperty(name)) {\n      subClass.prototype[name] = methods[name];\n    }\n  }\n\n  return subClass;\n};\n\nexport default extendFn;\n","/**\n * @file fullscreen-api.js\n */\nimport document from 'global/document';\n\n/*\n * Store the browser-specific methods for the fullscreen API\n * @type {Object|undefined}\n * @private\n */\nlet FullscreenApi = {};\n\n// browser API methods\n// map approach from Screenful.js - https://github.com/sindresorhus/screenfull.js\nconst apiMap = [\n  // Spec: https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html\n  [\n    'requestFullscreen',\n    'exitFullscreen',\n    'fullscreenElement',\n    'fullscreenEnabled',\n    'fullscreenchange',\n    'fullscreenerror'\n  ],\n  // WebKit\n  [\n    'webkitRequestFullscreen',\n    'webkitExitFullscreen',\n    'webkitFullscreenElement',\n    'webkitFullscreenEnabled',\n    'webkitfullscreenchange',\n    'webkitfullscreenerror'\n  ],\n  // Old WebKit (Safari 5.1)\n  [\n    'webkitRequestFullScreen',\n    'webkitCancelFullScreen',\n    'webkitCurrentFullScreenElement',\n    'webkitCancelFullScreen',\n    'webkitfullscreenchange',\n    'webkitfullscreenerror'\n  ],\n  // Mozilla\n  [\n    'mozRequestFullScreen',\n    'mozCancelFullScreen',\n    'mozFullScreenElement',\n    'mozFullScreenEnabled',\n    'mozfullscreenchange',\n    'mozfullscreenerror'\n  ],\n  // Microsoft\n  [\n    'msRequestFullscreen',\n    'msExitFullscreen',\n    'msFullscreenElement',\n    'msFullscreenEnabled',\n    'MSFullscreenChange',\n    'MSFullscreenError'\n  ]\n];\n\nlet specApi = apiMap[0];\nlet browserApi;\n\n// determine the supported set of functions\nfor (let i = 0; i < apiMap.length; i++) {\n  // check for exitFullscreen function\n  if (apiMap[i][1] in document) {\n    browserApi = apiMap[i];\n    break;\n  }\n}\n\n// map the browser API names to the spec API names\nif (browserApi) {\n  for (let i=0; i<browserApi.length; i++) {\n    FullscreenApi[specApi[i]] = browserApi[i];\n  }\n}\n\nexport default FullscreenApi;\n","/**\n * @file loading-spinner.js\n */\nimport Component from './component';\n\n/* Loading Spinner\n================================================================================ */\n/**\n * Loading spinner for waiting events\n *\n * @extends Component\n * @class LoadingSpinner\n */\nclass LoadingSpinner extends Component {\n\n  /**\n   * Create the component's DOM element\n   *\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-loading-spinner'\n    });\n  }\n}\n\nComponent.registerComponent('LoadingSpinner', LoadingSpinner);\nexport default LoadingSpinner;\n","/**\n * @file media-error.js\n */\nimport assign from 'object.assign';\n\n/*\n * Custom MediaError to mimic the HTML5 MediaError\n *\n * @param {Number} code The media error code\n */\nlet MediaError = function(code){\n  if (typeof code === 'number') {\n    this.code = code;\n  } else if (typeof code === 'string') {\n    // default code is zero, so this is a custom error\n    this.message = code;\n  } else if (typeof code === 'object') { // object\n    assign(this, code);\n  }\n\n  if (!this.message) {\n    this.message = MediaError.defaultMessages[this.code] || '';\n  }\n};\n\n/*\n * The error code that refers two one of the defined\n * MediaError types\n *\n * @type {Number}\n */\nMediaError.prototype.code = 0;\n\n/*\n * An optional message to be shown with the error.\n * Message is not part of the HTML5 video spec\n * but allows for more informative custom errors.\n *\n * @type {String}\n */\nMediaError.prototype.message = '';\n\n/*\n * An optional status code that can be set by plugins\n * to allow even more detail about the error.\n * For example the HLS plugin might provide the specific\n * HTTP status code that was returned when the error\n * occurred, then allowing a custom error overlay\n * to display more information.\n *\n * @type {Array}\n */\nMediaError.prototype.status = null;\n\nMediaError.errorTypes = [\n  'MEDIA_ERR_CUSTOM',            // = 0\n  'MEDIA_ERR_ABORTED',           // = 1\n  'MEDIA_ERR_NETWORK',           // = 2\n  'MEDIA_ERR_DECODE',            // = 3\n  'MEDIA_ERR_SRC_NOT_SUPPORTED', // = 4\n  'MEDIA_ERR_ENCRYPTED'          // = 5\n];\n\nMediaError.defaultMessages = {\n  1: 'You aborted the media playback',\n  2: 'A network error caused the media download to fail part-way.',\n  3: 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.',\n  4: 'The media could not be loaded, either because the server or network failed or because the format is not supported.',\n  5: 'The media is encrypted and we do not have the keys to decrypt it.'\n};\n\n// Add types as properties on MediaError\n// e.g. MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;\nfor (var errNum = 0; errNum < MediaError.errorTypes.length; errNum++) {\n  MediaError[MediaError.errorTypes[errNum]] = errNum;\n  // values should be accessible on both the class and instance\n  MediaError.prototype[MediaError.errorTypes[errNum]] = errNum;\n}\n\nexport default MediaError;\n","/**\n * @file menu-button.js\n */\nimport Button from '../button.js';\nimport Component from '../component.js';\nimport Menu from './menu.js';\nimport * as Dom from '../utils/dom.js';\nimport * as Fn from '../utils/fn.js';\nimport toTitleCase from '../utils/to-title-case.js';\n\n/**\n * A button class with a popup menu\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Button\n * @class MenuButton\n */\nclass MenuButton extends Button {\n\n  constructor(player, options={}){\n    super(player, options);\n\n    this.update();\n\n    this.on('keydown', this.handleKeyPress);\n    this.el_.setAttribute('aria-haspopup', true);\n    this.el_.setAttribute('role', 'button');\n  }\n\n  /**\n   * Update menu\n   *\n   * @method update\n   */\n  update() {\n    let menu = this.createMenu();\n\n    if (this.menu) {\n      this.removeChild(this.menu);\n    }\n\n    this.menu = menu;\n    this.addChild(menu);\n\n    /**\n     * Track the state of the menu button\n     *\n     * @type {Boolean}\n     * @private\n     */\n    this.buttonPressed_ = false;\n\n    if (this.items && this.items.length === 0) {\n      this.hide();\n    } else if (this.items && this.items.length > 1) {\n      this.show();\n    }\n  }\n\n  /**\n   * Create menu\n   *\n   * @return {Menu} The constructed menu\n   * @method createMenu\n   */\n  createMenu() {\n    var menu = new Menu(this.player_);\n\n    // Add a title list item to the top\n    if (this.options_.title) {\n      menu.contentEl().appendChild(Dom.createEl('li', {\n        className: 'vjs-menu-title',\n        innerHTML: toTitleCase(this.options_.title),\n        tabIndex: -1\n      }));\n    }\n\n    this.items = this['createItems']();\n\n    if (this.items) {\n      // Add menu items to the menu\n      for (var i = 0; i < this.items.length; i++) {\n        menu.addItem(this.items[i]);\n      }\n    }\n\n    return menu;\n  }\n\n  /**\n   * Create the list of menu items. Specific to each subclass.\n   *\n   * @method createItems\n   */\n  createItems(){}\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: this.buildCSSClass()\n    });\n  }\n\n  /**\n   * Allow sub components to stack CSS class names\n   *\n   * @return {String} The constructed class name\n   * @method buildCSSClass\n   */\n  buildCSSClass() {\n    var menuButtonClass = 'vjs-menu-button';\n\n    // If the inline option is passed, we want to use different styles altogether.\n    if (this.options_.inline === true) {\n      menuButtonClass += '-inline';\n    } else {\n      menuButtonClass += '-popup';\n    }\n\n    return `vjs-menu-button ${menuButtonClass} ${super.buildCSSClass()}`;\n  }\n\n  /**\n   * Focus - Add keyboard functionality to element\n   * This function is not needed anymore. Instead, the\n   * keyboard functionality is handled by\n   * treating the button as triggering a submenu.\n   * When the button is pressed, the submenu\n   * appears. Pressing the button again makes\n   * the submenu disappear.\n   *\n   * @method handleFocus\n   */\n  handleFocus() {}\n\n  /**\n   * Can't turn off list display that we turned\n   * on with focus, because list would go away.\n   *\n   * @method handleBlur\n   */\n  handleBlur() {}\n\n  /**\n   * When you click the button it adds focus, which\n   * will show the menu indefinitely.\n   * So we'll remove focus when the mouse leaves the button.\n   * Focus is needed for tab navigation.\n   * Allow sub components to stack CSS class names\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    this.one('mouseout', Fn.bind(this, function(){\n      this.menu.unlockShowing();\n      this.el_.blur();\n    }));\n    if (this.buttonPressed_){\n      this.unpressButton();\n    } else {\n      this.pressButton();\n    }\n  }\n\n  /**\n   * Handle key press on menu\n   *\n   * @param {Object} Key press event\n   * @method handleKeyPress\n   */\n  handleKeyPress(event) {\n\n    // Check for space bar (32) or enter (13) keys\n    if (event.which === 32 || event.which === 13) {\n      if (this.buttonPressed_){\n        this.unpressButton();\n      } else {\n        this.pressButton();\n      }\n      event.preventDefault();\n    // Check for escape (27) key\n    } else if (event.which === 27){\n      if (this.buttonPressed_){\n        this.unpressButton();\n      }\n      event.preventDefault();\n    }\n  }\n\n  /**\n   * Makes changes based on button pressed\n   *\n   * @method pressButton\n   */\n  pressButton() {\n    this.buttonPressed_ = true;\n    this.menu.lockShowing();\n    this.el_.setAttribute('aria-pressed', true);\n    if (this.items && this.items.length > 0) {\n      this.items[0].el().focus(); // set the focus to the title of the submenu\n    }\n  }\n\n  /**\n   * Makes changes based on button unpressed\n   *\n   * @method unpressButton\n   */\n  unpressButton() {\n    this.buttonPressed_ = false;\n    this.menu.unlockShowing();\n    this.el_.setAttribute('aria-pressed', false);\n  }\n}\n\nComponent.registerComponent('MenuButton', MenuButton);\nexport default MenuButton;\n","/**\n * @file menu-item.js\n */\nimport Button from '../button.js';\nimport Component from '../component.js';\nimport assign from 'object.assign';\n\n/**\n * The component for a menu item. `<li>`\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Button\n * @class MenuItem\n */\nclass MenuItem extends Button {\n\n  constructor(player, options) {\n    super(player, options);\n    this.selected(options['selected']);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @param {String=} type Desc\n   * @param {Object=} props Desc\n   * @return {Element}\n   * @method createEl\n   */\n  createEl(type, props, attrs) {\n    return super.createEl('li', assign({\n      className: 'vjs-menu-item',\n      innerHTML: this.localize(this.options_['label'])\n    }, props), attrs);\n  }\n\n  /**\n   * Handle a click on the menu item, and set it to selected\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    this.selected(true);\n  }\n\n  /**\n   * Set this menu item as selected or not\n   *\n   * @param  {Boolean} selected\n   * @method selected\n   */\n  selected(selected) {\n    if (selected) {\n      this.addClass('vjs-selected');\n      this.el_.setAttribute('aria-selected',true);\n    } else {\n      this.removeClass('vjs-selected');\n      this.el_.setAttribute('aria-selected',false);\n    }\n  }\n\n}\n\nComponent.registerComponent('MenuItem', MenuItem);\nexport default MenuItem;\n","/**\n * @file menu.js\n */\nimport Component from '../component.js';\nimport * as Dom from '../utils/dom.js';\nimport * as Fn from '../utils/fn.js';\nimport * as Events from '../utils/events.js';\n\n/**\n * The Menu component is used to build pop up menus, including subtitle and\n * captions selection menus.\n *\n * @extends Component\n * @class Menu\n */\nclass Menu extends Component {\n\n  /**\n   * Add a menu item to the menu\n   *\n   * @param {Object|String} component Component or component type to add\n   * @method addItem\n   */\n  addItem(component) {\n    this.addChild(component);\n    component.on('click', Fn.bind(this, function(){\n      this.unlockShowing();\n    }));\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let contentElType = this.options_.contentElType || 'ul';\n    this.contentEl_ = Dom.createEl(contentElType, {\n      className: 'vjs-menu-content'\n    });\n    var el = super.createEl('div', {\n      append: this.contentEl_,\n      className: 'vjs-menu'\n    });\n    el.appendChild(this.contentEl_);\n\n    // Prevent clicks from bubbling up. Needed for Menu Buttons,\n    // where a click on the parent is significant\n    Events.on(el, 'click', function(event){\n      event.preventDefault();\n      event.stopImmediatePropagation();\n    });\n\n    return el;\n  }\n}\n\nComponent.registerComponent('Menu', Menu);\nexport default Menu;\n","/**\n * @file player.js\n */\n // Subclasses Component\nimport Component from './component.js';\n\nimport document from 'global/document';\nimport window from 'global/window';\nimport * as Events from './utils/events.js';\nimport * as Dom from './utils/dom.js';\nimport * as Fn from './utils/fn.js';\nimport * as Guid from './utils/guid.js';\nimport * as browser from './utils/browser.js';\nimport log from './utils/log.js';\nimport toTitleCase from './utils/to-title-case.js';\nimport { createTimeRange } from './utils/time-ranges.js';\nimport { bufferedPercent } from './utils/buffer.js';\nimport * as stylesheet from './utils/stylesheet.js';\nimport FullscreenApi from './fullscreen-api.js';\nimport MediaError from './media-error.js';\nimport safeParseTuple from 'safe-json-parse/tuple';\nimport assign from 'object.assign';\nimport mergeOptions from './utils/merge-options.js';\nimport textTrackConverter from './tracks/text-track-list-converter.js';\n\n// Include required child components (importing also registers them)\nimport MediaLoader from './tech/loader.js';\nimport PosterImage from './poster-image.js';\nimport TextTrackDisplay from './tracks/text-track-display.js';\nimport LoadingSpinner from './loading-spinner.js';\nimport BigPlayButton from './big-play-button.js';\nimport ControlBar from './control-bar/control-bar.js';\nimport ErrorDisplay from './error-display.js';\nimport TextTrackSettings from './tracks/text-track-settings.js';\n\n// Require html5 tech, at least for disposing the original video tag\nimport Html5 from './tech/html5.js';\n\n/**\n * An instance of the `Player` class is created when any of the Video.js setup methods are used to initialize a video.\n * ```js\n * var myPlayer = videojs('example_video_1');\n * ```\n * In the following example, the `data-setup` attribute tells the Video.js library to create a player instance when the library is ready.\n * ```html\n * <video id=\"example_video_1\" data-setup='{}' controls>\n *   <source src=\"my-source.mp4\" type=\"video/mp4\">\n * </video>\n * ```\n * After an instance has been created it can be accessed globally using `Video('example_video_1')`.\n *\n * @param {Element} tag        The original video tag used for configuring options\n * @param {Object=} options    Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends Component\n * @class Player\n */\nclass Player extends Component {\n\n  /**\n   * player's constructor function\n   *\n   * @constructs\n   * @method init\n   * @param {Element} tag        The original video tag used for configuring options\n   * @param {Object=} options    Player options\n   * @param {Function=} ready    Ready callback function\n   */\n  constructor(tag, options, ready){\n    // Make sure tag ID exists\n    tag.id = tag.id || `vjs_video_${Guid.newGUID()}`;\n\n    // Set Options\n    // The options argument overrides options set in the video tag\n    // which overrides globally set options.\n    // This latter part coincides with the load order\n    // (tag must exist before Player)\n    options = assign(Player.getTagSettings(tag), options);\n\n    // Delay the initialization of children because we need to set up\n    // player properties first, and can't use `this` before `super()`\n    options.initChildren = false;\n\n    // Same with creating the element\n    options.createEl = false;\n\n    // we don't want the player to report touch activity on itself\n    // see enableTouchActivity in Component\n    options.reportTouchActivity = false;\n\n    // Run base component initializing with new options\n    super(null, options, ready);\n\n    // if the global option object was accidentally blown away by\n    // someone, bail early with an informative error\n    if (!this.options_ ||\n        !this.options_.techOrder ||\n        !this.options_.techOrder.length) {\n      throw new Error('No techOrder specified. Did you overwrite ' +\n                      'videojs.options instead of just changing the ' +\n                      'properties you want to override?');\n    }\n\n    this.tag = tag; // Store the original tag used to set options\n\n    // Store the tag attributes used to restore html5 element\n    this.tagAttributes = tag && Dom.getElAttributes(tag);\n\n    // Update current language\n    this.language(this.options_.language);\n\n    // Update Supported Languages\n    if (options.languages) {\n      // Normalise player option languages to lowercase\n      let languagesToLower = {};\n\n      Object.getOwnPropertyNames(options.languages).forEach(function(name) {\n        languagesToLower[name.toLowerCase()] = options.languages[name];\n      });\n      this.languages_ = languagesToLower;\n    } else {\n      this.languages_ = Player.prototype.options_.languages;\n    }\n\n    // Cache for video property values.\n    this.cache_ = {};\n\n    // Set poster\n    this.poster_ = options.poster || '';\n\n    // Set controls\n    this.controls_ = !!options.controls;\n\n    // Original tag settings stored in options\n    // now remove immediately so native controls don't flash.\n    // May be turned back on by HTML5 tech if nativeControlsForTouch is true\n    tag.controls = false;\n\n    /*\n     * Store the internal state of scrubbing\n     *\n     * @private\n     * @return {Boolean} True if the user is scrubbing\n     */\n    this.scrubbing_ = false;\n\n    this.el_ = this.createEl();\n\n    // We also want to pass the original player options to each component and plugin\n    // as well so they don't need to reach back into the player for options later.\n    // We also need to do another copy of this.options_ so we don't end up with\n    // an infinite loop.\n    let playerOptionsCopy = mergeOptions(this.options_);\n\n    // Load plugins\n    if (options.plugins) {\n      let plugins = options.plugins;\n\n      Object.getOwnPropertyNames(plugins).forEach(function(name){\n        if (typeof this[name] === 'function') {\n          this[name](plugins[name]);\n        } else {\n          log.error('Unable to find plugin:', name);\n        }\n      }, this);\n    }\n\n    this.options_.playerOptions = playerOptionsCopy;\n\n    this.initChildren();\n\n    // Set isAudio based on whether or not an audio tag was used\n    this.isAudio(tag.nodeName.toLowerCase() === 'audio');\n\n    // Update controls className. Can't do this when the controls are initially\n    // set because the element doesn't exist yet.\n    if (this.controls()) {\n      this.addClass('vjs-controls-enabled');\n    } else {\n      this.addClass('vjs-controls-disabled');\n    }\n\n    if (this.isAudio()) {\n      this.addClass('vjs-audio');\n    }\n\n    if (this.flexNotSupported_()) {\n      this.addClass('vjs-no-flex');\n    }\n\n    // TODO: Make this smarter. Toggle user state between touching/mousing\n    // using events, since devices can have both touch and mouse events.\n    // if (browser.TOUCH_ENABLED) {\n    //   this.addClass('vjs-touch-enabled');\n    // }\n\n    // Make player easily findable by ID\n    Player.players[this.id_] = this;\n\n    // When the player is first initialized, trigger activity so components\n    // like the control bar show themselves if needed\n    this.userActive(true);\n    this.reportUserActivity();\n    this.listenForUserActivity_();\n\n    this.on('fullscreenchange', this.handleFullscreenChange_);\n    this.on('stageclick', this.handleStageClick_);\n  }\n\n  /**\n   * Destroys the video player and does any necessary cleanup\n   * ```js\n   *     myPlayer.dispose();\n   * ```\n   * This is especially helpful if you are dynamically adding and removing videos\n   * to/from the DOM.\n   *\n   * @method dispose\n   */\n  dispose() {\n    this.trigger('dispose');\n    // prevent dispose from being called twice\n    this.off('dispose');\n\n    if (this.styleEl_) {\n      this.styleEl_.parentNode.removeChild(this.styleEl_);\n    }\n\n    // Kill reference to this player\n    Player.players[this.id_] = null;\n    if (this.tag && this.tag.player) { this.tag.player = null; }\n    if (this.el_ && this.el_.player) { this.el_.player = null; }\n\n    if (this.tech_) { this.tech_.dispose(); }\n\n    super.dispose();\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = this.el_ = super.createEl('div');\n    let tag = this.tag;\n\n    // Remove width/height attrs from tag so CSS can make it 100% width/height\n    tag.removeAttribute('width');\n    tag.removeAttribute('height');\n\n    // Copy over all the attributes from the tag, including ID and class\n    // ID will now reference player box, not the video tag\n    const attrs = Dom.getElAttributes(tag);\n\n    Object.getOwnPropertyNames(attrs).forEach(function(attr){\n      // workaround so we don't totally break IE7\n      // http://stackoverflow.com/questions/3653444/css-styles-not-applied-on-dynamic-elements-in-internet-explorer-7\n      if (attr === 'class') {\n        el.className = attrs[attr];\n      } else {\n        el.setAttribute(attr, attrs[attr]);\n      }\n    });\n\n    // Update tag id/class for use as HTML5 playback tech\n    // Might think we should do this after embedding in container so .vjs-tech class\n    // doesn't flash 100% width/height, but class only applies with .video-js parent\n    tag.id += '_html5_api';\n    tag.className = 'vjs-tech';\n\n    // Make player findable on elements\n    tag.player = el.player = this;\n    // Default state of video is paused\n    this.addClass('vjs-paused');\n\n    // Add a style element in the player that we'll use to set the width/height\n    // of the player in a way that's still overrideable by CSS, just like the\n    // video element\n    this.styleEl_ = stylesheet.createStyleElement('vjs-styles-dimensions');\n    let defaultsStyleEl = document.querySelector('.vjs-styles-defaults');\n    let head = document.querySelector('head');\n    head.insertBefore(this.styleEl_, defaultsStyleEl ? defaultsStyleEl.nextSibling : head.firstChild);\n\n    // Pass in the width/height/aspectRatio options which will update the style el\n    this.width(this.options_.width);\n    this.height(this.options_.height);\n    this.fluid(this.options_.fluid);\n    this.aspectRatio(this.options_.aspectRatio);\n\n    // insertElFirst seems to cause the networkState to flicker from 3 to 2, so\n    // keep track of the original for later so we can know if the source originally failed\n    tag.initNetworkState_ = tag.networkState;\n\n    // Wrap video tag in div (el/box) container\n    if (tag.parentNode) {\n      tag.parentNode.insertBefore(el, tag);\n    }\n    Dom.insertElFirst(tag, el); // Breaks iPhone, fixed in HTML5 setup.\n\n    this.el_ = el;\n\n    return el;\n  }\n\n  /**\n   * Get/set player width\n   *\n   * @param {Number=} value Value for width\n   * @return {Number} Width when getting\n   * @method width\n   */\n  width(value) {\n    return this.dimension('width', value);\n  }\n\n  /**\n   * Get/set player height\n   *\n   * @param {Number=} value Value for height\n   * @return {Number} Height when getting\n   * @method height\n   */\n  height(value) {\n    return this.dimension('height', value);\n  }\n\n  /**\n   * Get/set dimension for player\n   *\n   * @param {String} dimension Either width or height\n   * @param {Number=} value Value for dimension\n   * @return {Component}\n   * @method dimension\n   */\n  dimension(dimension, value) {\n    let privDimension = dimension + '_';\n\n    if (value === undefined) {\n      return this[privDimension] || 0;\n    }\n\n    if (value === '') {\n      // If an empty string is given, reset the dimension to be automatic\n      this[privDimension] = undefined;\n    } else {\n      let parsedVal = parseFloat(value);\n\n      if (isNaN(parsedVal)) {\n        log.error(`Improper value \"${value}\" supplied for for ${dimension}`);\n        return this;\n      }\n\n      this[privDimension] = parsedVal;\n    }\n\n    this.updateStyleEl_();\n    return this;\n  }\n\n  /**\n   * Add/remove the vjs-fluid class\n   *\n   * @param {Boolean} bool Value of true adds the class, value of false removes the class\n   * @method fluid\n   */\n  fluid(bool) {\n    if (bool === undefined) {\n      return !!this.fluid_;\n    }\n\n    this.fluid_ = !!bool;\n\n    if (bool) {\n      this.addClass('vjs-fluid');\n    } else {\n      this.removeClass('vjs-fluid');\n    }\n  }\n\n  /**\n   * Get/Set the aspect ratio\n   *\n   * @param {String=} ratio Aspect ratio for player\n   * @return aspectRatio\n   * @method aspectRatio\n   */\n  aspectRatio(ratio) {\n    if (ratio === undefined) {\n      return this.aspectRatio_;\n    }\n\n    // Check for width:height format\n    if (!/^\\d+\\:\\d+$/.test(ratio)) {\n      throw new Error('Improper value supplied for aspect ratio. The format should be width:height, for example 16:9.');\n    }\n    this.aspectRatio_ = ratio;\n\n    // We're assuming if you set an aspect ratio you want fluid mode,\n    // because in fixed mode you could calculate width and height yourself.\n    this.fluid(true);\n\n    this.updateStyleEl_();\n  }\n\n  /**\n   * Update styles of the player element (height, width and aspect ratio)\n   *\n   * @method updateStyleEl_\n   */\n  updateStyleEl_() {\n    let width;\n    let height;\n    let aspectRatio;\n\n    // The aspect ratio is either used directly or to calculate width and height.\n    if (this.aspectRatio_ !== undefined && this.aspectRatio_ !== 'auto') {\n      // Use any aspectRatio that's been specifically set\n      aspectRatio = this.aspectRatio_;\n    } else if (this.videoWidth()) {\n      // Otherwise try to get the aspect ratio from the video metadata\n      aspectRatio = this.videoWidth() + ':' + this.videoHeight();\n    } else {\n      // Or use a default. The video element's is 2:1, but 16:9 is more common.\n      aspectRatio = '16:9';\n    }\n\n    // Get the ratio as a decimal we can use to calculate dimensions\n    let ratioParts = aspectRatio.split(':');\n    let ratioMultiplier = ratioParts[1] / ratioParts[0];\n\n    if (this.width_ !== undefined) {\n      // Use any width that's been specifically set\n      width = this.width_;\n    } else if (this.height_ !== undefined) {\n      // Or calulate the width from the aspect ratio if a height has been set\n      width = this.height_ / ratioMultiplier;\n    } else {\n      // Or use the video's metadata, or use the video el's default of 300\n      width = this.videoWidth() || 300;\n    }\n\n    if (this.height_ !== undefined) {\n      // Use any height that's been specifically set\n      height = this.height_;\n    } else {\n      // Otherwise calculate the height from the ratio and the width\n      height = width  * ratioMultiplier;\n    }\n\n    let idClass = this.id()+'-dimensions';\n\n    // Ensure the right class is still on the player for the style element\n    this.addClass(idClass);\n\n    stylesheet.setTextContent(this.styleEl_, `\n      .${idClass} {\n        width: ${width}px;\n        height: ${height}px;\n      }\n\n      .${idClass}.vjs-fluid {\n        padding-top: ${ratioMultiplier * 100}%;\n      }\n    `);\n  }\n\n  /**\n   * Load the Media Playback Technology (tech)\n   * Load/Create an instance of playback technology including element and API methods\n   * And append playback element in player div.\n   *\n   * @param {String} techName Name of the playback technology\n   * @param {String} source Video source\n   * @method loadTech_\n   * @private\n   */\n  loadTech_(techName, source) {\n\n    // Pause and remove current playback technology\n    if (this.tech_) {\n      this.unloadTech_();\n    }\n\n    // get rid of the HTML5 video tag as soon as we are using another tech\n    if (techName !== 'Html5' && this.tag) {\n      Component.getComponent('Html5').disposeMediaElement(this.tag);\n      this.tag.player = null;\n      this.tag = null;\n    }\n\n    this.techName_ = techName;\n\n    // Turn off API access because we're loading a new tech that might load asynchronously\n    this.isReady_ = false;\n\n    // Grab tech-specific options from player options and add source and parent element to use.\n    var techOptions = assign({\n      'nativeControlsForTouch': this.options_.nativeControlsForTouch,\n      'source': source,\n      'playerId': this.id(),\n      'techId': `${this.id()}_${techName}_api`,\n      'textTracks': this.textTracks_,\n      'autoplay': this.options_.autoplay,\n      'preload': this.options_.preload,\n      'loop': this.options_.loop,\n      'muted': this.options_.muted,\n      'poster': this.poster(),\n      'language': this.language(),\n      'vtt.js': this.options_['vtt.js']\n    }, this.options_[techName.toLowerCase()]);\n\n    if (this.tag) {\n      techOptions.tag = this.tag;\n    }\n\n    if (source) {\n      this.currentType_ = source.type;\n      if (source.src === this.cache_.src && this.cache_.currentTime > 0) {\n        techOptions.startTime = this.cache_.currentTime;\n      }\n\n      this.cache_.src = source.src;\n    }\n\n    // Initialize tech instance\n    let techComponent = Component.getComponent(techName);\n    this.tech_ = new techComponent(techOptions);\n\n    // player.triggerReady is always async, so don't need this to be async\n    this.tech_.ready(Fn.bind(this, this.handleTechReady_), true);\n\n    textTrackConverter.jsonToTextTracks(this.textTracksJson_ || [], this.tech_);\n\n    // Listen to all HTML5-defined events and trigger them on the player\n    this.on(this.tech_, 'loadstart', this.handleTechLoadStart_);\n    this.on(this.tech_, 'waiting', this.handleTechWaiting_);\n    this.on(this.tech_, 'canplay', this.handleTechCanPlay_);\n    this.on(this.tech_, 'canplaythrough', this.handleTechCanPlayThrough_);\n    this.on(this.tech_, 'playing', this.handleTechPlaying_);\n    this.on(this.tech_, 'ended', this.handleTechEnded_);\n    this.on(this.tech_, 'seeking', this.handleTechSeeking_);\n    this.on(this.tech_, 'seeked', this.handleTechSeeked_);\n    this.on(this.tech_, 'play', this.handleTechPlay_);\n    this.on(this.tech_, 'firstplay', this.handleTechFirstPlay_);\n    this.on(this.tech_, 'pause', this.handleTechPause_);\n    this.on(this.tech_, 'progress', this.handleTechProgress_);\n    this.on(this.tech_, 'durationchange', this.handleTechDurationChange_);\n    this.on(this.tech_, 'fullscreenchange', this.handleTechFullscreenChange_);\n    this.on(this.tech_, 'error', this.handleTechError_);\n    this.on(this.tech_, 'suspend', this.handleTechSuspend_);\n    this.on(this.tech_, 'abort', this.handleTechAbort_);\n    this.on(this.tech_, 'emptied', this.handleTechEmptied_);\n    this.on(this.tech_, 'stalled', this.handleTechStalled_);\n    this.on(this.tech_, 'loadedmetadata', this.handleTechLoadedMetaData_);\n    this.on(this.tech_, 'loadeddata', this.handleTechLoadedData_);\n    this.on(this.tech_, 'timeupdate', this.handleTechTimeUpdate_);\n    this.on(this.tech_, 'ratechange', this.handleTechRateChange_);\n    this.on(this.tech_, 'volumechange', this.handleTechVolumeChange_);\n    this.on(this.tech_, 'texttrackchange', this.handleTechTextTrackChange_);\n    this.on(this.tech_, 'loadedmetadata', this.updateStyleEl_);\n    this.on(this.tech_, 'posterchange', this.handleTechPosterChange_);\n\n    this.usingNativeControls(this.techGet_('controls'));\n\n    if (this.controls() && !this.usingNativeControls()) {\n      this.addTechControlsListeners_();\n    }\n\n    // Add the tech element in the DOM if it was not already there\n    // Make sure to not insert the original video element if using Html5\n    if (this.tech_.el().parentNode !== this.el() && (techName !== 'Html5' || !this.tag)) {\n      Dom.insertElFirst(this.tech_.el(), this.el());\n    }\n\n    // Get rid of the original video tag reference after the first tech is loaded\n    if (this.tag) {\n      this.tag.player = null;\n      this.tag = null;\n    }\n  }\n\n  /**\n   * Unload playback technology\n   *\n   * @method unloadTech_\n   * @private\n   */\n  unloadTech_() {\n    // Save the current text tracks so that we can reuse the same text tracks with the next tech\n    this.textTracks_ = this.textTracks();\n    this.textTracksJson_ = textTrackConverter.textTracksToJson(this);\n\n    this.isReady_ = false;\n\n    this.tech_.dispose();\n\n    this.tech_ = false;\n  }\n\n  /**\n   * Set up click and touch listeners for the playback element\n   *\n   * On desktops, a click on the video itself will toggle playback,\n   * on a mobile device a click on the video toggles controls.\n   * (toggling controls is done by toggling the user state between active and\n   * inactive)\n   * A tap can signal that a user has become active, or has become inactive\n   * e.g. a quick tap on an iPhone movie should reveal the controls. Another\n   * quick tap should hide them again (signaling the user is in an inactive\n   * viewing state)\n   * In addition to this, we still want the user to be considered inactive after\n   * a few seconds of inactivity.\n   * Note: the only part of iOS interaction we can't mimic with this setup\n   * is a touch and hold on the video element counting as activity in order to\n   * keep the controls showing, but that shouldn't be an issue. A touch and hold\n   * on any controls will still keep the user active\n   *\n   * @private\n   * @method addTechControlsListeners_\n   */\n  addTechControlsListeners_() {\n    // Make sure to remove all the previous listeners in case we are called multiple times.\n    this.removeTechControlsListeners_();\n\n    // Some browsers (Chrome & IE) don't trigger a click on a flash swf, but do\n    // trigger mousedown/up.\n    // http://stackoverflow.com/questions/1444562/javascript-onclick-event-over-flash-object\n    // Any touch events are set to block the mousedown event from happening\n    this.on(this.tech_, 'mousedown', this.handleTechClick_);\n\n    // If the controls were hidden we don't want that to change without a tap event\n    // so we'll check if the controls were already showing before reporting user\n    // activity\n    this.on(this.tech_, 'touchstart', this.handleTechTouchStart_);\n    this.on(this.tech_, 'touchmove', this.handleTechTouchMove_);\n    this.on(this.tech_, 'touchend', this.handleTechTouchEnd_);\n\n    // The tap listener needs to come after the touchend listener because the tap\n    // listener cancels out any reportedUserActivity when setting userActive(false)\n    this.on(this.tech_, 'tap', this.handleTechTap_);\n  }\n\n  /**\n   * Remove the listeners used for click and tap controls. This is needed for\n   * toggling to controls disabled, where a tap/touch should do nothing.\n   *\n   * @method removeTechControlsListeners_\n   * @private\n   */\n  removeTechControlsListeners_() {\n    // We don't want to just use `this.off()` because there might be other needed\n    // listeners added by techs that extend this.\n    this.off(this.tech_, 'tap', this.handleTechTap_);\n    this.off(this.tech_, 'touchstart', this.handleTechTouchStart_);\n    this.off(this.tech_, 'touchmove', this.handleTechTouchMove_);\n    this.off(this.tech_, 'touchend', this.handleTechTouchEnd_);\n    this.off(this.tech_, 'mousedown', this.handleTechClick_);\n  }\n\n  /**\n   * Player waits for the tech to be ready\n   *\n   * @method handleTechReady_\n   * @private\n   */\n  handleTechReady_() {\n    this.triggerReady();\n\n    // Keep the same volume as before\n    if (this.cache_.volume) {\n      this.techCall_('setVolume', this.cache_.volume);\n    }\n\n    // Look if the tech found a higher resolution poster while loading\n    this.handleTechPosterChange_();\n\n    // Update the duration if available\n    this.handleTechDurationChange_();\n\n    // Chrome and Safari both have issues with autoplay.\n    // In Safari (5.1.1), when we move the video element into the container div, autoplay doesn't work.\n    // In Chrome (15), if you have autoplay + a poster + no controls, the video gets hidden (but audio plays)\n    // This fixes both issues. Need to wait for API, so it updates displays correctly\n    if (this.tag && this.options_.autoplay && this.paused()) {\n      delete this.tag.poster; // Chrome Fix. Fixed in Chrome v16.\n      this.play();\n    }\n  }\n\n  /**\n   * Fired when the user agent begins looking for media data\n   *\n   * @private\n   * @method handleTechLoadStart_\n   */\n  handleTechLoadStart_() {\n    // TODO: Update to use `emptied` event instead. See #1277.\n\n    this.removeClass('vjs-ended');\n\n    // reset the error state\n    this.error(null);\n\n    // If it's already playing we want to trigger a firstplay event now.\n    // The firstplay event relies on both the play and loadstart events\n    // which can happen in any order for a new source\n    if (!this.paused()) {\n      this.trigger('loadstart');\n      this.trigger('firstplay');\n    } else {\n      // reset the hasStarted state\n      this.hasStarted(false);\n      this.trigger('loadstart');\n    }\n  }\n\n  /**\n   * Add/remove the vjs-has-started class\n   *\n   * @param {Boolean} hasStarted The value of true adds the class the value of false remove the class\n   * @return {Boolean} Boolean value if has started\n   * @private\n   * @method hasStarted\n   */\n  hasStarted(hasStarted) {\n    if (hasStarted !== undefined) {\n      // only update if this is a new value\n      if (this.hasStarted_ !== hasStarted) {\n        this.hasStarted_ = hasStarted;\n        if (hasStarted) {\n          this.addClass('vjs-has-started');\n          // trigger the firstplay event if this newly has played\n          this.trigger('firstplay');\n        } else {\n          this.removeClass('vjs-has-started');\n        }\n      }\n      return this;\n    }\n    return !!this.hasStarted_;\n  }\n\n  /**\n   * Fired whenever the media begins or resumes playback\n   *\n   * @private\n   * @method handleTechPlay_\n   */\n  handleTechPlay_() {\n    this.removeClass('vjs-ended');\n    this.removeClass('vjs-paused');\n    this.addClass('vjs-playing');\n\n    // hide the poster when the user hits play\n    // https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-play\n    this.hasStarted(true);\n\n    this.trigger('play');\n  }\n\n  /**\n   * Fired whenever the media begins waiting\n   *\n   * @private\n   * @method handleTechWaiting_\n   */\n  handleTechWaiting_() {\n    this.addClass('vjs-waiting');\n    this.trigger('waiting');\n  }\n\n  /**\n   * A handler for events that signal that waiting has ended\n   * which is not consistent between browsers. See #1351\n   *\n   * @private\n   * @method handleTechCanPlay_\n   */\n  handleTechCanPlay_() {\n    this.removeClass('vjs-waiting');\n    this.trigger('canplay');\n  }\n\n  /**\n   * A handler for events that signal that waiting has ended\n   * which is not consistent between browsers. See #1351\n   *\n   * @private\n   * @method handleTechCanPlayThrough_\n   */\n  handleTechCanPlayThrough_() {\n    this.removeClass('vjs-waiting');\n    this.trigger('canplaythrough');\n  }\n\n  /**\n   * A handler for events that signal that waiting has ended\n   * which is not consistent between browsers. See #1351\n   *\n   * @private\n   * @method handleTechPlaying_\n   */\n  handleTechPlaying_() {\n    this.removeClass('vjs-waiting');\n    this.trigger('playing');\n  }\n\n  /**\n   * Fired whenever the player is jumping to a new time\n   *\n   * @private\n   * @method handleTechSeeking_\n   */\n  handleTechSeeking_() {\n    this.addClass('vjs-seeking');\n    this.trigger('seeking');\n  }\n\n  /**\n   * Fired when the player has finished jumping to a new time\n   *\n   * @private\n   * @method handleTechSeeked_\n   */\n  handleTechSeeked_() {\n    this.removeClass('vjs-seeking');\n    this.trigger('seeked');\n  }\n\n  /**\n   * Fired the first time a video is played\n   * Not part of the HLS spec, and we're not sure if this is the best\n   * implementation yet, so use sparingly. If you don't have a reason to\n   * prevent playback, use `myPlayer.one('play');` instead.\n   *\n   * @private\n   * @method handleTechFirstPlay_\n   */\n  handleTechFirstPlay_() {\n    //If the first starttime attribute is specified\n    //then we will start at the given offset in seconds\n    if(this.options_.starttime){\n      this.currentTime(this.options_.starttime);\n    }\n\n    this.addClass('vjs-has-started');\n    this.trigger('firstplay');\n  }\n\n  /**\n   * Fired whenever the media has been paused\n   *\n   * @private\n   * @method handleTechPause_\n   */\n  handleTechPause_() {\n    this.removeClass('vjs-playing');\n    this.addClass('vjs-paused');\n    this.trigger('pause');\n  }\n\n  /**\n   * Fired while the user agent is downloading media data\n   *\n   * @private\n   * @method handleTechProgress_\n   */\n  handleTechProgress_() {\n    this.trigger('progress');\n  }\n\n  /**\n   * Fired when the end of the media resource is reached (currentTime == duration)\n   *\n   * @private\n   * @method handleTechEnded_\n   */\n  handleTechEnded_() {\n    this.addClass('vjs-ended');\n    if (this.options_.loop) {\n      this.currentTime(0);\n      this.play();\n    } else if (!this.paused()) {\n      this.pause();\n    }\n\n    this.trigger('ended');\n  }\n\n  /**\n   * Fired when the duration of the media resource is first known or changed\n   *\n   * @private\n   * @method handleTechDurationChange_\n   */\n  handleTechDurationChange_() {\n    this.duration(this.techGet_('duration'));\n  }\n\n  /**\n   * Handle a click on the media element to play/pause\n   *\n   * @param {Object=} event Event object\n   * @private\n   * @method handleTechClick_\n   */\n  handleTechClick_(event) {\n    // We're using mousedown to detect clicks thanks to Flash, but mousedown\n    // will also be triggered with right-clicks, so we need to prevent that\n    if (event.button !== 0) return;\n\n    // When controls are disabled a click should not toggle playback because\n    // the click is considered a control\n    if (this.controls()) {\n      if (this.paused()) {\n        this.play();\n      } else {\n        this.pause();\n      }\n    }\n  }\n\n  /**\n   * Handle a tap on the media element. It will toggle the user\n   * activity state, which hides and shows the controls.\n   *\n   * @private\n   * @method handleTechTap_\n   */\n  handleTechTap_() {\n    this.userActive(!this.userActive());\n  }\n\n  /**\n   * Handle touch to start\n   *\n   * @private\n   * @method handleTechTouchStart_\n   */\n  handleTechTouchStart_() {\n    this.userWasActive = this.userActive();\n  }\n\n  /**\n   * Handle touch to move\n   *\n   * @private\n   * @method handleTechTouchMove_\n   */\n  handleTechTouchMove_() {\n    if (this.userWasActive){\n      this.reportUserActivity();\n    }\n  }\n\n  /**\n   * Handle touch to end\n   *\n   * @private\n   * @method handleTechTouchEnd_\n   */\n  handleTechTouchEnd_(event) {\n    // Stop the mouse events from also happening\n    event.preventDefault();\n  }\n\n  /**\n   * Fired when the player switches in or out of fullscreen mode\n   *\n   * @private\n   * @method handleFullscreenChange_\n   */\n  handleFullscreenChange_() {\n    if (this.isFullscreen()) {\n      this.addClass('vjs-fullscreen');\n    } else {\n      this.removeClass('vjs-fullscreen');\n    }\n  }\n\n  /**\n   * native click events on the SWF aren't triggered on IE11, Win8.1RT\n   * use stageclick events triggered from inside the SWF instead\n   *\n   * @private\n   * @method handleStageClick_\n   */\n  handleStageClick_() {\n    this.reportUserActivity();\n  }\n\n  /**\n   * Handle Tech Fullscreen Change\n   *\n   * @private\n   * @method handleTechFullscreenChange_\n   */\n  handleTechFullscreenChange_(event, data) {\n    if (data) {\n      this.isFullscreen(data.isFullscreen);\n    }\n    this.trigger('fullscreenchange');\n  }\n\n  /**\n   * Fires when an error occurred during the loading of an audio/video\n   *\n   * @private\n   * @method handleTechError_\n   */\n  handleTechError_() {\n    let error = this.tech_.error();\n    this.error(error && error.code);\n  }\n\n  /**\n   * Fires when the browser is intentionally not getting media data\n   *\n   * @private\n   * @method handleTechSuspend_\n   */\n  handleTechSuspend_() {\n    this.trigger('suspend');\n  }\n\n  /**\n   * Fires when the loading of an audio/video is aborted\n   *\n   * @private\n   * @method handleTechAbort_\n   */\n  handleTechAbort_() {\n    this.trigger('abort');\n  }\n\n  /**\n   * Fires when the current playlist is empty\n   *\n   * @private\n   * @method handleTechEmptied_\n   */\n  handleTechEmptied_() {\n    this.trigger('emptied');\n  }\n\n  /**\n   * Fires when the browser is trying to get media data, but data is not available\n   *\n   * @private\n   * @method handleTechStalled_\n   */\n  handleTechStalled_() {\n    this.trigger('stalled');\n  }\n\n  /**\n   * Fires when the browser has loaded meta data for the audio/video\n   *\n   * @private\n   * @method handleTechLoadedMetaData_\n   */\n  handleTechLoadedMetaData_() {\n    this.trigger('loadedmetadata');\n  }\n\n  /**\n   * Fires when the browser has loaded the current frame of the audio/video\n   *\n   * @private\n   * @method handleTechLoadedData_\n   */\n  handleTechLoadedData_() {\n    this.trigger('loadeddata');\n  }\n\n  /**\n   * Fires when the current playback position has changed\n   *\n   * @private\n   * @method handleTechTimeUpdate_\n   */\n  handleTechTimeUpdate_() {\n    this.trigger('timeupdate');\n  }\n\n  /**\n   * Fires when the playing speed of the audio/video is changed\n   *\n   * @private\n   * @method handleTechRateChange_\n   */\n  handleTechRateChange_() {\n    this.trigger('ratechange');\n  }\n\n  /**\n   * Fires when the volume has been changed\n   *\n   * @private\n   * @method handleTechVolumeChange_\n   */\n  handleTechVolumeChange_() {\n    this.trigger('volumechange');\n  }\n\n  /**\n   * Fires when the text track has been changed\n   *\n   * @private\n   * @method handleTechTextTrackChange_\n   */\n  handleTechTextTrackChange_() {\n    this.trigger('texttrackchange');\n  }\n\n  /**\n   * Get object for cached values.\n   *\n   * @return {Object}\n   * @method getCache\n   */\n  getCache() {\n    return this.cache_;\n  }\n\n  /**\n   * Pass values to the playback tech\n   *\n   * @param {String=} method Method\n   * @param {Object=} arg Argument\n   * @private\n   * @method techCall_\n   */\n  techCall_(method, arg) {\n    // If it's not ready yet, call method when it is\n    if (this.tech_ && !this.tech_.isReady_) {\n      this.tech_.ready(function(){\n        this[method](arg);\n      }, true);\n\n    // Otherwise call method now\n    } else {\n      try {\n        this.tech_[method](arg);\n      } catch(e) {\n        log(e);\n        throw e;\n      }\n    }\n  }\n\n  /**\n   * Get calls can't wait for the tech, and sometimes don't need to.\n   *\n   * @param {String} method Tech method\n   * @return {Method}\n   * @private\n   * @method techGet_\n   */\n  techGet_(method) {\n    if (this.tech_ && this.tech_.isReady_) {\n\n      // Flash likes to die and reload when you hide or reposition it.\n      // In these cases the object methods go away and we get errors.\n      // When that happens we'll catch the errors and inform tech that it's not ready any more.\n      try {\n        return this.tech_[method]();\n      } catch(e) {\n        // When building additional tech libs, an expected method may not be defined yet\n        if (this.tech_[method] === undefined) {\n          log(`Video.js: ${method} method not defined for ${this.techName_} playback technology.`, e);\n        } else {\n          // When a method isn't available on the object it throws a TypeError\n          if (e.name === 'TypeError') {\n            log(`Video.js: ${method} unavailable on ${this.techName_} playback technology element.`, e);\n            this.tech_.isReady_ = false;\n          } else {\n            log(e);\n          }\n        }\n        throw e;\n      }\n    }\n\n    return;\n  }\n\n  /**\n   * start media playback\n   * ```js\n   *     myPlayer.play();\n   * ```\n   *\n   * @return {Player} self\n   * @method play\n   */\n  play() {\n    this.techCall_('play');\n    return this;\n  }\n\n  /**\n   * Pause the video playback\n   * ```js\n   *     myPlayer.pause();\n   * ```\n   *\n   * @return {Player} self\n   * @method pause\n   */\n  pause() {\n    this.techCall_('pause');\n    return this;\n  }\n\n  /**\n   * Check if the player is paused\n   * ```js\n   *     var isPaused = myPlayer.paused();\n   *     var isPlaying = !myPlayer.paused();\n   * ```\n   *\n   * @return {Boolean} false if the media is currently playing, or true otherwise\n   * @method paused\n   */\n  paused() {\n    // The initial state of paused should be true (in Safari it's actually false)\n    return (this.techGet_('paused') === false) ? false : true;\n  }\n\n  /**\n   * Returns whether or not the user is \"scrubbing\". Scrubbing is when the user\n   * has clicked the progress bar handle and is dragging it along the progress bar.\n   *\n   * @param  {Boolean} isScrubbing   True/false the user is scrubbing\n   * @return {Boolean}               The scrubbing status when getting\n   * @return {Object}                The player when setting\n   * @method scrubbing\n   */\n  scrubbing(isScrubbing) {\n    if (isScrubbing !== undefined) {\n      this.scrubbing_ = !!isScrubbing;\n\n      if (isScrubbing) {\n        this.addClass('vjs-scrubbing');\n      } else {\n        this.removeClass('vjs-scrubbing');\n      }\n\n      return this;\n    }\n\n    return this.scrubbing_;\n  }\n\n  /**\n   * Get or set the current time (in seconds)\n   * ```js\n   *     // get\n   *     var whereYouAt = myPlayer.currentTime();\n   *     // set\n   *     myPlayer.currentTime(120); // 2 minutes into the video\n   * ```\n   *\n   * @param  {Number|String=} seconds The time to seek to\n   * @return {Number}        The time in seconds, when not setting\n   * @return {Player}    self, when the current time is set\n   * @method currentTime\n   */\n  currentTime(seconds) {\n    if (seconds !== undefined) {\n\n      this.techCall_('setCurrentTime', seconds);\n\n      return this;\n    }\n\n    // cache last currentTime and return. default to 0 seconds\n    //\n    // Caching the currentTime is meant to prevent a massive amount of reads on the tech's\n    // currentTime when scrubbing, but may not provide much performance benefit afterall.\n    // Should be tested. Also something has to read the actual current time or the cache will\n    // never get updated.\n    return this.cache_.currentTime = (this.techGet_('currentTime') || 0);\n  }\n\n  /**\n   * Get the length in time of the video in seconds\n   * ```js\n   *     var lengthOfVideo = myPlayer.duration();\n   * ```\n   * **NOTE**: The video must have started loading before the duration can be\n   * known, and in the case of Flash, may not be known until the video starts\n   * playing.\n   *\n   * @param {Number} seconds Duration when setting\n   * @return {Number} The duration of the video in seconds when getting\n   * @method duration\n   */\n  duration(seconds) {\n    if (seconds === undefined) {\n      return this.cache_.duration || 0;\n    }\n\n    seconds = parseFloat(seconds) || 0;\n\n    // Standardize on Inifity for signaling video is live\n    if (seconds < 0) {\n      seconds = Infinity;\n    }\n\n    if (seconds !== this.cache_.duration) {\n      // Cache the last set value for optimized scrubbing (esp. Flash)\n      this.cache_.duration = seconds;\n\n      if (seconds === Infinity) {\n        this.addClass('vjs-live');\n      } else {\n        this.removeClass('vjs-live');\n      }\n\n      this.trigger('durationchange');\n    }\n\n    return this;\n  }\n\n  /**\n   * Calculates how much time is left.\n   * ```js\n   *     var timeLeft = myPlayer.remainingTime();\n   * ```\n   * Not a native video element function, but useful\n   *\n   * @return {Number} The time remaining in seconds\n   * @method remainingTime\n   */\n  remainingTime() {\n    return this.duration() - this.currentTime();\n  }\n\n  // http://dev.w3.org/html5/spec/video.html#dom-media-buffered\n  // Buffered returns a timerange object.\n  // Kind of like an array of portions of the video that have been downloaded.\n\n  /**\n   * Get a TimeRange object with the times of the video that have been downloaded\n   * If you just want the percent of the video that's been downloaded,\n   * use bufferedPercent.\n   * ```js\n   *     // Number of different ranges of time have been buffered. Usually 1.\n   *     numberOfRanges = bufferedTimeRange.length,\n   *     // Time in seconds when the first range starts. Usually 0.\n   *     firstRangeStart = bufferedTimeRange.start(0),\n   *     // Time in seconds when the first range ends\n   *     firstRangeEnd = bufferedTimeRange.end(0),\n   *     // Length in seconds of the first time range\n   *     firstRangeLength = firstRangeEnd - firstRangeStart;\n   * ```\n   *\n   * @return {Object} A mock TimeRange object (following HTML spec)\n   * @method buffered\n   */\n  buffered() {\n    var buffered = this.techGet_('buffered');\n\n    if (!buffered || !buffered.length) {\n      buffered = createTimeRange(0,0);\n    }\n\n    return buffered;\n  }\n\n  /**\n   * Get the percent (as a decimal) of the video that's been downloaded\n   * ```js\n   *     var howMuchIsDownloaded = myPlayer.bufferedPercent();\n   * ```\n   * 0 means none, 1 means all.\n   * (This method isn't in the HTML5 spec, but it's very convenient)\n   *\n   * @return {Number} A decimal between 0 and 1 representing the percent\n   * @method bufferedPercent\n   */\n  bufferedPercent() {\n    return bufferedPercent(this.buffered(), this.duration());\n  }\n\n  /**\n   * Get the ending time of the last buffered time range\n   * This is used in the progress bar to encapsulate all time ranges.\n   *\n   * @return {Number} The end of the last buffered time range\n   * @method bufferedEnd\n   */\n  bufferedEnd() {\n    var buffered = this.buffered(),\n        duration = this.duration(),\n        end = buffered.end(buffered.length-1);\n\n    if (end > duration) {\n      end = duration;\n    }\n\n    return end;\n  }\n\n  /**\n   * Get or set the current volume of the media\n   * ```js\n   *     // get\n   *     var howLoudIsIt = myPlayer.volume();\n   *     // set\n   *     myPlayer.volume(0.5); // Set volume to half\n   * ```\n   * 0 is off (muted), 1.0 is all the way up, 0.5 is half way.\n   *\n   * @param  {Number} percentAsDecimal The new volume as a decimal percent\n   * @return {Number}              The current volume when getting\n   * @return {Player}              self when setting\n   * @method volume\n   */\n  volume(percentAsDecimal) {\n    let vol;\n\n    if (percentAsDecimal !== undefined) {\n      vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal))); // Force value to between 0 and 1\n      this.cache_.volume = vol;\n      this.techCall_('setVolume', vol);\n\n      return this;\n    }\n\n    // Default to 1 when returning current volume.\n    vol = parseFloat(this.techGet_('volume'));\n    return (isNaN(vol)) ? 1 : vol;\n  }\n\n\n  /**\n   * Get the current muted state, or turn mute on or off\n   * ```js\n   *     // get\n   *     var isVolumeMuted = myPlayer.muted();\n   *     // set\n   *     myPlayer.muted(true); // mute the volume\n   * ```\n   *\n   * @param  {Boolean=} muted True to mute, false to unmute\n   * @return {Boolean} True if mute is on, false if not when getting\n   * @return {Player} self when setting mute\n   * @method muted\n   */\n  muted(muted) {\n    if (muted !== undefined) {\n      this.techCall_('setMuted', muted);\n      return this;\n    }\n    return this.techGet_('muted') || false; // Default to false\n  }\n\n  // Check if current tech can support native fullscreen\n  // (e.g. with built in controls like iOS, so not our flash swf)\n  /**\n   * Check to see if fullscreen is supported\n   *\n   * @return {Boolean}\n   * @method supportsFullScreen\n   */\n  supportsFullScreen() {\n    return this.techGet_('supportsFullScreen') || false;\n  }\n\n  /**\n   * Check if the player is in fullscreen mode\n   * ```js\n   *     // get\n   *     var fullscreenOrNot = myPlayer.isFullscreen();\n   *     // set\n   *     myPlayer.isFullscreen(true); // tell the player it's in fullscreen\n   * ```\n   * NOTE: As of the latest HTML5 spec, isFullscreen is no longer an official\n   * property and instead document.fullscreenElement is used. But isFullscreen is\n   * still a valuable property for internal player workings.\n   *\n   * @param  {Boolean=} isFS Update the player's fullscreen state\n   * @return {Boolean} true if fullscreen false if not when getting\n   * @return {Player} self when setting\n   * @method isFullscreen\n   */\n  isFullscreen(isFS) {\n    if (isFS !== undefined) {\n      this.isFullscreen_ = !!isFS;\n      return this;\n    }\n    return !!this.isFullscreen_;\n  }\n\n  /**\n   * Increase the size of the video to full screen\n   * ```js\n   *     myPlayer.requestFullscreen();\n   * ```\n   * In some browsers, full screen is not supported natively, so it enters\n   * \"full window mode\", where the video fills the browser window.\n   * In browsers and devices that support native full screen, sometimes the\n   * browser's default controls will be shown, and not the Video.js custom skin.\n   * This includes most mobile devices (iOS, Android) and older versions of\n   * Safari.\n   *\n   * @return {Player} self\n   * @method requestFullscreen\n   */\n  requestFullscreen() {\n    var fsApi = FullscreenApi;\n\n    this.isFullscreen(true);\n\n    if (fsApi.requestFullscreen) {\n      // the browser supports going fullscreen at the element level so we can\n      // take the controls fullscreen as well as the video\n\n      // Trigger fullscreenchange event after change\n      // We have to specifically add this each time, and remove\n      // when canceling fullscreen. Otherwise if there's multiple\n      // players on a page, they would all be reacting to the same fullscreen\n      // events\n      Events.on(document, fsApi.fullscreenchange, Fn.bind(this, function documentFullscreenChange(e){\n        this.isFullscreen(document[fsApi.fullscreenElement]);\n\n        // If cancelling fullscreen, remove event listener.\n        if (this.isFullscreen() === false) {\n          Events.off(document, fsApi.fullscreenchange, documentFullscreenChange);\n        }\n\n        this.trigger('fullscreenchange');\n      }));\n\n      this.el_[fsApi.requestFullscreen]();\n\n    } else if (this.tech_.supportsFullScreen()) {\n      // we can't take the video.js controls fullscreen but we can go fullscreen\n      // with native controls\n      this.techCall_('enterFullScreen');\n    } else {\n      // fullscreen isn't supported so we'll just stretch the video element to\n      // fill the viewport\n      this.enterFullWindow();\n      this.trigger('fullscreenchange');\n    }\n\n    return this;\n  }\n\n  /**\n   * Return the video to its normal size after having been in full screen mode\n   * ```js\n   *     myPlayer.exitFullscreen();\n   * ```\n   *\n   * @return {Player} self\n   * @method exitFullscreen\n   */\n  exitFullscreen() {\n    var fsApi = FullscreenApi;\n    this.isFullscreen(false);\n\n    // Check for browser element fullscreen support\n    if (fsApi.requestFullscreen) {\n      document[fsApi.exitFullscreen]();\n    } else if (this.tech_.supportsFullScreen()) {\n     this.techCall_('exitFullScreen');\n    } else {\n     this.exitFullWindow();\n     this.trigger('fullscreenchange');\n    }\n\n    return this;\n  }\n\n  /**\n   * When fullscreen isn't supported we can stretch the video container to as wide as the browser will let us.\n   *\n   * @method enterFullWindow\n   */\n  enterFullWindow() {\n    this.isFullWindow = true;\n\n    // Storing original doc overflow value to return to when fullscreen is off\n    this.docOrigOverflow = document.documentElement.style.overflow;\n\n    // Add listener for esc key to exit fullscreen\n    Events.on(document, 'keydown', Fn.bind(this, this.fullWindowOnEscKey));\n\n    // Hide any scroll bars\n    document.documentElement.style.overflow = 'hidden';\n\n    // Apply fullscreen styles\n    Dom.addElClass(document.body, 'vjs-full-window');\n\n    this.trigger('enterFullWindow');\n  }\n\n  /**\n   * Check for call to either exit full window or full screen on ESC key\n   *\n   * @param {String} event Event to check for key press\n   * @method fullWindowOnEscKey\n   */\n  fullWindowOnEscKey(event) {\n    if (event.keyCode === 27) {\n      if (this.isFullscreen() === true) {\n        this.exitFullscreen();\n      } else {\n        this.exitFullWindow();\n      }\n    }\n  }\n\n  /**\n   * Exit full window\n   *\n   * @method exitFullWindow\n   */\n  exitFullWindow() {\n    this.isFullWindow = false;\n    Events.off(document, 'keydown', this.fullWindowOnEscKey);\n\n    // Unhide scroll bars.\n    document.documentElement.style.overflow = this.docOrigOverflow;\n\n    // Remove fullscreen styles\n    Dom.removeElClass(document.body, 'vjs-full-window');\n\n    // Resize the box, controller, and poster to original sizes\n    // this.positionAll();\n    this.trigger('exitFullWindow');\n  }\n\n  /**\n   * Select source based on tech order\n   *\n   * @param {Array} sources The sources for a media asset\n   * @return {Object|Boolean} Object of source and tech order, otherwise false\n   * @method selectSource\n   */\n  selectSource(sources) {\n    // Loop through each playback technology in the options order\n    for (var i=0,j=this.options_.techOrder;i<j.length;i++) {\n      let techName = toTitleCase(j[i]);\n      let tech = Component.getComponent(techName);\n\n      // Check if the current tech is defined before continuing\n      if (!tech) {\n        log.error(`The \"${techName}\" tech is undefined. Skipped browser support check for that tech.`);\n        continue;\n      }\n\n      // Check if the browser supports this technology\n      if (tech.isSupported()) {\n        // Loop through each source object\n        for (var a=0,b=sources;a<b.length;a++) {\n          var source = b[a];\n\n          // Check if source can be played with this technology\n          if (tech.canPlaySource(source)) {\n            return { source: source, tech: techName };\n          }\n        }\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * The source function updates the video source\n   * There are three types of variables you can pass as the argument.\n   * **URL String**: A URL to the the video file. Use this method if you are sure\n   * the current playback technology (HTML5/Flash) can support the source you\n   * provide. Currently only MP4 files can be used in both HTML5 and Flash.\n   * ```js\n   *     myPlayer.src(\"http://www.example.com/path/to/video.mp4\");\n   * ```\n   * **Source Object (or element):* * A javascript object containing information\n   * about the source file. Use this method if you want the player to determine if\n   * it can support the file using the type information.\n   * ```js\n   *     myPlayer.src({ type: \"video/mp4\", src: \"http://www.example.com/path/to/video.mp4\" });\n   * ```\n   * **Array of Source Objects:* * To provide multiple versions of the source so\n   * that it can be played using HTML5 across browsers you can use an array of\n   * source objects. Video.js will detect which version is supported and load that\n   * file.\n   * ```js\n   *     myPlayer.src([\n   *       { type: \"video/mp4\", src: \"http://www.example.com/path/to/video.mp4\" },\n   *       { type: \"video/webm\", src: \"http://www.example.com/path/to/video.webm\" },\n   *       { type: \"video/ogg\", src: \"http://www.example.com/path/to/video.ogv\" }\n   *     ]);\n   * ```\n   *\n   * @param  {String|Object|Array=} source The source URL, object, or array of sources\n   * @return {String} The current video source when getting\n   * @return {String} The player when setting\n   * @method src\n   */\n  src(source) {\n    if (source === undefined) {\n      return this.techGet_('src');\n    }\n\n    let currentTech = Component.getComponent(this.techName_);\n\n    // case: Array of source objects to choose from and pick the best to play\n    if (Array.isArray(source)) {\n      this.sourceList_(source);\n\n    // case: URL String (http://myvideo...)\n    } else if (typeof source === 'string') {\n      // create a source object from the string\n      this.src({ src: source });\n\n    // case: Source object { src: '', type: '' ... }\n    } else if (source instanceof Object) {\n      // check if the source has a type and the loaded tech cannot play the source\n      // if there's no type we'll just try the current tech\n      if (source.type && !currentTech.canPlaySource(source)) {\n        // create a source list with the current source and send through\n        // the tech loop to check for a compatible technology\n        this.sourceList_([source]);\n      } else {\n        this.cache_.src = source.src;\n        this.currentType_ = source.type || '';\n\n        // wait until the tech is ready to set the source\n        this.ready(function(){\n\n          // The setSource tech method was added with source handlers\n          // so older techs won't support it\n          // We need to check the direct prototype for the case where subclasses\n          // of the tech do not support source handlers\n          if (currentTech.prototype.hasOwnProperty('setSource')) {\n            this.techCall_('setSource', source);\n          } else {\n            this.techCall_('src', source.src);\n          }\n\n          if (this.options_.preload === 'auto') {\n            this.load();\n          }\n\n          if (this.options_.autoplay) {\n            this.play();\n          }\n\n        // Set the source synchronously if possible (#2326)\n        }, true);\n      }\n    }\n\n    return this;\n  }\n\n  /**\n   * Handle an array of source objects\n   *\n   * @param  {Array} sources Array of source objects\n   * @private\n   * @method sourceList_\n   */\n  sourceList_(sources) {\n    var sourceTech = this.selectSource(sources);\n\n    if (sourceTech) {\n      if (sourceTech.tech === this.techName_) {\n        // if this technology is already loaded, set the source\n        this.src(sourceTech.source);\n      } else {\n        // load this technology with the chosen source\n        this.loadTech_(sourceTech.tech, sourceTech.source);\n      }\n    } else {\n      // We need to wrap this in a timeout to give folks a chance to add error event handlers\n      this.setTimeout( function() {\n        this.error({ code: 4, message: this.localize(this.options_.notSupportedMessage) });\n      }, 0);\n\n      // we could not find an appropriate tech, but let's still notify the delegate that this is it\n      // this needs a better comment about why this is needed\n      this.triggerReady();\n    }\n  }\n\n  /**\n   * Begin loading the src data.\n   *\n   * @return {Player} Returns the player\n   * @method load\n   */\n  load() {\n    this.techCall_('load');\n    return this;\n  }\n\n  /**\n   * Returns the fully qualified URL of the current source value e.g. http://mysite.com/video.mp4\n   * Can be used in conjuction with `currentType` to assist in rebuilding the current source object.\n   *\n   * @return {String} The current source\n   * @method currentSrc\n   */\n  currentSrc() {\n    return this.techGet_('currentSrc') || this.cache_.src || '';\n  }\n\n  /**\n   * Get the current source type e.g. video/mp4\n   * This can allow you rebuild the current source object so that you could load the same\n   * source and tech later\n   *\n   * @return {String} The source MIME type\n   * @method currentType\n   */\n  currentType() {\n    return this.currentType_ || '';\n  }\n\n  /**\n   * Get or set the preload attribute\n   *\n   * @param {Boolean} value Boolean to determine if preload should be used\n   * @return {String} The preload attribute value when getting\n   * @return {Player} Returns the player when setting\n   * @method preload\n   */\n  preload(value) {\n    if (value !== undefined) {\n      this.techCall_('setPreload', value);\n      this.options_.preload = value;\n      return this;\n    }\n    return this.techGet_('preload');\n  }\n\n  /**\n   * Get or set the autoplay attribute.\n   *\n   * @param {Boolean} value Boolean to determine if preload should be used\n   * @return {String} The autoplay attribute value when getting\n   * @return {Player} Returns the player when setting\n   * @method autoplay\n   */\n  autoplay(value) {\n    if (value !== undefined) {\n      this.techCall_('setAutoplay', value);\n      this.options_.autoplay = value;\n      return this;\n    }\n    return this.techGet_('autoplay', value);\n  }\n\n  /**\n   * Get or set the loop attribute on the video element.\n   *\n   * @param {Boolean} value Boolean to determine if preload should be used\n   * @return {String} The loop attribute value when getting\n   * @return {Player} Returns the player when setting\n   * @method loop\n   */\n  loop(value) {\n    if (value !== undefined) {\n      this.techCall_('setLoop', value);\n      this.options_['loop'] = value;\n      return this;\n    }\n    return this.techGet_('loop');\n  }\n\n  /**\n   * Get or set the poster image source url\n   *\n   * ##### EXAMPLE:\n   * ```js\n   *     // get\n   *     var currentPoster = myPlayer.poster();\n   *     // set\n   *     myPlayer.poster('http://example.com/myImage.jpg');\n   * ```\n   *\n   * @param  {String=} src Poster image source URL\n   * @return {String} poster URL when getting\n   * @return {Player} self when setting\n   * @method poster\n   */\n  poster(src) {\n    if (src === undefined) {\n      return this.poster_;\n    }\n\n    // The correct way to remove a poster is to set as an empty string\n    // other falsey values will throw errors\n    if (!src) {\n      src = '';\n    }\n\n    // update the internal poster variable\n    this.poster_ = src;\n\n    // update the tech's poster\n    this.techCall_('setPoster', src);\n\n    // alert components that the poster has been set\n    this.trigger('posterchange');\n\n    return this;\n  }\n\n  /**\n   * Some techs (e.g. YouTube) can provide a poster source in an\n   * asynchronous way. We want the poster component to use this\n   * poster source so that it covers up the tech's controls.\n   * (YouTube's play button). However we only want to use this\n   * soruce if the player user hasn't set a poster through\n   * the normal APIs.\n   *\n   * @private\n   * @method handleTechPosterChange_\n   */\n  handleTechPosterChange_() {\n    if (!this.poster_ && this.tech_ && this.tech_.poster) {\n      this.poster_ = this.tech_.poster() || '';\n\n      // Let components know the poster has changed\n      this.trigger('posterchange');\n    }\n  }\n\n  /**\n   * Get or set whether or not the controls are showing.\n   *\n   * @param  {Boolean} bool Set controls to showing or not\n   * @return {Boolean}    Controls are showing\n   * @method controls\n   */\n  controls(bool) {\n    if (bool !== undefined) {\n      bool = !!bool; // force boolean\n      // Don't trigger a change event unless it actually changed\n      if (this.controls_ !== bool) {\n        this.controls_ = bool;\n\n        if (this.usingNativeControls()) {\n          this.techCall_('setControls', bool);\n        }\n\n        if (bool) {\n          this.removeClass('vjs-controls-disabled');\n          this.addClass('vjs-controls-enabled');\n          this.trigger('controlsenabled');\n\n          if (!this.usingNativeControls()) {\n            this.addTechControlsListeners_();\n          }\n        } else {\n          this.removeClass('vjs-controls-enabled');\n          this.addClass('vjs-controls-disabled');\n          this.trigger('controlsdisabled');\n\n          if (!this.usingNativeControls()) {\n            this.removeTechControlsListeners_();\n          }\n        }\n      }\n      return this;\n    }\n    return !!this.controls_;\n  }\n\n  /**\n   * Toggle native controls on/off. Native controls are the controls built into\n   * devices (e.g. default iPhone controls), Flash, or other techs\n   * (e.g. Vimeo Controls)\n   * **This should only be set by the current tech, because only the tech knows\n   * if it can support native controls**\n   *\n   * @param  {Boolean} bool    True signals that native controls are on\n   * @return {Player}      Returns the player\n   * @private\n   * @method usingNativeControls\n   */\n  usingNativeControls(bool) {\n    if (bool !== undefined) {\n      bool = !!bool; // force boolean\n      // Don't trigger a change event unless it actually changed\n      if (this.usingNativeControls_ !== bool) {\n        this.usingNativeControls_ = bool;\n        if (bool) {\n          this.addClass('vjs-using-native-controls');\n\n          /**\n            * player is using the native device controls\n           *\n            * @event usingnativecontrols\n            * @memberof Player\n            * @instance\n            * @private\n            */\n          this.trigger('usingnativecontrols');\n        } else {\n          this.removeClass('vjs-using-native-controls');\n\n          /**\n            * player is using the custom HTML controls\n           *\n            * @event usingcustomcontrols\n            * @memberof Player\n            * @instance\n            * @private\n            */\n          this.trigger('usingcustomcontrols');\n        }\n      }\n      return this;\n    }\n    return !!this.usingNativeControls_;\n  }\n\n  /**\n   * Set or get the current MediaError\n   *\n   * @param  {*} err A MediaError or a String/Number to be turned into a MediaError\n   * @return {MediaError|null}     when getting\n   * @return {Player}              when setting\n   * @method error\n   */\n  error(err) {\n    if (err === undefined) {\n      return this.error_ || null;\n    }\n\n    // restoring to default\n    if (err === null) {\n      this.error_ = err;\n      this.removeClass('vjs-error');\n      return this;\n    }\n\n    // error instance\n    if (err instanceof MediaError) {\n      this.error_ = err;\n    } else {\n      this.error_ = new MediaError(err);\n    }\n\n    // fire an error event on the player\n    this.trigger('error');\n\n    // add the vjs-error classname to the player\n    this.addClass('vjs-error');\n\n    // log the name of the error type and any message\n    // ie8 just logs \"[object object]\" if you just log the error object\n    log.error(`(CODE:${this.error_.code} ${MediaError.errorTypes[this.error_.code]})`, this.error_.message, this.error_);\n\n    return this;\n  }\n\n  /**\n   * Returns whether or not the player is in the \"ended\" state.\n   *\n   * @return {Boolean} True if the player is in the ended state, false if not.\n   * @method ended\n   */\n  ended() { return this.techGet_('ended'); }\n\n  /**\n   * Returns whether or not the player is in the \"seeking\" state.\n   *\n   * @return {Boolean} True if the player is in the seeking state, false if not.\n   * @method seeking\n   */\n  seeking() { return this.techGet_('seeking'); }\n\n  /**\n   * Returns the TimeRanges of the media that are currently available\n   * for seeking to.\n   *\n   * @return {TimeRanges} the seekable intervals of the media timeline\n   * @method seekable\n   */\n  seekable() { return this.techGet_('seekable'); }\n\n  /**\n   * Report user activity\n   *\n   * @param {Object} event Event object\n   * @method reportUserActivity\n   */\n  reportUserActivity(event) {\n    this.userActivity_ = true;\n  }\n\n  /**\n   * Get/set if user is active\n   *\n   * @param {Boolean} bool Value when setting\n   * @return {Boolean} Value if user is active user when getting\n   * @method userActive\n   */\n  userActive(bool) {\n    if (bool !== undefined) {\n      bool = !!bool;\n      if (bool !== this.userActive_) {\n        this.userActive_ = bool;\n        if (bool) {\n          // If the user was inactive and is now active we want to reset the\n          // inactivity timer\n          this.userActivity_ = true;\n          this.removeClass('vjs-user-inactive');\n          this.addClass('vjs-user-active');\n          this.trigger('useractive');\n        } else {\n          // We're switching the state to inactive manually, so erase any other\n          // activity\n          this.userActivity_ = false;\n\n          // Chrome/Safari/IE have bugs where when you change the cursor it can\n          // trigger a mousemove event. This causes an issue when you're hiding\n          // the cursor when the user is inactive, and a mousemove signals user\n          // activity. Making it impossible to go into inactive mode. Specifically\n          // this happens in fullscreen when we really need to hide the cursor.\n          //\n          // When this gets resolved in ALL browsers it can be removed\n          // https://code.google.com/p/chromium/issues/detail?id=103041\n          if(this.tech_) {\n            this.tech_.one('mousemove', function(e){\n              e.stopPropagation();\n              e.preventDefault();\n            });\n          }\n\n          this.removeClass('vjs-user-active');\n          this.addClass('vjs-user-inactive');\n          this.trigger('userinactive');\n        }\n      }\n      return this;\n    }\n    return this.userActive_;\n  }\n\n  /**\n   * Listen for user activity based on timeout value\n   *\n   * @private\n   * @method listenForUserActivity_\n   */\n  listenForUserActivity_() {\n    let mouseInProgress, lastMoveX, lastMoveY;\n\n    let handleActivity = Fn.bind(this, this.reportUserActivity);\n\n    let handleMouseMove = function(e) {\n      // #1068 - Prevent mousemove spamming\n      // Chrome Bug: https://code.google.com/p/chromium/issues/detail?id=366970\n      if(e.screenX !== lastMoveX || e.screenY !== lastMoveY) {\n        lastMoveX = e.screenX;\n        lastMoveY = e.screenY;\n        handleActivity();\n      }\n    };\n\n    let handleMouseDown = function() {\n      handleActivity();\n      // For as long as the they are touching the device or have their mouse down,\n      // we consider them active even if they're not moving their finger or mouse.\n      // So we want to continue to update that they are active\n      this.clearInterval(mouseInProgress);\n      // Setting userActivity=true now and setting the interval to the same time\n      // as the activityCheck interval (250) should ensure we never miss the\n      // next activityCheck\n      mouseInProgress = this.setInterval(handleActivity, 250);\n    };\n\n    let handleMouseUp = function(event) {\n      handleActivity();\n      // Stop the interval that maintains activity if the mouse/touch is down\n      this.clearInterval(mouseInProgress);\n    };\n\n    // Any mouse movement will be considered user activity\n    this.on('mousedown', handleMouseDown);\n    this.on('mousemove', handleMouseMove);\n    this.on('mouseup', handleMouseUp);\n\n    // Listen for keyboard navigation\n    // Shouldn't need to use inProgress interval because of key repeat\n    this.on('keydown', handleActivity);\n    this.on('keyup', handleActivity);\n\n    // Run an interval every 250 milliseconds instead of stuffing everything into\n    // the mousemove/touchmove function itself, to prevent performance degradation.\n    // `this.reportUserActivity` simply sets this.userActivity_ to true, which\n    // then gets picked up by this loop\n    // http://ejohn.org/blog/learning-from-twitter/\n    let inactivityTimeout;\n    let activityCheck = this.setInterval(function() {\n      // Check to see if mouse/touch activity has happened\n      if (this.userActivity_) {\n        // Reset the activity tracker\n        this.userActivity_ = false;\n\n        // If the user state was inactive, set the state to active\n        this.userActive(true);\n\n        // Clear any existing inactivity timeout to start the timer over\n        this.clearTimeout(inactivityTimeout);\n\n        var timeout = this.options_['inactivityTimeout'];\n        if (timeout > 0) {\n          // In <timeout> milliseconds, if no more activity has occurred the\n          // user will be considered inactive\n          inactivityTimeout = this.setTimeout(function () {\n            // Protect against the case where the inactivityTimeout can trigger just\n            // before the next user activity is picked up by the activityCheck loop\n            // causing a flicker\n            if (!this.userActivity_) {\n                this.userActive(false);\n            }\n          }, timeout);\n        }\n      }\n    }, 250);\n  }\n\n  /**\n   * Gets or sets the current playback rate.  A playback rate of\n   * 1.0 represents normal speed and 0.5 would indicate half-speed\n   * playback, for instance.\n   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-playbackrate\n   *\n   * @param  {Number} rate    New playback rate to set.\n   * @return {Number}         Returns the new playback rate when setting\n   * @return {Number}         Returns the current playback rate when getting\n   * @method playbackRate\n   */\n  playbackRate(rate) {\n    if (rate !== undefined) {\n      this.techCall_('setPlaybackRate', rate);\n      return this;\n    }\n\n    if (this.tech_ && this.tech_['featuresPlaybackRate']) {\n      return this.techGet_('playbackRate');\n    } else {\n      return 1.0;\n    }\n  }\n\n  /**\n   * Gets or sets the audio flag\n   *\n   * @param  {Boolean} bool    True signals that this is an audio player.\n   * @return {Boolean}         Returns true if player is audio, false if not when getting\n   * @return {Player}      Returns the player if setting\n   * @private\n   * @method isAudio\n   */\n  isAudio(bool) {\n    if (bool !== undefined) {\n      this.isAudio_ = !!bool;\n      return this;\n    }\n\n    return !!this.isAudio_;\n  }\n\n  /**\n   * Returns the current state of network activity for the element, from\n   * the codes in the list below.\n   * - NETWORK_EMPTY (numeric value 0)\n   *   The element has not yet been initialised. All attributes are in\n   *   their initial states.\n   * - NETWORK_IDLE (numeric value 1)\n   *   The element's resource selection algorithm is active and has\n   *   selected a resource, but it is not actually using the network at\n   *   this time.\n   * - NETWORK_LOADING (numeric value 2)\n   *   The user agent is actively trying to download data.\n   * - NETWORK_NO_SOURCE (numeric value 3)\n   *   The element's resource selection algorithm is active, but it has\n   *   not yet found a resource to use.\n   *\n   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#network-states\n   * @return {Number} the current network activity state\n   * @method networkState\n   */\n  networkState() {\n    return this.techGet_('networkState');\n  }\n\n  /**\n   * Returns a value that expresses the current state of the element\n   * with respect to rendering the current playback position, from the\n   * codes in the list below.\n   * - HAVE_NOTHING (numeric value 0)\n   *   No information regarding the media resource is available.\n   * - HAVE_METADATA (numeric value 1)\n   *   Enough of the resource has been obtained that the duration of the\n   *   resource is available.\n   * - HAVE_CURRENT_DATA (numeric value 2)\n   *   Data for the immediate current playback position is available.\n   * - HAVE_FUTURE_DATA (numeric value 3)\n   *   Data for the immediate current playback position is available, as\n   *   well as enough data for the user agent to advance the current\n   *   playback position in the direction of playback.\n   * - HAVE_ENOUGH_DATA (numeric value 4)\n   *   The user agent estimates that enough data is available for\n   *   playback to proceed uninterrupted.\n   *\n   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-readystate\n   * @return {Number} the current playback rendering state\n   * @method readyState\n   */\n  readyState() {\n    return this.techGet_('readyState');\n  }\n\n  /*\n    * Text tracks are tracks of timed text events.\n    * Captions - text displayed over the video for the hearing impaired\n    * Subtitles - text displayed over the video for those who don't understand language in the video\n    * Chapters - text displayed in a menu allowing the user to jump to particular points (chapters) in the video\n    * Descriptions (not supported yet) - audio descriptions that are read back to the user by a screen reading device\n    */\n\n  /**\n   * Get an array of associated text tracks. captions, subtitles, chapters, descriptions\n   * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-texttracks\n   *\n   * @return {Array}           Array of track objects\n   * @method textTracks\n   */\n  textTracks() {\n    // cannot use techGet_ directly because it checks to see whether the tech is ready.\n    // Flash is unlikely to be ready in time but textTracks should still work.\n    return this.tech_ && this.tech_['textTracks']();\n  }\n\n  /**\n   * Get an array of remote text tracks\n   *\n   * @return {Array}\n   * @method remoteTextTracks\n   */\n  remoteTextTracks() {\n    return this.tech_ && this.tech_['remoteTextTracks']();\n  }\n\n  /**\n   * Add a text track\n   * In addition to the W3C settings we allow adding additional info through options.\n   * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-addtexttrack\n   *\n   * @param {String}  kind        Captions, subtitles, chapters, descriptions, or metadata\n   * @param {String=} label       Optional label\n   * @param {String=} language    Optional language\n   * @method addTextTrack\n   */\n  addTextTrack(kind, label, language) {\n    return this.tech_ && this.tech_['addTextTrack'](kind, label, language);\n  }\n\n  /**\n   * Add a remote text track\n   *\n   * @param {Object} options    Options for remote text track\n   * @method addRemoteTextTrack\n   */\n  addRemoteTextTrack(options) {\n    return this.tech_ && this.tech_['addRemoteTextTrack'](options);\n  }\n\n  /**\n   * Remove a remote text track\n   *\n   * @param {Object} track    Remote text track to remove\n   * @method removeRemoteTextTrack\n   */\n  removeRemoteTextTrack(track) {\n    this.tech_ && this.tech_['removeRemoteTextTrack'](track);\n  }\n\n  /**\n   * Get video width\n   *\n   * @return {Number} Video width\n   * @method videoWidth\n   */\n  videoWidth() {\n    return this.tech_ && this.tech_.videoWidth && this.tech_.videoWidth() || 0;\n  }\n\n  /**\n   * Get video height\n   *\n   * @return {Number} Video height\n   * @method videoHeight\n   */\n  videoHeight() {\n    return this.tech_ && this.tech_.videoHeight && this.tech_.videoHeight() || 0;\n  }\n\n  // Methods to add support for\n  // initialTime: function(){ return this.techCall_('initialTime'); },\n  // startOffsetTime: function(){ return this.techCall_('startOffsetTime'); },\n  // played: function(){ return this.techCall_('played'); },\n  // videoTracks: function(){ return this.techCall_('videoTracks'); },\n  // audioTracks: function(){ return this.techCall_('audioTracks'); },\n  // defaultPlaybackRate: function(){ return this.techCall_('defaultPlaybackRate'); },\n  // defaultMuted: function(){ return this.techCall_('defaultMuted'); }\n\n  /**\n   * The player's language code\n   * NOTE: The language should be set in the player options if you want the\n   * the controls to be built with a specific language. Changing the lanugage\n   * later will not update controls text.\n   *\n   * @param {String} code  The locale string\n   * @return {String}      The locale string when getting\n   * @return {Player}      self when setting\n   * @method language\n   */\n  language(code) {\n    if (code === undefined) {\n      return this.language_;\n    }\n\n    this.language_ = (''+code).toLowerCase();\n    return this;\n  }\n\n  /**\n   * Get the player's language dictionary\n   * Merge every time, because a newly added plugin might call videojs.addLanguage() at any time\n   * Languages specified directly in the player options have precedence\n   *\n   * @return {Array} Array of languages\n   * @method languages\n   */\n  languages() {\n    return  mergeOptions(Player.prototype.options_.languages, this.languages_);\n  }\n\n  /**\n   * Converts track info to JSON\n   *\n   * @return {Object} JSON object of options\n   * @method toJSON\n   */\n  toJSON() {\n    let options = mergeOptions(this.options_);\n    let tracks = options.tracks;\n\n    options.tracks = [];\n\n    for (let i = 0; i < tracks.length; i++) {\n      let track = tracks[i];\n\n      // deep merge tracks and null out player so no circular references\n      track = mergeOptions(track);\n      track.player = undefined;\n      options.tracks[i] = track;\n    }\n\n    return options;\n  }\n\n  /**\n   * Gets tag settings\n   *\n   * @param {Element} tag The player tag\n   * @return {Array} An array of sources and track objects\n   * @static\n   * @method getTagSettings\n   */\n  static getTagSettings(tag) {\n    let baseOptions = {\n      'sources': [],\n      'tracks': []\n    };\n\n    const tagOptions = Dom.getElAttributes(tag);\n    const dataSetup = tagOptions['data-setup'];\n\n    // Check if data-setup attr exists.\n    if (dataSetup !== null){\n      // Parse options JSON\n      // If empty string, make it a parsable json object.\n      const [err, data] = safeParseTuple(dataSetup || '{}');\n      if (err) {\n        log.error(err);\n      }\n      assign(tagOptions, data);\n    }\n\n    assign(baseOptions, tagOptions);\n\n    // Get tag children settings\n    if (tag.hasChildNodes()) {\n      const children = tag.childNodes;\n\n      for (let i=0, j=children.length; i<j; i++) {\n        const child = children[i];\n        // Change case needed: http://ejohn.org/blog/nodename-case-sensitivity/\n        const childName = child.nodeName.toLowerCase();\n        if (childName === 'source') {\n          baseOptions.sources.push(Dom.getElAttributes(child));\n        } else if (childName === 'track') {\n          baseOptions.tracks.push(Dom.getElAttributes(child));\n        }\n      }\n    }\n\n    return baseOptions;\n  }\n\n}\n\n/*\n * Global player list\n *\n * @type {Object}\n */\nPlayer.players = {};\n\nlet navigator = window.navigator;\n/*\n * Player instance options, surfaced using options\n * options = Player.prototype.options_\n * Make changes in options, not here.\n *\n * @type {Object}\n * @private\n */\nPlayer.prototype.options_ = {\n  // Default order of fallback technology\n  techOrder: ['html5','flash'],\n  // techOrder: ['flash','html5'],\n\n  html5: {},\n  flash: {},\n\n  // defaultVolume: 0.85,\n  defaultVolume: 0.00, // The freakin seaguls are driving me crazy!\n\n  // default inactivity timeout\n  inactivityTimeout: 2000,\n\n  // default playback rates\n  playbackRates: [],\n  // Add playback rate selection by adding rates\n  // 'playbackRates': [0.5, 1, 1.5, 2],\n\n  // Included control sets\n  children: [\n    'mediaLoader',\n    'posterImage',\n    'textTrackDisplay',\n    'loadingSpinner',\n    'bigPlayButton',\n    'controlBar',\n    'errorDisplay',\n    'textTrackSettings'\n  ],\n\n  language: document.getElementsByTagName('html')[0].getAttribute('lang') || navigator.languages && navigator.languages[0] || navigator.userLanguage || navigator.language || 'en',\n\n  // locales and their language translations\n  languages: {},\n\n  // Default message to show when a video cannot be played.\n  notSupportedMessage: 'No compatible source was found for this video.'\n};\n\n/**\n * Fired when the player has initial duration and dimension information\n *\n * @event loadedmetadata\n */\nPlayer.prototype.handleLoadedMetaData_;\n\n/**\n * Fired when the player has downloaded data at the current playback position\n *\n * @event loadeddata\n */\nPlayer.prototype.handleLoadedData_;\n\n/**\n * Fired when the user is active, e.g. moves the mouse over the player\n *\n * @event useractive\n */\nPlayer.prototype.handleUserActive_;\n\n/**\n * Fired when the user is inactive, e.g. a short delay after the last mouse move or control interaction\n *\n * @event userinactive\n */\nPlayer.prototype.handleUserInactive_;\n\n/**\n * Fired when the current playback position has changed *\n * During playback this is fired every 15-250 milliseconds, depending on the\n * playback technology in use.\n *\n * @event timeupdate\n */\nPlayer.prototype.handleTimeUpdate_;\n\n/**\n * Fired when the volume changes\n *\n * @event volumechange\n */\nPlayer.prototype.handleVolumeChange_;\n\n/**\n * Fired when an error occurs\n *\n * @event error\n */\nPlayer.prototype.handleError_;\n\nPlayer.prototype.flexNotSupported_ = function() {\n  var elem = document.createElement('i');\n\n  // Note: We don't actually use flexBasis (or flexOrder), but it's one of the more\n  // common flex features that we can rely on when checking for flex support.\n  return !('flexBasis' in elem.style ||\n          'webkitFlexBasis' in elem.style ||\n          'mozFlexBasis' in elem.style ||\n          'msFlexBasis' in elem.style ||\n          'msFlexOrder' in elem.style /* IE10-specific (2012 flex spec)  */);\n};\n\nComponent.registerComponent('Player', Player);\nexport default Player;\n","/**\n * @file plugins.js\n */\nimport Player from './player.js';\n\n/**\n * The method for registering a video.js plugin\n *\n * @param  {String} name The name of the plugin\n * @param  {Function} init The function that is run when the player inits\n * @method plugin\n */\nvar plugin = function(name, init){\n  Player.prototype[name] = init;\n};\n\nexport default plugin;\n","/**\n * @file poster-image.js\n */\nimport Button from './button.js';\nimport Component from './component.js';\nimport * as Fn from './utils/fn.js';\nimport * as Dom from './utils/dom.js';\nimport * as browser from './utils/browser.js';\n\n/**\n * The component that handles showing the poster image.\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Button\n * @class PosterImage\n */\nclass PosterImage extends Button {\n\n  constructor(player, options){\n    super(player, options);\n\n    this.update();\n    player.on('posterchange', Fn.bind(this, this.update));\n  }\n\n  /**\n   * Clean up the poster image\n   *\n   * @method dispose\n   */\n  dispose() {\n    this.player().off('posterchange', this.update);\n    super.dispose();\n  }\n\n  /**\n   * Create the poster's image element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = Dom.createEl('div', {\n      className: 'vjs-poster',\n\n      // Don't want poster to be tabbable.\n      tabIndex: -1\n    });\n\n    // To ensure the poster image resizes while maintaining its original aspect\n    // ratio, use a div with `background-size` when available. For browsers that\n    // do not support `background-size` (e.g. IE8), fall back on using a regular\n    // img element.\n    if (!browser.BACKGROUND_SIZE_SUPPORTED) {\n      this.fallbackImg_ = Dom.createEl('img');\n      el.appendChild(this.fallbackImg_);\n    }\n\n    return el;\n  }\n\n  /**\n   * Event handler for updates to the player's poster source\n   *\n   * @method update\n   */\n  update() {\n    let url = this.player().poster();\n\n    this.setSrc(url);\n\n    // If there's no poster source we should display:none on this component\n    // so it's not still clickable or right-clickable\n    if (url) {\n      this.show();\n    } else {\n      this.hide();\n    }\n  }\n\n  /**\n   * Set the poster source depending on the display method\n   *\n   * @param {String} url The URL to the poster source\n   * @method setSrc\n   */\n  setSrc(url) {\n    if (this.fallbackImg_) {\n      this.fallbackImg_.src = url;\n    } else {\n      let backgroundImage = '';\n      // Any falsey values should stay as an empty string, otherwise\n      // this will throw an extra error\n      if (url) {\n        backgroundImage = `url(\"${url}\")`;\n      }\n\n      this.el_.style.backgroundImage = backgroundImage;\n    }\n  }\n\n  /**\n   * Event handler for clicks on the poster image\n   *\n   * @method handleClick\n   */\n  handleClick() {\n    // We don't want a click to trigger playback when controls are disabled\n    // but CSS should be hiding the poster to prevent that from happening\n    if (this.player_.paused()) {\n      this.player_.play();\n    } else {\n      this.player_.pause();\n    }\n  }\n\n}\n\nComponent.registerComponent('PosterImage', PosterImage);\nexport default PosterImage;\n","/**\n * @file setup.js\n *\n * Functions for automatically setting up a player\n * based on the data-setup attribute of the video tag\n */\nimport * as Events from './utils/events.js';\nimport document from 'global/document';\nimport window from 'global/window';\n\nlet _windowLoaded = false;\nlet videojs;\n\n\n// Automatically set up any tags that have a data-setup attribute\nvar autoSetup = function(){\n  // One day, when we stop supporting IE8, go back to this, but in the meantime...*hack hack hack*\n  // var vids = Array.prototype.slice.call(document.getElementsByTagName('video'));\n  // var audios = Array.prototype.slice.call(document.getElementsByTagName('audio'));\n  // var mediaEls = vids.concat(audios);\n\n  // Because IE8 doesn't support calling slice on a node list, we need to loop through each list of elements\n  // to build up a new, combined list of elements.\n  var vids = document.getElementsByTagName('video');\n  var audios = document.getElementsByTagName('audio');\n  var mediaEls = [];\n  if (vids && vids.length > 0) {\n    for(let i=0, e=vids.length; i<e; i++) {\n      mediaEls.push(vids[i]);\n    }\n  }\n  if (audios && audios.length > 0) {\n    for(let i=0, e=audios.length; i<e; i++) {\n      mediaEls.push(audios[i]);\n    }\n  }\n\n  // Check if any media elements exist\n  if (mediaEls && mediaEls.length > 0) {\n\n    for (let i=0, e=mediaEls.length; i<e; i++) {\n      let mediaEl = mediaEls[i];\n\n      // Check if element exists, has getAttribute func.\n      // IE seems to consider typeof el.getAttribute == 'object' instead of 'function' like expected, at least when loading the player immediately.\n      if (mediaEl && mediaEl.getAttribute) {\n\n        // Make sure this player hasn't already been set up.\n        if (mediaEl['player'] === undefined) {\n          let options = mediaEl.getAttribute('data-setup');\n\n          // Check if data-setup attr exists.\n          // We only auto-setup if they've added the data-setup attr.\n          if (options !== null) {\n            // Create new video.js instance.\n            let player = videojs(mediaEl);\n          }\n        }\n\n      // If getAttribute isn't defined, we need to wait for the DOM.\n      } else {\n        autoSetupTimeout(1);\n        break;\n      }\n    }\n\n  // No videos were found, so keep looping unless page is finished loading.\n  } else if (!_windowLoaded) {\n    autoSetupTimeout(1);\n  }\n};\n\n// Pause to let the DOM keep processing\nvar autoSetupTimeout = function(wait, vjs){\n  videojs = vjs;\n  setTimeout(autoSetup, wait);\n};\n\nif (document.readyState === 'complete') {\n  _windowLoaded = true;\n} else {\n  Events.one(window, 'load', function(){\n    _windowLoaded = true;\n  });\n}\n\nvar hasLoaded = function() {\n  return _windowLoaded;\n};\n\nexport { autoSetup, autoSetupTimeout, hasLoaded };\n","/**\n * @file slider.js\n */\nimport Component from '../component.js';\nimport * as Dom from '../utils/dom.js';\nimport document from 'global/document';\nimport assign from 'object.assign';\n\n/**\n * The base functionality for sliders like the volume bar and seek bar\n *\n * @param {Player|Object} player\n * @param {Object=} options\n * @extends Component\n * @class Slider\n */\nclass Slider extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n\n    // Set property names to bar to match with the child Slider class is looking for\n    this.bar = this.getChild(this.options_.barName);\n\n    // Set a horizontal or vertical class on the slider depending on the slider type\n    this.vertical(!!this.options_.vertical);\n\n    this.on('mousedown', this.handleMouseDown);\n    this.on('touchstart', this.handleMouseDown);\n    this.on('focus', this.handleFocus);\n    this.on('blur', this.handleBlur);\n    this.on('click', this.handleClick);\n\n    this.on(player, 'controlsvisible', this.update);\n    this.on(player, this.playerEvent, this.update);\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @param {String} type Type of element to create\n   * @param {Object=} props List of properties in Object form\n   * @return {Element}\n   * @method createEl\n   */\n  createEl(type, props={}, attributes={}) {\n    // Add the slider element class to all sub classes\n    props.className = props.className + ' vjs-slider';\n    props = assign({\n      tabIndex: 0\n    }, props);\n\n    attributes = assign({\n      'role': 'slider',\n      'aria-valuenow': 0,\n      'aria-valuemin': 0,\n      'aria-valuemax': 100,\n      tabIndex: 0\n    }, attributes);\n\n    return super.createEl(type, props, attributes);\n  }\n\n  /**\n   * Handle mouse down on slider\n   *\n   * @param {Object} event Mouse down event object\n   * @method handleMouseDown\n   */\n  handleMouseDown(event) {\n    event.preventDefault();\n    Dom.blockTextSelection();\n\n    this.addClass('vjs-sliding');\n    this.trigger('slideractive');\n\n    this.on(document, 'mousemove', this.handleMouseMove);\n    this.on(document, 'mouseup', this.handleMouseUp);\n    this.on(document, 'touchmove', this.handleMouseMove);\n    this.on(document, 'touchend', this.handleMouseUp);\n\n    this.handleMouseMove(event);\n  }\n\n  /**\n   * To be overridden by a subclass\n   *\n   * @method handleMouseMove\n   */\n  handleMouseMove() {}\n\n  /**\n   * Handle mouse up on Slider\n   *\n   * @method handleMouseUp\n   */\n  handleMouseUp() {\n    Dom.unblockTextSelection();\n\n    this.removeClass('vjs-sliding');\n    this.trigger('sliderinactive');\n\n    this.off(document, 'mousemove', this.handleMouseMove);\n    this.off(document, 'mouseup', this.handleMouseUp);\n    this.off(document, 'touchmove', this.handleMouseMove);\n    this.off(document, 'touchend', this.handleMouseUp);\n\n    this.update();\n  }\n\n  /**\n   * Update slider\n   *\n   * @method update\n   */\n  update() {\n    // In VolumeBar init we have a setTimeout for update that pops and update to the end of the\n    // execution stack. The player is destroyed before then update will cause an error\n    if (!this.el_) return;\n\n    // If scrubbing, we could use a cached value to make the handle keep up with the user's mouse.\n    // On HTML5 browsers scrubbing is really smooth, but some flash players are slow, so we might want to utilize this later.\n    // var progress =  (this.player_.scrubbing()) ? this.player_.getCache().currentTime / this.player_.duration() : this.player_.currentTime() / this.player_.duration();\n    let progress = this.getPercent();\n    let bar = this.bar;\n\n    // If there's no bar...\n    if (!bar) return;\n\n    // Protect against no duration and other division issues\n    if (typeof progress !== 'number' ||\n        progress !== progress ||\n        progress < 0 ||\n        progress === Infinity) {\n          progress = 0;\n    }\n\n    // Convert to a percentage for setting\n    let percentage = (progress * 100).toFixed(2) + '%';\n\n    // Set the new bar width or height\n    if (this.vertical()) {\n      bar.el().style.height = percentage;\n    } else {\n      bar.el().style.width = percentage;\n    }\n  }\n\n  /**\n   * Calculate distance for slider\n   *\n   * @param {Object} event Event object\n   * @method calculateDistance\n   */\n  calculateDistance(event){\n    let position = Dom.getPointerPosition(this.el_, event);\n    if (this.vertical()) {\n      return position.y;\n    }\n    return position.x;\n  }\n\n  /**\n   * Handle on focus for slider\n   *\n   * @method handleFocus\n   */\n  handleFocus() {\n    this.on(document, 'keydown', this.handleKeyPress);\n  }\n\n  /**\n   * Handle key press for slider\n   *\n   * @param {Object} event Event object\n   * @method handleKeyPress\n   */\n  handleKeyPress(event) {\n    if (event.which === 37 || event.which === 40) { // Left and Down Arrows\n      event.preventDefault();\n      this.stepBack();\n    } else if (event.which === 38 || event.which === 39) { // Up and Right Arrows\n      event.preventDefault();\n      this.stepForward();\n    }\n  }\n\n  /**\n   * Handle on blur for slider\n   *\n   * @method handleBlur\n   */\n  handleBlur() {\n    this.off(document, 'keydown', this.handleKeyPress);\n  }\n\n  /**\n   * Listener for click events on slider, used to prevent clicks\n   *   from bubbling up to parent elements like button menus.\n   *\n   * @param {Object} event Event object\n   * @method handleClick\n   */\n  handleClick(event) {\n    event.stopImmediatePropagation();\n    event.preventDefault();\n  }\n\n  /**\n   * Get/set if slider is horizontal for vertical\n   *\n   * @param {Boolean} bool True if slider is vertical, false is horizontal\n   * @return {Boolean} True if slider is vertical, false is horizontal\n   * @method vertical\n   */\n  vertical(bool) {\n    if (bool === undefined) {\n      return this.vertical_ || false;\n    }\n\n    this.vertical_ = !!bool;\n\n    if (this.vertical_) {\n      this.addClass('vjs-slider-vertical');\n    } else {\n      this.addClass('vjs-slider-horizontal');\n    }\n\n    return this;\n  }\n\n}\n\nComponent.registerComponent('Slider', Slider);\nexport default Slider;\n","/**\n * @file flash-rtmp.js\n */\nfunction FlashRtmpDecorator(Flash) {\n  Flash.streamingFormats = {\n    'rtmp/mp4': 'MP4',\n    'rtmp/flv': 'FLV'\n  };\n\n  Flash.streamFromParts = function(connection, stream) {\n    return connection + '&' + stream;\n  };\n\n  Flash.streamToParts = function(src) {\n    let parts = {\n      connection: '',\n      stream: ''\n    };\n\n    if (!src) return parts;\n\n    // Look for the normal URL separator we expect, '&'.\n    // If found, we split the URL into two pieces around the\n    // first '&'.\n    let connEnd = src.indexOf('&');\n    let streamBegin;\n    if (connEnd !== -1) {\n      streamBegin = connEnd + 1;\n    }\n    else {\n      // If there's not a '&', we use the last '/' as the delimiter.\n      connEnd = streamBegin = src.lastIndexOf('/') + 1;\n      if (connEnd === 0) {\n        // really, there's not a '/'?\n        connEnd = streamBegin = src.length;\n      }\n    }\n    parts.connection = src.substring(0, connEnd);\n    parts.stream = src.substring(streamBegin, src.length);\n\n    return parts;\n  };\n\n  Flash.isStreamingType = function(srcType) {\n    return srcType in Flash.streamingFormats;\n  };\n\n  // RTMP has four variations, any string starting\n  // with one of these protocols should be valid\n  Flash.RTMP_RE = /^rtmp[set]?:\\/\\//i;\n\n  Flash.isStreamingSrc = function(src) {\n    return Flash.RTMP_RE.test(src);\n  };\n\n  /**\n   * A source handler for RTMP urls\n   * @type {Object}\n   */\n  Flash.rtmpSourceHandler = {};\n\n  /**\n   * Check Flash can handle the source natively\n   * @param  {Object} source  The source object\n   * @return {String}         'probably', 'maybe', or '' (empty string)\n   */\n  Flash.rtmpSourceHandler.canHandleSource = function(source){\n    if (Flash.isStreamingType(source.type) || Flash.isStreamingSrc(source.src)) {\n      return 'maybe';\n    }\n\n    return '';\n  };\n\n  /**\n   * Pass the source to the flash object\n   * Adaptive source handlers will have more complicated workflows before passing\n   * video data to the video element\n   * @param  {Object} source    The source object\n   * @param  {Flash} tech   The instance of the Flash tech\n   */\n  Flash.rtmpSourceHandler.handleSource = function(source, tech){\n    let srcParts = Flash.streamToParts(source.src);\n\n    tech['setRtmpConnection'](srcParts.connection);\n    tech['setRtmpStream'](srcParts.stream);\n  };\n\n  // Register the native source handler\n  Flash.registerSourceHandler(Flash.rtmpSourceHandler);\n\n  return Flash;\n}\n\nexport default FlashRtmpDecorator;\n","/**\n * @file flash.js\n * VideoJS-SWF - Custom Flash Player with HTML5-ish API\n * https://github.com/zencoder/video-js-swf\n * Not using setupTriggers. Using global onEvent func to distribute events\n */\n\nimport Tech from './tech';\nimport * as Dom from '../utils/dom.js';\nimport * as Url from '../utils/url.js';\nimport { createTimeRange } from '../utils/time-ranges.js';\nimport FlashRtmpDecorator from './flash-rtmp';\nimport Component from '../component';\nimport window from 'global/window';\nimport assign from 'object.assign';\n\nlet navigator = window.navigator;\n/**\n * Flash Media Controller - Wrapper for fallback SWF API\n *\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready Ready callback function\n * @extends Tech\n * @class Flash\n */\nclass Flash extends Tech {\n\n  constructor(options, ready){\n    super(options, ready);\n\n    // Set the source when ready\n    if (options.source) {\n      this.ready(function(){\n        this.setSource(options.source);\n      }, true);\n    }\n\n    // Having issues with Flash reloading on certain page actions (hide/resize/fullscreen) in certain browsers\n    // This allows resetting the playhead when we catch the reload\n    if (options.startTime) {\n      this.ready(function(){\n        this.load();\n        this.play();\n        this.currentTime(options.startTime);\n      }, true);\n    }\n\n    // Add global window functions that the swf expects\n    // A 4.x workflow we weren't able to solve for in 5.0\n    // because of the need to hard code these functions\n    // into the swf for security reasons\n    window.videojs = window.videojs || {};\n    window.videojs.Flash = window.videojs.Flash || {};\n    window.videojs.Flash.onReady = Flash.onReady;\n    window.videojs.Flash.onEvent = Flash.onEvent;\n    window.videojs.Flash.onError = Flash.onError;\n\n    this.on('seeked', function() {\n      this.lastSeekTarget_ = undefined;\n    });\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let options = this.options_;\n\n    // If video.js is hosted locally you should also set the location\n    // for the hosted swf, which should be relative to the page (not video.js)\n    // Otherwise this adds a CDN url.\n    // The CDN also auto-adds a swf URL for that specific version.\n    if (!options.swf) {\n      options.swf = '//vjs.zencdn.net/swf/__SWF_VERSION__/video-js.swf';\n    }\n\n    // Generate ID for swf object\n    let objId = options.techId;\n\n    // Merge default flashvars with ones passed in to init\n    let flashVars = assign({\n\n      // SWF Callback Functions\n      'readyFunction': 'videojs.Flash.onReady',\n      'eventProxyFunction': 'videojs.Flash.onEvent',\n      'errorEventProxyFunction': 'videojs.Flash.onError',\n\n      // Player Settings\n      'autoplay': options.autoplay,\n      'preload': options.preload,\n      'loop': options.loop,\n      'muted': options.muted\n\n    }, options.flashVars);\n\n    // Merge default parames with ones passed in\n    let params = assign({\n      'wmode': 'opaque', // Opaque is needed to overlay controls, but can affect playback performance\n      'bgcolor': '#000000' // Using bgcolor prevents a white flash when the object is loading\n    }, options.params);\n\n    // Merge default attributes with ones passed in\n    let attributes = assign({\n      'id': objId,\n      'name': objId, // Both ID and Name needed or swf to identify itself\n      'class': 'vjs-tech'\n    }, options.attributes);\n\n    this.el_ = Flash.embed(options.swf, flashVars, params, attributes);\n    this.el_.tech = this;\n\n    return this.el_;\n  }\n\n  /**\n   * Play for flash tech\n   *\n   * @method play\n   */\n  play() {\n    if (this.ended()) {\n      this.setCurrentTime(0);\n    }\n    this.el_.vjs_play();\n  }\n\n  /**\n   * Pause for flash tech\n   *\n   * @method pause\n   */\n  pause() {\n    this.el_.vjs_pause();\n  }\n\n  /**\n   * Get/set video\n   *\n   * @param {Object=} src Source object\n   * @return {Object}\n   * @method src\n   */\n  src(src) {\n    if (src === undefined) {\n      return this.currentSrc();\n    }\n\n    // Setting src through `src` not `setSrc` will be deprecated\n    return this.setSrc(src);\n  }\n\n  /**\n   * Set video\n   *\n   * @param {Object=} src Source object\n   * @deprecated\n   * @method setSrc\n   */\n  setSrc(src) {\n    // Make sure source URL is absolute.\n    src = Url.getAbsoluteURL(src);\n    this.el_.vjs_src(src);\n\n    // Currently the SWF doesn't autoplay if you load a source later.\n    // e.g. Load player w/ no source, wait 2s, set src.\n    if (this.autoplay()) {\n      var tech = this;\n      this.setTimeout(function(){ tech.play(); }, 0);\n    }\n  }\n\n  /**\n   * Returns true if the tech is currently seeking.\n   * @return {boolean} true if seeking\n   */\n  seeking() {\n    return this.lastSeekTarget_ !== undefined;\n  }\n\n  /**\n   * Set current time\n   *\n   * @param {Number} time Current time of video\n   * @method setCurrentTime\n   */\n  setCurrentTime(time) {\n    let seekable = this.seekable();\n    if (seekable.length) {\n      // clamp to the current seekable range\n      time = time > seekable.start(0) ? time : seekable.start(0);\n      time = time < seekable.end(seekable.length - 1) ? time : seekable.end(seekable.length - 1);\n\n      this.lastSeekTarget_ = time;\n      this.trigger('seeking');\n      this.el_.vjs_setProperty('currentTime', time);\n      super.setCurrentTime();\n    }\n  }\n\n  /**\n   * Get current time\n   *\n   * @param {Number=} time Current time of video\n   * @return {Number} Current time\n   * @method currentTime\n   */\n  currentTime(time) {\n    // when seeking make the reported time keep up with the requested time\n    // by reading the time we're seeking to\n    if (this.seeking()) {\n      return this.lastSeekTarget_ || 0;\n    }\n    return this.el_.vjs_getProperty('currentTime');\n  }\n\n  /**\n   * Get current source\n   *\n   * @method currentSrc\n   */\n  currentSrc() {\n    if (this.currentSource_) {\n      return this.currentSource_.src;\n    } else {\n      return this.el_.vjs_getProperty('currentSrc');\n    }\n  }\n\n  /**\n   * Load media into player\n   *\n   * @method load\n   */\n  load() {\n    this.el_.vjs_load();\n  }\n\n  /**\n   * Get poster\n   *\n   * @method poster\n   */\n  poster() {\n    this.el_.vjs_getProperty('poster');\n  }\n\n  /**\n   * Poster images are not handled by the Flash tech so make this a no-op\n   *\n   * @method setPoster\n   */\n  setPoster() {}\n\n  /**\n   * Determine if can seek in media\n   *\n   * @return {TimeRangeObject}\n   * @method seekable\n   */\n  seekable() {\n    const duration = this.duration();\n    if (duration === 0) {\n      return createTimeRange();\n    }\n    return createTimeRange(0, duration);\n  }\n\n  /**\n   * Get buffered time range\n   *\n   * @return {TimeRangeObject}\n   * @method buffered\n   */\n  buffered() {\n    let ranges = this.el_.vjs_getProperty('buffered');\n    if (ranges.length === 0) {\n      return createTimeRange();\n    }\n    return createTimeRange(ranges[0][0], ranges[0][1]);\n  }\n\n  /**\n   * Get fullscreen support -\n   * Flash does not allow fullscreen through javascript\n   * so always returns false\n   *\n   * @return {Boolean} false\n   * @method supportsFullScreen\n   */\n  supportsFullScreen() {\n    return false; // Flash does not allow fullscreen through javascript\n  }\n\n  /**\n   * Request to enter fullscreen\n   * Flash does not allow fullscreen through javascript\n   * so always returns false\n   *\n   * @return {Boolean} false\n   * @method enterFullScreen\n   */\n  enterFullScreen() {\n    return false;\n  }\n\n}\n\n\n// Create setters and getters for attributes\nconst _api = Flash.prototype;\nconst _readWrite = 'rtmpConnection,rtmpStream,preload,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted'.split(',');\nconst _readOnly = 'networkState,readyState,initialTime,duration,startOffsetTime,paused,ended,videoTracks,audioTracks,videoWidth,videoHeight'.split(',');\n\nfunction _createSetter(attr){\n  var attrUpper = attr.charAt(0).toUpperCase() + attr.slice(1);\n  _api['set'+attrUpper] = function(val){ return this.el_.vjs_setProperty(attr, val); };\n}\nfunction _createGetter(attr) {\n  _api[attr] = function(){ return this.el_.vjs_getProperty(attr); };\n}\n\n// Create getter and setters for all read/write attributes\nfor (let i = 0; i < _readWrite.length; i++) {\n  _createGetter(_readWrite[i]);\n  _createSetter(_readWrite[i]);\n}\n\n// Create getters for read-only attributes\nfor (let i = 0; i < _readOnly.length; i++) {\n  _createGetter(_readOnly[i]);\n}\n\n/* Flash Support Testing -------------------------------------------------------- */\n\nFlash.isSupported = function(){\n  return Flash.version()[0] >= 10;\n  // return swfobject.hasFlashPlayerVersion('10');\n};\n\n// Add Source Handler pattern functions to this tech\nTech.withSourceHandlers(Flash);\n\n/*\n * The default native source handler.\n * This simply passes the source to the video element. Nothing fancy.\n *\n * @param  {Object} source   The source object\n * @param  {Flash} tech  The instance of the Flash tech\n */\nFlash.nativeSourceHandler = {};\n\n/*\n * Check Flash can handle the source natively\n *\n * @param  {Object} source  The source object\n * @return {String}         'probably', 'maybe', or '' (empty string)\n */\nFlash.nativeSourceHandler.canHandleSource = function(source){\n  var type;\n\n  function guessMimeType(src) {\n    var ext = Url.getFileExtension(src);\n    if (ext) {\n      return `video/${ext}`;\n    }\n    return '';\n  }\n\n  if (!source.type) {\n    type = guessMimeType(source.src);\n  } else {\n    // Strip code information from the type because we don't get that specific\n    type = source.type.replace(/;.*/, '').toLowerCase();\n  }\n\n  if (type in Flash.formats) {\n    return 'maybe';\n  }\n\n  return '';\n};\n\n/*\n * Pass the source to the flash object\n * Adaptive source handlers will have more complicated workflows before passing\n * video data to the video element\n *\n * @param  {Object} source    The source object\n * @param  {Flash} tech   The instance of the Flash tech\n */\nFlash.nativeSourceHandler.handleSource = function(source, tech){\n  tech.setSrc(source.src);\n};\n\n/*\n * Clean up the source handler when disposing the player or switching sources..\n * (no cleanup is needed when supporting the format natively)\n */\nFlash.nativeSourceHandler.dispose = function(){};\n\n// Register the native source handler\nFlash.registerSourceHandler(Flash.nativeSourceHandler);\n\nFlash.formats = {\n  'video/flv': 'FLV',\n  'video/x-flv': 'FLV',\n  'video/mp4': 'MP4',\n  'video/m4v': 'MP4'\n};\n\nFlash.onReady = function(currSwf){\n  let el = Dom.getEl(currSwf);\n  let tech = el && el.tech;\n\n  // if there is no el then the tech has been disposed\n  // and the tech element was removed from the player div\n  if (tech && tech.el()) {\n    // check that the flash object is really ready\n    Flash.checkReady(tech);\n  }\n};\n\n// The SWF isn't always ready when it says it is. Sometimes the API functions still need to be added to the object.\n// If it's not ready, we set a timeout to check again shortly.\nFlash.checkReady = function(tech){\n  // stop worrying if the tech has been disposed\n  if (!tech.el()) {\n    return;\n  }\n\n  // check if API property exists\n  if (tech.el().vjs_getProperty) {\n    // tell tech it's ready\n    tech.triggerReady();\n  } else {\n    // wait longer\n    this.setTimeout(function(){\n      Flash['checkReady'](tech);\n    }, 50);\n  }\n};\n\n// Trigger events from the swf on the player\nFlash.onEvent = function(swfID, eventName){\n  let tech = Dom.getEl(swfID).tech;\n  tech.trigger(eventName);\n};\n\n// Log errors from the swf\nFlash.onError = function(swfID, err){\n  const tech = Dom.getEl(swfID).tech;\n\n  // trigger MEDIA_ERR_SRC_NOT_SUPPORTED\n  if (err === 'srcnotfound') {\n    return tech.error(4);\n  }\n\n  // trigger a custom error\n  tech.error('FLASH: ' + err);\n};\n\n// Flash Version Check\nFlash.version = function(){\n  let version = '0,0,0';\n\n  // IE\n  try {\n    version = new window.ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\\D+/g, ',').match(/^,?(.+),?$/)[1];\n\n  // other browsers\n  } catch(e) {\n    try {\n      if (navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin){\n        version = (navigator.plugins['Shockwave Flash 2.0'] || navigator.plugins['Shockwave Flash']).description.replace(/\\D+/g, ',').match(/^,?(.+),?$/)[1];\n      }\n    } catch(err) {}\n  }\n  return version.split(',');\n};\n\n// Flash embedding method. Only used in non-iframe mode\nFlash.embed = function(swf, flashVars, params, attributes){\n  const code = Flash.getEmbedCode(swf, flashVars, params, attributes);\n\n  // Get element by embedding code and retrieving created element\n  const obj = Dom.createEl('div', { innerHTML: code }).childNodes[0];\n\n  return obj;\n};\n\nFlash.getEmbedCode = function(swf, flashVars, params, attributes){\n  const objTag = '<object type=\"application/x-shockwave-flash\" ';\n  let flashVarsString = '';\n  let paramsString = '';\n  let attrsString = '';\n\n  // Convert flash vars to string\n  if (flashVars) {\n    Object.getOwnPropertyNames(flashVars).forEach(function(key){\n      flashVarsString += `${key}=${flashVars[key]}&amp;`;\n    });\n  }\n\n  // Add swf, flashVars, and other default params\n  params = assign({\n    'movie': swf,\n    'flashvars': flashVarsString,\n    'allowScriptAccess': 'always', // Required to talk to swf\n    'allowNetworking': 'all' // All should be default, but having security issues.\n  }, params);\n\n  // Create param tags string\n  Object.getOwnPropertyNames(params).forEach(function(key){\n    paramsString += `<param name=\"${key}\" value=\"${params[key]}\" />`;\n  });\n\n  attributes = assign({\n    // Add swf to attributes (need both for IE and Others to work)\n    'data': swf,\n\n    // Default to 100% width/height\n    'width': '100%',\n    'height': '100%'\n\n  }, attributes);\n\n  // Create Attributes string\n  Object.getOwnPropertyNames(attributes).forEach(function(key){\n    attrsString += `${key}=\"${attributes[key]}\" `;\n  });\n\n  return `${objTag}${attrsString}>${paramsString}</object>`;\n};\n\n// Run Flash through the RTMP decorator\nFlashRtmpDecorator(Flash);\n\nComponent.registerComponent('Flash', Flash);\nexport default Flash;\n","/**\n * @file html5.js\n * HTML5 Media Controller - Wrapper for HTML5 Media API\n */\n\nimport Tech from './tech.js';\nimport Component from '../component';\nimport * as Dom from '../utils/dom.js';\nimport * as Url from '../utils/url.js';\nimport * as Fn from '../utils/fn.js';\nimport log from '../utils/log.js';\nimport * as browser from '../utils/browser.js';\nimport document from 'global/document';\nimport window from 'global/window';\nimport assign from 'object.assign';\nimport mergeOptions from '../utils/merge-options.js';\n\n/**\n * HTML5 Media Controller - Wrapper for HTML5 Media API\n *\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready Ready callback function\n * @extends Tech\n * @class Html5\n */\nclass Html5 extends Tech {\n\n  constructor(options, ready){\n    super(options, ready);\n\n    const source = options.source;\n\n    // Set the source if one is provided\n    // 1) Check if the source is new (if not, we want to keep the original so playback isn't interrupted)\n    // 2) Check to see if the network state of the tag was failed at init, and if so, reset the source\n    // anyway so the error gets fired.\n    if (source && (this.el_.currentSrc !== source.src || (options.tag && options.tag.initNetworkState_ === 3))) {\n      this.setSource(source);\n    } else {\n      this.handleLateInit_(this.el_);\n    }\n\n    if (this.el_.hasChildNodes()) {\n\n      let nodes = this.el_.childNodes;\n      let nodesLength = nodes.length;\n      let removeNodes = [];\n\n      while (nodesLength--) {\n        let node = nodes[nodesLength];\n        let nodeName = node.nodeName.toLowerCase();\n        if (nodeName === 'track') {\n          if (!this.featuresNativeTextTracks) {\n            // Empty video tag tracks so the built-in player doesn't use them also.\n            // This may not be fast enough to stop HTML5 browsers from reading the tags\n            // so we'll need to turn off any default tracks if we're manually doing\n            // captions and subtitles. videoElement.textTracks\n            removeNodes.push(node);\n          } else {\n            this.remoteTextTracks().addTrack_(node.track);\n          }\n        }\n      }\n\n      for (let i=0; i<removeNodes.length; i++) {\n        this.el_.removeChild(removeNodes[i]);\n      }\n    }\n\n    if (this.featuresNativeTextTracks) {\n      this.handleTextTrackChange_ = Fn.bind(this, this.handleTextTrackChange);\n      this.handleTextTrackAdd_ = Fn.bind(this, this.handleTextTrackAdd);\n      this.handleTextTrackRemove_ = Fn.bind(this, this.handleTextTrackRemove);\n      this.proxyNativeTextTracks_();\n    }\n\n    // Determine if native controls should be used\n    // Our goal should be to get the custom controls on mobile solid everywhere\n    // so we can remove this all together. Right now this will block custom\n    // controls on touch enabled laptops like the Chrome Pixel\n    if (browser.TOUCH_ENABLED && options.nativeControlsForTouch === true ||\n        browser.IS_IPHONE ||\n        browser.IS_NATIVE_ANDROID) {\n      this.setControls(true);\n    }\n\n    this.triggerReady();\n  }\n\n  /**\n   * Dispose of html5 media element\n   *\n   * @method dispose\n   */\n  dispose() {\n    let tt = this.el().textTracks;\n    let emulatedTt = this.textTracks();\n\n    // remove native event listeners\n    if (tt && tt.removeEventListener) {\n      tt.removeEventListener('change', this.handleTextTrackChange_);\n      tt.removeEventListener('addtrack', this.handleTextTrackAdd_);\n      tt.removeEventListener('removetrack', this.handleTextTrackRemove_);\n    }\n\n    // clearout the emulated text track list.\n    let i = emulatedTt.length;\n\n    while (i--) {\n      emulatedTt.removeTrack_(emulatedTt[i]);\n    }\n\n\n    Html5.disposeMediaElement(this.el_);\n    super.dispose();\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    let el = this.options_.tag;\n\n    // Check if this browser supports moving the element into the box.\n    // On the iPhone video will break if you move the element,\n    // So we have to create a brand new element.\n    if (!el || this['movingMediaElementInDOM'] === false) {\n\n      // If the original tag is still there, clone and remove it.\n      if (el) {\n        const clone = el.cloneNode(true);\n        el.parentNode.insertBefore(clone, el);\n        Html5.disposeMediaElement(el);\n        el = clone;\n      } else {\n        el = document.createElement('video');\n\n        // determine if native controls should be used\n        let tagAttributes = this.options_.tag && Dom.getElAttributes(this.options_.tag);\n        let attributes = mergeOptions({}, tagAttributes);\n        if (!browser.TOUCH_ENABLED || this.options_.nativeControlsForTouch !== true) {\n          delete attributes.controls;\n        }\n\n        Dom.setElAttributes(el,\n          assign(attributes, {\n            id: this.options_.techId,\n            class: 'vjs-tech'\n          })\n        );\n      }\n    }\n\n    // Update specific tag settings, in case they were overridden\n    let settingsAttrs = ['autoplay','preload','loop','muted'];\n    for (let i = settingsAttrs.length - 1; i >= 0; i--) {\n      const attr = settingsAttrs[i];\n      let overwriteAttrs = {};\n      if (typeof this.options_[attr] !== 'undefined') {\n        overwriteAttrs[attr] = this.options_[attr];\n      }\n      Dom.setElAttributes(el, overwriteAttrs);\n    }\n\n    return el;\n    // jenniisawesome = true;\n  }\n\n  // If we're loading the playback object after it has started loading\n  // or playing the video (often with autoplay on) then the loadstart event\n  // has already fired and we need to fire it manually because many things\n  // rely on it.\n  handleLateInit_(el) {\n    if (el.networkState === 0 || el.networkState === 3) {\n      // The video element hasn't started loading the source yet\n      // or didn't find a source\n      return;\n    }\n\n    if (el.readyState === 0) {\n      // NetworkState is set synchronously BUT loadstart is fired at the\n      // end of the current stack, usually before setInterval(fn, 0).\n      // So at this point we know loadstart may have already fired or is\n      // about to fire, and either way the player hasn't seen it yet.\n      // We don't want to fire loadstart prematurely here and cause a\n      // double loadstart so we'll wait and see if it happens between now\n      // and the next loop, and fire it if not.\n      // HOWEVER, we also want to make sure it fires before loadedmetadata\n      // which could also happen between now and the next loop, so we'll\n      // watch for that also.\n      let loadstartFired = false;\n      let setLoadstartFired = function() {\n        loadstartFired = true;\n      };\n      this.on('loadstart', setLoadstartFired);\n\n      let triggerLoadstart = function() {\n        // We did miss the original loadstart. Make sure the player\n        // sees loadstart before loadedmetadata\n        if (!loadstartFired) {\n          this.trigger('loadstart');\n        }\n      };\n      this.on('loadedmetadata', triggerLoadstart);\n\n      this.ready(function(){\n        this.off('loadstart', setLoadstartFired);\n        this.off('loadedmetadata', triggerLoadstart);\n\n        if (!loadstartFired) {\n          // We did miss the original native loadstart. Fire it now.\n          this.trigger('loadstart');\n        }\n      });\n\n      return;\n    }\n\n    // From here on we know that loadstart already fired and we missed it.\n    // The other readyState events aren't as much of a problem if we double\n    // them, so not going to go to as much trouble as loadstart to prevent\n    // that unless we find reason to.\n    let eventsToTrigger = ['loadstart'];\n\n    // loadedmetadata: newly equal to HAVE_METADATA (1) or greater\n    eventsToTrigger.push('loadedmetadata');\n\n    // loadeddata: newly increased to HAVE_CURRENT_DATA (2) or greater\n    if (el.readyState >= 2) {\n      eventsToTrigger.push('loadeddata');\n    }\n\n    // canplay: newly increased to HAVE_FUTURE_DATA (3) or greater\n    if (el.readyState >= 3) {\n      eventsToTrigger.push('canplay');\n    }\n\n    // canplaythrough: newly equal to HAVE_ENOUGH_DATA (4)\n    if (el.readyState >= 4) {\n      eventsToTrigger.push('canplaythrough');\n    }\n\n    // We still need to give the player time to add event listeners\n    this.ready(function(){\n      eventsToTrigger.forEach(function(type){\n        this.trigger(type);\n      }, this);\n    });\n  }\n\n  proxyNativeTextTracks_() {\n    let tt = this.el().textTracks;\n\n    if (tt && tt.addEventListener) {\n      tt.addEventListener('change', this.handleTextTrackChange_);\n      tt.addEventListener('addtrack', this.handleTextTrackAdd_);\n      tt.addEventListener('removetrack', this.handleTextTrackRemove_);\n    }\n  }\n\n  handleTextTrackChange(e) {\n    let tt = this.textTracks();\n    this.textTracks().trigger({\n      type: 'change',\n      target: tt,\n      currentTarget: tt,\n      srcElement: tt\n    });\n  }\n\n  handleTextTrackAdd(e) {\n    this.textTracks().addTrack_(e.track);\n  }\n\n  handleTextTrackRemove(e) {\n    this.textTracks().removeTrack_(e.track);\n  }\n\n  /**\n   * Play for html5 tech\n   *\n   * @method play\n   */\n  play() { this.el_.play(); }\n\n  /**\n   * Pause for html5 tech\n   *\n   * @method pause\n   */\n  pause() { this.el_.pause(); }\n\n  /**\n   * Paused for html5 tech\n   *\n   * @return {Boolean}\n   * @method paused\n   */\n  paused() { return this.el_.paused; }\n\n  /**\n   * Get current time\n   *\n   * @return {Number}\n   * @method currentTime\n   */\n  currentTime() { return this.el_.currentTime; }\n\n  /**\n   * Set current time\n   *\n   * @param {Number} seconds Current time of video\n   * @method setCurrentTime\n   */\n  setCurrentTime(seconds) {\n    try {\n      this.el_.currentTime = seconds;\n    } catch(e) {\n      log(e, 'Video is not ready. (Video.js)');\n      // this.warning(VideoJS.warnings.videoNotReady);\n    }\n  }\n\n  /**\n   * Get duration\n   *\n   * @return {Number}\n   * @method duration\n   */\n  duration() { return this.el_.duration || 0; }\n\n  /**\n   * Get a TimeRange object that represents the intersection\n   * of the time ranges for which the user agent has all\n   * relevant media\n   *\n   * @return {TimeRangeObject}\n   * @method buffered\n   */\n  buffered() { return this.el_.buffered; }\n\n  /**\n   * Get volume level\n   *\n   * @return {Number}\n   * @method volume\n   */\n  volume() { return this.el_.volume; }\n\n  /**\n   * Set volume level\n   *\n   * @param {Number} percentAsDecimal Volume percent as a decimal\n   * @method setVolume\n   */\n  setVolume(percentAsDecimal) { this.el_.volume = percentAsDecimal; }\n\n  /**\n   * Get if muted\n   *\n   * @return {Boolean}\n   * @method muted\n   */\n  muted() { return this.el_.muted; }\n\n  /**\n   * Set muted\n   *\n   * @param {Boolean} If player is to be muted or note\n   * @method setMuted\n   */\n  setMuted(muted) { this.el_.muted = muted; }\n\n  /**\n   * Get player width\n   *\n   * @return {Number}\n   * @method width\n   */\n  width() { return this.el_.offsetWidth; }\n\n  /**\n   * Get player height\n   *\n   * @return {Number}\n   * @method height\n   */\n  height() {  return this.el_.offsetHeight; }\n\n  /**\n   * Get if there is fullscreen support\n   *\n   * @return {Boolean}\n   * @method supportsFullScreen\n   */\n  supportsFullScreen() {\n    if (typeof this.el_.webkitEnterFullScreen === 'function') {\n      let userAgent = window.navigator.userAgent;\n      // Seems to be broken in Chromium/Chrome && Safari in Leopard\n      if (/Android/.test(userAgent) || !/Chrome|Mac OS X 10.5/.test(userAgent)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Request to enter fullscreen\n   *\n   * @method enterFullScreen\n   */\n  enterFullScreen() {\n    var video = this.el_;\n\n    if ('webkitDisplayingFullscreen' in video) {\n      this.one('webkitbeginfullscreen', function() {\n        this.one('webkitendfullscreen', function() {\n          this.trigger('fullscreenchange', { isFullscreen: false });\n        });\n\n        this.trigger('fullscreenchange', { isFullscreen: true });\n      });\n    }\n\n    if (video.paused && video.networkState <= video.HAVE_METADATA) {\n      // attempt to prime the video element for programmatic access\n      // this isn't necessary on the desktop but shouldn't hurt\n      this.el_.play();\n\n      // playing and pausing synchronously during the transition to fullscreen\n      // can get iOS ~6.1 devices into a play/pause loop\n      this.setTimeout(function(){\n        video.pause();\n        video.webkitEnterFullScreen();\n      }, 0);\n    } else {\n      video.webkitEnterFullScreen();\n    }\n  }\n\n  /**\n   * Request to exit fullscreen\n   *\n   * @method exitFullScreen\n   */\n  exitFullScreen() {\n    this.el_.webkitExitFullScreen();\n  }\n\n  /**\n   * Get/set video\n   *\n   * @param {Object=} src Source object\n   * @return {Object}\n   * @method src\n   */\n  src(src) {\n    if (src === undefined) {\n      return this.el_.src;\n    } else {\n      // Setting src through `src` instead of `setSrc` will be deprecated\n      this.setSrc(src);\n    }\n  }\n\n  /**\n   * Set video\n   *\n   * @param {Object} src Source object\n   * @deprecated\n   * @method setSrc\n   */\n  setSrc(src) {\n    this.el_.src = src;\n  }\n\n  /**\n   * Load media into player\n   *\n   * @method load\n   */\n  load(){\n    this.el_.load();\n  }\n\n  /**\n   * Get current source\n   *\n   * @return {Object}\n   * @method currentSrc\n   */\n  currentSrc() { return this.el_.currentSrc; }\n\n  /**\n   * Get poster\n   *\n   * @return {String}\n   * @method poster\n   */\n  poster() { return this.el_.poster; }\n\n  /**\n   * Set poster\n   *\n   * @param {String} val URL to poster image\n   * @method\n   */\n  setPoster(val) { this.el_.poster = val; }\n\n  /**\n   * Get preload attribute\n   *\n   * @return {String}\n   * @method preload\n   */\n  preload() { return this.el_.preload; }\n\n  /**\n   * Set preload attribute\n   *\n   * @param {String} val Value for preload attribute\n   * @method setPreload\n   */\n  setPreload(val) { this.el_.preload = val; }\n\n  /**\n   * Get autoplay attribute\n   *\n   * @return {String}\n   * @method autoplay\n   */\n  autoplay() { return this.el_.autoplay; }\n\n  /**\n   * Set autoplay attribute\n   *\n   * @param {String} val Value for preload attribute\n   * @method setAutoplay\n   */\n  setAutoplay(val) { this.el_.autoplay = val; }\n\n  /**\n   * Get controls attribute\n   *\n   * @return {String}\n   * @method controls\n   */\n  controls() { return this.el_.controls; }\n\n  /**\n   * Set controls attribute\n   *\n   * @param {String} val Value for controls attribute\n   * @method setControls\n   */\n  setControls(val) { this.el_.controls = !!val; }\n\n  /**\n   * Get loop attribute\n   *\n   * @return {String}\n   * @method loop\n   */\n  loop() { return this.el_.loop; }\n\n  /**\n   * Set loop attribute\n   *\n   * @param {String} val Value for loop attribute\n   * @method setLoop\n   */\n  setLoop(val) { this.el_.loop = val; }\n\n  /**\n   * Get error value\n   *\n   * @return {String}\n   * @method error\n   */\n  error() { return this.el_.error; }\n\n  /**\n   * Get whether or not the player is in the \"seeking\" state\n   *\n   * @return {Boolean}\n   * @method seeking\n   */\n  seeking() { return this.el_.seeking; }\n\n  /**\n   * Get a TimeRanges object that represents the\n   * ranges of the media resource to which it is possible\n   * for the user agent to seek.\n   *\n   * @return {TimeRangeObject}\n   * @method seekable\n   */\n  seekable() { return this.el_.seekable; }\n\n  /**\n   * Get if video ended\n   *\n   * @return {Boolean}\n   * @method ended\n   */\n  ended() { return this.el_.ended; }\n\n  /**\n   * Get the value of the muted content attribute\n   * This attribute has no dynamic effect, it only\n   * controls the default state of the element\n   *\n   * @return {Boolean}\n   * @method defaultMuted\n   */\n  defaultMuted() { return this.el_.defaultMuted; }\n\n  /**\n   * Get desired speed at which the media resource is to play\n   *\n   * @return {Number}\n   * @method playbackRate\n   */\n  playbackRate() { return this.el_.playbackRate; }\n\n  /**\n   * Returns a TimeRanges object that represents the ranges of the\n   * media resource that the user agent has played.\n   * @return {TimeRangeObject} the range of points on the media\n   * timeline that has been reached through normal playback\n   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-played\n   */\n  played() { return this.el_.played; }\n\n  /**\n   * Set desired speed at which the media resource is to play\n   *\n   * @param {Number} val Speed at which the media resource is to play\n   * @method setPlaybackRate\n   */\n  setPlaybackRate(val) { this.el_.playbackRate = val; }\n\n  /**\n   * Get the current state of network activity for the element, from\n   * the list below\n   * NETWORK_EMPTY (numeric value 0)\n   * NETWORK_IDLE (numeric value 1)\n   * NETWORK_LOADING (numeric value 2)\n   * NETWORK_NO_SOURCE (numeric value 3)\n   *\n   * @return {Number}\n   * @method networkState\n   */\n  networkState() { return this.el_.networkState; }\n\n  /**\n   * Get a value that expresses the current state of the element\n   * with respect to rendering the current playback position, from\n   * the codes in the list below\n   * HAVE_NOTHING (numeric value 0)\n   * HAVE_METADATA (numeric value 1)\n   * HAVE_CURRENT_DATA (numeric value 2)\n   * HAVE_FUTURE_DATA (numeric value 3)\n   * HAVE_ENOUGH_DATA (numeric value 4)\n   *\n   * @return {Number}\n   * @method readyState\n   */\n  readyState() { return this.el_.readyState; }\n\n  /**\n   * Get width of video\n   *\n   * @return {Number}\n   * @method videoWidth\n   */\n  videoWidth() { return this.el_.videoWidth; }\n\n  /**\n   * Get height of video\n   *\n   * @return {Number}\n   * @method videoHeight\n   */\n  videoHeight() { return this.el_.videoHeight; }\n\n  /**\n   * Get text tracks\n   *\n   * @return {TextTrackList}\n   * @method textTracks\n   */\n  textTracks() {\n    return super.textTracks();\n  }\n\n  /**\n   * Creates and returns a text track object\n   *\n   * @param {String} kind Text track kind (subtitles, captions, descriptions\n   *                                       chapters and metadata)\n   * @param {String=} label Label to identify the text track\n   * @param {String=} language Two letter language abbreviation\n   * @return {TextTrackObject}\n   * @method addTextTrack\n   */\n  addTextTrack(kind, label, language) {\n    if (!this['featuresNativeTextTracks']) {\n      return super.addTextTrack(kind, label, language);\n    }\n\n    return this.el_.addTextTrack(kind, label, language);\n  }\n\n  /**\n   * Creates and returns a remote text track object\n   *\n   * @param {Object} options The object should contain values for\n   * kind, language, label and src (location of the WebVTT file)\n   * @return {TextTrackObject}\n   * @method addRemoteTextTrack\n   */\n  addRemoteTextTrack(options={}) {\n    if (!this['featuresNativeTextTracks']) {\n      return super.addRemoteTextTrack(options);\n    }\n\n    var track = document.createElement('track');\n\n    if (options['kind']) {\n      track['kind'] = options['kind'];\n    }\n    if (options['label']) {\n      track['label'] = options['label'];\n    }\n    if (options['language'] || options['srclang']) {\n      track['srclang'] = options['language'] || options['srclang'];\n    }\n    if (options['default']) {\n      track['default'] = options['default'];\n    }\n    if (options['id']) {\n      track['id'] = options['id'];\n    }\n    if (options['src']) {\n      track['src'] = options['src'];\n    }\n\n    this.el().appendChild(track);\n\n    this.remoteTextTracks().addTrack_(track.track);\n\n    return track;\n  }\n\n  /**\n   * Remove remote text track from TextTrackList object\n   *\n   * @param {TextTrackObject} track Texttrack object to remove\n   * @method removeRemoteTextTrack\n   */\n  removeRemoteTextTrack(track) {\n    if (!this['featuresNativeTextTracks']) {\n      return super.removeRemoteTextTrack(track);\n    }\n\n    var tracks, i;\n\n    this.remoteTextTracks().removeTrack_(track);\n\n    tracks = this.el().querySelectorAll('track');\n\n    i = tracks.length;\n    while (i--) {\n      if (track === tracks[i] || track === tracks[i].track) {\n        this.el().removeChild(tracks[i]);\n      }\n    }\n  }\n\n}\n\n\n/* HTML5 Support Testing ---------------------------------------------------- */\n\n/*\n* Element for testing browser HTML5 video capabilities\n*\n* @type {Element}\n* @constant\n* @private\n*/\nHtml5.TEST_VID = document.createElement('video');\nlet track = document.createElement('track');\ntrack.kind = 'captions';\ntrack.srclang = 'en';\ntrack.label = 'English';\nHtml5.TEST_VID.appendChild(track);\n\n/*\n * Check if HTML5 video is supported by this browser/device\n *\n * @return {Boolean}\n */\nHtml5.isSupported = function(){\n  // IE9 with no Media Player is a LIAR! (#984)\n  try {\n    Html5.TEST_VID['volume'] = 0.5;\n  } catch (e) {\n    return false;\n  }\n\n  return !!Html5.TEST_VID.canPlayType;\n};\n\n// Add Source Handler pattern functions to this tech\nTech.withSourceHandlers(Html5);\n\n/*\n * The default native source handler.\n * This simply passes the source to the video element. Nothing fancy.\n *\n * @param  {Object} source   The source object\n * @param  {Html5} tech  The instance of the HTML5 tech\n */\nHtml5.nativeSourceHandler = {};\n\n/*\n * Check if the video element can handle the source natively\n *\n * @param  {Object} source  The source object\n * @return {String}         'probably', 'maybe', or '' (empty string)\n */\nHtml5.nativeSourceHandler.canHandleSource = function(source){\n  var match, ext;\n\n  function canPlayType(type){\n    // IE9 on Windows 7 without MediaPlayer throws an error here\n    // https://github.com/videojs/video.js/issues/519\n    try {\n      return Html5.TEST_VID.canPlayType(type);\n    } catch(e) {\n      return '';\n    }\n  }\n\n  // If a type was provided we should rely on that\n  if (source.type) {\n    return canPlayType(source.type);\n  } else if (source.src) {\n    // If no type, fall back to checking 'video/[EXTENSION]'\n    ext = Url.getFileExtension(source.src);\n\n    return canPlayType(`video/${ext}`);\n  }\n\n  return '';\n};\n\n/*\n * Pass the source to the video element\n * Adaptive source handlers will have more complicated workflows before passing\n * video data to the video element\n *\n * @param  {Object} source    The source object\n * @param  {Html5} tech   The instance of the Html5 tech\n */\nHtml5.nativeSourceHandler.handleSource = function(source, tech){\n  tech.setSrc(source.src);\n};\n\n/*\n* Clean up the source handler when disposing the player or switching sources..\n* (no cleanup is needed when supporting the format natively)\n*/\nHtml5.nativeSourceHandler.dispose = function(){};\n\n// Register the native source handler\nHtml5.registerSourceHandler(Html5.nativeSourceHandler);\n\n/*\n * Check if the volume can be changed in this browser/device.\n * Volume cannot be changed in a lot of mobile devices.\n * Specifically, it can't be changed from 1 on iOS.\n *\n * @return {Boolean}\n */\nHtml5.canControlVolume = function(){\n  var volume =  Html5.TEST_VID.volume;\n  Html5.TEST_VID.volume = (volume / 2) + 0.1;\n  return volume !== Html5.TEST_VID.volume;\n};\n\n/*\n * Check if playbackRate is supported in this browser/device.\n *\n * @return {Number} [description]\n */\nHtml5.canControlPlaybackRate = function(){\n  var playbackRate = Html5.TEST_VID.playbackRate;\n  Html5.TEST_VID.playbackRate = (playbackRate / 2) + 0.1;\n  return playbackRate !== Html5.TEST_VID.playbackRate;\n};\n\n/*\n * Check to see if native text tracks are supported by this browser/device\n *\n * @return {Boolean}\n */\nHtml5.supportsNativeTextTracks = function() {\n  var supportsTextTracks;\n\n  // Figure out native text track support\n  // If mode is a number, we cannot change it because it'll disappear from view.\n  // Browsers with numeric modes include IE10 and older (<=2013) samsung android models.\n  // Firefox isn't playing nice either with modifying the mode\n  // TODO: Investigate firefox: https://github.com/videojs/video.js/issues/1862\n  supportsTextTracks = !!Html5.TEST_VID.textTracks;\n  if (supportsTextTracks && Html5.TEST_VID.textTracks.length > 0) {\n    supportsTextTracks = typeof Html5.TEST_VID.textTracks[0]['mode'] !== 'number';\n  }\n  if (supportsTextTracks && browser.IS_FIREFOX) {\n    supportsTextTracks = false;\n  }\n  if (supportsTextTracks && !('onremovetrack' in Html5.TEST_VID.textTracks)) {\n    supportsTextTracks = false;\n  }\n\n  return supportsTextTracks;\n};\n\n/**\n * An array of events available on the Html5 tech.\n *\n * @private\n * @type {Array}\n */\nHtml5.Events = [\n  'loadstart',\n  'suspend',\n  'abort',\n  'error',\n  'emptied',\n  'stalled',\n  'loadedmetadata',\n  'loadeddata',\n  'canplay',\n  'canplaythrough',\n  'playing',\n  'waiting',\n  'seeking',\n  'seeked',\n  'ended',\n  'durationchange',\n  'timeupdate',\n  'progress',\n  'play',\n  'pause',\n  'ratechange',\n  'volumechange'\n];\n\n/*\n * Set the tech's volume control support status\n *\n * @type {Boolean}\n */\nHtml5.prototype['featuresVolumeControl'] = Html5.canControlVolume();\n\n/*\n * Set the tech's playbackRate support status\n *\n * @type {Boolean}\n */\nHtml5.prototype['featuresPlaybackRate'] = Html5.canControlPlaybackRate();\n\n/*\n * Set the tech's status on moving the video element.\n * In iOS, if you move a video element in the DOM, it breaks video playback.\n *\n * @type {Boolean}\n */\nHtml5.prototype['movingMediaElementInDOM'] = !browser.IS_IOS;\n\n/*\n * Set the the tech's fullscreen resize support status.\n * HTML video is able to automatically resize when going to fullscreen.\n * (No longer appears to be used. Can probably be removed.)\n */\nHtml5.prototype['featuresFullscreenResize'] = true;\n\n/*\n * Set the tech's progress event support status\n * (this disables the manual progress events of the Tech)\n */\nHtml5.prototype['featuresProgressEvents'] = true;\n\n/*\n * Sets the tech's status on native text track support\n *\n * @type {Boolean}\n */\nHtml5.prototype['featuresNativeTextTracks'] = Html5.supportsNativeTextTracks();\n\n// HTML5 Feature detection and Device Fixes --------------------------------- //\nlet canPlayType;\nconst mpegurlRE = /^application\\/(?:x-|vnd\\.apple\\.)mpegurl/i;\nconst mp4RE = /^video\\/mp4/i;\n\nHtml5.patchCanPlayType = function() {\n  // Android 4.0 and above can play HLS to some extent but it reports being unable to do so\n  if (browser.ANDROID_VERSION >= 4.0) {\n    if (!canPlayType) {\n      canPlayType = Html5.TEST_VID.constructor.prototype.canPlayType;\n    }\n\n    Html5.TEST_VID.constructor.prototype.canPlayType = function(type) {\n      if (type && mpegurlRE.test(type)) {\n        return 'maybe';\n      }\n      return canPlayType.call(this, type);\n    };\n  }\n\n  // Override Android 2.2 and less canPlayType method which is broken\n  if (browser.IS_OLD_ANDROID) {\n    if (!canPlayType) {\n      canPlayType = Html5.TEST_VID.constructor.prototype.canPlayType;\n    }\n\n    Html5.TEST_VID.constructor.prototype.canPlayType = function(type){\n      if (type && mp4RE.test(type)) {\n        return 'maybe';\n      }\n      return canPlayType.call(this, type);\n    };\n  }\n};\n\nHtml5.unpatchCanPlayType = function() {\n  var r = Html5.TEST_VID.constructor.prototype.canPlayType;\n  Html5.TEST_VID.constructor.prototype.canPlayType = canPlayType;\n  canPlayType = null;\n  return r;\n};\n\n// by default, patch the video element\nHtml5.patchCanPlayType();\n\nHtml5.disposeMediaElement = function(el){\n  if (!el) { return; }\n\n  if (el.parentNode) {\n    el.parentNode.removeChild(el);\n  }\n\n  // remove any child track or source nodes to prevent their loading\n  while(el.hasChildNodes()) {\n    el.removeChild(el.firstChild);\n  }\n\n  // remove any src reference. not setting `src=''` because that causes a warning\n  // in firefox\n  el.removeAttribute('src');\n\n  // force the media element to update its loading state by calling load()\n  // however IE on Windows 7N has a bug that throws an error so need a try/catch (#793)\n  if (typeof el.load === 'function') {\n    // wrapping in an iife so it's not deoptimized (#1060#discussion_r10324473)\n    (function() {\n      try {\n        el.load();\n      } catch (e) {\n        // not supported\n      }\n    })();\n  }\n};\n\nComponent.registerComponent('Html5', Html5);\nexport default Html5;\n","/**\n * @file loader.js\n */\nimport Component from '../component';\nimport window from 'global/window';\nimport toTitleCase from '../utils/to-title-case.js';\n\n/**\n * The Media Loader is the component that decides which playback technology to load\n * when the player is initialized.\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends Component\n * @class MediaLoader\n */\nclass MediaLoader extends Component {\n\n  constructor(player, options, ready){\n    super(player, options, ready);\n\n    // If there are no sources when the player is initialized,\n    // load the first supported playback technology.\n\n    if (!options.playerOptions['sources'] || options.playerOptions['sources'].length === 0) {\n      for (let i=0, j=options.playerOptions['techOrder']; i<j.length; i++) {\n        let techName = toTitleCase(j[i]);\n        let tech = Component.getComponent(techName);\n\n        // Check if the browser supports this technology\n        if (tech && tech.isSupported()) {\n          player.loadTech_(techName);\n          break;\n        }\n      }\n    } else {\n      // // Loop through playback technologies (HTML5, Flash) and check for support.\n      // // Then load the best source.\n      // // A few assumptions here:\n      // //   All playback technologies respect preload false.\n      player.src(options.playerOptions['sources']);\n    }\n  }\n}\n\nComponent.registerComponent('MediaLoader', MediaLoader);\nexport default MediaLoader;\n","/**\n * @file tech.js\n * Media Technology Controller - Base class for media playback\n * technology controllers like Flash and HTML5\n */\n\nimport Component from '../component';\nimport TextTrack from '../tracks/text-track';\nimport TextTrackList from '../tracks/text-track-list';\nimport * as Fn from '../utils/fn.js';\nimport log from '../utils/log.js';\nimport { createTimeRange } from '../utils/time-ranges.js';\nimport { bufferedPercent } from '../utils/buffer.js';\nimport MediaError from '../media-error.js';\nimport window from 'global/window';\nimport document from 'global/document';\n\n/**\n * Base class for media (HTML5 Video, Flash) controllers\n *\n * @param {Object=} options Options object\n * @param {Function=} ready Ready callback function\n * @extends Component\n * @class Tech\n */\nclass Tech extends Component {\n\n  constructor(options={}, ready=function(){}){\n    // we don't want the tech to report user activity automatically.\n    // This is done manually in addControlsListeners\n    options.reportTouchActivity = false;\n    super(null, options, ready);\n\n    // keep track of whether the current source has played at all to\n    // implement a very limited played()\n    this.hasStarted_ = false;\n    this.on('playing', function() {\n      this.hasStarted_ = true;\n    });\n    this.on('loadstart', function() {\n      this.hasStarted_ = false;\n    });\n\n    this.textTracks_ = options.textTracks;\n\n    // Manually track progress in cases where the browser/flash player doesn't report it.\n    if (!this.featuresProgressEvents) {\n      this.manualProgressOn();\n    }\n\n    // Manually track timeupdates in cases where the browser/flash player doesn't report it.\n    if (!this.featuresTimeupdateEvents) {\n      this.manualTimeUpdatesOn();\n    }\n\n    if (options.nativeCaptions === false || options.nativeTextTracks === false) {\n      this.featuresNativeTextTracks = false;\n    }\n\n    if (!this.featuresNativeTextTracks) {\n      this.emulateTextTracks();\n    }\n\n    this.initTextTrackListeners();\n\n    // Turn on component tap events\n    this.emitTapEvents();\n  }\n\n  /* Fallbacks for unsupported event types\n  ================================================================================ */\n  // Manually trigger progress events based on changes to the buffered amount\n  // Many flash players and older HTML5 browsers don't send progress or progress-like events\n  /**\n   * Turn on progress events\n   *\n   * @method manualProgressOn\n   */\n  manualProgressOn() {\n    this.on('durationchange', this.onDurationChange);\n\n    this.manualProgress = true;\n\n    // Trigger progress watching when a source begins loading\n    this.one('ready', this.trackProgress);\n  }\n\n  /**\n   * Turn off progress events\n   *\n   * @method manualProgressOff\n   */\n  manualProgressOff() {\n    this.manualProgress = false;\n    this.stopTrackingProgress();\n\n    this.off('durationchange', this.onDurationChange);\n  }\n\n  /**\n   * Track progress\n   *\n   * @method trackProgress\n   */\n  trackProgress() {\n    this.stopTrackingProgress();\n    this.progressInterval = this.setInterval(Fn.bind(this, function(){\n      // Don't trigger unless buffered amount is greater than last time\n\n      let numBufferedPercent = this.bufferedPercent();\n\n      if (this.bufferedPercent_ !== numBufferedPercent) {\n        this.trigger('progress');\n      }\n\n      this.bufferedPercent_ = numBufferedPercent;\n\n      if (numBufferedPercent === 1) {\n        this.stopTrackingProgress();\n      }\n    }), 500);\n  }\n\n  /**\n   * Update duration\n   *\n   * @method onDurationChange\n   */\n  onDurationChange() {\n    this.duration_ = this.duration();\n  }\n\n  /**\n   * Create and get TimeRange object for buffering\n   *\n   * @return {TimeRangeObject}\n   * @method buffered\n   */\n  buffered() {\n    return createTimeRange(0, 0);\n  }\n\n  /**\n   * Get buffered percent\n   *\n   * @return {Number}\n   * @method bufferedPercent\n   */\n  bufferedPercent() {\n    return bufferedPercent(this.buffered(), this.duration_);\n  }\n\n  /**\n   * Stops tracking progress by clearing progress interval\n   *\n   * @method stopTrackingProgress\n   */\n  stopTrackingProgress() {\n    this.clearInterval(this.progressInterval);\n  }\n\n  /*! Time Tracking -------------------------------------------------------------- */\n  /**\n   * Set event listeners for on play and pause and tracking current time\n   *\n   * @method manualTimeUpdatesOn\n   */\n  manualTimeUpdatesOn() {\n    this.manualTimeUpdates = true;\n\n    this.on('play', this.trackCurrentTime);\n    this.on('pause', this.stopTrackingCurrentTime);\n  }\n\n  /**\n   * Remove event listeners for on play and pause and tracking current time\n   *\n   * @method manualTimeUpdatesOff\n   */\n  manualTimeUpdatesOff() {\n    this.manualTimeUpdates = false;\n    this.stopTrackingCurrentTime();\n    this.off('play', this.trackCurrentTime);\n    this.off('pause', this.stopTrackingCurrentTime);\n  }\n\n  /**\n   * Tracks current time\n   *\n   * @method trackCurrentTime\n   */\n  trackCurrentTime() {\n    if (this.currentTimeInterval) { this.stopTrackingCurrentTime(); }\n    this.currentTimeInterval = this.setInterval(function(){\n      this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n    }, 250); // 42 = 24 fps // 250 is what Webkit uses // FF uses 15\n  }\n\n  /**\n   * Turn off play progress tracking (when paused or dragging)\n   *\n   * @method stopTrackingCurrentTime\n   */\n  stopTrackingCurrentTime() {\n    this.clearInterval(this.currentTimeInterval);\n\n    // #1002 - if the video ends right before the next timeupdate would happen,\n    // the progress bar won't make it all the way to the end\n    this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n  }\n\n  /**\n   * Turn off any manual progress or timeupdate tracking\n   *\n   * @method dispose\n   */\n  dispose() {\n    // clear out text tracks because we can't reuse them between techs\n    let textTracks = this.textTracks();\n\n    if (textTracks) {\n      let i = textTracks.length;\n      while(i--) {\n        this.removeRemoteTextTrack(textTracks[i]);\n      }\n    }\n\n    // Turn off any manual progress or timeupdate tracking\n    if (this.manualProgress) { this.manualProgressOff(); }\n\n    if (this.manualTimeUpdates) { this.manualTimeUpdatesOff(); }\n\n    super.dispose();\n  }\n\n  /**\n   * When invoked without an argument, returns a MediaError object\n   * representing the current error state of the player or null if\n   * there is no error. When invoked with an argument, set the current\n   * error state of the player.\n   * @param {MediaError=} err    Optional an error object\n   * @return {MediaError}        the current error object or null\n   * @method error\n   */\n  error(err) {\n    if (err !== undefined) {\n      if (err instanceof MediaError) {\n        this.error_ = err;\n      } else {\n        this.error_ = new MediaError(err);\n      }\n      this.trigger('error');\n    }\n    return this.error_;\n  }\n\n  /**\n   * Return the time ranges that have been played through for the\n   * current source. This implementation is incomplete. It does not\n   * track the played time ranges, only whether the source has played\n   * at all or not.\n   * @return {TimeRangeObject} a single time range if this video has\n   * played or an empty set of ranges if not.\n   * @method played\n   */\n  played() {\n    if (this.hasStarted_) {\n      return createTimeRange(0, 0);\n    }\n    return createTimeRange();\n  }\n\n  /**\n   * Set current time\n   *\n   * @method setCurrentTime\n   */\n  setCurrentTime() {\n    // improve the accuracy of manual timeupdates\n    if (this.manualTimeUpdates) { this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true }); }\n  }\n\n  /**\n   * Initialize texttrack listeners\n   *\n   * @method initTextTrackListeners\n   */\n  initTextTrackListeners() {\n    let textTrackListChanges = Fn.bind(this, function() {\n      this.trigger('texttrackchange');\n    });\n\n    let tracks = this.textTracks();\n\n    if (!tracks) return;\n\n    tracks.addEventListener('removetrack', textTrackListChanges);\n    tracks.addEventListener('addtrack', textTrackListChanges);\n\n    this.on('dispose', Fn.bind(this, function() {\n      tracks.removeEventListener('removetrack', textTrackListChanges);\n      tracks.removeEventListener('addtrack', textTrackListChanges);\n    }));\n  }\n\n  /**\n   * Emulate texttracks\n   *\n   * @method emulateTextTracks\n   */\n  emulateTextTracks() {\n    if (!window['WebVTT'] && this.el().parentNode != null) {\n      let script = document.createElement('script');\n      script.src = this.options_['vtt.js'] || '../node_modules/vtt.js/dist/vtt.js';\n      this.el().parentNode.appendChild(script);\n      window['WebVTT'] = true;\n    }\n\n    let tracks = this.textTracks();\n    if (!tracks) {\n      return;\n    }\n\n    let textTracksChanges = Fn.bind(this, function() {\n      let updateDisplay = () => this.trigger('texttrackchange');\n\n      updateDisplay();\n\n      for (let i = 0; i < tracks.length; i++) {\n        let track = tracks[i];\n        track.removeEventListener('cuechange', updateDisplay);\n        if (track.mode === 'showing') {\n          track.addEventListener('cuechange', updateDisplay);\n        }\n      }\n    });\n\n    tracks.addEventListener('change', textTracksChanges);\n\n    this.on('dispose', function() {\n      tracks.removeEventListener('change', textTracksChanges);\n    });\n  }\n\n  /*\n   * Provide default methods for text tracks.\n   *\n   * Html5 tech overrides these.\n   */\n\n  /**\n   * Get texttracks\n   *\n   * @returns {TextTrackList}\n   * @method textTracks\n   */\n  textTracks() {\n    this.textTracks_ = this.textTracks_ || new TextTrackList();\n    return this.textTracks_;\n  }\n\n  /**\n   * Get remote texttracks\n   *\n   * @returns {TextTrackList}\n   * @method remoteTextTracks\n   */\n  remoteTextTracks() {\n    this.remoteTextTracks_ = this.remoteTextTracks_ || new TextTrackList();\n    return this.remoteTextTracks_;\n  }\n\n  /**\n   * Creates and returns a remote text track object\n   *\n   * @param {String} kind Text track kind (subtitles, captions, descriptions\n   *                                       chapters and metadata)\n   * @param {String=} label Label to identify the text track\n   * @param {String=} language Two letter language abbreviation\n   * @return {TextTrackObject}\n   * @method addTextTrack\n   */\n  addTextTrack(kind, label, language) {\n    if (!kind) {\n      throw new Error('TextTrack kind is required but was not provided');\n    }\n\n    return createTrackHelper(this, kind, label, language);\n  }\n\n  /**\n   * Creates and returns a remote text track object\n   *\n   * @param {Object} options The object should contain values for\n   * kind, language, label and src (location of the WebVTT file)\n   * @return {TextTrackObject}\n   * @method addRemoteTextTrack\n   */\n  addRemoteTextTrack(options) {\n    let track = createTrackHelper(this, options.kind, options.label, options.language, options);\n    this.remoteTextTracks().addTrack_(track);\n    return {\n      track: track\n    };\n  }\n\n  /**\n   * Remove remote texttrack\n   *\n   * @param {TextTrackObject} track Texttrack to remove\n   * @method removeRemoteTextTrack\n   */\n  removeRemoteTextTrack(track) {\n    this.textTracks().removeTrack_(track);\n    this.remoteTextTracks().removeTrack_(track);\n  }\n\n  /**\n   * Provide a default setPoster method for techs\n   * Poster support for techs should be optional, so we don't want techs to\n   * break if they don't have a way to set a poster.\n   *\n   * @method setPoster\n   */\n  setPoster() {}\n\n}\n\n/*\n * List of associated text tracks\n *\n * @type {Array}\n * @private\n */\nTech.prototype.textTracks_;\n\nvar createTrackHelper = function(self, kind, label, language, options={}) {\n  let tracks = self.textTracks();\n\n  options.kind = kind;\n\n  if (label) {\n    options.label = label;\n  }\n  if (language) {\n    options.language = language;\n  }\n  options.tech = self;\n\n  let track = new TextTrack(options);\n  tracks.addTrack_(track);\n\n  return track;\n};\n\nTech.prototype.featuresVolumeControl = true;\n\n// Resizing plugins using request fullscreen reloads the plugin\nTech.prototype.featuresFullscreenResize = false;\nTech.prototype.featuresPlaybackRate = false;\n\n// Optional events that we can manually mimic with timers\n// currently not triggered by video-js-swf\nTech.prototype.featuresProgressEvents = false;\nTech.prototype.featuresTimeupdateEvents = false;\n\nTech.prototype.featuresNativeTextTracks = false;\n\n/*\n * A functional mixin for techs that want to use the Source Handler pattern.\n *\n * ##### EXAMPLE:\n *\n *   Tech.withSourceHandlers.call(MyTech);\n *\n */\nTech.withSourceHandlers = function(_Tech){\n   /*\n    * Register a source handler\n    * Source handlers are scripts for handling specific formats.\n    * The source handler pattern is used for adaptive formats (HLS, DASH) that\n    * manually load video data and feed it into a Source Buffer (Media Source Extensions)\n    * @param  {Function} handler  The source handler\n    * @param  {Boolean}  first    Register it before any existing handlers\n    */\n   _Tech.registerSourceHandler = function(handler, index){\n    let handlers = _Tech.sourceHandlers;\n\n    if (!handlers) {\n      handlers = _Tech.sourceHandlers = [];\n    }\n\n    if (index === undefined) {\n      // add to the end of the list\n      index = handlers.length;\n    }\n\n    handlers.splice(index, 0, handler);\n  };\n\n   /*\n    * Return the first source handler that supports the source\n    * TODO: Answer question: should 'probably' be prioritized over 'maybe'\n    * @param  {Object} source The source object\n    * @returns {Object}       The first source handler that supports the source\n    * @returns {null}         Null if no source handler is found\n    */\n   _Tech.selectSourceHandler = function(source){\n    let handlers = _Tech.sourceHandlers || [];\n    let can;\n\n    for (let i = 0; i < handlers.length; i++) {\n      can = handlers[i].canHandleSource(source);\n\n      if (can) {\n        return handlers[i];\n      }\n    }\n\n    return null;\n  };\n\n  /*\n   * Check if the tech can support the given source\n   * @param  {Object} srcObj  The source object\n   * @return {String}         'probably', 'maybe', or '' (empty string)\n   */\n  _Tech.canPlaySource = function(srcObj){\n    let sh = _Tech.selectSourceHandler(srcObj);\n\n    if (sh) {\n      return sh.canHandleSource(srcObj);\n    }\n\n    return '';\n  };\n\n  let originalSeekable = _Tech.prototype.seekable;\n\n  // when a source handler is registered, prefer its implementation of\n  // seekable when present.\n  _Tech.prototype.seekable = function() {\n    if (this.sourceHandler_ && this.sourceHandler_.seekable) {\n      return this.sourceHandler_.seekable();\n    }\n    return originalSeekable.call(this);\n  };\n\n   /*\n    * Create a function for setting the source using a source object\n    * and source handlers.\n    * Should never be called unless a source handler was found.\n    * @param {Object} source  A source object with src and type keys\n    * @return {Tech} self\n    */\n   _Tech.prototype.setSource = function(source){\n    let sh = _Tech.selectSourceHandler(source);\n\n    if (!sh) {\n      // Fall back to a native source hander when unsupported sources are\n      // deliberately set\n      if (_Tech.nativeSourceHandler) {\n        sh = _Tech.nativeSourceHandler;\n      } else {\n        log.error('No source hander found for the current source.');\n      }\n    }\n\n    // Dispose any existing source handler\n    this.disposeSourceHandler();\n    this.off('dispose', this.disposeSourceHandler);\n\n    this.currentSource_ = source;\n    this.sourceHandler_ = sh.handleSource(source, this);\n    this.on('dispose', this.disposeSourceHandler);\n\n    return this;\n  };\n\n   /*\n    * Clean up any existing source handler\n    */\n   _Tech.prototype.disposeSourceHandler = function(){\n    if (this.sourceHandler_ && this.sourceHandler_.dispose) {\n      this.sourceHandler_.dispose();\n    }\n  };\n\n};\n\nComponent.registerComponent('Tech', Tech);\n// Old name for Tech\nComponent.registerComponent('MediaTechController', Tech);\nexport default Tech;\n","/**\n * @file text-track-cue-list.js\n */\nimport * as browser from '../utils/browser.js';\nimport document from 'global/document';\n\n/*\n * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcuelist\n *\n * interface TextTrackCueList {\n *   readonly attribute unsigned long length;\n *   getter TextTrackCue (unsigned long index);\n *   TextTrackCue? getCueById(DOMString id);\n * };\n */\n\nlet TextTrackCueList = function(cues) {\n  let list = this;\n\n  if (browser.IS_IE8) {\n    list = document.createElement('custom');\n\n    for (let prop in TextTrackCueList.prototype) {\n      list[prop] = TextTrackCueList.prototype[prop];\n    }\n  }\n\n  TextTrackCueList.prototype.setCues_.call(list, cues);\n\n  Object.defineProperty(list, 'length', {\n    get: function() {\n      return this.length_;\n    }\n  });\n\n  if (browser.IS_IE8) {\n    return list;\n  }\n};\n\nTextTrackCueList.prototype.setCues_ = function(cues) {\n  let oldLength = this.length || 0;\n  let i = 0;\n  let l = cues.length;\n\n  this.cues_ = cues;\n  this.length_ = cues.length;\n\n  let defineProp = function(i) {\n    if (!(''+i in this)) {\n      Object.defineProperty(this, '' + i, {\n        get: function() {\n          return this.cues_[i];\n        }\n      });\n    }\n  };\n\n  if (oldLength < l) {\n    i = oldLength;\n\n    for(; i < l; i++) {\n      defineProp.call(this, i);\n    }\n  }\n};\n\nTextTrackCueList.prototype.getCueById = function(id) {\n  let result = null;\n  for (let i = 0, l = this.length; i < l; i++) {\n    let cue = this[i];\n    if (cue.id === id) {\n      result = cue;\n      break;\n    }\n  }\n\n  return result;\n};\n\nexport default TextTrackCueList;\n","/**\n * @file text-track-display.js\n */\nimport Component from '../component';\nimport Menu from '../menu/menu.js';\nimport MenuItem from '../menu/menu-item.js';\nimport MenuButton from '../menu/menu-button.js';\nimport * as Fn from '../utils/fn.js';\nimport document from 'global/document';\nimport window from 'global/window';\n\nconst darkGray = '#222';\nconst lightGray = '#ccc';\nconst fontMap = {\n  monospace:             'monospace',\n  sansSerif:             'sans-serif',\n  serif:                 'serif',\n  monospaceSansSerif:    '\"Andale Mono\", \"Lucida Console\", monospace',\n  monospaceSerif:        '\"Courier New\", monospace',\n  proportionalSansSerif: 'sans-serif',\n  proportionalSerif:     'serif',\n  casual:                '\"Comic Sans MS\", Impact, fantasy',\n  script:                '\"Monotype Corsiva\", cursive',\n  smallcaps:             '\"Andale Mono\", \"Lucida Console\", monospace, sans-serif'\n};\n\n/**\n * The component for displaying text track cues\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @param {Function=} ready    Ready callback function\n * @extends Component\n * @class TextTrackDisplay\n */\nclass TextTrackDisplay extends Component {\n\n  constructor(player, options, ready){\n    super(player, options, ready);\n\n    player.on('loadstart', Fn.bind(this, this.toggleDisplay));\n    player.on('texttrackchange', Fn.bind(this, this.updateDisplay));\n\n    // This used to be called during player init, but was causing an error\n    // if a track should show by default and the display hadn't loaded yet.\n    // Should probably be moved to an external track loader when we support\n    // tracks that don't need a display.\n    player.ready(Fn.bind(this, function() {\n      if (player.tech_ && player.tech_['featuresNativeTextTracks']) {\n        this.hide();\n        return;\n      }\n\n      player.on('fullscreenchange', Fn.bind(this, this.updateDisplay));\n\n      let tracks = this.options_.playerOptions['tracks'] || [];\n      for (let i = 0; i < tracks.length; i++) {\n        let track = tracks[i];\n        this.player_.addRemoteTextTrack(track);\n      }\n    }));\n  }\n\n  /**\n   * Toggle display texttracks\n   *\n   * @method toggleDisplay\n   */\n  toggleDisplay() {\n    if (this.player_.tech_ && this.player_.tech_['featuresNativeTextTracks']) {\n      this.hide();\n    } else {\n      this.show();\n    }\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-text-track-display'\n    });\n  }\n\n  /**\n   * Clear display texttracks\n   *\n   * @method clearDisplay\n   */\n  clearDisplay() {\n    if (typeof window['WebVTT'] === 'function') {\n      window['WebVTT']['processCues'](window, [], this.el_);\n    }\n  }\n\n  /**\n   * Update display texttracks\n   *\n   * @method updateDisplay\n   */\n  updateDisplay() {\n    var tracks = this.player_.textTracks();\n\n    this.clearDisplay();\n\n    if (!tracks) {\n      return;\n    }\n\n    for (let i=0; i < tracks.length; i++) {\n      let track = tracks[i];\n      if (track['mode'] === 'showing') {\n        this.updateForTrack(track);\n      }\n    }\n  }\n\n  /**\n   * Add texttrack to texttrack list\n   *\n   * @param {TextTrackObject} track Texttrack object to be added to list\n   * @method updateForTrack\n   */\n  updateForTrack(track) {\n    if (typeof window['WebVTT'] !== 'function' || !track['activeCues']) {\n      return;\n    }\n\n    let overrides = this.player_['textTrackSettings'].getValues();\n\n    let cues = [];\n    for (let i = 0; i < track['activeCues'].length; i++) {\n      cues.push(track['activeCues'][i]);\n    }\n\n    window['WebVTT']['processCues'](window, track['activeCues'], this.el_);\n\n    let i = cues.length;\n    while (i--) {\n      let cueDiv = cues[i].displayState;\n      if (overrides.color) {\n        cueDiv.firstChild.style.color = overrides.color;\n      }\n      if (overrides.textOpacity) {\n        tryUpdateStyle(cueDiv.firstChild,\n                       'color',\n                       constructColor(overrides.color || '#fff',\n                                      overrides.textOpacity));\n      }\n      if (overrides.backgroundColor) {\n        cueDiv.firstChild.style.backgroundColor = overrides.backgroundColor;\n      }\n      if (overrides.backgroundOpacity) {\n        tryUpdateStyle(cueDiv.firstChild,\n                       'backgroundColor',\n                       constructColor(overrides.backgroundColor || '#000',\n                                      overrides.backgroundOpacity));\n      }\n      if (overrides.windowColor) {\n        if (overrides.windowOpacity) {\n          tryUpdateStyle(cueDiv,\n                         'backgroundColor',\n                         constructColor(overrides.windowColor, overrides.windowOpacity));\n        } else {\n          cueDiv.style.backgroundColor = overrides.windowColor;\n        }\n      }\n      if (overrides.edgeStyle) {\n        if (overrides.edgeStyle === 'dropshadow') {\n          cueDiv.firstChild.style.textShadow = `2px 2px 3px ${darkGray}, 2px 2px 4px ${darkGray}, 2px 2px 5px ${darkGray}`;\n        } else if (overrides.edgeStyle === 'raised') {\n          cueDiv.firstChild.style.textShadow = `1px 1px ${darkGray}, 2px 2px ${darkGray}, 3px 3px ${darkGray}`;\n        } else if (overrides.edgeStyle === 'depressed') {\n          cueDiv.firstChild.style.textShadow = `1px 1px ${lightGray}, 0 1px ${lightGray}, -1px -1px ${darkGray}, 0 -1px ${darkGray}`;\n        } else if (overrides.edgeStyle === 'uniform') {\n          cueDiv.firstChild.style.textShadow = `0 0 4px ${darkGray}, 0 0 4px ${darkGray}, 0 0 4px ${darkGray}, 0 0 4px ${darkGray}`;\n        }\n      }\n      if (overrides.fontPercent && overrides.fontPercent !== 1) {\n        const fontSize = window.parseFloat(cueDiv.style.fontSize);\n        cueDiv.style.fontSize = (fontSize * overrides.fontPercent) + 'px';\n        cueDiv.style.height = 'auto';\n        cueDiv.style.top = 'auto';\n        cueDiv.style.bottom = '2px';\n      }\n      if (overrides.fontFamily && overrides.fontFamily !== 'default') {\n        if (overrides.fontFamily === 'small-caps') {\n          cueDiv.firstChild.style.fontVariant = 'small-caps';\n        } else {\n          cueDiv.firstChild.style.fontFamily = fontMap[overrides.fontFamily];\n        }\n      }\n    }\n  }\n\n}\n\n/**\n* Add cue HTML to display\n*\n* @param {Number} color Hex number for color, like #f0e\n* @param {Number} opacity Value for opacity,0.0 - 1.0\n* @return {RGBAColor} In the form 'rgba(255, 0, 0, 0.3)'\n* @method constructColor\n*/\nfunction constructColor(color, opacity) {\n  return 'rgba(' +\n    // color looks like \"#f0e\"\n    parseInt(color[1] + color[1], 16) + ',' +\n    parseInt(color[2] + color[2], 16) + ',' +\n    parseInt(color[3] + color[3], 16) + ',' +\n    opacity + ')';\n}\n\n/**\n * Try to update style\n * Some style changes will throw an error, particularly in IE8. Those should be noops.\n *\n * @param {Element} el The element to be styles\n * @param {CSSProperty} style The CSS property to be styled\n * @param {CSSStyle} rule The actual style to be applied to the property\n * @method tryUpdateStyle\n */\nfunction tryUpdateStyle(el, style, rule) {\n  //\n  try {\n    el.style[style] = rule;\n  } catch (e) {}\n}\n\nComponent.registerComponent('TextTrackDisplay', TextTrackDisplay);\nexport default TextTrackDisplay;\n","/**\n * @file text-track-enums.js\n *\n * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackmode\n *\n * enum TextTrackMode { \"disabled\",  \"hidden\",  \"showing\" };\n */\nvar TextTrackMode = {\n  'disabled': 'disabled',\n  'hidden': 'hidden',\n  'showing': 'showing'\n};\n\n/*\n * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackkind\n *\n * enum TextTrackKind { \"subtitles\",  \"captions\",  \"descriptions\",  \"chapters\",  \"metadata\" };\n */\nvar TextTrackKind = {\n  'subtitles': 'subtitles',\n  'captions': 'captions',\n  'descriptions': 'descriptions',\n  'chapters': 'chapters',\n  'metadata': 'metadata'\n};\n\nexport { TextTrackMode, TextTrackKind };\n","/**\n * Utilities for capturing text track state and re-creating tracks\n * based on a capture.\n *\n * @file text-track-list-converter.js\n */\n\n/**\n * Examine a single text track and return a JSON-compatible javascript\n * object that represents the text track's state.\n * @param track {TextTrackObject} the text track to query\n * @return {Object} a serializable javascript representation of the\n * @private\n */\nlet trackToJson_ = function(track) {\n  return {\n    kind: track.kind,\n    label: track.label,\n    language: track.language,\n    id: track.id,\n    inBandMetadataTrackDispatchType: track.inBandMetadataTrackDispatchType,\n    mode: track.mode,\n    cues: track.cues && Array.prototype.map.call(track.cues, function(cue) {\n      return {\n        startTime: cue.startTime,\n        endTime: cue.endTime,\n        text: cue.text,\n        id: cue.id\n      };\n    }),\n    src: track.src\n  };\n};\n\n/**\n * Examine a tech and return a JSON-compatible javascript array that\n * represents the state of all text tracks currently configured. The\n * return array is compatible with `jsonToTextTracks`.\n * @param tech {tech} the tech object to query\n * @return {Array} a serializable javascript representation of the\n * @function textTracksToJson\n */\nlet textTracksToJson = function(tech) {\n  let trackEls = tech.el().querySelectorAll('track');\n\n  let trackObjs = Array.prototype.map.call(trackEls, (t) => t.track);\n  let tracks = Array.prototype.map.call(trackEls, function(trackEl) {\n    let json = trackToJson_(trackEl.track);\n    json.src = trackEl.src;\n    return json;\n  });\n\n  return tracks.concat(Array.prototype.filter.call(tech.textTracks(), function(track) {\n    return trackObjs.indexOf(track) === -1;\n  }).map(trackToJson_));\n};\n\n/**\n * Creates a set of remote text tracks on a tech based on an array of\n * javascript text track representations.\n * @param json {Array} an array of text track representation objects,\n * like those that would be produced by `textTracksToJson`\n * @param tech {tech} the tech to create text tracks on\n * @function jsonToTextTracks\n */\nlet jsonToTextTracks = function(json, tech) {\n  json.forEach(function(track) {\n    let addedTrack = tech.addRemoteTextTrack(track).track;\n    if (!track.src && track.cues) {\n      track.cues.forEach((cue) => addedTrack.addCue(cue));\n    }\n  });\n\n  return tech.textTracks();\n};\n\nexport default {textTracksToJson, jsonToTextTracks, trackToJson_};\n","/**\n * @file text-track-list.js\n */\nimport EventTarget from '../event-target';\nimport * as Fn from '../utils/fn.js';\nimport * as browser from '../utils/browser.js';\nimport document from 'global/document';\n\n/*\n * https://html.spec.whatwg.org/multipage/embedded-content.html#texttracklist\n *\n * interface TextTrackList : EventTarget {\n *   readonly attribute unsigned long length;\n *   getter TextTrack (unsigned long index);\n *   TextTrack? getTrackById(DOMString id);\n *\n *   attribute EventHandler onchange;\n *   attribute EventHandler onaddtrack;\n *   attribute EventHandler onremovetrack;\n * };\n */\nlet TextTrackList = function(tracks) {\n  let list = this;\n\n  if (browser.IS_IE8) {\n    list = document.createElement('custom');\n\n    for (let prop in TextTrackList.prototype) {\n      list[prop] = TextTrackList.prototype[prop];\n    }\n  }\n\n  tracks = tracks || [];\n  list.tracks_ = [];\n\n  Object.defineProperty(list, 'length', {\n    get: function() {\n      return this.tracks_.length;\n    }\n  });\n\n  for (let i = 0; i < tracks.length; i++) {\n    list.addTrack_(tracks[i]);\n  }\n\n  if (browser.IS_IE8) {\n    return list;\n  }\n};\n\nTextTrackList.prototype = Object.create(EventTarget.prototype);\nTextTrackList.prototype.constructor = TextTrackList;\n\n/*\n * change - One or more tracks in the track list have been enabled or disabled.\n * addtrack - A track has been added to the track list.\n * removetrack - A track has been removed from the track list.\n */\nTextTrackList.prototype.allowedEvents_ = {\n  'change': 'change',\n  'addtrack': 'addtrack',\n  'removetrack': 'removetrack'\n};\n\n// emulate attribute EventHandler support to allow for feature detection\nfor (let event in TextTrackList.prototype.allowedEvents_) {\n  TextTrackList.prototype['on' + event] = null;\n}\n\nTextTrackList.prototype.addTrack_ = function(track) {\n  let index = this.tracks_.length;\n  if (!(''+index in this)) {\n    Object.defineProperty(this, index, {\n      get: function() {\n        return this.tracks_[index];\n      }\n    });\n  }\n\n  track.addEventListener('modechange', Fn.bind(this, function() {\n    this.trigger('change');\n  }));\n  this.tracks_.push(track);\n\n  this.trigger({\n    type: 'addtrack',\n    track: track\n  });\n};\n\nTextTrackList.prototype.removeTrack_ = function(rtrack) {\n  let result = null;\n  let track;\n\n  for (let i = 0, l = this.length; i < l; i++) {\n    track = this[i];\n    if (track === rtrack) {\n      this.tracks_.splice(i, 1);\n      break;\n    }\n  }\n\n  this.trigger({\n    type: 'removetrack',\n    track: track\n  });\n};\n\nTextTrackList.prototype.getTrackById = function(id) {\n  let result = null;\n\n  for (let i = 0, l = this.length; i < l; i++) {\n    let track = this[i];\n    if (track.id === id) {\n      result = track;\n      break;\n    }\n  }\n\n  return result;\n};\n\nexport default TextTrackList;\n","/**\n * @file text-track-settings.js\n */\nimport Component from '../component';\nimport * as Events from '../utils/events.js';\nimport * as Fn from '../utils/fn.js';\nimport log from '../utils/log.js';\nimport safeParseTuple from 'safe-json-parse/tuple';\nimport window from 'global/window';\n\n/**\n * Manipulate settings of texttracks\n *\n * @param {Object} player  Main Player\n * @param {Object=} options Object of option names and values\n * @extends Component\n * @class TextTrackSettings\n */\nclass TextTrackSettings extends Component {\n\n  constructor(player, options) {\n    super(player, options);\n    this.hide();\n\n    // Grab `persistTextTrackSettings` from the player options if not passed in child options\n    if (options.persistTextTrackSettings === undefined) {\n      this.options_.persistTextTrackSettings = this.options_.playerOptions.persistTextTrackSettings;\n    }\n\n    Events.on(this.el().querySelector('.vjs-done-button'), 'click', Fn.bind(this, function() {\n      this.saveSettings();\n      this.hide();\n    }));\n\n    Events.on(this.el().querySelector('.vjs-default-button'), 'click', Fn.bind(this, function() {\n      this.el().querySelector('.vjs-fg-color > select').selectedIndex = 0;\n      this.el().querySelector('.vjs-bg-color > select').selectedIndex = 0;\n      this.el().querySelector('.window-color > select').selectedIndex = 0;\n      this.el().querySelector('.vjs-text-opacity > select').selectedIndex = 0;\n      this.el().querySelector('.vjs-bg-opacity > select').selectedIndex = 0;\n      this.el().querySelector('.vjs-window-opacity > select').selectedIndex = 0;\n      this.el().querySelector('.vjs-edge-style select').selectedIndex = 0;\n      this.el().querySelector('.vjs-font-family select').selectedIndex = 0;\n      this.el().querySelector('.vjs-font-percent select').selectedIndex = 2;\n      this.updateDisplay();\n    }));\n\n    Events.on(this.el().querySelector('.vjs-fg-color > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-bg-color > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.window-color > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-text-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-bg-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-window-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-font-percent select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-edge-style select'), 'change', Fn.bind(this, this.updateDisplay));\n    Events.on(this.el().querySelector('.vjs-font-family select'), 'change', Fn.bind(this, this.updateDisplay));\n\n    if (this.options_.persistTextTrackSettings) {\n      this.restoreSettings();\n    }\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   * @method createEl\n   */\n  createEl() {\n    return super.createEl('div', {\n      className: 'vjs-caption-settings vjs-modal-overlay',\n      innerHTML: captionOptionsMenuTemplate()\n    });\n  }\n\n  /**\n   * Get texttrack settings \n   * Settings are\n   * .vjs-edge-style\n   * .vjs-font-family\n   * .vjs-fg-color\n   * .vjs-text-opacity\n   * .vjs-bg-color\n   * .vjs-bg-opacity\n   * .window-color\n   * .vjs-window-opacity \n   *\n   * @return {Object} \n   * @method getValues\n   */\n  getValues() {\n    const el = this.el();\n\n    const textEdge = getSelectedOptionValue(el.querySelector('.vjs-edge-style select'));\n    const fontFamily = getSelectedOptionValue(el.querySelector('.vjs-font-family select'));\n    const fgColor = getSelectedOptionValue(el.querySelector('.vjs-fg-color > select'));\n    const textOpacity = getSelectedOptionValue(el.querySelector('.vjs-text-opacity > select'));\n    const bgColor = getSelectedOptionValue(el.querySelector('.vjs-bg-color > select'));\n    const bgOpacity = getSelectedOptionValue(el.querySelector('.vjs-bg-opacity > select'));\n    const windowColor = getSelectedOptionValue(el.querySelector('.window-color > select'));\n    const windowOpacity = getSelectedOptionValue(el.querySelector('.vjs-window-opacity > select'));\n    const fontPercent = window['parseFloat'](getSelectedOptionValue(el.querySelector('.vjs-font-percent > select')));\n\n    let result = {\n      'backgroundOpacity': bgOpacity,\n      'textOpacity': textOpacity,\n      'windowOpacity': windowOpacity,\n      'edgeStyle': textEdge,\n      'fontFamily': fontFamily,\n      'color': fgColor,\n      'backgroundColor': bgColor,\n      'windowColor': windowColor,\n      'fontPercent': fontPercent\n    };\n    for (let name in result) {\n      if (result[name] === '' || result[name] === 'none' || (name === 'fontPercent' && result[name] === 1.00)) {\n        delete result[name];\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Set texttrack settings \n   * Settings are\n   * .vjs-edge-style\n   * .vjs-font-family\n   * .vjs-fg-color\n   * .vjs-text-opacity\n   * .vjs-bg-color\n   * .vjs-bg-opacity\n   * .window-color\n   * .vjs-window-opacity \n   *\n   * @param {Object} values Object with texttrack setting values\n   * @method setValues\n   */\n  setValues(values) {\n    const el = this.el();\n\n    setSelectedOption(el.querySelector('.vjs-edge-style select'), values.edgeStyle);\n    setSelectedOption(el.querySelector('.vjs-font-family select'), values.fontFamily);\n    setSelectedOption(el.querySelector('.vjs-fg-color > select'), values.color);\n    setSelectedOption(el.querySelector('.vjs-text-opacity > select'), values.textOpacity);\n    setSelectedOption(el.querySelector('.vjs-bg-color > select'), values.backgroundColor);\n    setSelectedOption(el.querySelector('.vjs-bg-opacity > select'), values.backgroundOpacity);\n    setSelectedOption(el.querySelector('.window-color > select'), values.windowColor);\n    setSelectedOption(el.querySelector('.vjs-window-opacity > select'), values.windowOpacity);\n\n    let fontPercent = values.fontPercent;\n\n    if (fontPercent) {\n      fontPercent = fontPercent.toFixed(2);\n    }\n\n    setSelectedOption(el.querySelector('.vjs-font-percent > select'), fontPercent);\n  }\n\n  /**\n   * Restore texttrack settings \n   *\n   * @method restoreSettings\n   */\n  restoreSettings() {\n    let [err, values] = safeParseTuple(window.localStorage.getItem('vjs-text-track-settings'));\n\n    if (err) {\n      log.error(err);\n    }\n\n    if (values) {\n      this.setValues(values);\n    }\n  }\n\n  /**\n   * Save texttrack settings to local storage \n   *\n   * @method saveSettings\n   */\n  saveSettings() {\n    if (!this.options_.persistTextTrackSettings) {\n      return;\n    }\n\n    let values = this.getValues();\n    try {\n      if (Object.getOwnPropertyNames(values).length > 0) {\n        window.localStorage.setItem('vjs-text-track-settings', JSON.stringify(values));\n      } else {\n        window.localStorage.removeItem('vjs-text-track-settings');\n      }\n    } catch (e) {}\n  }\n\n  /**\n   * Update display of texttrack settings  \n   *\n   * @method updateDisplay\n   */\n  updateDisplay() {\n    let ttDisplay = this.player_.getChild('textTrackDisplay');\n    if (ttDisplay) {\n      ttDisplay.updateDisplay();\n    }\n  }\n\n}\n\nComponent.registerComponent('TextTrackSettings', TextTrackSettings);\n\nfunction getSelectedOptionValue(target) {\n  let selectedOption;\n  // not all browsers support selectedOptions, so, fallback to options\n  if (target.selectedOptions) {\n    selectedOption = target.selectedOptions[0];\n  } else if (target.options) {\n    selectedOption = target.options[target.options.selectedIndex];\n  }\n\n  return selectedOption.value;\n}\n\nfunction setSelectedOption(target, value) {\n  if (!value) {\n    return;\n  }\n\n  let i;\n  for (i = 0; i < target.options.length; i++) {\n    const option = target.options[i];\n    if (option.value === value) {\n      break;\n    }\n  }\n\n  target.selectedIndex = i;\n}\n\nfunction captionOptionsMenuTemplate() {\n  let template = `<div class=\"vjs-tracksettings\">\n      <div class=\"vjs-tracksettings-colors\">\n        <div class=\"vjs-fg-color vjs-tracksetting\">\n            <label class=\"vjs-label\">Foreground</label>\n            <select>\n              <option value=\"\">---</option>\n              <option value=\"#FFF\">White</option>\n              <option value=\"#000\">Black</option>\n              <option value=\"#F00\">Red</option>\n              <option value=\"#0F0\">Green</option>\n              <option value=\"#00F\">Blue</option>\n              <option value=\"#FF0\">Yellow</option>\n              <option value=\"#F0F\">Magenta</option>\n              <option value=\"#0FF\">Cyan</option>\n            </select>\n            <span class=\"vjs-text-opacity vjs-opacity\">\n              <select>\n                <option value=\"\">---</option>\n                <option value=\"1\">Opaque</option>\n                <option value=\"0.5\">Semi-Opaque</option>\n              </select>\n            </span>\n        </div> <!-- vjs-fg-color -->\n        <div class=\"vjs-bg-color vjs-tracksetting\">\n            <label class=\"vjs-label\">Background</label>\n            <select>\n              <option value=\"\">---</option>\n              <option value=\"#FFF\">White</option>\n              <option value=\"#000\">Black</option>\n              <option value=\"#F00\">Red</option>\n              <option value=\"#0F0\">Green</option>\n              <option value=\"#00F\">Blue</option>\n              <option value=\"#FF0\">Yellow</option>\n              <option value=\"#F0F\">Magenta</option>\n              <option value=\"#0FF\">Cyan</option>\n            </select>\n            <span class=\"vjs-bg-opacity vjs-opacity\">\n                <select>\n                  <option value=\"\">---</option>\n                  <option value=\"1\">Opaque</option>\n                  <option value=\"0.5\">Semi-Transparent</option>\n                  <option value=\"0\">Transparent</option>\n                </select>\n            </span>\n        </div> <!-- vjs-bg-color -->\n        <div class=\"window-color vjs-tracksetting\">\n            <label class=\"vjs-label\">Window</label>\n            <select>\n              <option value=\"\">---</option>\n              <option value=\"#FFF\">White</option>\n              <option value=\"#000\">Black</option>\n              <option value=\"#F00\">Red</option>\n              <option value=\"#0F0\">Green</option>\n              <option value=\"#00F\">Blue</option>\n              <option value=\"#FF0\">Yellow</option>\n              <option value=\"#F0F\">Magenta</option>\n              <option value=\"#0FF\">Cyan</option>\n            </select>\n            <span class=\"vjs-window-opacity vjs-opacity\">\n                <select>\n                  <option value=\"\">---</option>\n                  <option value=\"1\">Opaque</option>\n                  <option value=\"0.5\">Semi-Transparent</option>\n                  <option value=\"0\">Transparent</option>\n                </select>\n            </span>\n        </div> <!-- vjs-window-color -->\n      </div> <!-- vjs-tracksettings -->\n      <div class=\"vjs-tracksettings-font\">\n        <div class=\"vjs-font-percent vjs-tracksetting\">\n          <label class=\"vjs-label\">Font Size</label>\n          <select>\n            <option value=\"0.50\">50%</option>\n            <option value=\"0.75\">75%</option>\n            <option value=\"1.00\" selected>100%</option>\n            <option value=\"1.25\">125%</option>\n            <option value=\"1.50\">150%</option>\n            <option value=\"1.75\">175%</option>\n            <option value=\"2.00\">200%</option>\n            <option value=\"3.00\">300%</option>\n            <option value=\"4.00\">400%</option>\n          </select>\n        </div> <!-- vjs-font-percent -->\n        <div class=\"vjs-edge-style vjs-tracksetting\">\n          <label class=\"vjs-label\">Text Edge Style</label>\n          <select>\n            <option value=\"none\">None</option>\n            <option value=\"raised\">Raised</option>\n            <option value=\"depressed\">Depressed</option>\n            <option value=\"uniform\">Uniform</option>\n            <option value=\"dropshadow\">Dropshadow</option>\n          </select>\n        </div> <!-- vjs-edge-style -->\n        <div class=\"vjs-font-family vjs-tracksetting\">\n          <label class=\"vjs-label\">Font Family</label>\n          <select>\n            <option value=\"\">Default</option>\n            <option value=\"monospaceSerif\">Monospace Serif</option>\n            <option value=\"proportionalSerif\">Proportional Serif</option>\n            <option value=\"monospaceSansSerif\">Monospace Sans-Serif</option>\n            <option value=\"proportionalSansSerif\">Proportional Sans-Serif</option>\n            <option value=\"casual\">Casual</option>\n            <option value=\"script\">Script</option>\n            <option value=\"small-caps\">Small Caps</option>\n          </select>\n        </div> <!-- vjs-font-family -->\n      </div>\n    </div>\n    <div class=\"vjs-tracksettings-controls\">\n      <button class=\"vjs-default-button\">Defaults</button>\n      <button class=\"vjs-done-button\">Done</button>\n    </div>`;\n\n    return template;\n}\n\nexport default TextTrackSettings;\n","/**\n * @file text-track.js\n */\nimport TextTrackCueList from './text-track-cue-list';\nimport * as Fn from '../utils/fn.js';\nimport * as Guid from '../utils/guid.js';\nimport * as browser from '../utils/browser.js';\nimport * as TextTrackEnum from './text-track-enums';\nimport log from '../utils/log.js';\nimport EventTarget from '../event-target';\nimport document from 'global/document';\nimport window from 'global/window';\nimport { isCrossOrigin } from '../utils/url.js';\nimport XHR from 'xhr';\n\n/*\n * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrack\n *\n * interface TextTrack : EventTarget {\n *   readonly attribute TextTrackKind kind;\n *   readonly attribute DOMString label;\n *   readonly attribute DOMString language;\n *\n *   readonly attribute DOMString id;\n *   readonly attribute DOMString inBandMetadataTrackDispatchType;\n *\n *   attribute TextTrackMode mode;\n *\n *   readonly attribute TextTrackCueList? cues;\n *   readonly attribute TextTrackCueList? activeCues;\n *\n *   void addCue(TextTrackCue cue);\n *   void removeCue(TextTrackCue cue);\n *\n *   attribute EventHandler oncuechange;\n * };\n */\nlet TextTrack = function(options={}) {\n  if (!options.tech) {\n    throw new Error('A tech was not provided.');\n  }\n\n  let tt = this;\n  if (browser.IS_IE8) {\n    tt = document.createElement('custom');\n\n    for (let prop in TextTrack.prototype) {\n      tt[prop] = TextTrack.prototype[prop];\n    }\n  }\n\n  tt.tech_ = options.tech;\n\n  let mode = TextTrackEnum.TextTrackMode[options['mode']] || 'disabled';\n  let kind = TextTrackEnum.TextTrackKind[options['kind']] || 'subtitles';\n  let label = options['label'] || '';\n  let language = options['language'] || options['srclang'] || '';\n  let id = options['id'] || 'vjs_text_track_' + Guid.newGUID();\n\n  if (kind === 'metadata' || kind === 'chapters') {\n    mode = 'hidden';\n  }\n\n  tt.cues_ = [];\n  tt.activeCues_ = [];\n\n  let cues = new TextTrackCueList(tt.cues_);\n  let activeCues = new TextTrackCueList(tt.activeCues_);\n\n  let changed = false;\n  let timeupdateHandler = Fn.bind(tt, function() {\n    this['activeCues'];\n    if (changed) {\n      this['trigger']('cuechange');\n      changed = false;\n    }\n  });\n  if (mode !== 'disabled') {\n    tt.tech_.on('timeupdate', timeupdateHandler);\n  }\n\n  Object.defineProperty(tt, 'kind', {\n    get: function() {\n      return kind;\n    },\n    set: Function.prototype\n  });\n\n  Object.defineProperty(tt, 'label', {\n    get: function() {\n      return label;\n    },\n    set: Function.prototype\n  });\n\n  Object.defineProperty(tt, 'language', {\n    get: function() {\n      return language;\n    },\n    set: Function.prototype\n  });\n\n  Object.defineProperty(tt, 'id', {\n    get: function() {\n      return id;\n    },\n    set: Function.prototype\n  });\n\n  Object.defineProperty(tt, 'mode', {\n    get: function() {\n      return mode;\n    },\n    set: function(newMode) {\n      if (!TextTrackEnum.TextTrackMode[newMode]) {\n        return;\n      }\n      mode = newMode;\n      if (mode === 'showing') {\n        this.tech_.on('timeupdate', timeupdateHandler);\n      }\n      this.trigger('modechange');\n    }\n  });\n\n  Object.defineProperty(tt, 'cues', {\n    get: function() {\n      if (!this.loaded_) {\n        return null;\n      }\n\n      return cues;\n    },\n    set: Function.prototype\n  });\n\n  Object.defineProperty(tt, 'activeCues', {\n    get: function() {\n      if (!this.loaded_) {\n        return null;\n      }\n\n      if (this['cues'].length === 0) {\n        return activeCues; // nothing to do\n      }\n\n      let ct = this.tech_.currentTime();\n      let active = [];\n\n      for (let i = 0, l = this['cues'].length; i < l; i++) {\n        let cue = this['cues'][i];\n        if (cue['startTime'] <= ct && cue['endTime'] >= ct) {\n          active.push(cue);\n        } else if (cue['startTime'] === cue['endTime'] && cue['startTime'] <= ct && cue['startTime'] + 0.5 >= ct) {\n          active.push(cue);\n        }\n      }\n\n      changed = false;\n\n      if (active.length !== this.activeCues_.length) {\n        changed = true;\n      } else {\n        for (let i = 0; i < active.length; i++) {\n          if (indexOf.call(this.activeCues_, active[i]) === -1) {\n            changed = true;\n          }\n        }\n      }\n\n      this.activeCues_ = active;\n      activeCues.setCues_(this.activeCues_);\n\n      return activeCues;\n    },\n    set: Function.prototype\n  });\n\n  if (options.src) {\n    tt.src = options.src;\n    loadTrack(options.src, tt);\n  } else {\n    tt.loaded_ = true;\n  }\n\n  if (browser.IS_IE8) {\n    return tt;\n  }\n};\n\nTextTrack.prototype = Object.create(EventTarget.prototype);\nTextTrack.prototype.constructor = TextTrack;\n\n/*\n * cuechange - One or more cues in the track have become active or stopped being active.\n */\nTextTrack.prototype.allowedEvents_ = {\n  'cuechange': 'cuechange'\n};\n\nTextTrack.prototype.addCue = function(cue) {\n  let tracks = this.tech_.textTracks();\n\n  if (tracks) {\n    for (let i = 0; i < tracks.length; i++) {\n      if (tracks[i] !== this) {\n        tracks[i].removeCue(cue);\n      }\n    }\n  }\n\n  this.cues_.push(cue);\n  this['cues'].setCues_(this.cues_);\n};\n\nTextTrack.prototype.removeCue = function(removeCue) {\n  let removed = false;\n\n  for (let i = 0, l = this.cues_.length; i < l; i++) {\n    let cue = this.cues_[i];\n    if (cue === removeCue) {\n      this.cues_.splice(i, 1);\n      removed = true;\n    }\n  }\n\n  if (removed) {\n    this.cues.setCues_(this.cues_);\n  }\n};\n\n/*\n* Downloading stuff happens below this point\n*/\nvar parseCues = function(srcContent, track) {\n  if (typeof window['WebVTT'] !== 'function') {\n    //try again a bit later\n    return window.setTimeout(function() {\n      parseCues(srcContent, track);\n    }, 25);\n  }\n\n  let parser = new window['WebVTT']['Parser'](window, window['vttjs'], window['WebVTT']['StringDecoder']());\n\n  parser['oncue'] = function(cue) {\n    track.addCue(cue);\n  };\n  parser['onparsingerror'] = function(error) {\n    log.error(error);\n  };\n\n  parser['parse'](srcContent);\n  parser['flush']();\n};\n\nvar loadTrack = function(src, track) {\n  let opts = {\n    uri: src\n  };\n\n  let crossOrigin = isCrossOrigin(src);\n  if (crossOrigin) {\n    opts.cors = crossOrigin;\n  }\n\n  XHR(opts, Fn.bind(this, function(err, response, responseBody){\n    if (err) {\n      return log.error(err, response);\n    }\n\n    track.loaded_ = true;\n    parseCues(responseBody, track);\n  }));\n};\n\nvar indexOf = function(searchElement, fromIndex) {\n  if (this == null) {\n    throw new TypeError('\"this\" is null or not defined');\n  }\n\n  let O = Object(this);\n\n  let len = O.length >>> 0;\n\n  if (len === 0) {\n    return -1;\n  }\n\n  let n = +fromIndex || 0;\n\n  if (Math.abs(n) === Infinity) {\n    n = 0;\n  }\n\n  if (n >= len) {\n    return -1;\n  }\n\n  let k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n\n  while (k < len) {\n    if (k in O && O[k] === searchElement) {\n      return k;\n    }\n    k++;\n  }\n  return -1;\n};\n\nexport default TextTrack;\n","/**\n * @file browser.js\n */\nimport document from 'global/document';\nimport window from 'global/window';\n\nconst USER_AGENT = window.navigator.userAgent;\nconst webkitVersionMap = (/AppleWebKit\\/([\\d.]+)/i).exec(USER_AGENT);\nconst appleWebkitVersion = webkitVersionMap ? parseFloat(webkitVersionMap.pop()) : null;\n\n/*\n * Device is an iPhone\n *\n * @type {Boolean}\n * @constant\n * @private\n */\nexport const IS_IPHONE = (/iPhone/i).test(USER_AGENT);\nexport const IS_IPAD = (/iPad/i).test(USER_AGENT);\nexport const IS_IPOD = (/iPod/i).test(USER_AGENT);\nexport const IS_IOS = IS_IPHONE || IS_IPAD || IS_IPOD;\n\nexport const IOS_VERSION = (function(){\n  var match = USER_AGENT.match(/OS (\\d+)_/i);\n  if (match && match[1]) { return match[1]; }\n})();\n\nexport const IS_ANDROID = (/Android/i).test(USER_AGENT);\nexport const ANDROID_VERSION = (function() {\n  // This matches Android Major.Minor.Patch versions\n  // ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned\n  var match = USER_AGENT.match(/Android (\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))*/i),\n    major,\n    minor;\n\n  if (!match) {\n    return null;\n  }\n\n  major = match[1] && parseFloat(match[1]);\n  minor = match[2] && parseFloat(match[2]);\n\n  if (major && minor) {\n    return parseFloat(match[1] + '.' + match[2]);\n  } else if (major) {\n    return major;\n  } else {\n    return null;\n  }\n})();\n// Old Android is defined as Version older than 2.3, and requiring a webkit version of the android browser\nexport const IS_OLD_ANDROID = IS_ANDROID && (/webkit/i).test(USER_AGENT) && ANDROID_VERSION < 2.3;\nexport const IS_NATIVE_ANDROID = IS_ANDROID && ANDROID_VERSION < 5 && appleWebkitVersion < 537;\n\nexport const IS_FIREFOX = (/Firefox/i).test(USER_AGENT);\nexport const IS_CHROME = (/Chrome/i).test(USER_AGENT);\nexport const IS_IE8 = (/MSIE\\s8\\.0/).test(USER_AGENT);\n\nexport const TOUCH_ENABLED = !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch);\nexport const BACKGROUND_SIZE_SUPPORTED = 'backgroundSize' in document.createElement('video').style;\n","/**\n * @file buffer.js\n */\nimport { createTimeRange } from './time-ranges.js';\n\n/**\n * Compute how much your video has been buffered\n *\n * @param  {Object} Buffered object\n * @param  {Number} Total duration\n * @return {Number} Percent buffered of the total duration\n * @private\n * @function bufferedPercent\n */\nexport function bufferedPercent(buffered, duration) {\n  var bufferedDuration = 0,\n      start, end;\n\n  if (!duration) {\n    return 0;\n  }\n\n  if (!buffered || !buffered.length) {\n    buffered = createTimeRange(0, 0);\n  }\n\n  for (let i = 0; i < buffered.length; i++){\n    start = buffered.start(i);\n    end   = buffered.end(i);\n\n    // buffered end can be bigger than duration by a very small fraction\n    if (end > duration) {\n      end = duration;\n    }\n\n    bufferedDuration += end - start;\n  }\n\n  return bufferedDuration / duration;\n}\n","import log from './log.js';\n\n/**\n * Object containing the default behaviors for available handler methods.\n *\n * @private\n * @type {Object}\n */\nconst defaultBehaviors = {\n  get(obj, key) {\n    return obj[key];\n  },\n  set(obj, key, value) {\n    obj[key] = value;\n    return true;\n  }\n};\n\n/**\n * Expose private objects publicly using a Proxy to log deprecation warnings.\n *\n * Browsers that do not support Proxy objects will simply return the `target`\n * object, so it can be directly exposed.\n *\n * @param {Object} target The target object.\n * @param {Object} messages Messages to display from a Proxy. Only operations\n *                          with an associated message will be proxied.\n * @param {String} [messages.get]\n * @param {String} [messages.set]\n * @return {Object} A Proxy if supported or the `target` argument.\n */\nexport default (target, messages={}) => {\n  if (typeof Proxy === 'function') {\n    let handler = {};\n\n    // Build a handler object based on those keys that have both messages\n    // and default behaviors.\n    Object.keys(messages).forEach(key => {\n      if (defaultBehaviors.hasOwnProperty(key)) {\n        handler[key] = function() {\n          log.warn(messages[key]);\n          return defaultBehaviors[key].apply(this, arguments);\n        };\n      }\n    });\n\n    return new Proxy(target, handler);\n  }\n  return target;\n};\n","/**\n * @file dom.js\n */\nimport document from 'global/document';\nimport window from 'global/window';\nimport  * as Guid from './guid.js';\nimport log from './log.js';\nimport tsml from 'tsml';\n\n/**\n * Shorthand for document.getElementById()\n * Also allows for CSS (jQuery) ID syntax. But nothing other than IDs.\n *\n * @param  {String} id  Element ID\n * @return {Element}    Element with supplied ID\n * @function getEl\n */\nexport function getEl(id){\n  if (id.indexOf('#') === 0) {\n    id = id.slice(1);\n  }\n\n  return document.getElementById(id);\n}\n\n/**\n * Creates an element and applies properties.\n *\n * @param  {String=} tagName    Name of tag to be created.\n * @param  {Object=} properties Element properties to be applied.\n * @return {Element}\n * @function createEl\n */\nexport function createEl(tagName='div', properties={}, attributes={}){\n  let el = document.createElement(tagName);\n\n  Object.getOwnPropertyNames(properties).forEach(function(propName){\n    let val = properties[propName];\n\n    // See #2176\n    // We originally were accepting both properties and attributes in the\n    // same object, but that doesn't work so well.\n    if (propName.indexOf('aria-') !== -1 || propName === 'role' || propName === 'type') {\n      log.warn(tsml`Setting attributes in the second argument of createEl()\n                has been deprecated. Use the third argument instead.\n                createEl(type, properties, attributes). Attempting to set ${propName} to ${val}.`);\n      el.setAttribute(propName, val);\n    } else {\n      el[propName] = val;\n    }\n  });\n\n  Object.getOwnPropertyNames(attributes).forEach(function(attrName){\n    let val = attributes[attrName];\n    el.setAttribute(attrName, attributes[attrName]);\n  });\n\n  return el;\n}\n\n/**\n * Insert an element as the first child node of another\n *\n * @param  {Element} child   Element to insert\n * @param  {Element} parent Element to insert child into\n * @private\n * @function insertElFirst\n */\nexport function insertElFirst(child, parent){\n  if (parent.firstChild) {\n    parent.insertBefore(child, parent.firstChild);\n  } else {\n    parent.appendChild(child);\n  }\n}\n\n/**\n * Element Data Store. Allows for binding data to an element without putting it directly on the element.\n * Ex. Event listeners are stored here.\n * (also from jsninja.com, slightly modified and updated for closure compiler)\n *\n * @type {Object}\n * @private\n */\nconst elData = {};\n\n/*\n * Unique attribute name to store an element's guid in\n *\n * @type {String}\n * @constant\n * @private\n */\nconst elIdAttr = 'vdata' + (new Date()).getTime();\n\n/**\n * Returns the cache object where data for an element is stored\n *\n * @param  {Element} el Element to store data for.\n * @return {Object}\n * @function getElData\n */\nexport function getElData(el) {\n  let id = el[elIdAttr];\n\n  if (!id) {\n    id = el[elIdAttr] = Guid.newGUID();\n  }\n\n  if (!elData[id]) {\n    elData[id] = {};\n  }\n\n  return elData[id];\n}\n\n/**\n * Returns whether or not an element has cached data\n *\n * @param  {Element} el A dom element\n * @return {Boolean}\n * @private\n * @function hasElData\n */\nexport function hasElData(el) {\n  const id = el[elIdAttr];\n\n  if (!id) {\n    return false;\n  }\n\n  return !!Object.getOwnPropertyNames(elData[id]).length;\n}\n\n/**\n * Delete data for the element from the cache and the guid attr from getElementById\n *\n * @param  {Element} el Remove data for an element\n * @private\n * @function removeElData\n */\nexport function removeElData(el) {\n  let id = el[elIdAttr];\n\n  if (!id) {\n    return;\n  }\n\n  // Remove all stored data\n  delete elData[id];\n\n  // Remove the elIdAttr property from the DOM node\n  try {\n    delete el[elIdAttr];\n  } catch(e) {\n    if (el.removeAttribute) {\n      el.removeAttribute(elIdAttr);\n    } else {\n      // IE doesn't appear to support removeAttribute on the document element\n      el[elIdAttr] = null;\n    }\n  }\n}\n\n/**\n * Check if an element has a CSS class\n *\n * @param {Element} element Element to check\n * @param {String} classToCheck Classname to check\n * @function hasElClass\n */\nexport function hasElClass(element, classToCheck) {\n  return ((' ' + element.className + ' ').indexOf(' ' + classToCheck + ' ') !== -1);\n}\n\n/**\n * Add a CSS class name to an element\n *\n * @param {Element} element    Element to add class name to\n * @param {String} classToAdd Classname to add\n * @function addElClass\n */\nexport function addElClass(element, classToAdd) {\n  if (!hasElClass(element, classToAdd)) {\n    element.className = element.className === '' ? classToAdd : element.className + ' ' + classToAdd;\n  }\n}\n\n/**\n * Remove a CSS class name from an element\n *\n * @param {Element} element    Element to remove from class name\n * @param {String} classToRemove Classname to remove\n * @function removeElClass\n */\nexport function removeElClass(element, classToRemove) {\n  if (!hasElClass(element, classToRemove)) {return;}\n\n  let classNames = element.className.split(' ');\n\n  // no arr.indexOf in ie8, and we don't want to add a big shim\n  for (let i = classNames.length - 1; i >= 0; i--) {\n    if (classNames[i] === classToRemove) {\n      classNames.splice(i,1);\n    }\n  }\n\n  element.className = classNames.join(' ');\n}\n\n/**\n * Apply attributes to an HTML element.\n *\n * @param  {Element} el         Target element.\n * @param  {Object=} attributes Element attributes to be applied.\n * @private\n * @function setElAttributes\n */\nexport function setElAttributes(el, attributes) {\n  Object.getOwnPropertyNames(attributes).forEach(function(attrName){\n    let attrValue = attributes[attrName];\n\n    if (attrValue === null || typeof attrValue === 'undefined' || attrValue === false) {\n      el.removeAttribute(attrName);\n    } else {\n      el.setAttribute(attrName, (attrValue === true ? '' : attrValue));\n    }\n  });\n}\n\n/**\n * Get an element's attribute values, as defined on the HTML tag\n * Attributes are not the same as properties. They're defined on the tag\n * or with setAttribute (which shouldn't be used with HTML)\n * This will return true or false for boolean attributes.\n *\n * @param  {Element} tag Element from which to get tag attributes\n * @return {Object}\n * @private\n * @function getElAttributes\n */\nexport function getElAttributes(tag) {\n  var obj, knownBooleans, attrs, attrName, attrVal;\n\n  obj = {};\n\n  // known boolean attributes\n  // we can check for matching boolean properties, but older browsers\n  // won't know about HTML5 boolean attributes that we still read from\n  knownBooleans = ','+'autoplay,controls,loop,muted,default'+',';\n\n  if (tag && tag.attributes && tag.attributes.length > 0) {\n    attrs = tag.attributes;\n\n    for (var i = attrs.length - 1; i >= 0; i--) {\n      attrName = attrs[i].name;\n      attrVal = attrs[i].value;\n\n      // check for known booleans\n      // the matching element property will return a value for typeof\n      if (typeof tag[attrName] === 'boolean' || knownBooleans.indexOf(','+attrName+',') !== -1) {\n        // the value of an included boolean attribute is typically an empty\n        // string ('') which would equal false if we just check for a false value.\n        // we also don't want support bad code like autoplay='false'\n        attrVal = (attrVal !== null) ? true : false;\n      }\n\n      obj[attrName] = attrVal;\n    }\n  }\n\n  return obj;\n}\n\n/**\n * Attempt to block the ability to select text while dragging controls\n *\n * @return {Boolean}\n * @method blockTextSelection\n */\nexport function blockTextSelection() {\n  document.body.focus();\n  document.onselectstart = function() {\n    return false;\n  };\n}\n\n/**\n * Turn off text selection blocking\n *\n * @return {Boolean}\n * @method unblockTextSelection\n */\nexport function unblockTextSelection() {\n  document.onselectstart = function() {\n    return true;\n  };\n}\n\n/**\n * Offset Left\n * getBoundingClientRect technique from\n * John Resig http://ejohn.org/blog/getboundingclientrect-is-awesome/\n *\n * @param {Element} el Element from which to get offset\n * @return {Object=}\n * @method findElPosition\n */\nexport function findElPosition(el) {\n  let box;\n\n  if (el.getBoundingClientRect && el.parentNode) {\n    box = el.getBoundingClientRect();\n  }\n\n  if (!box) {\n    return {\n      left: 0,\n      top: 0\n    };\n  }\n\n  const docEl = document.documentElement;\n  const body = document.body;\n\n  const clientLeft = docEl.clientLeft || body.clientLeft || 0;\n  const scrollLeft = window.pageXOffset || body.scrollLeft;\n  const left = box.left + scrollLeft - clientLeft;\n\n  const clientTop = docEl.clientTop || body.clientTop || 0;\n  const scrollTop = window.pageYOffset || body.scrollTop;\n  const top = box.top + scrollTop - clientTop;\n\n  // Android sometimes returns slightly off decimal values, so need to round\n  return {\n    left: Math.round(left),\n    top: Math.round(top)\n  };\n}\n\n/**\n * Get pointer position in element\n * Returns an object with x and y coordinates.\n * The base on the coordinates are the bottom left of the element.\n *\n * @param {Element} el Element on which to get the pointer position on\n * @param {Event} event Event object\n * @return {Object=} position This object will have x and y coordinates corresponding to the mouse position\n * @metho getPointerPosition\n */\nexport function getPointerPosition(el, event) {\n  let position = {};\n  let box = findElPosition(el);\n  let boxW = el.offsetWidth;\n  let boxH = el.offsetHeight;\n\n  let boxY = box.top;\n  let boxX = box.left;\n  let pageY = event.pageY;\n  let pageX = event.pageX;\n\n  if (event.changedTouches) {\n    pageX = event.changedTouches[0].pageX;\n    pageY = event.changedTouches[0].pageY;\n  }\n\n  position.y = Math.max(0, Math.min(1, ((boxY - pageY) + boxH) / boxH));\n  position.x = Math.max(0, Math.min(1, (pageX - boxX) / boxW));\n\n  return position;\n}\n","/**\n * @file events.js\n *\n * Event System (John Resig - Secrets of a JS Ninja http://jsninja.com/)\n * (Original book version wasn't completely usable, so fixed some things and made Closure Compiler compatible)\n * This should work very similarly to jQuery's events, however it's based off the book version which isn't as\n * robust as jquery's, so there's probably some differences.\n */\n\nimport  * as Dom from './dom.js';\nimport  * as Guid from './guid.js';\nimport window from 'global/window';\nimport document from 'global/document';\n\n/**\n * Add an event listener to element\n * It stores the handler function in a separate cache object\n * and adds a generic handler to the element's event,\n * along with a unique id (guid) to the element.\n *\n * @param  {Element|Object}   elem Element or object to bind listeners to\n * @param  {String|Array}   type Type of event to bind to.\n * @param  {Function} fn   Event listener.\n * @method on\n */\nexport function on(elem, type, fn){\n  if (Array.isArray(type)) {\n    return _handleMultipleEvents(on, elem, type, fn);\n  }\n\n  let data = Dom.getElData(elem);\n\n  // We need a place to store all our handler data\n  if (!data.handlers) data.handlers = {};\n\n  if (!data.handlers[type]) data.handlers[type] = [];\n\n  if (!fn.guid) fn.guid = Guid.newGUID();\n\n  data.handlers[type].push(fn);\n\n  if (!data.dispatcher) {\n    data.disabled = false;\n\n    data.dispatcher = function (event, hash){\n\n      if (data.disabled) return;\n      event = fixEvent(event);\n\n      var handlers = data.handlers[event.type];\n\n      if (handlers) {\n        // Copy handlers so if handlers are added/removed during the process it doesn't throw everything off.\n        var handlersCopy = handlers.slice(0);\n\n        for (var m = 0, n = handlersCopy.length; m < n; m++) {\n          if (event.isImmediatePropagationStopped()) {\n            break;\n          } else {\n            handlersCopy[m].call(elem, event, hash);\n          }\n        }\n      }\n    };\n  }\n\n  if (data.handlers[type].length === 1) {\n    if (elem.addEventListener) {\n      elem.addEventListener(type, data.dispatcher, false);\n    } else if (elem.attachEvent) {\n      elem.attachEvent('on' + type, data.dispatcher);\n    }\n  }\n}\n\n/**\n * Removes event listeners from an element\n *\n * @param  {Element|Object}   elem Object to remove listeners from\n * @param  {String|Array=}   type Type of listener to remove. Don't include to remove all events from element.\n * @param  {Function} fn   Specific listener to remove. Don't include to remove listeners for an event type.\n * @method off\n */\nexport function off(elem, type, fn) {\n  // Don't want to add a cache object through getElData if not needed\n  if (!Dom.hasElData(elem)) return;\n\n  let data = Dom.getElData(elem);\n\n  // If no events exist, nothing to unbind\n  if (!data.handlers) { return; }\n\n  if (Array.isArray(type)) {\n    return _handleMultipleEvents(off, elem, type, fn);\n  }\n\n  // Utility function\n  var removeType = function(t){\n     data.handlers[t] = [];\n     _cleanUpEvents(elem,t);\n  };\n\n  // Are we removing all bound events?\n  if (!type) {\n    for (let t in data.handlers) removeType(t);\n    return;\n  }\n\n  var handlers = data.handlers[type];\n\n  // If no handlers exist, nothing to unbind\n  if (!handlers) return;\n\n  // If no listener was provided, remove all listeners for type\n  if (!fn) {\n    removeType(type);\n    return;\n  }\n\n  // We're only removing a single handler\n  if (fn.guid) {\n    for (let n = 0; n < handlers.length; n++) {\n      if (handlers[n].guid === fn.guid) {\n        handlers.splice(n--, 1);\n      }\n    }\n  }\n\n  _cleanUpEvents(elem, type);\n}\n\n/**\n * Trigger an event for an element\n *\n * @param  {Element|Object}      elem  Element to trigger an event on\n * @param  {Event|Object|String} event A string (the type) or an event object with a type attribute\n * @param  {Object} [hash] data hash to pass along with the event\n * @return {Boolean=} Returned only if default was prevented\n * @method trigger\n */\nexport function trigger(elem, event, hash) {\n  // Fetches element data and a reference to the parent (for bubbling).\n  // Don't want to add a data object to cache for every parent,\n  // so checking hasElData first.\n  var elemData = (Dom.hasElData(elem)) ? Dom.getElData(elem) : {};\n  var parent = elem.parentNode || elem.ownerDocument;\n      // type = event.type || event,\n      // handler;\n\n  // If an event name was passed as a string, creates an event out of it\n  if (typeof event === 'string') {\n    event = { type:event, target:elem };\n  }\n  // Normalizes the event properties.\n  event = fixEvent(event);\n\n  // If the passed element has a dispatcher, executes the established handlers.\n  if (elemData.dispatcher) {\n    elemData.dispatcher.call(elem, event, hash);\n  }\n\n  // Unless explicitly stopped or the event does not bubble (e.g. media events)\n    // recursively calls this function to bubble the event up the DOM.\n    if (parent && !event.isPropagationStopped() && event.bubbles === true) {\n      trigger.call(null, parent, event, hash);\n\n  // If at the top of the DOM, triggers the default action unless disabled.\n  } else if (!parent && !event.defaultPrevented) {\n    var targetData = Dom.getElData(event.target);\n\n    // Checks if the target has a default action for this event.\n    if (event.target[event.type]) {\n      // Temporarily disables event dispatching on the target as we have already executed the handler.\n      targetData.disabled = true;\n      // Executes the default action.\n      if (typeof event.target[event.type] === 'function') {\n        event.target[event.type]();\n      }\n      // Re-enables event dispatching.\n      targetData.disabled = false;\n    }\n  }\n\n  // Inform the triggerer if the default was prevented by returning false\n  return !event.defaultPrevented;\n}\n\n/**\n * Trigger a listener only once for an event\n *\n * @param  {Element|Object}   elem Element or object to\n * @param  {String|Array}   type Name/type of event\n * @param  {Function} fn Event handler function\n * @method one\n */\nexport function one(elem, type, fn) {\n  if (Array.isArray(type)) {\n    return _handleMultipleEvents(one, elem, type, fn);\n  }\n  var func = function(){\n    off(elem, type, func);\n    fn.apply(this, arguments);\n  };\n  // copy the guid to the new function so it can removed using the original function's ID\n  func.guid = fn.guid = fn.guid || Guid.newGUID();\n  on(elem, type, func);\n}\n\n/**\n * Fix a native event to have standard property values\n *\n * @param  {Object} event Event object to fix\n * @return {Object}\n * @private\n * @method fixEvent\n */\nexport function fixEvent(event) {\n\n  function returnTrue() { return true; }\n  function returnFalse() { return false; }\n\n  // Test if fixing up is needed\n  // Used to check if !event.stopPropagation instead of isPropagationStopped\n  // But native events return true for stopPropagation, but don't have\n  // other expected methods like isPropagationStopped. Seems to be a problem\n  // with the Javascript Ninja code. So we're just overriding all events now.\n  if (!event || !event.isPropagationStopped) {\n    var old = event || window.event;\n\n    event = {};\n    // Clone the old object so that we can modify the values event = {};\n    // IE8 Doesn't like when you mess with native event properties\n    // Firefox returns false for event.hasOwnProperty('type') and other props\n    //  which makes copying more difficult.\n    // TODO: Probably best to create a whitelist of event props\n    for (var key in old) {\n      // Safari 6.0.3 warns you if you try to copy deprecated layerX/Y\n      // Chrome warns you if you try to copy deprecated keyboardEvent.keyLocation\n      // and webkitMovementX/Y\n      if (key !== 'layerX' && key !== 'layerY' && key !== 'keyLocation' &&\n          key !== 'webkitMovementX' && key !== 'webkitMovementY') {\n        // Chrome 32+ warns if you try to copy deprecated returnValue, but\n        // we still want to if preventDefault isn't supported (IE8).\n        if (!(key === 'returnValue' && old.preventDefault)) {\n          event[key] = old[key];\n        }\n      }\n    }\n\n    // The event occurred on this element\n    if (!event.target) {\n      event.target = event.srcElement || document;\n    }\n\n    // Handle which other element the event is related to\n    if (!event.relatedTarget) {\n      event.relatedTarget = event.fromElement === event.target ?\n        event.toElement :\n        event.fromElement;\n    }\n\n    // Stop the default browser action\n    event.preventDefault = function () {\n      if (old.preventDefault) {\n        old.preventDefault();\n      }\n      event.returnValue = false;\n      old.returnValue = false;\n      event.defaultPrevented = true;\n    };\n\n    event.defaultPrevented = false;\n\n    // Stop the event from bubbling\n    event.stopPropagation = function () {\n      if (old.stopPropagation) {\n        old.stopPropagation();\n      }\n      event.cancelBubble = true;\n      old.cancelBubble = true;\n      event.isPropagationStopped = returnTrue;\n    };\n\n    event.isPropagationStopped = returnFalse;\n\n    // Stop the event from bubbling and executing other handlers\n    event.stopImmediatePropagation = function () {\n      if (old.stopImmediatePropagation) {\n        old.stopImmediatePropagation();\n      }\n      event.isImmediatePropagationStopped = returnTrue;\n      event.stopPropagation();\n    };\n\n    event.isImmediatePropagationStopped = returnFalse;\n\n    // Handle mouse position\n    if (event.clientX != null) {\n      var doc = document.documentElement, body = document.body;\n\n      event.pageX = event.clientX +\n        (doc && doc.scrollLeft || body && body.scrollLeft || 0) -\n        (doc && doc.clientLeft || body && body.clientLeft || 0);\n      event.pageY = event.clientY +\n        (doc && doc.scrollTop || body && body.scrollTop || 0) -\n        (doc && doc.clientTop || body && body.clientTop || 0);\n    }\n\n    // Handle key presses\n    event.which = event.charCode || event.keyCode;\n\n    // Fix button for mouse clicks:\n    // 0 == left; 1 == middle; 2 == right\n    if (event.button != null) {\n      event.button = (event.button & 1 ? 0 :\n        (event.button & 4 ? 1 :\n          (event.button & 2 ? 2 : 0)));\n    }\n  }\n\n  // Returns fixed-up instance\n  return event;\n}\n\n/**\n * Clean up the listener cache and dispatchers\n*\n * @param  {Element|Object} elem Element to clean up\n * @param  {String} type Type of event to clean up\n * @private\n * @method _cleanUpEvents\n */\nfunction _cleanUpEvents(elem, type) {\n  var data = Dom.getElData(elem);\n\n  // Remove the events of a particular type if there are none left\n  if (data.handlers[type].length === 0) {\n    delete data.handlers[type];\n    // data.handlers[type] = null;\n    // Setting to null was causing an error with data.handlers\n\n    // Remove the meta-handler from the element\n    if (elem.removeEventListener) {\n      elem.removeEventListener(type, data.dispatcher, false);\n    } else if (elem.detachEvent) {\n      elem.detachEvent('on' + type, data.dispatcher);\n    }\n  }\n\n  // Remove the events object if there are no types left\n  if (Object.getOwnPropertyNames(data.handlers).length <= 0) {\n    delete data.handlers;\n    delete data.dispatcher;\n    delete data.disabled;\n  }\n\n  // Finally remove the element data if there is no data left\n  if (Object.getOwnPropertyNames(data).length === 0) {\n    Dom.removeElData(elem);\n  }\n}\n\n/**\n * Loops through an array of event types and calls the requested method for each type.\n *\n * @param  {Function} fn   The event method we want to use.\n * @param  {Element|Object} elem Element or object to bind listeners to\n * @param  {String}   type Type of event to bind to.\n * @param  {Function} callback   Event listener.\n * @private\n * @function _handleMultipleEvents\n */\nfunction _handleMultipleEvents(fn, elem, types, callback) {\n  types.forEach(function(type) {\n    //Call the event method for each one of the types\n    fn(elem, type, callback);\n  });\n}\n","/**\n * @file fn.js\n */\nimport { newGUID } from './guid.js';\n\n/**\n * Bind (a.k.a proxy or Context). A simple method for changing the context of a function\n * It also stores a unique id on the function so it can be easily removed from events\n *\n * @param  {*}   context The object to bind as scope\n * @param  {Function} fn      The function to be bound to a scope\n * @param  {Number=}   uid     An optional unique ID for the function to be set\n * @return {Function}\n * @private\n * @method bind\n */\nexport const bind = function(context, fn, uid) {\n  // Make sure the function has a unique ID\n  if (!fn.guid) { fn.guid = newGUID(); }\n\n  // Create the new function that changes the context\n  let ret = function() {\n    return fn.apply(context, arguments);\n  };\n\n  // Allow for the ability to individualize this function\n  // Needed in the case where multiple objects might share the same prototype\n  // IF both items add an event listener with the same function, then you try to remove just one\n  // it will remove both because they both have the same guid.\n  // when using this, you need to use the bind method when you remove the listener as well.\n  // currently used in text tracks\n  ret.guid = (uid) ? uid + '_' + fn.guid : fn.guid;\n\n  return ret;\n};\n","/**\n * @file format-time.js\n *\n * Format seconds as a time string, H:MM:SS or M:SS\n * Supplying a guide (in seconds) will force a number of leading zeros\n * to cover the length of the guide\n *\n * @param  {Number} seconds Number of seconds to be turned into a string\n * @param  {Number} guide   Number (in seconds) to model the string after\n * @return {String}         Time formatted as H:MM:SS or M:SS\n * @private\n * @function formatTime\n */\nfunction formatTime(seconds, guide=seconds) {\n  let s = Math.floor(seconds % 60);\n  let m = Math.floor(seconds / 60 % 60);\n  let h = Math.floor(seconds / 3600);\n  const gm = Math.floor(guide / 60 % 60);\n  const gh = Math.floor(guide / 3600);\n\n  // handle invalid times\n  if (isNaN(seconds) || seconds === Infinity) {\n    // '-' is false for all relational operators (e.g. <, >=) so this setting\n    // will add the minimum number of fields specified by the guide\n    h = m = s = '-';\n  }\n\n  // Check if we need to show hours\n  h = (h > 0 || gh > 0) ? h + ':' : '';\n\n  // If hours are showing, we may need to add a leading zero.\n  // Always show at least one digit of minutes.\n  m = (((h || gm >= 10) && m < 10) ? '0' + m : m) + ':';\n\n  // Check if leading zero is need for seconds\n  s = (s < 10) ? '0' + s : s;\n\n  return h + m + s;\n}\n\nexport default formatTime;\n","/**\n * @file guid.js\n *\n * Unique ID for an element or function\n * @type {Number}\n * @private\n */\nlet _guid = 1;\n\n/**\n * Get the next unique ID\n *\n * @return {String} \n * @function newGUID\n */\nexport function newGUID() {\n  return _guid++;\n}\n","/**\n * @file log.js\n */\nimport window from 'global/window';\n\n/**\n * Log plain debug messages\n */\nconst log = function(){\n  _logType(null, arguments);\n};\n\n/**\n * Keep a history of log messages\n * @type {Array}\n */\nlog.history = [];\n\n/**\n * Log error messages\n */\nlog.error = function(){\n  _logType('error', arguments);\n};\n\n/**\n * Log warning messages\n */\nlog.warn = function(){\n  _logType('warn', arguments);\n};\n\n/**\n * Log messages to the console and history based on the type of message\n *\n * @param  {String} type The type of message, or `null` for `log`\n * @param  {Object} args The args to be passed to the log\n * @private\n * @method _logType\n */\nfunction _logType(type, args){\n  // convert args to an array to get array functions\n  let argsArray = Array.prototype.slice.call(args);\n  // if there's no console then don't try to output messages\n  // they will still be stored in log.history\n  // Was setting these once outside of this function, but containing them\n  // in the function makes it easier to test cases where console doesn't exist\n  let noop = function(){};\n\n  let console = window['console'] || {\n    'log': noop,\n    'warn': noop,\n    'error': noop\n  };\n\n  if (type) {\n    // add the type to the front of the message\n    argsArray.unshift(type.toUpperCase()+':');\n  } else {\n    // default to log with no prefix\n    type = 'log';\n  }\n\n  // add to history\n  log.history.push(argsArray);\n\n  // add console prefix after adding to history\n  argsArray.unshift('VIDEOJS:');\n\n  // call appropriate log function\n  if (console[type].apply) {\n    console[type].apply(console, argsArray);\n  } else {\n    // ie8 doesn't allow error.apply, but it will just join() the array anyway\n    console[type](argsArray.join(' '));\n  }\n}\n\nexport default log;\n","/**\n * @file merge-options.js\n */\nimport merge from 'lodash-compat/object/merge';\n\nfunction isPlain(obj) {\n  return !!obj\n    && typeof obj === 'object'\n    && obj.toString() === '[object Object]'\n    && obj.constructor === Object;\n}\n\n/**\n * Merge customizer. video.js simply overwrites non-simple objects\n * (like arrays) instead of attempting to overlay them.\n * @see https://lodash.com/docs#merge\n */\nconst customizer = function(destination, source) {\n  // If we're not working with a plain object, copy the value as is\n  // If source is an array, for instance, it will replace destination\n  if (!isPlain(source)) {\n    return source;\n  }\n\n  // If the new value is a plain object but the first object value is not\n  // we need to create a new object for the first object to merge with.\n  // This makes it consistent with how merge() works by default\n  // and also protects from later changes the to first object affecting\n  // the second object's values.\n  if (!isPlain(destination)) {\n    return mergeOptions(source);\n  }\n};\n\n/**\n * Merge one or more options objects, recursively merging **only**\n * plain object properties.  Previously `deepMerge`.\n *\n * @param  {...Object} source One or more objects to merge\n * @returns {Object}          a new object that is the union of all\n * provided objects\n * @function mergeOptions\n */\nexport default function mergeOptions() {\n  // contruct the call dynamically to handle the variable number of\n  // objects to merge\n  let args = Array.prototype.slice.call(arguments);\n\n  // unshift an empty object into the front of the call as the target\n  // of the merge\n  args.unshift({});\n\n  // customize conflict resolution to match our historical merge behavior\n  args.push(customizer);\n\n  merge.apply(null, args);\n\n  // return the mutated result object\n  return args[0];\n}\n","import document from 'global/document';\n\nexport let createStyleElement = function(className) {\n  let style = document.createElement('style');\n  style.className = className;\n\n  return style;\n};\n\nexport let setTextContent = function(el, content) {\n  if (el.styleSheet) {\n    el.styleSheet.cssText = content;\n  } else {\n    el.textContent = content;\n  }\n};\n","import log from './log.js';\n\n/**\n * @file time-ranges.js\n *\n * Should create a fake TimeRange object\n * Mimics an HTML5 time range instance, which has functions that\n * return the start and end times for a range\n * TimeRanges are returned by the buffered() method\n *\n * @param  {(Number|Array)} Start of a single range or an array of ranges\n * @param  {Number} End of a single range\n * @private\n * @method createTimeRanges\n */\nexport function createTimeRanges(start, end){\n  if (Array.isArray(start)) {\n    return createTimeRangesObj(start);\n  } else if (start === undefined || end === undefined) {\n    return createTimeRangesObj();\n  }\n  return createTimeRangesObj([[start, end]]);\n}\n\nexport { createTimeRanges as createTimeRange };\n\nfunction createTimeRangesObj(ranges){\n  if (ranges === undefined || ranges.length === 0) {\n    return {\n      length: 0,\n      start: function() {\n        throw new Error('This TimeRanges object is empty');\n      },\n      end: function() {\n        throw new Error('This TimeRanges object is empty');\n      }\n    };\n  }\n  return {\n    length: ranges.length,\n    start: getRange.bind(null, 'start', 0, ranges),\n    end: getRange.bind(null, 'end', 1, ranges)\n  };\n}\n\nfunction getRange(fnName, valueIndex, ranges, rangeIndex){\n  if (rangeIndex === undefined) {\n    log.warn(`DEPRECATED: Function '${fnName}' on 'TimeRanges' called without an index argument.`);\n    rangeIndex = 0;\n  }\n  rangeCheck(fnName, rangeIndex, ranges.length - 1);\n  return ranges[rangeIndex][valueIndex];\n}\n\nfunction rangeCheck(fnName, index, maxIndex){\n  if (index < 0 || index > maxIndex) {\n    throw new Error(`Failed to execute '${fnName}' on 'TimeRanges': The index provided (${index}) is greater than or equal to the maximum bound (${maxIndex}).`);\n  }\n}\n","/**\n * @file to-title-case.js\n *\n * Uppercase the first letter of a string\n *\n * @param  {String} string String to be uppercased\n * @return {String}\n * @private\n * @method toTitleCase\n */\nfunction toTitleCase(string){\n  return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nexport default toTitleCase;\n","/**\n * @file url.js\n */\nimport document from 'global/document';\nimport window from 'global/window';\n\n/**\n * Resolve and parse the elements of a URL\n *\n * @param  {String} url The url to parse\n * @return {Object}     An object of url details\n * @method parseUrl\n */\nexport const parseUrl = function(url) {\n  const props = ['protocol', 'hostname', 'port', 'pathname', 'search', 'hash', 'host'];\n\n  // add the url to an anchor and let the browser parse the URL\n  let a = document.createElement('a');\n  a.href = url;\n\n  // IE8 (and 9?) Fix\n  // ie8 doesn't parse the URL correctly until the anchor is actually\n  // added to the body, and an innerHTML is needed to trigger the parsing\n  let addToBody = (a.host === '' && a.protocol !== 'file:');\n  let div;\n  if (addToBody) {\n    div = document.createElement('div');\n    div.innerHTML = `<a href=\"${url}\"></a>`;\n    a = div.firstChild;\n    // prevent the div from affecting layout\n    div.setAttribute('style', 'display:none; position:absolute;');\n    document.body.appendChild(div);\n  }\n\n  // Copy the specific URL properties to a new object\n  // This is also needed for IE8 because the anchor loses its\n  // properties when it's removed from the dom\n  let details = {};\n  for (var i = 0; i < props.length; i++) {\n    details[props[i]] = a[props[i]];\n  }\n\n  // IE9 adds the port to the host property unlike everyone else. If\n  // a port identifier is added for standard ports, strip it.\n  if (details.protocol === 'http:') {\n    details.host = details.host.replace(/:80$/, '');\n  }\n  if (details.protocol === 'https:') {\n    details.host = details.host.replace(/:443$/, '');\n  }\n\n  if (addToBody) {\n    document.body.removeChild(div);\n  }\n\n  return details;\n};\n\n/**\n * Get absolute version of relative URL. Used to tell flash correct URL.\n * http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue\n *\n * @param  {String} url URL to make absolute\n * @return {String}     Absolute URL\n * @private\n * @method getAbsoluteURL\n */\nexport const getAbsoluteURL = function(url){\n  // Check if absolute URL\n  if (!url.match(/^https?:\\/\\//)) {\n    // Convert to absolute URL. Flash hosted off-site needs an absolute URL.\n    let div = document.createElement('div');\n    div.innerHTML = `<a href=\"${url}\">x</a>`;\n    url = div.firstChild.href;\n  }\n\n  return url;\n};\n\n/**\n * Returns the extension of the passed file name. It will return an empty string if you pass an invalid path\n *\n * @param {String}    path    The fileName path like '/path/to/file.mp4'\n * @returns {String}          The extension in lower case or an empty string if no extension could be found.\n * @method getFileExtension\n */\nexport const getFileExtension = function(path) {\n  if(typeof path === 'string'){\n    let splitPathRe = /^(\\/?)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?)(\\.([^\\.\\/\\?]+)))(?:[\\/]*|[\\?].*)$/i;\n    let pathParts = splitPathRe.exec(path);\n\n    if (pathParts) {\n      return pathParts.pop().toLowerCase();\n    }\n  }\n\n  return '';\n};\n\n/**\n * Returns whether the url passed is a cross domain request or not.\n *\n * @param {String} url The url to check\n * @return {Boolean}   Whether it is a cross domain request or not\n * @method isCrossOrigin\n */\nexport const isCrossOrigin = function(url) {\n  let urlInfo = parseUrl(url);\n  let winLoc = window.location;\n\n  // IE8 protocol relative urls will return ':' for protocol\n  let srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol;\n\n  // Check if url is for another domain/origin\n  // IE8 doesn't know location.origin, so we won't rely on it here\n  let crossOrigin = (srcProtocol + urlInfo.host) !== (winLoc.protocol + winLoc.host);\n\n  return crossOrigin;\n};\n","/**\n * @file video.js\n */\nimport document from 'global/document';\nimport * as setup from './setup';\nimport * as stylesheet from './utils/stylesheet.js';\nimport Component from './component';\nimport EventTarget from './event-target';\nimport * as Events from './utils/events.js';\nimport Player from './player';\nimport plugin from './plugins.js';\nimport mergeOptions from '../../src/js/utils/merge-options.js';\nimport * as Fn from './utils/fn.js';\nimport TextTrack from './tracks/text-track.js';\n\nimport assign from 'object.assign';\nimport { createTimeRanges } from './utils/time-ranges.js';\nimport formatTime from './utils/format-time.js';\nimport log from './utils/log.js';\nimport * as Dom from './utils/dom.js';\nimport * as browser from './utils/browser.js';\nimport * as Url from './utils/url.js';\nimport extendFn from './extend.js';\nimport merge from 'lodash-compat/object/merge';\nimport createDeprecationProxy from './utils/create-deprecation-proxy.js';\nimport xhr from 'xhr';\n\n// Include the built-in techs\nimport Html5 from './tech/html5.js';\nimport Flash from './tech/flash.js';\n\n// HTML5 Element Shim for IE8\nif (typeof HTMLVideoElement === 'undefined') {\n  document.createElement('video');\n  document.createElement('audio');\n  document.createElement('track');\n}\n\n/**\n * Doubles as the main function for users to create a player instance and also\n * the main library object.\n * The `videojs` function can be used to initialize or retrieve a player.\n * ```js\n *     var myPlayer = videojs('my_video_id');\n * ```\n *\n * @param  {String|Element} id      Video element or video element ID\n * @param  {Object=} options        Optional options object for config/settings\n * @param  {Function=} ready        Optional ready callback\n * @return {Player}                 A player instance\n * @mixes videojs\n * @method videojs\n */\nvar videojs = function(id, options, ready){\n  var tag; // Element of ID\n\n  // Allow for element or ID to be passed in\n  // String ID\n  if (typeof id === 'string') {\n\n    // Adjust for jQuery ID syntax\n    if (id.indexOf('#') === 0) {\n      id = id.slice(1);\n    }\n\n    // If a player instance has already been created for this ID return it.\n    if (videojs.getPlayers()[id]) {\n\n      // If options or ready funtion are passed, warn\n      if (options) {\n        log.warn(`Player \"${id}\" is already initialised. Options will not be applied.`);\n      }\n\n      if (ready) {\n        videojs.getPlayers()[id].ready(ready);\n      }\n\n      return videojs.getPlayers()[id];\n\n    // Otherwise get element for ID\n    } else {\n      tag = Dom.getEl(id);\n    }\n\n  // ID is a media element\n  } else {\n    tag = id;\n  }\n\n  // Check for a useable element\n  if (!tag || !tag.nodeName) { // re: nodeName, could be a box div also\n    throw new TypeError('The element or ID supplied is not valid. (videojs)'); // Returns\n  }\n\n  // Element may have a player attr referring to an already created player instance.\n  // If not, set up a new player and return the instance.\n  return tag['player'] || new Player(tag, options, ready);\n};\n\n// Add default styles\nlet style = document.querySelector('.vjs-styles-defaults');\nif (!style) {\n  style = stylesheet.createStyleElement('vjs-styles-defaults');\n  let head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n  stylesheet.setTextContent(style, `\n    .video-js {\n      width: 300px;\n      height: 150px;\n    }\n\n    .vjs-fluid {\n      padding-top: 56.25%\n    }\n  `);\n}\n\n// Run Auto-load players\n// You have to wait at least once in case this script is loaded after your video in the DOM (weird behavior only with minified version)\nsetup.autoSetupTimeout(1, videojs);\n\n/*\n * Current software version (semver)\n *\n * @type {String}\n */\nvideojs.VERSION = '__VERSION__';\n\n/**\n * The global options object. These are the settings that take effect\n * if no overrides are specified when the player is created.\n *\n * ```js\n *     videojs.options.autoplay = true\n *     // -> all players will autoplay by default\n * ```\n *\n * @type {Object}\n */\nvideojs.options = Player.prototype.options_;\n\n/**\n * Get an object with the currently created players, keyed by player ID\n *\n * @return {Object} The created players\n * @mixes videojs\n * @method getPlayers\n */\nvideojs.getPlayers = function() {\n  return Player.players;\n};\n\n/**\n * For backward compatibility, expose players object.\n *\n * @deprecated\n * @memberOf videojs\n * @property {Object|Proxy} players\n */\nvideojs.players = createDeprecationProxy(Player.players, {\n  get: 'Access to videojs.players is deprecated; use videojs.getPlayers instead',\n  set: 'Modification of videojs.players is deprecated'\n});\n\n/**\n * Get a component class object by name\n * ```js\n *     var VjsButton = videojs.getComponent('Button');\n *     // Create a new instance of the component\n *     var myButton = new VjsButton(myPlayer);\n * ```\n *\n * @return {Component} Component identified by name\n * @mixes videojs\n * @method getComponent\n */\nvideojs.getComponent = Component.getComponent;\n\n/**\n * Register a component so it can referred to by name\n * Used when adding to other\n * components, either through addChild\n * `component.addChild('myComponent')`\n * or through default children options\n * `{ children: ['myComponent'] }`.\n * ```js\n *     // Get a component to subclass\n *     var VjsButton = videojs.getComponent('Button');\n *     // Subclass the component (see 'extend' doc for more info)\n *     var MySpecialButton = videojs.extend(VjsButton, {});\n *     // Register the new component\n *     VjsButton.registerComponent('MySepcialButton', MySepcialButton);\n *     // (optionally) add the new component as a default player child\n *     myPlayer.addChild('MySepcialButton');\n * ```\n * NOTE: You could also just initialize the component before adding.\n * `component.addChild(new MyComponent());`\n *\n * @param {String} The class name of the component\n * @param {Component} The component class\n * @return {Component} The newly registered component\n * @mixes videojs\n * @method registerComponent\n */\nvideojs.registerComponent = Component.registerComponent;\n\n/**\n * A suite of browser and device tests\n *\n * @type {Object}\n * @private\n */\nvideojs.browser = browser;\n\n/**\n * Whether or not the browser supports touch events. Included for backward\n * compatibility with 4.x, but deprecated. Use `videojs.browser.TOUCH_ENABLED`\n * instead going forward.\n *\n * @deprecated\n * @type {Boolean}\n */\nvideojs.TOUCH_ENABLED = browser.TOUCH_ENABLED;\n\n/**\n * Subclass an existing class\n * Mimics ES6 subclassing with the `extend` keyword\n * ```js\n *     // Create a basic javascript 'class'\n *     function MyClass(name){\n *       // Set a property at initialization\n *       this.myName = name;\n *     }\n *     // Create an instance method\n *     MyClass.prototype.sayMyName = function(){\n *       alert(this.myName);\n *     };\n *     // Subclass the exisitng class and change the name\n *     // when initializing\n *     var MySubClass = videojs.extend(MyClass, {\n *       constructor: function(name) {\n *         // Call the super class constructor for the subclass\n *         MyClass.call(this, name)\n *       }\n *     });\n *     // Create an instance of the new sub class\n *     var myInstance = new MySubClass('John');\n *     myInstance.sayMyName(); // -> should alert \"John\"\n * ```\n *\n * @param {Function} The Class to subclass\n * @param {Object} An object including instace methods for the new class\n *                   Optionally including a `constructor` function\n * @return {Function} The newly created subclass\n * @mixes videojs\n * @method extend\n */\nvideojs.extend = extendFn;\n\n/**\n * Merge two options objects recursively\n * Performs a deep merge like lodash.merge but **only merges plain objects**\n * (not arrays, elements, anything else)\n * Other values will be copied directly from the second object.\n * ```js\n *     var defaultOptions = {\n *       foo: true,\n *       bar: {\n *         a: true,\n *         b: [1,2,3]\n *       }\n *     };\n *     var newOptions = {\n *       foo: false,\n *       bar: {\n *         b: [4,5,6]\n *       }\n *     };\n *     var result = videojs.mergeOptions(defaultOptions, newOptions);\n *     // result.foo = false;\n *     // result.bar.a = true;\n *     // result.bar.b = [4,5,6];\n * ```\n *\n * @param {Object} The options object whose values will be overriden\n * @param {Object} The options object with values to override the first\n * @param {Object} Any number of additional options objects\n *\n * @return {Object} a new object with the merged values\n * @mixes videojs\n * @method mergeOptions\n */\nvideojs.mergeOptions = mergeOptions;\n\n/**\n * Change the context (this) of a function\n *\n *     videojs.bind(newContext, function(){\n *       this === newContext\n *     });\n *\n * NOTE: as of v5.0 we require an ES5 shim, so you should use the native\n * `function(){}.bind(newContext);` instead of this.\n *\n * @param  {*}        context The object to bind as scope\n * @param  {Function} fn      The function to be bound to a scope\n * @param  {Number=}  uid     An optional unique ID for the function to be set\n * @return {Function}\n */\nvideojs.bind = Fn.bind;\n\n/**\n * Create a Video.js player plugin\n * Plugins are only initialized when options for the plugin are included\n * in the player options, or the plugin function on the player instance is\n * called.\n * **See the plugin guide in the docs for a more detailed example**\n * ```js\n *     // Make a plugin that alerts when the player plays\n *     videojs.plugin('myPlugin', function(myPluginOptions) {\n *       myPluginOptions = myPluginOptions || {};\n *\n *       var player = this;\n *       var alertText = myPluginOptions.text || 'Player is playing!'\n *\n *       player.on('play', function(){\n *         alert(alertText);\n *       });\n *     });\n *     // USAGE EXAMPLES\n *     // EXAMPLE 1: New player with plugin options, call plugin immediately\n *     var player1 = videojs('idOne', {\n *       myPlugin: {\n *         text: 'Custom text!'\n *       }\n *     });\n *     // Click play\n *     // --> Should alert 'Custom text!'\n *     // EXAMPLE 3: New player, initialize plugin later\n *     var player3 = videojs('idThree');\n *     // Click play\n *     // --> NO ALERT\n *     // Click pause\n *     // Initialize plugin using the plugin function on the player instance\n *     player3.myPlugin({\n *       text: 'Plugin added later!'\n *     });\n *     // Click play\n *     // --> Should alert 'Plugin added later!'\n * ```\n *\n * @param {String} The plugin name\n * @param {Function} The plugin function that will be called with options\n * @mixes videojs\n * @method plugin\n */\nvideojs.plugin = plugin;\n\n/**\n * Adding languages so that they're available to all players.\n * ```js\n *     videojs.addLanguage('es', { 'Hello': 'Hola' });\n * ```\n *\n * @param  {String} code The language code or dictionary property\n * @param  {Object} data The data values to be translated\n * @return {Object} The resulting language dictionary object\n * @mixes videojs\n * @method addLanguage\n */\nvideojs.addLanguage = function(code, data){\n  code = ('' + code).toLowerCase();\n  return merge(videojs.options.languages, { [code]: data })[code];\n};\n\n/**\n * Log debug messages.\n *\n * @param {...Object} messages One or more messages to log\n */\nvideojs.log = log;\n\n/**\n * Creates an emulated TimeRange object.\n *\n * @param  {Number|Array} start Start time in seconds or an array of ranges\n * @param  {Number} end   End time in seconds\n * @return {Object}       Fake TimeRange object\n * @method createTimeRange\n */\nvideojs.createTimeRange = videojs.createTimeRanges = createTimeRanges;\n\n/**\n * Format seconds as a time string, H:MM:SS or M:SS\n * Supplying a guide (in seconds) will force a number of leading zeros\n * to cover the length of the guide\n *\n * @param  {Number} seconds Number of seconds to be turned into a string\n * @param  {Number} guide   Number (in seconds) to model the string after\n * @return {String}         Time formatted as H:MM:SS or M:SS\n * @method formatTime\n */\nvideojs.formatTime = formatTime;\n\n/**\n * Resolve and parse the elements of a URL\n *\n * @param  {String} url The url to parse\n * @return {Object}     An object of url details\n * @method parseUrl\n */\nvideojs.parseUrl = Url.parseUrl;\n\n/**\n * Returns whether the url passed is a cross domain request or not.\n *\n * @param {String} url The url to check\n * @return {Boolean}   Whether it is a cross domain request or not\n * @method isCrossOrigin\n */\nvideojs.isCrossOrigin = Url.isCrossOrigin;\n\n/**\n * Event target class.\n *\n * @type {Function}\n */\nvideojs.EventTarget = EventTarget;\n\n/**\n * Add an event listener to element\n * It stores the handler function in a separate cache object\n * and adds a generic handler to the element's event,\n * along with a unique id (guid) to the element.\n *\n * @param  {Element|Object}   elem Element or object to bind listeners to\n * @param  {String|Array}   type Type of event to bind to.\n * @param  {Function} fn   Event listener.\n * @method on\n */\nvideojs.on = Events.on;\n\n/**\n * Trigger a listener only once for an event\n *\n * @param  {Element|Object}   elem Element or object to\n * @param  {String|Array}   type Name/type of event\n * @param  {Function} fn Event handler function\n * @method one\n */\nvideojs.one = Events.one;\n\n/**\n * Removes event listeners from an element\n *\n * @param  {Element|Object}   elem Object to remove listeners from\n * @param  {String|Array=}   type Type of listener to remove. Don't include to remove all events from element.\n * @param  {Function} fn   Specific listener to remove. Don't include to remove listeners for an event type.\n * @method off\n */\nvideojs.off = Events.off;\n\n/**\n * Trigger an event for an element\n *\n * @param  {Element|Object}      elem  Element to trigger an event on\n * @param  {Event|Object|String} event A string (the type) or an event object with a type attribute\n * @param  {Object} [hash] data hash to pass along with the event\n * @return {Boolean=} Returned only if default was prevented\n * @method trigger\n */\nvideojs.trigger = Events.trigger;\n\n/**\n * A cross-browser XMLHttpRequest wrapper. Here's a simple example:\n *\n *     videojs.xhr({\n *       body: someJSONString,\n *       uri: \"/foo\",\n *       headers: {\n *         \"Content-Type\": \"application/json\"\n *       }\n *     }, function (err, resp, body) {\n *       // check resp.statusCode\n *     });\n *\n * Check out the [full\n * documentation](https://github.com/Raynos/xhr/blob/v2.1.0/README.md)\n * for more options.\n *\n * @param {Object} options settings for the request.\n * @return {XMLHttpRequest|XDomainRequest} the request object.\n * @see https://github.com/Raynos/xhr\n */\nvideojs.xhr = xhr;\n\n/**\n * TextTrack class\n *\n * @type {Function}\n */\nvideojs.TextTrack = TextTrack;\n\n// REMOVING: We probably should add this to the migration plugin\n// // Expose but deprecate the window[componentName] method for accessing components\n// Object.getOwnPropertyNames(Component.components).forEach(function(name){\n//   let component = Component.components[name];\n//\n//   // A deprecation warning as the constuctor\n//   module.exports[name] = function(player, options, ready){\n//     log.warn('Using videojs.'+name+' to access the '+name+' component has been deprecated. Please use videojs.getComponent(\"componentName\")');\n//\n//     return new Component(player, options, ready);\n//   };\n//\n//   // Allow the prototype and class methods to be accessible still this way\n//   // Though anything that attempts to override class methods will no longer work\n//   assign(module.exports[name], component);\n// });\n\n/*\n * Custom Universal Module Definition (UMD)\n *\n * Video.js will never be a non-browser lib so we can simplify UMD a bunch and\n * still support requirejs and browserify. This also needs to be closure\n * compiler compatible, so string keys are used.\n */\nif (typeof define === 'function' && define['amd']) {\n  define('videojs', [], function(){ return videojs; });\n\n// checking that module is an object too because of umdjs/umd#35\n} else if (typeof exports === 'object' && typeof module === 'object') {\n  module['exports'] = videojs;\n}\n\nexport default videojs;\n"]}
 
\ No newline at end of file
ennstatus/static/js/video.js/docs/examples/shared/example-captions.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 

	
 
00:00.700 --> 00:04.110
 
Captions describe all relevant audio for the hearing impaired.
 
[ Heroic music playing for a seagull ]
 

	
 
00:04.500 --> 00:05.000
 
[ Splash!!! ]
 

	
 
00:05.100 --> 00:06.000
 
[ Sploosh!!! ]
 

	
 
00:08.000 --> 00:09.225
 
[ Splash...splash...splash splash splash ]
 

	
 
00:10.525 --> 00:11.255
 
[ Splash, Sploosh again ]
 

	
 
00:13.500 --> 00:14.984
 
Dolphin: eeeEEEEEeeee!
 

	
 
00:14.984 --> 00:16.984
 
Dolphin: Squawk! eeeEEE?
 

	
 
00:25.000 --> 00:28.284
 
[ A whole ton of splashes ]
 

	
 
00:29.500 --> 00:31.000
 
Mine. Mine. Mine.
 

	
 
00:34.300 --> 00:36.000
 
Shark: Chomp
 

	
 
00:36.800 --> 00:37.900
 
Shark: CHOMP!!!
 

	
 
00:37.861 --> 00:41.193
 
EEEEEEOOOOOOOOOOWHALENOISE
 

	
 
00:42.593 --> 00:45.611
 
[ BIG SPLASH ]
 
\ No newline at end of file
ennstatus/static/js/video.js/docs/examples/simple-embed/index.html
Show inline comments
 
new file 100644
 
<!DOCTYPE html>
 
<html>
 
<head>
 
  <title>Video.js | HTML5 Video Player</title>
 

	
 
  <!-- Chang URLs to wherever Video.js files will be hosted -->
 
  <!-- Default URLs assume the examples folder is included alongside video.js -->
 
  <link href="../../video-js.min.css" rel="stylesheet" type="text/css">
 

	
 
  <!-- Include ES5 shim, sham and html5 shiv for ie8 support  -->
 
  <!-- Exclude this if you don't need ie8 support -->
 
  <script src="../../ie8/videojs-ie8.min.js"></script>
 

	
 
  <!-- video.js must be in the <head> for older IEs to work. -->
 
  <script src="../../video.min.js"></script>
 

	
 
  <!-- Unless using the CDN hosted version, update the URL to the Flash SWF -->
 
  <script>
 
    videojs.options.flash.swf = "../../video-js.swf";
 
  </script>
 

	
 
</head>
 
<body>
 

	
 
  <video id="example_video_1" class="video-js vjs-default-skin" controls preload="none" width="640" height="264"
 
      poster="http://video-js.zencoder.com/oceans-clip.png"
 
      data-setup="{}">
 
    <source src="http://video-js.zencoder.com/oceans-clip.mp4" type='video/mp4' />
 
    <source src="http://video-js.zencoder.com/oceans-clip.webm" type='video/webm' />
 
    <source src="http://video-js.zencoder.com/oceans-clip.ogv" type='video/ogg' />
 
    <track kind="captions" src="../shared/example-captions.vtt" srclang="en" label="English"></track><!-- Tracks need an ending tag thanks to IE9 -->
 
    <track kind="subtitles" src="../shared/example-captions.vtt" srclang="en" label="English"></track><!-- Tracks need an ending tag thanks to IE9 -->
 
    <p class="vjs-no-js">To view this video please enable JavaScript, and consider upgrading to a web browser that <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a></p>
 
  </video>
 

	
 
</body>
 
</html>
ennstatus/static/js/video.js/docs/guides/api.md
Show inline comments
 
new file 100644
 
API
 
===
 

	
 
The Video.js API allows you to interact with the video through JavaScript, whether the browser is playing the video through HTML5 video, Flash, or any other supported playback technologies.
 

	
 
Referencing the Player
 
----------------------
 
To use the API functions, you need access to the player object. Luckily this is easy to get. You just need to make sure your video tag has an ID. The example embed code has an ID of "example\_video_1". If you have multiple videos on one page, make sure every video tag has a unique ID.
 

	
 
```js
 
var myPlayer = videojs('example_video_1');
 
```
 

	
 
(If the player hasn't been initialized yet via the data-setup attribute or another method, this will also initialize the player.)
 

	
 
Wait Until the Player is Ready
 
------------------------------
 
The time it takes Video.js to set up the video and API will vary depending on the playback technology being used (HTML5 will often be much faster to load than Flash). For that reason we want to use the player's 'ready' function to trigger any code that requires the player's API.
 

	
 
```javascript
 
videojs("example_video_1").ready(function(){
 
  var myPlayer = this;
 

	
 
  // EXAMPLE: Start playing the video.
 
  myPlayer.play();
 

	
 
});
 
```
 

	
 
API Methods
 
-----------
 
Now that you have access to a ready player, you can control the video, get values, or respond to video events. The Video.js API function names follow the [HTML5 media API](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html). The main difference is that getter/setter functions are used for video properties.
 

	
 
```js
 

	
 
// setting a property on a bare HTML5 video element
 
myVideoElement.currentTime = "120";
 

	
 
// setting a property on a Video.js player
 
myPlayer.currentTime(120);
 

	
 
```
 

	
 
The full list of player API methods and events can be found in the [player API docs](../api/vjs.Player.md).
ennstatus/static/js/video.js/docs/guides/components.md
Show inline comments
 
new file 100644
 
Components
 
===
 
The Video.js player is built on top of a simple, custom UI components architecture. The player class and all control classes inherit from the `Component` class, or a subclass of `Component`.
 

	
 
```js
 
videojs.registerComponent('Control', videojs.extends(Component));
 
videojs.registerComponent('Button', videojs.extends(videojs.getComponent('Control')));
 
videojs.registerComponent('PlayToggle', videojs.extends(videojs.getComponent('Button')));
 
```
 

	
 
The UI component architecture makes it easier to add child components to a parent component and build up an entire user interface, like the controls for the Video.js player.
 

	
 
```js
 
// Adding a new control to the player
 
myPlayer.addChild('BigPlayButton');
 
```
 

	
 
Every component has an associated DOM element, and when you add a child component, it inserts the element of that child into the element of the parent.
 

	
 
```js
 
myPlayer.addChild('BigPlayButton');
 
```
 

	
 
Results in:
 

	
 
```html
 
    <!-- Player Element -->
 
    <div class="video-js">
 
      <!-- BigPlayButton Element -->
 
      <div class="vjs-big-play-button"></div>
 
    </div>
 
```
 

	
 
The actual default component structure of the Video.js player looks something like this:
 

	
 
```
 
Player
 
    PosterImage
 
    TextTrackDisplay
 
    LoadingSpinner
 
    BigPlayButton
 
    ControlBar
 
        PlayToggle
 
        FullscreenToggle
 
        CurrentTimeDisplay
 
        TimeDivider
 
        DurationDisplay
 
        RemainingTimeDisplay
 
        ProgressControl
 
            SeekBar
 
              LoadProgressBar
 
              PlayProgressBar
 
              SeekHandle
 
        VolumeControl
 
            VolumeBar
 
                VolumeLevel
 
                VolumeHandle
 
        MuteToggle
 
```
ennstatus/static/js/video.js/docs/guides/glossary.md
Show inline comments
 
new file 100644
 
Glossary
 
========
 
Terms related to web video.
 

	
 
### DOM (Document Object Model)
 
The container of elements on the page that must be loaded before you can interact with the elements with through Javascript.
 
http://en.wikipedia.org/wiki/Document_Object_Model
 

	
 

	
 
### Flash Fallback
 
The Flash video player (SWF) used to play a video when HTML5 isn't supported.
 

	
 

	
 
### TimeRange
 

	
 

	
 
### HTML5 Video
 
HTML is the markup language that makes up every page on the web. The newest version, HTML5, includes specifications for a video tag, that is meant to allow website developers to add a video to a page the same way they would add an image. In order for this to work, web browser developers (Mozilla, Apple, Microsoft, Google, Opera, etc.) have to build the video playback functionality into their browsers. The W3C has created directions on how video should work in browsers, and it’s up to browser developers to follow those directions, so that video works the same across all browsers. This doesn’t always happen thanks to technology, legal, and financial choices made by browser developers, but so far no one’s varying too far from the specifications. However the specifications are still being changed and refined, so browsers developers have to keep up with that as well.
 

	
 
Playing video in a web page may not seem so special since you can already view video on a web page through plugins like Flash Player, Quicktime, Silverlight, and RealPlayer, however this is a big step forward for standardizing video playback across web browsers and devices. The goal is that in the future, developers will only need to use one method for embedding a video, that’s based on open standards (not controlled by one company), and it will work everywhere.
 

	
 
A prime example of this is the iPhone and iPad. Apple has decided not to support Flash on their mobile devices, but they do support HTML5 video. Since Flash is currently the most common way video is added to web pages, most web video (aside from YouTube who has a special relationship with Apple) can’t be viewed on the iPhone or iPad. These devices are very popular, so many web sites are switching to hybrid HTML5/Flash player setups (like VideoJS).
 

	
 

	
 
### Video Tag
 
There are a number of great resources that will give you an introduction to the video tag an how it is used including:
 

	
 
  - [Dive into HTML5](http://diveintohtml5.org/video.html)
 
  - Lynda.com's ['HTML5 Video and Audio in Depth'](http://www.lynda.com/HTML-5-tutorials/HTML5-Video-and-Audio-in-Depth/80781-2.html) video tutorials created by yours truly.
 

	
 
An if you really want to dig in, you can read the (W3C Spec)[http://www.w3.org/TR/html5/video.html]. (Warning - not for the faint of heart)
 

	
 

	
 
### Skin
 
"Skin" refers to the design of the player's controls, also sometimes called the chrome. With VideoJS, new skins can be built simply by creating a new stylesheet.
 

	
 

	
 
### Content Delivery Network (CDN)
 
A network of servers around the world that host copies of a file. When your browser requests one of these files, the CDN automatically determines which server is closest to your location and delivers the file from there. This drastically increases delivery time, especially internationally.
ennstatus/static/js/video.js/docs/guides/languages.md
Show inline comments
 
new file 100644
 
Languages
 
=========
 

	
 
Multiple language support allows for users of non-English locales to natively interact with the displayed player. Video.js will compile multiple language files (see below) and instantiate with a global dictionary of language key/value support. Video.js player instances can be created with per-player language support that amends/overrides these default values. Player instances can also hard-set default languages to values other than English as of version 4.7.
 

	
 
Creating the Language File
 
--------------------------
 
Video.js uses key/value object dictionaries in JSON form. A sample dictionary for Spanish `['es']` would look as follows;
 

	
 
```JSON
 
{
 
  "Play": "Reproducción",
 
  "Pause": "Pausa",
 
  "Current Time": "Tiempo reproducido",
 
  "Duration Time": "Duración total",
 
  "Remaining Time": "Tiempo restante",
 
  "Stream Type": "Tipo de secuencia",
 
  "LIVE": "DIRECTO",
 
  "Loaded": "Cargado",
 
  "Progress": "Progreso",
 
  "Fullscreen": "Pantalla completa",
 
  "Non-Fullscreen": "Pantalla no completa",
 
  "Mute": "Silenciar",
 
  "Unmuted": "No silenciado",
 
  "Playback Rate": "Velocidad de reproducción",
 
  "Subtitles": "Subtítulos",
 
  "subtitles off": "Subtítulos desactivados",
 
  "Captions": "Subtítulos especiales",
 
  "captions off": "Subtítulos especiales desactivados",
 
  "Chapters": "Capítulos",
 
  "You aborted the video playback": "Ha interrumpido la reproducción del vídeo.",
 
  "A network error caused the video download to fail part-way.": "Un error de red ha interrumpido la descarga del vídeo.",
 
  "The video could not be loaded, either because the server or network failed or because the format is not supported.": "No se ha podido cargar el vídeo debido a un fallo de red o del servidor o porque el formato es incompatible.",
 
  "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "La reproducción de vídeo se ha interrumpido por un problema de corrupción de datos o porque el vídeo precisa funciones que su navegador no ofrece.",
 
  "No compatible source was found for this video.": "No se ha encontrado ninguna fuente compatible con este vídeo."
 
}
 
```
 

	
 
Notes:
 

	
 
- The file name should always be in the format `XX.json`, where `XX` is the two letter value of the language reported to the browser (for options see the bottom of this document).
 
- For automatic inclusion at build time, add your language file to the `/lang` directory (see 'Adding Languages to Video.js below').
 

	
 
Adding Languages to Video.js
 
----------------------------
 
Additional language support can be added to Video.js in multiple ways.
 

	
 
1. Create language scripts out of your JSON objects by using our custom grunt task `vjslanguages`. This task is automatically run as part of the default grunt task in Video.JS, but can be configured to match your `src`/`dist` directories if different. Once these scripts are created, just add them to your DOM like any other script.
 

	
 
NOTE: These need to be added after the core Video.js script.
 

	
 

	
 
2. Add your JSON objects via the videojs.addLanguage API. Preferably in the HEAD element of your DOM or otherwise prior to player instantiation.
 

	
 
```html
 
<head>
 
<script>
 
  videojs.options.flash.swf = '../node_modules/videojs-swf/dist/video-js.swf';
 
  videojs.addLanguage('es', {
 
    "Play": "Reproducción",
 
    "Pause": "Pausa",
 
    "Current Time": "Tiempo reproducido",
 
    "Duration Time": "Duración total",
 
    "Remaining Time": "Tiempo restante",
 
    "Stream Type": "Tipo de secuencia",
 
    "LIVE": "DIRECTO",
 
    "Loaded": "Cargado",
 
    "Progress": "Progreso",
 
    "Fullscreen": "Pantalla completa",
 
    "Non-Fullscreen": "Pantalla no completa",
 
    "Mute": "Silenciar",
 
    "Unmuted": "No silenciado",
 
    "Playback Rate": "Velocidad de reproducción",
 
    "Subtitles": "Subtítulos",
 
    "subtitles off": "Subtítulos desactivados",
 
    "Captions": "Subtítulos especiales",
 
    "captions off": "Subtítulos especiales desactivados",
 
    "Chapters": "Capítulos",
 
    "You aborted the video playback": "Ha interrumpido la reproducción del vídeo.",
 
    "A network error caused the video download to fail part-way.": "Un error de red ha interrumpido la descarga del vídeo.",
 
    "The video could not be loaded, either because the server or network failed or because the format is not supported.": "No se ha podido cargar el vídeo debido a un fallo de red o del servidor o porque el formato es incompatible.",
 
    "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "La reproducción de vídeo se ha interrumpido por un problema de corrupción de datos o porque el vídeo precisa funciones que su navegador no ofrece.",
 
    "No compatible source was found for this video.": "No se ha encontrado ninguna fuente compatible con este vídeo."
 
});
 
</script>
 
</head>
 
```
 

	
 
3. During a Video.js player instantiation. Adding the languages to the configuration object provided in the `data-setup` attribute.
 

	
 
```html
 
<video id="example_video_1" class="video-js vjs-default-skin"  
 
  controls preload="auto" width="640" height="264"  
 
  data-setup='{"languages":{"es":{"Play":"Juego"}}}'>  
 
 <source src="http://video-js.zencoder.com/oceans-clip.mp4" type='video/mp4' />  
 
 <source src="http://video-js.zencoder.com/oceans-clip.webm" type='video/webm' />  
 
 <source src="http://video-js.zencoder.com/oceans-clip.ogv" type='video/ogg' />  
 

	
 
 <track kind="captions" src="http://example.com/path/to/captions.vtt" srclang="en" label="English" default>
 

	
 
</video>
 
```
 

	
 
Notes:
 
- This will add your language key/values to the Video.js player instances individually. If these values already exist in the global dictionary via the process above, those will be overridden for the player instance in question.
 

	
 

	
 
Setting Default Language in a Video.js Player
 
---------------------------------------------
 
During a Video.js player instantiation you can force it to localize to a specific language by including the locale value into the configuration object via the `data-setup` attribute. Valid options listed at the bottom of the page for reference.
 

	
 
```html
 
<video id="example_video_1" class="video-js vjs-default-skin"  
 
  controls preload="auto" width="640" height="264"  
 
  data-setup='{"language":"es"}'>  
 
 <source src="http://video-js.zencoder.com/oceans-clip.mp4" type='video/mp4' />  
 
 <source src="http://video-js.zencoder.com/oceans-clip.webm" type='video/webm' />  
 
 <source src="http://video-js.zencoder.com/oceans-clip.ogv" type='video/ogg' />  
 

	
 
 <track kind="captions" src="http://example.com/path/to/captions.vtt" srclang="en" label="English" default>
 

	
 
</video>
 
```
 

	
 
Determining Player Language
 
---------------------------
 

	
 
The player language is set to one of the following in descending priority
 

	
 
* The language set in setup options as above
 
* The document language (`lang` attribute of the `html` element)
 
* Browser language preference
 
* 'en'
 

	
 
That can be overridden after instantiation with `language('fr')`.
 

	
 
Language selection
 
------------------
 

	
 
* Language codes are considered case-insensitively (`en-US` == `en-us`).
 
* If there is no match for a language code with a subcode (`en-us`), a match for the primary code (`en`) is used if available.
 

	
 
Localization in Plugins
 
-----------------------
 

	
 
When you're developing a plugin, you can also introduce new localized strings. Simply wrap the string with the player's `localize` function:
 

	
 
```javascript
 
var details = '<div class="vjs-errors-details">' + player.localize('Technical details') + '</div>';
 
```
 

	
 
Language Codes
 
--------------
 
The following is a list of official language codes.
 

	
 
**NOTE:** For supported language translations, please see the [Languages Folder (/lang)](../../lang) folder located in the project root.
 

	
 
<table border="0" cellspacing="5" cellpadding="5">
 
  <tr>
 
    <td>
 

	
 
      <table>
 
        <tr><th>ab<th><td>Abkhazian</td></tr>
 
        <tr><th>aa<th><td>Afar</td></tr>
 
        <tr><th>af<th><td>Afrikaans</td></tr>
 
        <tr><th>sq<th><td>Albanian</td></tr>
 
        <tr><th>am<th><td>Amharic</td></tr>
 
        <tr><th>ar<th><td>Arabic</td></tr>
 
        <tr><th>an<th><td>Aragonese</td></tr>
 
        <tr><th>hy<th><td>Armenian</td></tr>
 
        <tr><th>as<th><td>Assamese</td></tr>
 
        <tr><th>ay<th><td>Aymara</td></tr>
 
        <tr><th>az<th><td>Azerbaijani</td></tr>
 
        <tr><th>ba<th><td>Bashkir</td></tr>
 
        <tr><th>eu<th><td>Basque</td></tr>
 
        <tr><th>bn<th><td>Bengali (Bangla)</td></tr>
 
        <tr><th>dz<th><td>Bhutani</td></tr>
 
        <tr><th>bh<th><td>Bihari</td></tr>
 
        <tr><th>bi<th><td>Bislama</td></tr>
 
        <tr><th>br<th><td>Breton</td></tr>
 
        <tr><th>bg<th><td>Bulgarian</td></tr>
 
        <tr><th>my<th><td>Burmese</td></tr>
 
        <tr><th>be<th><td>Byelorussian (Belarusian)</td></tr>
 
        <tr><th>km<th><td>Cambodian</td></tr>
 
        <tr><th>ca<th><td>Catalan</td></tr>
 
        <tr><th>zh<th><td>Chinese (Simplified)</td></tr>
 
        <tr><th>zh<th><td>Chinese (Traditional)</td></tr>
 
        <tr><th>co<th><td>Corsican</td></tr>
 
        <tr><th>hr<th><td>Croatian</td></tr>
 
        <tr><th>cs<th><td>Czech</td></tr>
 
        <tr><th>da<th><td>Danish</td></tr>
 
        <tr><th>nl<th><td>Dutch</td></tr>
 
        <tr><th>en<th><td>English</td></tr>
 
        <tr><th>eo<th><td>Esperanto</td></tr>
 
        <tr><th>et<th><td>Estonian</td></tr>
 
        <tr><th>fo<th><td>Faeroese</td></tr>
 
        <tr><th>fa<th><td>Farsi</td></tr>
 
        <tr><th>fj<th><td>Fiji</td></tr>
 
        <tr><th>fi<th><td>Finnish</td></tr>
 
      </table>
 

	
 
    </td>
 
    <td>
 

	
 
      <table>
 
        <tr><th>fr<th><td>French</td></tr>
 
        <tr><th>fy<th><td>Frisian</td></tr>
 
        <tr><th>gl<th><td>Galician</td></tr>
 
        <tr><th>gd<th><td>Gaelic (Scottish)</td></tr>
 
        <tr><th>gv<th><td>Gaelic (Manx)</td></tr>
 
        <tr><th>ka<th><td>Georgian</td></tr>
 
        <tr><th>de<th><td>German</td></tr>
 
        <tr><th>el<th><td>Greek</td></tr>
 
        <tr><th>kl<th><td>Greenlandic</td></tr>
 
        <tr><th>gn<th><td>Guarani</td></tr>
 
        <tr><th>gu<th><td>Gujarati</td></tr>
 
        <tr><th>ht<th><td>Haitian Creole</td></tr>
 
        <tr><th>ha<th><td>Hausa</td></tr>
 
        <tr><th>he<th><td>Hebrew</td></tr>
 
        <tr><th>hi<th><td>Hindi</td></tr>
 
        <tr><th>hu<th><td>Hungarian</td></tr>
 
        <tr><th>is<th><td>Icelandic</td></tr>
 
        <tr><th>io<th><td>Ido</td></tr>
 
        <tr><th>id<th><td>Indonesian</td></tr>
 
        <tr><th>ia<th><td>Interlingua</td></tr>
 
        <tr><th>ie<th><td>Interlingue</td></tr>
 
        <tr><th>iu<th><td>Inuktitut</td></tr>
 
        <tr><th>ik<th><td>Inupiak</td></tr>
 
        <tr><th>ga<th><td>Irish</td></tr>
 
        <tr><th>it<th><td>Italian</td></tr>
 
        <tr><th>ja<th><td>Japanese</td></tr>
 
        <tr><th>jv<th><td>Javanese</td></tr>
 
        <tr><th>kn<th><td>Kannada</td></tr>
 
        <tr><th>ks<th><td>Kashmiri</td></tr>
 
        <tr><th>kk<th><td>Kazakh</td></tr>
 
        <tr><th>rw<th><td>Kinyarwanda (Ruanda)</td></tr>
 
        <tr><th>ky<th><td>Kirghiz</td></tr>
 
        <tr><th>rn<th><td>Kirundi (Rundi)</td></tr>
 
        <tr><th>ko<th><td>Korean</td></tr>
 
        <tr><th>ku<th><td>Kurdish</td></tr>
 
        <tr><th>lo<th><td>Laothian</td></tr>
 
        <tr><th>la<th><td>Latin</td></tr>
 
      </table>
 

	
 
    </td>
 
    <td>
 

	
 
      <table>
 
        <tr><th>lv<th><td>Latvian (Lettish)</td></tr>
 
        <tr><th>li<th><td>Limburgish ( Limburger)</td></tr>
 
        <tr><th>ln<th><td>Lingala</td></tr>
 
        <tr><th>lt<th><td>Lithuanian</td></tr>
 
        <tr><th>mk<th><td>Macedonian</td></tr>
 
        <tr><th>mg<th><td>Malagasy</td></tr>
 
        <tr><th>ms<th><td>Malay</td></tr>
 
        <tr><th>ml<th><td>Malayalam</td></tr>
 
        <tr><th>mt<th><td>Maltese</td></tr>
 
        <tr><th>mi<th><td>Maori</td></tr>
 
        <tr><th>mr<th><td>Marathi</td></tr>
 
        <tr><th>mo<th><td>Moldavian</td></tr>
 
        <tr><th>mn<th><td>Mongolian</td></tr>
 
        <tr><th>na<th><td>Nauru</td></tr>
 
        <tr><th>ne<th><td>Nepali</td></tr>
 
        <tr><th>no<th><td>Norwegian</td></tr>
 
        <tr><th>oc<th><td>Occitan</td></tr>
 
        <tr><th>or<th><td>Oriya</td></tr>
 
        <tr><th>om<th><td>Oromo (Afan, Galla)</td></tr>
 
        <tr><th>ps<th><td>Pashto (Pushto)</td></tr>
 
        <tr><th>pl<th><td>Polish</td></tr>
 
        <tr><th>pt<th><td>Portuguese</td></tr>
 
        <tr><th>pa<th><td>Punjabi</td></tr>
 
        <tr><th>qu<th><td>Quechua</td></tr>
 
        <tr><th>rm<th><td>Rhaeto-Romance</td></tr>
 
        <tr><th>ro<th><td>Romanian</td></tr>
 
        <tr><th>ru<th><td>Russian</td></tr>
 
        <tr><th>sm<th><td>Samoan</td></tr>
 
        <tr><th>sg<th><td>Sangro</td></tr>
 
        <tr><th>sa<th><td>Sanskrit</td></tr>
 
        <tr><th>sr<th><td>Serbian</td></tr>
 
        <tr><th>sh<th><td>Serbo-Croatian</td></tr>
 
        <tr><th>st<th><td>Sesotho</td></tr>
 
        <tr><th>tn<th><td>Setswana</td></tr>
 
        <tr><th>sn<th><td>Shona</td></tr>
 
        <tr><th>ii<th><td>Sichuan Yi</td></tr>
 
        <tr><th>sd<th><td>Sindhi</td></tr>
 
      </table>
 

	
 
    </td>
 
    <td>
 

	
 
      <table>
 
        <tr><th>si<th><td>Sinhalese</td></tr>
 
        <tr><th>ss<th><td>Siswati</td></tr>
 
        <tr><th>sk<th><td>Slovak</td></tr>
 
        <tr><th>sl<th><td>Slovenian</td></tr>
 
        <tr><th>so<th><td>Somali</td></tr>
 
        <tr><th>es<th><td>Spanish</td></tr>
 
        <tr><th>su<th><td>Sundanese</td></tr>
 
        <tr><th>sw<th><td>Swahili (Kiswahili)</td></tr>
 
        <tr><th>sv<th><td>Swedish</td></tr>
 
        <tr><th>tl<th><td>Tagalog</td></tr>
 
        <tr><th>tg<th><td>Tajik</td></tr>
 
        <tr><th>ta<th><td>Tamil</td></tr>
 
        <tr><th>tt<th><td>Tatar</td></tr>
 
        <tr><th>te<th><td>Telugu</td></tr>
 
        <tr><th>th<th><td>Thai</td></tr>
 
        <tr><th>bo<th><td>Tibetan</td></tr>
 
        <tr><th>ti<th><td>Tigrinya</td></tr>
 
        <tr><th>to<th><td>Tonga</td></tr>
 
        <tr><th>ts<th><td>Tsonga</td></tr>
 
        <tr><th>tr<th><td>Turkish</td></tr>
 
        <tr><th>tk<th><td>Turkmen</td></tr>
 
        <tr><th>tw<th><td>Twi</td></tr>
 
        <tr><th>ug<th><td>Uighur</td></tr>
 
        <tr><th>uk<th><td>Ukrainian</td></tr>
 
        <tr><th>ur<th><td>Urdu</td></tr>
 
        <tr><th>uz<th><td>Uzbek</td></tr>
 
        <tr><th>vi<th><td>Vietnamese</td></tr>
 
        <tr><th>vo<th><td>Volapük</td></tr>
 
        <tr><th>wa<th><td>Wallon</td></tr>
 
        <tr><th>cy<th><td>Welsh</td></tr>
 
        <tr><th>wo<th><td>Wolof</td></tr>
 
        <tr><th>xh<th><td>Xhosa</td></tr>
 
        <tr><th>yi<th><td>Yiddish</td></tr>
 
        <tr><th>yo<th><td>Yoruba</td></tr>
 
        <tr><th>zu<th><td>Zulu</td></tr>
 
      </table>
 

	
 
    </td>
 
  </tr>
 
</table>
ennstatus/static/js/video.js/docs/guides/options.md
Show inline comments
 
new file 100644
 
Options
 
=======
 

	
 
Setting Options
 
---------------
 

	
 
The Video.js embed code is simply an HTML5 video tag, so for many of the options you can use the standard tag attributes to set the options.
 

	
 
```html
 
<video controls autoplay preload="auto" ...>
 
```
 

	
 
Alternatively, you can use the data-setup attribute to provide options in the [JSON](http://json.org/example.html) format. This is also how you would set options that aren't standard to the video tag.
 

	
 
```html
 
<video data-setup='{ "controls": true, "autoplay": false, "preload": "auto" }'...>
 
```
 

	
 
Finally, if you're not using the data-setup attribute to trigger the player setup, you can pass in an object with the player options as the second argument in the javascript setup function.
 

	
 
```js
 
videojs("example_video_1", { "controls": true, "autoplay": false, "preload": "auto" });
 
```
 

	
 

	
 
Individual Options
 
------------------
 

	
 
> ### Note on Video Tag Attributes ###
 
> With HTML5 video tag attributes that can only be true or false (boolean), you simply include the attribute (no equals sign) to turn it on, or exclude it to turn it off. For example, to turn controls on:
 

	
 
WRONG
 
```html
 
<video controls="true" ...>
 
```
 

	
 
RIGHT
 
```html
 
<video controls ...>
 
```
 

	
 
> The biggest issue people run into is trying to set these values to false using false as the value (e.g. controls="false") which actually does the opposite and sets the value to true because the attribute is still included. If you need the attribute to include an equals sign for XHTML validation, you can set the attribute's value to the same as its name (e.g. controls="controls").
 

	
 

	
 
### controls ###
 
The controls option sets whether or not the player has controls that the user can interact with. Without controls the only way to start the video playing is with the autoplay attribute or through the API.
 

	
 
```html
 
<video controls ...>
 
or
 
{ "controls": true }
 
```
 

	
 

	
 
### autoplay ###
 
If autoplay is true, the video will start playing as soon as page is loaded (without any interaction from the user).
 
NOT SUPPORTED BY APPLE iOS DEVICES. Apple blocks the autoplay functionality in an effort to protect it's customers from unwillingly using a lot of their (often expensive) monthly data plans. A user touch/click is required to start the video in this case.
 
```html
 
<video autoplay ...>
 
or
 
{ "autoplay": true }
 
```
 

	
 

	
 
### preload ###
 
The preload attribute informs the browser whether or not the video data should begin downloading as soon as the video tag is loaded. The options are auto, metadata, and none.
 

	
 
'auto': Start loading the video immediately (if the browser agrees). Some mobile devices like iPhones and iPads will not preload the video in order to protect their users' bandwidth. This is why the value is called 'auto' and not something more final like 'true'.
 

	
 
'metadata': Load only the meta data of the video, which includes information like the duration and dimensions of the video.
 

	
 
'none': Don't preload any of the video data. This will wait until the user clicks play to begin downloading.
 

	
 
```html
 
<video preload ...>
 
or
 
{ "preload": "auto" }
 
```
 

	
 

	
 
### poster ###
 
The poster attribute sets the image that displays before the video begins playing. This is often a frame of the video or a custom title screen. As soon as the user clicks play the image will go away.
 
```html
 
<video poster="myPoster.jpg" ...>
 
or
 
{ "poster": "myPoster.jpg" }
 
```
 

	
 

	
 
### loop ###
 
The loop attribute causes the video to start over as soon as it ends. This could be used for a visual effect like clouds in the background.
 
```html
 
<video loop ...>
 
or
 
{ "loop": true }
 
```
 

	
 

	
 
### width ###
 
The width attribute sets the display width of the video.
 
```html
 
<video width="640" ...>
 
or
 
{ "width": 640 }
 
```
 

	
 

	
 
### height ###
 
The height attribute sets the display height of the video.
 
```html
 
<video height="480" ...>
 
or
 
{ "height": 480 }
 
```
 

	
 
Component Options
 
-----------------
 

	
 
You can set the options for any single player component. For instance, if you wanted to remove the `muteToggle` button, which
 
is a child of `controlBar`, you can just set that component to false:
 

	
 
```javascript
 
var player = videojs('video-id', {
 
  controlBar: {
 
    muteToggle: false
 
  }
 
});
 
```
 

	
 
This also works using the `data-setup` attribute on the video element, just remember the options need to use proper JSON
 
notation.
 

	
 
```html
 
<video ... data-setup='{ "controlBar": { "muteToggle": false } }'></video>
 
```
 

	
 
The [components guide](components.md) has an excellent breakdown of the structure of a player, you
 
just need to remember to nest child components in a `children` object for each level.
ennstatus/static/js/video.js/docs/guides/plugins.md
Show inline comments
 
new file 100644
 
Plugins
 
=======
 
If you've built something cool with Video.js, you can easily share it with the rest of the world by creating a plugin. Although, you can roll your own, you can also use [generator-videojs-plugin](https://github.com/dmlap/generator-videojs-plugin), a [Yeoman](http://yeoman.io) generator that provides scaffolding for video.js plugins including:
 
* [Grunt](http://gruntjs.com) for build management
 
* [npm](https://www.npmjs.org) for dependency management
 
* [QUnit](http://qunitjs.com) for testing
 

	
 

	
 

	
 
Step 1: Write Some Javascript
 
-----------------------------
 
You may have already done this step. Code up something interesting and then wrap it in a function. At the most basic level, that's all a video.js plugin is. By convention, plugins take a hash of options as their first argument:
 

	
 
    function examplePlugin(options) {
 
      this.on('play', function(e) {
 
        console.log('playback has started!');
 
      });
 
    };
 

	
 
When it's activated, `this` will be the Video.js player your plugin is attached to. You can use anything you'd like in the [Video.js API](api.md) when you're writing a plugin: change the `src`, mess up the DOM, or listen for and emit your own events.
 

	
 
Step 2: Registering A Plugin
 
-------------------------------
 
It's time to give the rest of the world the opportunity to be awed by your genius. When your plugin is loaded, it needs to let Video.js know this amazing new functionality is now available:
 

	
 
    videojs.plugin('examplePlugin', examplePlugin);
 

	
 
From this point on, your plugin will be added to the Video.js prototype and will show up as a property on every instance created. Make sure you choose a unique name that doesn't clash with any of the properties already in Video.js. Which leads us to...
 

	
 
Step 3: Using A Plugin
 
----------------------
 
There are two ways to initialize a plugin. If you're creating your video tag dynamically, you can specify the plugins you'd like to initialize with it and any options you want to pass to them:
 

	
 
    videojs('vidId', {
 
      plugins: {
 
        examplePlugin: {
 
          exampleOption: true
 
        }
 
      }
 
    });
 

	
 
If you've already initialized your video tag, you can activate a plugin at any time by calling its setup function directly:
 

	
 
    var video = videojs('cool-vid');
 
    video.examplePlugin({ exampleOption: true });
 

	
 
That's it. Head on over to the [Video.js wiki](https://github.com/videojs/video.js/wiki/Plugins) and add your plugin to the list so everyone else can check it out.
ennstatus/static/js/video.js/docs/guides/removing-players.md
Show inline comments
 
new file 100644
 
Removing Players
 
================
 

	
 
Sometimes, you want to remove players after page load (in single page apps or modals, for instance). It's easy to manage, but there are some simple rules you need to follow.
 

	
 
Call `.dispose()`
 
-----------------
 

	
 
To remove the html associated with your videojs player from the page always call the player's [`dispose()`](https://github.com/videojs/video.js/blob/stable/docs/api/vjs.Player.md#dispose) method:
 

	
 
```javascript```
 
var oldPlayer = document.getElementById('my-player');
 
videojs(oldPlayer).dispose(); 
 
```
 

	
 
This method will:
 

	
 
  1. reset the internal state of videojs
 
  2. remove the player's dom from the page
 

	
 
Showing / Hiding a Player
 
-------------------------
 

	
 
For instance, if you have a modal that a player appears in, you should create the player when the modal pops up. When the modal hides, dispose the player. If you try to hide the Flash tech, things will go poorly. Even with other tech, calling `dispose()` on a player that's not needed will free up resources for the browser.
 

	
 
Why Is This Needed?
 
-------------------
 

	
 
VideoJS internally tracks all players and their associated data by html id attribute. If you plan to create new players with the same id as previously created players, you'll need to call the player's dispose() method to clear VideoJS's internal state before creating the new player.
 

	
 
Signs You Did It Wrong
 
-------------------------
 

	
 
```
 
TypeError: this.el_.vjs_getProperty is not a function
 
"VIDEOJS:" "Video.js: buffered unavailable on Hls playback technology element." TypeError: this.el_.vjs_getProperty is not a function
 
Stack trace:
 
...
 
```
 

	
 
If you encounter a console error in the browser similar to the above, you've probably forgotten to `dispose()` a player before removing it from the dom. This would happen when using the [contrib-hls](https://github.com/videojs/videojs-contrib-hls) plugin.
ennstatus/static/js/video.js/docs/guides/setup.md
Show inline comments
 
new file 100644
 
Setup
 
=====
 

	
 
Video.js is pretty easy to set up. It can take a matter of seconds to get the player up and working on your web page.
 

	
 
Step 1: Include the Video.js Javascript and CSS files in the head of your page.
 
------------------------------------------------------------------------------
 

	
 
You can download the Video.js source and host it on your own servers, or use the free CDN hosted version. As of Video.js 5.0, the source is [transpiled from ES2015](http://babeljs.io/) (formerly known as ES6) to [ES5](https://es5.github.io/), but IE8 only supports ES3. In order to continue to support IE8, we've bundled an [ES5 shim and sham](https://github.com/es-shims/es5-shim) together and hosted it on the CDN.
 

	
 
```html
 
<script src="//vjs.zencdn.net/ie8/1.1.0/videojs-ie8.min.js"></script>
 
```
 

	
 
### CDN Version ###
 
```html
 
<link href="//vjs.zencdn.net/4.12/video-js.min.css" rel="stylesheet">
 
<script src="//vjs.zencdn.net/4.12/video.min.js"></script>
 
```
 

	
 
We include a stripped down Google Analytics pixel that tracks a random percentage (currently 1%) of players loaded from the CDN. This allows us to see (roughly) what browsers are in use in the wild, along with other useful metrics such as OS and device. If you'd like to disable analytics, you can simply include the following global **before** including Video.js:
 

	
 
```js
 
window.HELP_IMPROVE_VIDEOJS = false;
 
```
 

	
 
## Install via package manager
 

	
 
### NPM
 
```
 
$ npm install --save video.js
 
```
 

	
 
### Bower
 
```
 
$ bower install --save video.js
 
```
 

	
 

	
 
### Self Hosted. ###
 
To entirely self-host, you'll need to pull in the font files and let Video.js know where the swf is located. If you simply copy the dist folder or zip file contents into your project everything
 
should Just Work™, but the paths can easily be changed by editing the LESS file and re-building, or by modifying the generated CSS file.
 

	
 
```html
 
<link href="//example.com/path/to/video-js.min.css" rel="stylesheet">
 
<script src="//example.com/path/to/video.min.js"></script>
 
<script>
 
  videojs.options.flash.swf = "http://example.com/path/to/video-js.swf"
 
</script>
 
```
 

	
 

	
 
Step 2: Add an HTML5 video tag to your page.
 
--------------------------------------------
 
With Video.js you just use an HTML5 video tag to embed a video. Video.js will then read the tag and make it work in all browsers, not just ones that support HTML5 video. Beyond the basic markup, Video.js needs a few extra pieces.
 

	
 
> Note: The `data-setup` attribute described here should not be used if you use the alternative setup described in the next section.
 

	
 
  1. The 'data-setup' Attribute tells Video.js to automatically set up the video when the page is ready, and read any options (in JSON format) from the attribute (see [options](options.md)). There are other methods for initializing the player, but this is the easiest.
 

	
 
  2. The 'id' Attribute: Should be used and unique for every video on the same page.
 

	
 
  3. The 'class' attribute contains two classes:
 
    - `video-js` applies styles that are required for Video.js functionality, like fullscreen and subtitles.
 
    - `vjs-default-skin` applies the default skin to the HTML controls, and can be removed or overridden to create your own controls design.
 

	
 
Otherwise include/exclude attributes, settings, sources, and tracks exactly as you would for HTML5 video.*
 
```html
 
<video id="example_video_1" class="video-js vjs-default-skin"
 
  controls preload="auto" width="640" height="264"
 
  poster="http://video-js.zencoder.com/oceans-clip.png"
 
  data-setup='{"example_option":true}'>
 
 <source src="http://video-js.zencoder.com/oceans-clip.mp4" type='video/mp4' />
 
 <source src="http://video-js.zencoder.com/oceans-clip.webm" type='video/webm' />
 
 <source src="http://video-js.zencoder.com/oceans-clip.ogv" type='video/ogg' />
 
 <p class="vjs-no-js">To view this video please enable JavaScript, and consider upgrading to a web browser that <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a></p>
 
</video>
 
```
 

	
 
By default, the big play button is located in the upper left hand corner so it doesn't cover up the interesting parts of the poster. If you'd prefer to center the big play button, you can add an additional `vjs-big-play-centered` class to your video element. For example:
 

	
 
```html
 
<video id="example_video_1" class="video-js vjs-default-skin vjs-big-play-centered"
 
  controls preload="auto" width="640" height="264"
 
  poster="http://video-js.zencoder.com/oceans-clip.png"
 
  data-setup='{"example_option":true}'>
 
  ...
 
</video>
 
```
 

	
 
Alternative Setup for Dynamically Loaded HTML
 
---------------------------------------------
 
If your web page or application loads the video tag dynamically (ajax, appendChild, etc.), so that it may not exist when the page loads, you'll want to manually set up the player instead of relying on the data-setup attribute. To do this, first remove the data-setup attribute from the tag so there's no confusion around when the player is initialized. Next, run the following javascript some time after the Video.js javascript library has loaded, and after the video tag has been loaded into the DOM.
 
```js
 
videojs("example_video_1", {}, function(){
 
  // Player (this) is initialized and ready.
 
});
 
```
 

	
 
The first argument in the `videojs` function is the ID of your video tag. Replace it with your own.
 

	
 
The second argument is an options object. It allows you to set additional options like you can with the data-setup attribute.
 

	
 
The third argument is a 'ready' callback. Once Video.js has initialized it will call this function.
 

	
 
Instead of using an element ID, you can also pass a reference to the element itself.
 

	
 
```js
 
videojs(document.getElementById('example_video_1'), {}, function() {
 
  // This is functionally the same as the previous example.
 
});
 
```
 

	
 
```js
 
videojs(document.getElementsByClassName('awesome_video_class')[0], {}, function() {
 
  // You can grab an element by class if you'd like, just make sure
 
  // if it's an array that you pick one (here we chose the first).
 
});
 
```
 

	
 
\* If you have trouble playing back content you know is in the [correct format](http://blog.zencoder.com/2013/09/13/what-formats-do-i-need-for-html5-video/), your HTTP server might not be delivering the content with the correct [MIME type](http://en.wikipedia.org/wiki/Internet_media_type#Type_video). Please double check your content's headers before opening an [issue](https://github.com/videojs/video.js/blob/master/CONTRIBUTING.md).
ennstatus/static/js/video.js/docs/guides/skins.md
Show inline comments
 
new file 100644
 
Skins
 
=====
 

	
 
The base Video.js skin is made using HTML and CSS (although we use the [Sass preprocessor](http://sass-lang.com)), and by default these styles are added to the dom for you! That means you can build a custom skin by simply taking advantage of the cascading aspect of CSS and overriding
 
the styles you'd like to change.
 

	
 
If you don't want Video.js to inject the base styles for you, you can disable it by setting `window.VIDEOJS_NO_BASE_THEME = false` before Video.js is loaded. Keep in mind that without these base styles
 
enabled, you'll need to manually include them.
 

	
 
## Icons
 

	
 
You can view all of the icons available in the base theme by renaming and viewing [`icons.html.example`](../../sandbox/icons.html.example) in the sandbox directory.
 

	
 
## Customization
 

	
 
When you create a new skin, the easiest way to get started is to simply override the base Video.js theme. You should include a new class matching the
 
name of your theme, then just start overriding!
 

	
 
```css
 
.vjs-skin-hotdog-stand { color: #FF0000; }
 
.vjs-skin-hotdog-stand .vjs-control-bar { background: #FFFF00; }
 
.vjs-skin-hotdog-stand .vjs-play-progress { background: #FF0000; }
 
```
 

	
 
This would take care of the major areas of the skin (play progress, the control bar background, and icon colors), but you can skin any other aspect.
 
Our suggestion is to use a browser such as Firefox and Chrome, and use the developer tools to inspect the different elements and see what you'd like to change and what classes
 
to target when you do so.
 

	
 
More custom skins will be available for download soon. If you have one you like you can share it by forking [this example on CodePen.io](http://codepen.io/heff/pen/EarCt), and adding a link on the [Skins wiki page](https://github.com/videojs/video.js/wiki/Skins).
ennstatus/static/js/video.js/docs/guides/tech.md
Show inline comments
 
new file 100644
 
Playback Technology ("Tech")
 
============================
 
Playback Technology refers to the specific browser or plugin technology used to play the video or audio. When using HTML5, the playback technology is the video or audio element. When using Flash, the playback technology is the specific Flash player used, e.g. Flowplayer, YouTube Player, video-js.swf, etc. (not just "Flash"). This could also include Silverlight, Quicktime, or any other plugin that will play back video in the browser, as long as there is an API wrapper written for it.
 

	
 
Essentially we're using HTML5 and plugins only as video decoders, and using HTML and JavaScript to create a consistent API and skinning experience across all of them.
 

	
 
Building an API Wrapper
 
-----------------------
 
We'll write a more complete guide on writing a wrapper soon, but for now the best resource is the [Video.js](https://github.com/zencoder/video-js/tree/master/src) source where you can see how both the HTML5 and video-js.swf API wrappers were created.
 

	
 
Required Methods
 
----------------
 
canPlayType
 
play
 
pause
 
currentTime
 
volume
 
duration
 
buffered
 
supportsFullScreen
 

	
 
Required Events
 
---------------
 
loadstart
 
play
 
pause
 
playing
 
ended
 
volumechange
 
durationchange
 
error
 

	
 
Optional Events (include if supported)
 
--------------------------------------
 
timeupdate
 
progress
 
enterFullScreen
 
exitFullScreen
 

	
 
Adding Playback Technology
 
==================
 
When adding additional Tech to a video player, make sure to add the supported tech to the video object.
 

	
 
### Tag Method: ###
 
    <video data-setup='{"techOrder": ["html5", "flash", "other supported tech"]}'
 

	
 
### Object Method: ###
 
    videojs("videoID", {
 
      techOrder: ["html5", "flash", "other supported tech"]
 
    });
 

	
 
Flash Technology
 
==================
 
The Flash playback tech is a part of the default `techOrder`. You may notice undesirable playback behavior in browsers that are subject to using this playback tech, in particular when scrubbing and seeking within a video. This behavior is a result of Flash's progressive video playback.
 

	
 
Enabling Streaming Playback
 
--------------------------------
 
In order to force the Flash tech to choose streaming playback, you need to provide a valid streaming source **before other valid Flash video sources**. This is necessary because of the source selection algorithm, where playback tech chooses the first possible source object with a valid type. Valid streaming `type` values include `rtmp/mp4` and `rtmp/flv`. The streaming `src` value requires valid connection and stream strings, separated by an `&`. An example of supplying a streaming source through your HTML markup might look like:
 

	
 
    <source src="rtmp://your.streaming.provider.net/cfx/st/&mp4:path/to/video.mp4" type="rtmp/mp4">
 
    <source src="http://your.static.provider.net/path/to/video.mp4" type="video/mp4">
 
    <source src="http://your.static.provider.net/path/to/video.webm" type="video/webm">
 

	
 
You may optionally use the last `/` as the separator between connection and stream strings, for example:
 

	
 
    <source src="rtmp://your.streaming.provider.net/cfx/st/mp4:video.mp4" type="rtmp/mp4">
 

	
 
All four RTMP protocols are valid in the `src` (RTMP, RTMPT, RTMPE, and RTMPS).
ennstatus/static/js/video.js/docs/guides/tracks.md
Show inline comments
 
new file 100644
 
Tracks
 
======
 

	
 
Text Tracks are a function of HTML5 video for providing time triggered text to the viewer. Video.js makes tracks work across all browsers. There are currently five types of tracks:
 

	
 
- **Subtitles**: Translations of the dialogue in the video for when audio is available but not understood. Subtitles are shown over the video.
 
- **Captions**: Transcription of the dialogue, sound effects, musical cues, and other audio information for when the viewer is deaf/hard of hearing, or the video is muted. Captions are also shown over the video.
 
- **Chapters**: Chapter titles that are used to create navigation within the video. Typically they're in the form of a list of chapters that the viewer can click on to go to a specific chapter.
 
- **Descriptions** (not supported yet): Text descriptions of what's happening in the video for when the video portion isn't available, because the viewer is blind, not using a screen, or driving and about to crash because they're trying to enjoy a video while driving. Descriptions are read by a screen reader or turned into a separate audio track.
 
- **Metadata** (not supported yet): Tracks that have data meant for javascript to parse and do something with. These aren't shown to the user.
 

	
 
Creating the Text File
 
----------------------
 
Timed text requires a text file in [WebVTT](http://dev.w3.org/html5/webvtt/) format. This format defines a list of "cues" that have a start time, and end time, and text to display.
 

	
 
When creating captions, there's also additional [caption formatting techniques] (http://www.theneitherworld.com/mcpoodle/SCC_TOOLS/DOCS/SCC_FORMAT.HTML#style) that would be good to use, like brackets around sound effects: [ sound effect ]. If you'd like a more in depth style guide for captioning, you can reference the [Captioning Key](http://www.dcmp.org/captioningkey/), but keep in mind not all features are supported by WebVTT or (more likely) the Video.js WebVTT implementation.
 

	
 
Adding to Video.js
 
------------------
 
Once you have your WebVTT file created, you can add it to Video.js using the track tag. Put your track tag after all the source elements, and before any fallback content.
 

	
 
```html
 
<video id="example_video_1" class="video-js vjs-default-skin"  
 
  controls preload="auto" width="640" height="264"  
 
  data-setup='{"example_option":true}'>  
 
 <source src="http://video-js.zencoder.com/oceans-clip.mp4" type='video/mp4' />  
 
 <source src="http://video-js.zencoder.com/oceans-clip.webm" type='video/webm' />  
 
 <source src="http://video-js.zencoder.com/oceans-clip.ogv" type='video/ogg' />  
 

	
 
 <track kind="captions" src="http://example.com/path/to/captions.vtt" srclang="en" label="English" default>
 

	
 
</video>
 
```
 

	
 
Subtitles from Another Domain
 
-----------------------------
 
Because we're pulling in the text track file via Javascript, the [same-origin policy](http://en.wikipedia.org/wiki/Same_origin_policy) applies. If you'd like to have a player served from one domain,
 
but the text track served from another, you'll need to [enable CORS](http://enable-cors.org/) in order to do so.
 

	
 
Track Attributes
 
----------------
 
Additional settings for track tags.
 

	
 
### kind
 
One of the five track types listed above. Kind defaults to subtitles if no kind is included.
 

	
 
### label
 
The label for the track that will be show to the user, for example in a menu that list the different languages available for subtitles.
 

	
 
### default
 
The default attribute can be used to have a track default to showing. Otherwise the viewer would need to select their language from the captions or subtitles menu.
 
NOTE: For chapters, default is required if you want the chapters menu to show.
 

	
 
### srclang
 
The two-letter code (valid BCP 47 language tag) for the language of the text track, for example "en" for English. Here's a list of available language codes.
 

	
 
<table border="0" cellspacing="5" cellpadding="5">
 
  <tr>
 
    <td>
 

	
 
      <table>
 
        <tr><th>ab<th><td>Abkhazian</td></tr>
 
        <tr><th>aa<th><td>Afar</td></tr>
 
        <tr><th>af<th><td>Afrikaans</td></tr>
 
        <tr><th>sq<th><td>Albanian</td></tr>
 
        <tr><th>am<th><td>Amharic</td></tr>
 
        <tr><th>ar<th><td>Arabic</td></tr>
 
        <tr><th>an<th><td>Aragonese</td></tr>
 
        <tr><th>hy<th><td>Armenian</td></tr>
 
        <tr><th>as<th><td>Assamese</td></tr>
 
        <tr><th>ay<th><td>Aymara</td></tr>
 
        <tr><th>az<th><td>Azerbaijani</td></tr>
 
        <tr><th>ba<th><td>Bashkir</td></tr>
 
        <tr><th>eu<th><td>Basque</td></tr>
 
        <tr><th>bn<th><td>Bengali (Bangla)</td></tr>
 
        <tr><th>dz<th><td>Bhutani</td></tr>
 
        <tr><th>bh<th><td>Bihari</td></tr>
 
        <tr><th>bi<th><td>Bislama</td></tr>
 
        <tr><th>br<th><td>Breton</td></tr>
 
        <tr><th>bg<th><td>Bulgarian</td></tr>
 
        <tr><th>my<th><td>Burmese</td></tr>
 
        <tr><th>be<th><td>Byelorussian (Belarusian)</td></tr>
 
        <tr><th>km<th><td>Cambodian</td></tr>
 
        <tr><th>ca<th><td>Catalan</td></tr>
 
        <tr><th>zh<th><td>Chinese (Simplified)</td></tr>
 
        <tr><th>zh<th><td>Chinese (Traditional)</td></tr>
 
        <tr><th>co<th><td>Corsican</td></tr>
 
        <tr><th>hr<th><td>Croatian</td></tr>
 
        <tr><th>cs<th><td>Czech</td></tr>
 
        <tr><th>da<th><td>Danish</td></tr>
 
        <tr><th>nl<th><td>Dutch</td></tr>
 
        <tr><th>en<th><td>English</td></tr>
 
        <tr><th>eo<th><td>Esperanto</td></tr>
 
        <tr><th>et<th><td>Estonian</td></tr>
 
        <tr><th>fo<th><td>Faeroese</td></tr>
 
        <tr><th>fa<th><td>Farsi</td></tr>
 
        <tr><th>fj<th><td>Fiji</td></tr>
 
        <tr><th>fi<th><td>Finnish</td></tr>
 
      </table>
 

	
 
    </td>
 
    <td>
 

	
 
      <table>
 
        <tr><th>fr<th><td>French</td></tr>
 
        <tr><th>fy<th><td>Frisian</td></tr>
 
        <tr><th>gl<th><td>Galician</td></tr>
 
        <tr><th>gd<th><td>Gaelic (Scottish)</td></tr>
 
        <tr><th>gv<th><td>Gaelic (Manx)</td></tr>
 
        <tr><th>ka<th><td>Georgian</td></tr>
 
        <tr><th>de<th><td>German</td></tr>
 
        <tr><th>el<th><td>Greek</td></tr>
 
        <tr><th>kl<th><td>Greenlandic</td></tr>
 
        <tr><th>gn<th><td>Guarani</td></tr>
 
        <tr><th>gu<th><td>Gujarati</td></tr>
 
        <tr><th>ht<th><td>Haitian Creole</td></tr>
 
        <tr><th>ha<th><td>Hausa</td></tr>
 
        <tr><th>he<th><td>Hebrew</td></tr>
 
        <tr><th>hi<th><td>Hindi</td></tr>
 
        <tr><th>hu<th><td>Hungarian</td></tr>
 
        <tr><th>is<th><td>Icelandic</td></tr>
 
        <tr><th>io<th><td>Ido</td></tr>
 
        <tr><th>id<th><td>Indonesian</td></tr>
 
        <tr><th>ia<th><td>Interlingua</td></tr>
 
        <tr><th>ie<th><td>Interlingue</td></tr>
 
        <tr><th>iu<th><td>Inuktitut</td></tr>
 
        <tr><th>ik<th><td>Inupiak</td></tr>
 
        <tr><th>ga<th><td>Irish</td></tr>
 
        <tr><th>it<th><td>Italian</td></tr>
 
        <tr><th>ja<th><td>Japanese</td></tr>
 
        <tr><th>jv<th><td>Javanese</td></tr>
 
        <tr><th>kn<th><td>Kannada</td></tr>
 
        <tr><th>ks<th><td>Kashmiri</td></tr>
 
        <tr><th>kk<th><td>Kazakh</td></tr>
 
        <tr><th>rw<th><td>Kinyarwanda (Ruanda)</td></tr>
 
        <tr><th>ky<th><td>Kirghiz</td></tr>
 
        <tr><th>rn<th><td>Kirundi (Rundi)</td></tr>
 
        <tr><th>ko<th><td>Korean</td></tr>
 
        <tr><th>ku<th><td>Kurdish</td></tr>
 
        <tr><th>lo<th><td>Laothian</td></tr>
 
        <tr><th>la<th><td>Latin</td></tr>
 
      </table>
 

	
 
    </td>
 
    <td>
 

	
 
      <table>
 
        <tr><th>lv<th><td>Latvian (Lettish)</td></tr>
 
        <tr><th>li<th><td>Limburgish ( Limburger)</td></tr>
 
        <tr><th>ln<th><td>Lingala</td></tr>
 
        <tr><th>lt<th><td>Lithuanian</td></tr>
 
        <tr><th>mk<th><td>Macedonian</td></tr>
 
        <tr><th>mg<th><td>Malagasy</td></tr>
 
        <tr><th>ms<th><td>Malay</td></tr>
 
        <tr><th>ml<th><td>Malayalam</td></tr>
 
        <tr><th>mt<th><td>Maltese</td></tr>
 
        <tr><th>mi<th><td>Maori</td></tr>
 
        <tr><th>mr<th><td>Marathi</td></tr>
 
        <tr><th>mo<th><td>Moldavian</td></tr>
 
        <tr><th>mn<th><td>Mongolian</td></tr>
 
        <tr><th>na<th><td>Nauru</td></tr>
 
        <tr><th>ne<th><td>Nepali</td></tr>
 
        <tr><th>no<th><td>Norwegian</td></tr>
 
        <tr><th>oc<th><td>Occitan</td></tr>
 
        <tr><th>or<th><td>Oriya</td></tr>
 
        <tr><th>om<th><td>Oromo (Afan, Galla)</td></tr>
 
        <tr><th>ps<th><td>Pashto (Pushto)</td></tr>
 
        <tr><th>pl<th><td>Polish</td></tr>
 
        <tr><th>pt<th><td>Portuguese</td></tr>
 
        <tr><th>pa<th><td>Punjabi</td></tr>
 
        <tr><th>qu<th><td>Quechua</td></tr>
 
        <tr><th>rm<th><td>Rhaeto-Romance</td></tr>
 
        <tr><th>ro<th><td>Romanian</td></tr>
 
        <tr><th>ru<th><td>Russian</td></tr>
 
        <tr><th>sm<th><td>Samoan</td></tr>
 
        <tr><th>sg<th><td>Sangro</td></tr>
 
        <tr><th>sa<th><td>Sanskrit</td></tr>
 
        <tr><th>sr<th><td>Serbian</td></tr>
 
        <tr><th>sh<th><td>Serbo-Croatian</td></tr>
 
        <tr><th>st<th><td>Sesotho</td></tr>
 
        <tr><th>tn<th><td>Setswana</td></tr>
 
        <tr><th>sn<th><td>Shona</td></tr>
 
        <tr><th>ii<th><td>Sichuan Yi</td></tr>
 
        <tr><th>sd<th><td>Sindhi</td></tr>
 
      </table>
 

	
 
    </td>
 
    <td>
 

	
 
      <table>
 
        <tr><th>si<th><td>Sinhalese</td></tr>
 
        <tr><th>ss<th><td>Siswati</td></tr>
 
        <tr><th>sk<th><td>Slovak</td></tr>
 
        <tr><th>sl<th><td>Slovenian</td></tr>
 
        <tr><th>so<th><td>Somali</td></tr>
 
        <tr><th>es<th><td>Spanish</td></tr>
 
        <tr><th>su<th><td>Sundanese</td></tr>
 
        <tr><th>sw<th><td>Swahili (Kiswahili)</td></tr>
 
        <tr><th>sv<th><td>Swedish</td></tr>
 
        <tr><th>tl<th><td>Tagalog</td></tr>
 
        <tr><th>tg<th><td>Tajik</td></tr>
 
        <tr><th>ta<th><td>Tamil</td></tr>
 
        <tr><th>tt<th><td>Tatar</td></tr>
 
        <tr><th>te<th><td>Telugu</td></tr>
 
        <tr><th>th<th><td>Thai</td></tr>
 
        <tr><th>bo<th><td>Tibetan</td></tr>
 
        <tr><th>ti<th><td>Tigrinya</td></tr>
 
        <tr><th>to<th><td>Tonga</td></tr>
 
        <tr><th>ts<th><td>Tsonga</td></tr>
 
        <tr><th>tr<th><td>Turkish</td></tr>
 
        <tr><th>tk<th><td>Turkmen</td></tr>
 
        <tr><th>tw<th><td>Twi</td></tr>
 
        <tr><th>ug<th><td>Uighur</td></tr>
 
        <tr><th>uk<th><td>Ukrainian</td></tr>
 
        <tr><th>ur<th><td>Urdu</td></tr>
 
        <tr><th>uz<th><td>Uzbek</td></tr>
 
        <tr><th>vi<th><td>Vietnamese</td></tr>
 
        <tr><th>vo<th><td>Volapük</td></tr>
 
        <tr><th>wa<th><td>Wallon</td></tr>
 
        <tr><th>cy<th><td>Welsh</td></tr>
 
        <tr><th>wo<th><td>Wolof</td></tr>
 
        <tr><th>xh<th><td>Xhosa</td></tr>
 
        <tr><th>yi<th><td>Yiddish</td></tr>
 
        <tr><th>yo<th><td>Yoruba</td></tr>
 
        <tr><th>zu<th><td>Zulu</td></tr>
 
      </table>
 

	
 
    </td>
 
  </tr>
 
</table>
ennstatus/static/js/video.js/docs/index.md
Show inline comments
 
new file 100644
 
[Video.js homepage](http://videojs.com)
 

	
 
<h1>Video.js Documentation</h1>
 

	
 
There are two categories of docs: [Guides](./guides/) and [API docs](./api/). Guides explain general topics and use cases (e.g. setup). API docs are automatically generated from the codebase and give specific details about functions, properties, and events.
 

	
 
(Corrections and additions welcome)
 

	
 
## Guides
 

	
 
### Getting Started
 

	
 
* [Setup](./guides/setup.md) - The setup documentation gives a deeper view of the additional methods you can use to trigger the player setup.
 

	
 
* [Options](./guides/options.md) - There are a number of options that can be used to change how the player behaves, starting with the HTML5 media options like autoplay and preload, and expanding to Video.js specific options.
 

	
 
* [Tracks](./guides/tracks.md) - Text Tracks are used to display subtitles and captions, and add a menu for navigating between chapters in a video.
 

	
 
### Customizing
 

	
 
* [API](./guides/api.md) - The Video.js API allows you to control the video through javascript or trigger event listeners, whether the video is playing through HTML5, flash, or another playback technology.
 

	
 
* [Skins](./guides/skins.md) - You can change the look of the player across playback technologies just by editing a CSS file. The skins documentation gives you a intro to how the HTML and CSS of the default skin is put together.
 

	
 
* [Tech](./guides/tech.md) - A 'playback technology' is the term we're using to represent HTML5 video, Flash, and other video plugins, as well as other players like the YouTube player. Basically anything that has a unique API to audio or video. Additional playback technologies can be added relatively easily.
 

	
 
* [Plugins](./guides/plugins.md) - You can package up interesting Video.js customizations and reuse them elsewhere. Find out how to build your own plugin or use one created by someone else.
 

	
 
### Resources
 

	
 
* [Glossary](./guides/glossary.md) - Some helpful definitions.
 

	
 
* [Removing Players](./guides/removing-players.md) - Helpful for using VideoJS in single page apps.
 

	
 
## API Docs
 
- The most relevant API doc is the [player API doc](./api/vjs.Player.md).
 
- [Full list of API Docs](./api/)
ennstatus/static/js/video.js/sandbox/icons.html.example
Show inline comments
 
new file 100644
 
<!DOCTYPE html>
 
<html>
 
<head>
 
  <meta charset="utf-8" />
 
  <title>Video.js Icons Sandbox</title>
 

	
 
  <link href="../build/temp/video-js.css" rel="stylesheet" type="text/css">
 

	
 
  <style>
 
  .icon-list li span { font-size: 150% }
 
  </style>
 
</head>
 
<body>
 
  <h1>Video.js Icons</h1>
 
  <p>This is a list of all of the icons available in the Video.js base stylesheet. The appropriate class is to the right of each icon.</p>
 

	
 
  <ul class="icon-list">
 
    <li><span class="vjs-icon-play"></span> <code>.vjs-icon-play</code></li>
 
    <li><span class="vjs-icon-pause"></span> <code>.vjs-icon-pause</code></li>
 
    <li><span class="vjs-icon-volume-mute"></span> <code>.vjs-icon-volume-mute</code></li>
 
    <li><span class="vjs-icon-volume-low"></span> <code>.vjs-icon-volume-low</code></li>
 
    <li><span class="vjs-icon-volume-mid"></span> <code>.vjs-icon-volume-mid</code></li>
 
    <li><span class="vjs-icon-volume-high"></span> <code>.vjs-icon-volume-high</code></li>
 
    <li><span class="vjs-icon-fullscreen-enter"></span> <code>.vjs-icon-fullscreen-enter</code></li>
 
    <li><span class="vjs-icon-fullscreen-exit"></span> <code>.vjs-icon-fullscreen-exit</code></li>
 
    <li><span class="vjs-icon-square"></span> <code>.vjs-icon-square</code></li>
 
    <li><span class="vjs-icon-spinner"></span> <code>.vjs-icon-spinner</code></li>
 
    <li><span class="vjs-icon-subtitles"></span> <code>.vjs-icon-subtitles</code></li>
 
    <li><span class="vjs-icon-captions"></span> <code>.vjs-icon-captions</code></li>
 
    <li><span class="vjs-icon-chapters"></span> <code>.vjs-icon-chapters</code></li>
 
    <li><span class="vjs-icon-share"></span> <code>.vjs-icon-share</code></li>
 
    <li><span class="vjs-icon-cog"></span> <code>.vjs-icon-cog</code></li>
 
    <li><span class="vjs-icon-circle"></span> <code>.vjs-icon-circle</code></li>
 
    <li><span class="vjs-icon-circle-outline"></span> <code>.vjs-icon-circle-outline</code></li>
 
    <li><span class="vjs-icon-circle-inner-circle"></span> <code>.vjs-icon-circle-inner-circle</code></li>
 
  </ul>
 
</body>
 
</html>
ennstatus/static/js/video.js/sandbox/index.html.example
Show inline comments
 
new file 100644
 
<!DOCTYPE html>
 
<html>
 
<head>
 
  <meta charset="utf-8" />
 
  <title>Video.js Sandbox</title>
 

	
 
  <!-- Add ES5 shim and sham for IE8 -->
 
  <script src="../build/temp/ie8/videojs-ie8.js"></script>
 

	
 
  <!-- Load the source files -->
 
  <link href="../build/temp/video-js.css" rel="stylesheet" type="text/css">
 
  <script src="../build/temp/video.js"></script>
 

	
 
  <!-- Set the location of the flash SWF -->
 
  <script>
 
    videojs.options.flash.swf = '../build/temp/video-js.swf';
 
  </script>
 

	
 
</head>
 
<body>
 
  <div style="background-color:#eee; border: 1px solid #777; padding: 10px; margin-bottom: 20px; font-size: .8em; line-height: 1.5em; font-family: Verdana, sans-serif;">
 
    <p>You can use /sandbox/ for writing and testing your own code. Nothing in /sandbox/ will get checked into the repo, except files that end in .example (so don't edit or add those files). To get started make a copy of index.html.example and rename it to index.html.</p>
 
    <pre>cp sandbox/index.html.example sandbox/index.html</pre>
 
    <pre>grunt watch</pre>
 
    <pre>grunt connect</pre>
 
    <pre>open http://localhost:9999/sandbox/index.html</pre>
 
  </div>
 

	
 
  <video id="vid1" class="video-js vjs-default-skin" controls preload="auto" width="640" height="264"
 
      poster="http://video-js.zencoder.com/oceans-clip.png"
 
      data-setup='{}'>
 
    <source src="http://video-js.zencoder.com/oceans-clip.mp4" type='video/mp4'>
 
    <source src="http://video-js.zencoder.com/oceans-clip.webm" type='video/webm'>
 
    <source src="http://video-js.zencoder.com/oceans-clip.ogv" type='video/ogg'>
 
    <track kind="captions" src="../docs/examples/shared/example-captions.vtt" srclang="en" label="English"></track><!-- Tracks need an ending tag thanks to IE9 -->
 
    <p class="vjs-no-js">To view this video please enable JavaScript, and consider upgrading to a web browser that <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a></p>
 
  </video>
 

	
 
  <script>
 
    vid = document.getElementById("vid1");
 
  </script>
 

	
 
</body>
 
</html>
ennstatus/static/js/video.js/sandbox/language.html.example
Show inline comments
 
new file 100644
 
<!DOCTYPE html>
 
<!-- Set Page Language Here -->
 
<html lang="es">
 
<head>
 
  <meta charset="utf-8" />
 
  <title>VideoJS Languages Demo</title>
 

	
 
  <!-- Add ES5 shim and sham for IE8 -->
 
  <script src="../build/temp/ie8/videojs-ie8.js"></script>
 

	
 
  <!-- Load the source files -->
 
  <link href="../build/temp/video-js.css" rel="stylesheet" type="text/css">
 
  <script src="../build/temp/video.js"></script>
 

	
 
  <!-- Set the location of the flash SWF -->
 
  <script>
 
    videojs.options.flash.swf = '../build/temp/video-js.swf';
 
  </script>
 

	
 
  <!-- Add support for Spanish 'es' -->
 
  <script>
 
    videojs.addLanguage('es', {
 
      "Play": "Juego",
 
      "Pause": "Pausa",
 
      "Current Time": "Tiempo Actual",
 
      "Duration Time": "Tiempo de Duracion",
 
      "Remaining Time": "Tiempo Restante",
 
      "Stream Type": "Tipo de Transmision",
 
      "LIVE": "En Vivo",
 
      "Loaded": "Cargado",
 
      "Progress": "Progreso",
 
      "Fullscreen": "Pantalla Completa",
 
      "Non-Fullscreen": "No Pantalla Completa",
 
      "Mute": "Mudo",
 
      "Unmuted": "Activar sonido",
 
      "Playback Rate": "Reproduccion Cambio",
 
      "Subtitles": "Subtitulos",
 
      "subtitles off": "subtitulos fuera",
 
      "Captions": "Subtitulos",
 
      "captions off": "subtitulos fuera",
 
      "Chapters": "Capitulos",
 
      "You aborted the video playback": "Ha anulado la reproduccion de video",
 
      "A network error caused the video download to fail part-way.": "Un error en la red hizo que la descarga de video falle parte del camino.",
 
      "The video could not be loaded, either because the server or network failed or because the format is not supported.": "El video no se puede cargar, ya sea porque el servidor o la red fracasaron o porque el formato no es compatible.",
 
      "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "La reproduccion de video se ha cancelado debido a un problema de corrupcion o porque el video utilizado cuenta con su navegador no soporta.",
 
      "No compatible source was found for this video.": "Ninguna fuente compatible se encontro para este video."
 
    });
 
  </script>
 

	
 
</head>
 
<body>
 
  <video id="vid1" class="video-js vjs-default-skin" controls preload="auto" width="640" height="264" data-setup=''>
 
    <!--
 
    <source src="http://video-js.zencoder.com/oceans-clip.mp4" type='video/mp4'>
 
    <source src="http://video-js.zencoder.com/oceans-clip.webm" type='video/webm'>
 
    <source src="http://video-js.zencoder.com/oceans-clip.ogv" type='video/ogg'>
 
    -->
 
  </video>
 

	
 
  <script>
 
    var player = videojs("vid1");
 
    player.controlBar.show();
 
    player.error(1);
 
  </script>
 

	
 
</body>
 
</html>
ennstatus/static/js/video.js/sandbox/plugin.html.example
Show inline comments
 
new file 100644
 
<!DOCTYPE html>
 
<html>
 
<head>
 
  <meta charset="utf-8" />
 
  <title>Video.js Plugin Example</title>
 

	
 
  <!-- Add ES5 shim and sham for IE8 -->
 
  <script src="../build/temp/ie8/videojs-ie8.js"></script>
 

	
 
  <!-- Load the source files -->
 
  <link href="../build/temp/video-js.css" rel="stylesheet" type="text/css">
 
  <script src="../build/temp/video.js"></script>
 

	
 
  <!-- Set the location of the flash SWF -->
 
  <script>
 
    videojs.options.flash.swf = '../build/temp/video-js.swf';
 
  </script>
 

	
 
</head>
 
<body>
 
  <p style="background-color:#eee; border: 1px solid #777; padding: 10px; font-size: .8em; line-height: 1.5em; font-family: Verdana, sans-serif;">This page shows you how to create, register and initialize a Video.js plugin.</p>
 

	
 
  <video id="vid1" class="video-js vjs-default-skin" controls preload="auto" width="640" height="264" poster="http://video-js.zencoder.com/oceans-clip.png">
 
    <source src="http://video-js.zencoder.com/oceans-clip.mp4" type='video/mp4'>
 
    <source src="http://video-js.zencoder.com/oceans-clip.webm" type='video/webm'>
 
    <source src="http://video-js.zencoder.com/oceans-clip.ogv" type='video/ogg'>
 
    <p>Video Playback Not Supported</p>
 
  </video>
 

	
 
  <script>
 
    (function() {
 
      var vid1, progressed;
 

	
 
      // create a really simple plugin
 
      // this one just logs the buffered percentage to the console whenever
 
      // more data is downloaded
 
      progressed = function(options) {
 
        this.on('progress', function(e) {
 
          console.log(this.bufferedPercent());
 
        });
 
      };
 

	
 
      // register the plugin
 
      vjs.plugin('progressed', progressed);
 

	
 
      // initialize it
 
      vid1 = vjs('vid1');
 
      vid1.progressed();
 
    })();
 
  </script>
 

	
 
</body>
 
</html>
ennstatus/static/js/video.js/src/css/_private-variables.scss
Show inline comments
 
new file 100644
 
// Text, icons, hover states
 
$primary-foreground-color: #fff;
 

	
 
// Control backgrounds (control bar, big play, menus)
 
$primary-background-color: #2B333F !default;
 
$primary-background-transparency: 0.7 !default;
 

	
 
// Hover states, slider backgrounds
 
$secondary-background-color: lighten($primary-background-color, 33%) !default;
 
$secondary-background-transparency: 0.5 !default;
 

	
 
$text-font-family: Arial, Helvetica, sans-serif !default;
 

	
 
// Using the '--' naming for component-specific styles
 
$big-play-button--width: 3em !default;
 
$big-play-button--height: 1.5em !default;
 
$big-play-button--transparency: 0.8 !default;
ennstatus/static/js/video.js/src/css/_utilities.scss
Show inline comments
 
new file 100644
 
@mixin background-color-with-alpha($color, $alpha) {
 
  background-color: $color;
 
  background-color: rgba($color, $alpha);
 
}
 

	
 
@mixin transition($string: $transition--default) {
 
  -webkit-transition: $string;
 
  -moz-transition: $string;
 
  -o-transition: $string;
 
  transition: $string;
 
}
 

	
 
@mixin hide-visually {
 
  border: 0;
 
  clip: rect(0 0 0 0);
 
  height: 1px;
 
  margin: -1px;
 
  overflow: hidden;
 
  padding: 0;
 
  position: absolute;
 
  width: 1px;
 
}
 

	
 
@mixin border-radius($radius) {
 
  -webkit-border-radius: $radius;
 
  -moz-border-radius: $radius;
 
  border-radius: $radius;
 
}
 

	
 
@mixin animation($string: spin 1s infinite linear) {
 
  -webkit-animation: $string;
 
  -moz-animation: $string;
 
  -o-animation: $string;
 
  animation: $string;
 
}
 

	
 
@mixin display-flex($alignment: '', $justification: '') {
 
  display: -webkit-box;
 
  display: -webkit-flex;
 
  display: -ms-flexbox;
 
  display: flex;
 

	
 
  @if $alignment != '' {
 
    -webkit-box-align: $alignment;
 
    -webkit-align-items: $alignment;
 
    -ms-flex-align: $alignment;
 
    align-items: $alignment;
 
  }
 

	
 
  @if $justification != '' {
 
    -webkit-box-pack: $justification;
 
    -webkit-justify-content: $justification;
 
    -ms-flex-pack: $justification;
 
    justify-content: $justification;
 
  }
 
}
 

	
 
@mixin flex($value) {
 
  // @include context('.video-js', '.video-js.vjs-no-flex') {
 
  //   display: table-cell;
 
  //   vertical-align: middle;
 
  //   @if ($value == 'auto') {
 
  //     width: auto;
 
  //   }
 
  // }
 

	
 
  -webkit-box-flex: $value;
 
  -moz-box-flex: $value;
 
  -webkit-flex: $value;
 
  -ms-flex: $value;
 
  flex: $value;
 
}
 

	
 
// https://developer.mozilla.org/en-US/docs/Web/CSS/user-select
 
@mixin user-select($string: none) {
 
  -webkit-user-select: $string;
 
  -moz-user-select: $string;
 
  -ms-user-select: $string;
 
  user-select: $string
 
}
 

	
 
// https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow
 
@mixin box-shadow ($string: 0 0 1em rgba(0, 0, 0, 0.25)) {
 
  -webkit-box-shadow: $string;
 
  -moz-box-shadow: $string;
 
  box-shadow: $string;
 
}
 

	
 
@mixin order($value) {
 
  -webkit-box-ordinal-group: $value;
 
  -moz-box-ordinal-group: $value;
 
  -ms-flex-order: $value;
 
  -webkit-order: $value;
 
  order: $value;
 
}
 

	
 
%icon-default {
 
  position: absolute;
 
  top: 0;
 
  left: 0;
 
  width: 100%;
 
  height: 100%;
 
  text-align: center;
 
}
ennstatus/static/js/video.js/src/css/_variables.scss
Show inline comments
 
new file 100644
 
$icon-font-path: 'font' !default;
ennstatus/static/js/video.js/src/css/components/_adaptive.scss
Show inline comments
 
new file 100644
 
// When the player is absurdly tiny, display nothing but:
 
// - Play button
 
// - Fullscreen Button
 
.video-js.vjs-layout-tiny:not(.vjs-fullscreen) {
 
  .vjs-custom-control-spacer { @include flex(auto); }
 
  &.vjs-no-flex .vjs-custom-control-spacer { width: auto; }
 

	
 
  .vjs-current-time, .vjs-captions-button, .vjs-time-divider,
 
  .vjs-progress-control, .vjs-duration, .vjs-remaining-time, .vjs-playback-rate,
 
  .vjs-mute-control, .vjs-volume-control, .vjs-chapters-button, .vjs-captions-button,
 
  .vjs-subtitles-button, .vjs-volume-menu-button { display: none; }
 
}
 

	
 
// When the player is x-small, display nothing but:
 
// - Play button
 
// - Progress bar
 
// - Fullscreen Button
 
.video-js.vjs-layout-x-small:not(.vjs-fullscreen) {
 
  .vjs-current-time, .vjs-captions-button, .vjs-time-divider,
 
  .vjs-duration, .vjs-remaining-time, .vjs-playback-rate, .vjs-captions-button,
 
  .vjs-mute-control, .vjs-volume-control, .vjs-chapters-button,
 
  .vjs-subtitles-button, .vjs-volume-button, .vjs-fullscreen-control { display: none; }
 
}
 

	
 

	
 
// When the player is small, display nothing but:
 
// - Play button
 
// - Progress bar
 
// - Volume menu button
 
// - Captions Button
 
// - Fullscreen button
 
.video-js.vjs-layout-small:not(.vjs-fullscreen) {
 
  .vjs-current-time, .vjs-captions-button, .vjs-time-divider,
 
  .vjs-duration, .vjs-remaining-time, .vjs-playback-rate,
 
  .vjs-mute-control, .vjs-volume-control, .vjs-chapters-button,
 
  .vjs-subtitles-button { display: none; }
 
}
ennstatus/static/js/video.js/src/css/components/_big-play.scss
Show inline comments
 
new file 100644
 
.video-js .vjs-big-play-button {
 
  font-size: 3em;
 
  line-height: $big-play-button--height;
 
  height: $big-play-button--height;
 
  width: $big-play-button--width; // Firefox bug: For some reason without width the icon wouldn't show up. Switched to using width and removed padding.
 
  display: block;
 
  z-index: 2;
 
  position: absolute;
 
  top: 10px;
 
  left: 10px;
 
  padding: 0;
 
  cursor: pointer;
 
  opacity: 1;
 
  border: 0.06666em solid $primary-foreground-color;
 

	
 
  /* Need a slightly gray bg so it can be seen on black backgrounds */
 
  @include background-color-with-alpha($primary-background-color, $primary-background-transparency);
 
  @include border-radius(0.3em);
 
  @include transition(all 0.4s);
 

	
 
  @extend .vjs-icon-play;
 

	
 
  // Since the big play button doesn't inherit from vjs-control, we need to specify a bit more than
 
  // other buttons for the icon.
 
  &:before {
 
    @extend %icon-default;
 
  }
 
}
 

	
 
// Allow people that hate their poster image to center the big play button.
 
.vjs-big-play-centered .vjs-big-play-button {
 
  top: 50%;
 
  left: 50%;
 
  margin-top: -($big-play-button--height / 2);
 
  margin-left: -($big-play-button--width / 2);
 
}
 

	
 
.video-js:hover .vjs-big-play-button,
 
.video-js .vjs-big-play-button:focus {
 
  outline: 0;
 
  border-color: $primary-foreground-color;
 

	
 
  @include background-color-with-alpha($secondary-background-color, $secondary-background-transparency);
 
  @include transition(all 0s);
 
}
 

	
 
// Hide if controls are disabled, the video is playing, or native controls are used.
 
.vjs-controls-disabled .vjs-big-play-button,
 
.vjs-has-started .vjs-big-play-button,
 
.vjs-using-native-controls .vjs-big-play-button,
 
.vjs-error .vjs-big-play-button {
 
  display: none;
 
}
ennstatus/static/js/video.js/src/css/components/_button.scss
Show inline comments
 
new file 100644
 
.video-js button {
 
  background: none;
 
  border: none;
 
  color: inherit;
 
  display: inline-block;
 

	
 
  overflow: visible; // IE8
 
  font-size: inherit; // IE in general. WTF.
 
  line-height: inherit;
 
  text-transform: none;
 
  text-decoration: none;
 
  transition: none;
 

	
 
  -webkit-appearance: none;
 
  -moz-appearance:    none;
 
  appearance:         none;
 
}
ennstatus/static/js/video.js/src/css/components/_captions-settings.scss
Show inline comments
 
new file 100644
 
.vjs-caption-settings {
 
  position: relative;
 
  top: 1em;
 
  background-color: $primary-background-color;
 
  background-color: rgba($primary-background-color, 0.75);
 
  color: $primary-foreground-color;
 
  margin: 0 auto;
 
  padding: 0.5em;
 
  height: 15em;
 
  font-size: 12px;
 
  width: 40em;
 
}
 

	
 
.vjs-caption-settings .vjs-tracksettings {
 
  top: 0;
 
  bottom: 2em;
 
  left: 0;
 
  right: 0;
 
  position: absolute;
 
  overflow: auto;
 
}
 

	
 
.vjs-caption-settings .vjs-tracksettings-colors,
 
.vjs-caption-settings .vjs-tracksettings-font {
 
  float: left;
 
}
 
.vjs-caption-settings .vjs-tracksettings-colors:after,
 
.vjs-caption-settings .vjs-tracksettings-font:after,
 
.vjs-caption-settings .vjs-tracksettings-controls:after {
 
  clear: both;
 
}
 

	
 
.vjs-caption-settings .vjs-tracksettings-controls {
 
  position: absolute;
 
  bottom: 1em;
 
  right: 1em;
 
}
 

	
 
.vjs-caption-settings .vjs-tracksetting {
 
  margin: 5px;
 
  padding: 3px;
 
  min-height: 40px;
 
}
 
.vjs-caption-settings .vjs-tracksetting label {
 
  display: block;
 
  width: 100px;
 
  margin-bottom: 5px;
 
}
 

	
 
.vjs-caption-settings .vjs-tracksetting span {
 
  display: inline;
 
  margin-left: 5px;
 
}
 

	
 
.vjs-caption-settings .vjs-tracksetting > div {
 
  margin-bottom: 5px;
 
  min-height: 20px;
 
}
 

	
 
.vjs-caption-settings .vjs-tracksetting > div:last-child {
 
  margin-bottom: 0;
 
  padding-bottom: 0;
 
  min-height: 0;
 
}
 

	
 
.vjs-caption-settings label > input {
 
  margin-right: 10px;
 
}
 

	
 
.vjs-caption-settings input[type="button"] {
 
  width: 40px;
 
  height: 40px;
 
}
ennstatus/static/js/video.js/src/css/components/_captions.scss
Show inline comments
 
new file 100644
 
.video-js .vjs-captions-button {
 
  @extend .vjs-icon-captions;
 
}
ennstatus/static/js/video.js/src/css/components/_chapters.scss
Show inline comments
 
new file 100644
 
.video-js .vjs-chapters-button {
 
  @extend .vjs-icon-chapters;
 
}
 

	
 
.vjs-chapters-button .vjs-menu {
 
  left: -10em; /* (Width of vjs-menu - width of vjs-control) / 2 */
 
  width: 0;
 
}
 

	
 
.vjs-chapters-button .vjs-menu ul {
 
  width: 24em;
 
}
ennstatus/static/js/video.js/src/css/components/_control-bar.scss
Show inline comments
 
new file 100644
 
.video-js .vjs-control-bar {
 
  display: none;
 
  width: 100%;
 
  position: absolute;
 
  bottom: 0;
 
  left: 0;
 
  right: 0;
 
  height: 3.0em;
 

	
 
  @include background-color-with-alpha($primary-background-color, $primary-background-transparency);
 
}
 

	
 
// Video has started playing
 
.vjs-has-started .vjs-control-bar {
 
  @include display-flex;
 
  visibility: visible;
 
  opacity: 1;
 

	
 
  $trans: visibility 0.1s, opacity 0.1s; // Var needed because of comma
 
  @include transition($trans);
 
}
 

	
 
// Video has started playing AND user is inactive
 
.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {
 
  visibility: hidden;
 
  opacity: 0;
 

	
 
  $trans: visibility 1.0s, opacity 1.0s;
 
  @include transition($trans);
 
}
 

	
 
.vjs-controls-disabled .vjs-control-bar,
 
.vjs-using-native-controls .vjs-control-bar,
 
.vjs-error .vjs-control-bar {
 
  /* !important is ok in this context. */
 
  display: none !important;
 
}
 

	
 
// Don't hide the control bar if it's audio
 
.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {
 
  opacity: 1;
 
  visibility: visible;
 
}
 

	
 
/* IE8 is flakey with fonts, and you have to change the actual content to force
 
fonts to show/hide properly.
 
- "\9" IE8 hack didn't work for this
 
- Found in XP IE8 from http://modern.ie. Does not show up in "IE8 mode" in IE9
 
*/
 
$ie8screen: "\0screen";
 
.vjs-user-inactive.vjs-playing .vjs-control-bar :before {
 
  @media #{$ie8screen} { content: ""; }
 
}
 

	
 
/* IE 8 + 9 Support */
 
.vjs-has-started.vjs-no-flex .vjs-control-bar {
 
  display: table;
 
}
ennstatus/static/js/video.js/src/css/components/_control-spacer.scss
Show inline comments
 
new file 100644
 
.video-js .vjs-custom-control-spacer {
 
  display: none;
 
}
ennstatus/static/js/video.js/src/css/components/_control.scss
Show inline comments
 
new file 100644
 
// vjs-control might be better named vjs-button now.
 
// It's used on both real buttons (play button)
 
// and div buttons (menu buttons)
 
.video-js .vjs-control {
 
  outline: none;
 
  position: relative;
 
  text-align: center;
 
  margin: 0;
 
  padding: 0;
 
  height: 100%;
 
  width: 4em;
 
  @include flex(none);
 

	
 
  &:before {
 
    font-size: 1.8em;
 
    line-height: 1.67;
 

	
 
    @extend %icon-default;
 
  }
 
}
 

	
 
/* Replacement for focus outline */
 
.video-js .vjs-control:focus:before,
 
.video-js .vjs-control:hover:before,
 
.video-js .vjs-control:focus {
 
  text-shadow: 0em 0em 1em rgba($primary-foreground-color, 1);
 
}
 

	
 
/* Hide control text visually, but have it available for screenreaders */
 
.video-js .vjs-control-text {
 
  @include hide-visually;
 
}
 

	
 
/* IE 8 + 9 Support */
 
.vjs-no-flex .vjs-control {
 
  display: table-cell;
 
  vertical-align: middle;
 
}
ennstatus/static/js/video.js/src/css/components/_error.scss
Show inline comments
 
new file 100644
 
.vjs-error-display {
 
  display: none;
 
}
 

	
 
.vjs-error .vjs-error-display {
 
  display: block;
 
  position: absolute;
 
  left: 0;
 
  top: 0;
 
  width: 100%;
 
  height: 100%;
 
}
 

	
 
.vjs-error .vjs-error-display:before {
 
  content: 'X';
 
  font-family: $text-font-family;
 
  font-size: 4em;
 
  color: #fff;
 
  /* In order to center the play icon vertically we need to set the line height
 
  to the same as the button height */
 
  line-height: 1;
 
  text-shadow: 0.05em 0.05em 0.1em #000;
 
  text-align: center /* Needed for IE8 */;
 
  vertical-align: middle;
 

	
 
  position: absolute;
 
  left: 0;
 
  top: 50%;
 
  margin-top: -0.5em;
 
  width: 100%;
 
}
 

	
 
.vjs-error-display div {
 
  position: absolute;
 
  bottom: 1em;
 
  right: 0;
 
  left: 0;
 
  font-size: 1.4em;
 
  text-align: center;
 
  padding: 3px;
 

	
 
  @include background-color-with-alpha(#000, 0.5);
 
}
 

	
 
.vjs-error-display a,
 
.vjs-error-display a:visited {
 
  color: #66A8CC;
 
}
ennstatus/static/js/video.js/src/css/components/_fullscreen.scss
Show inline comments
 
new file 100644
 
.video-js .vjs-fullscreen-control {
 
  width: 3.8em;
 
  cursor: pointer;
 
  @include flex(none);
 
}
 
.video-js .vjs-fullscreen-control {
 
  @extend .vjs-icon-fullscreen-enter;
 
}
 
/* Switch to the exit icon when the player is in fullscreen */
 
.video-js.vjs-fullscreen .vjs-fullscreen-control {
 
  @extend .vjs-icon-fullscreen-exit;
 
}
ennstatus/static/js/video.js/src/css/components/_layout.scss
Show inline comments
 
new file 100644
 
.video-js {
 
  /* display:inline-block would be closer to the video el's display:inline
 
   * but it results in flash reloading when going into fullscreen [#2205]
 
   */
 
  display: block;
 
  /* Make video.js videos align top when next to video elements */
 
  vertical-align: top;
 
  box-sizing: border-box;
 

	
 
  color: $primary-foreground-color;
 
  background-color: #000;
 
  position: relative;
 
  padding: 0;
 
  /* Start with 10px for base font size so other dimensions can be em based and
 
  easily calculable. */
 
  font-size: 10px;
 
  line-height: 1;
 

	
 
  /* Provide some basic defaults for fonts */
 
  font-weight: normal;
 
  font-style: normal;
 
  /* Avoiding helvetica: issue #376 */
 
  font-family: $text-font-family;
 

	
 
  @include user-select(none);
 

	
 
  /* Fix for Firefox 9 fullscreen (only if it is enabled). Not needed when
 
  checking fullScreenEnabled. */
 
  &:-moz-full-screen { position: absolute; }
 

	
 
  &:-webkit-full-screen {
 
    width: 100% !important;
 
    height: 100% !important;
 
  }
 
}
 

	
 
/* All elements inherit border-box sizing */
 
.video-js *,
 
.video-js *:before,
 
.video-js *:after {
 
  box-sizing: inherit;
 
}
 

	
 
/* List style reset */
 
.video-js ul {
 
  font-family: inherit;
 
  font-size: inherit;
 
  line-height: inherit;
 
  list-style-position: outside;
 

	
 
  /* Important to specify each */
 
  margin-left: 0;
 
  margin-right: 0;
 
  margin-top: 0;
 
  margin-bottom: 0;
 
}
 

	
 
/* Fill the width of the containing element and use padding to create the
 
   desired aspect ratio. Default to 16x9 unless another ratio is given. */
 
@mixin apply-aspect-ratio($width, $height) {
 
  padding-top: 100% * ($height/$width);
 
}
 

	
 
/* Not including a default AR in vjs-fluid because it would override
 
   the user set AR injected into the header. */
 
.video-js.vjs-fluid,
 
.video-js.vjs-16-9,
 
.video-js.vjs-4-3 {
 
  width: 100%;
 
  max-width: 100%;
 
  height: 0;
 
}
 

	
 
.video-js.vjs-16-9 {
 
  @include apply-aspect-ratio(16, 9);
 
}
 

	
 
.video-js.vjs-4-3 {
 
  @include apply-aspect-ratio(4, 3);
 
}
 

	
 
.video-js.vjs-fill {
 
  width: 100%;
 
  height: 100%;
 
}
 

	
 
/* Playback technology elements expand to the width/height of the containing div
 
<video> or <object> */
 
.video-js .vjs-tech {
 
  position: absolute;
 
  top: 0;
 
  left: 0;
 
  width: 100%;
 
  height: 100%;
 
}
 

	
 
/* Fullscreen Styles */
 
body.vjs-full-window {
 
  padding: 0;
 
  margin: 0;
 
  height: 100%;
 
  /* Fix for IE6 full-window. http://www.cssplay.co.uk/layouts/fixed.html */
 
  overflow-y: auto;
 
}
 
.vjs-full-window .video-js.vjs-fullscreen {
 
  position: fixed;
 
  overflow: hidden;
 
  z-index: 1000;
 
  left: 0;
 
  top: 0;
 
  bottom: 0;
 
  right: 0;
 
}
 
.video-js.vjs-fullscreen {
 
  width: 100% !important;
 
  height: 100% !important;
 
  /* Undo any aspect ratio padding for fluid layouts */
 
  padding-top: 0 !important;
 
}
 
.video-js.vjs-fullscreen.vjs-user-inactive {
 
  cursor: none;
 
}
 

	
 

	
 
/* Hide disabled or unsupported controls. */
 
.vjs-hidden { display: none !important; }
 

	
 
.vjs-lock-showing {
 
  display: block !important;
 
  opacity: 1;
 
  visibility: visible;
 
}
 

	
 
/*  In IE8 w/ no JavaScript (no HTML5 shim), the video tag doesn't register.
 
The .video-js classname on the video tag also isn't considered.
 
This optional paragraph inside the video tag can provide a message to users
 
about what's required to play video. */
 
.vjs-no-js {
 
  padding: 20px;
 
  color: #fff;
 
  background-color: #000;
 
  font-size: 18px;
 
  font-family: $text-font-family;
 
  text-align: center;
 
  width: 300px;
 
  height: 150px;
 
  margin: 0px auto;
 
}
 

	
 
.vjs-no-js a,
 
.vjs-no-js a:visited {
 
  color: #66A8CC;
 
}
ennstatus/static/js/video.js/src/css/components/_live.scss
Show inline comments
 
new file 100644
 
// We are assuming there is no progress bar and using the live display
 
// to fill in the middle space. Live+DVR will need to adjust this.
 
.video-js .vjs-live-control {
 
  @include display-flex(flex-start);
 
  @include flex(auto);
 
  font-size: 1em;
 
  line-height: 3em;
 
}
 

	
 
.vjs-no-flex .vjs-live-control {
 
  display: table-cell;
 
  width: auto;
 
  text-align: left;
 
}
ennstatus/static/js/video.js/src/css/components/_loading.scss
Show inline comments
 
new file 100644
 
.vjs-loading-spinner {
 
  display: none;
 
  position: absolute;
 
  top: 50%;
 
  left: 50%;
 
  margin: -25px 0 0 -25px;
 
  opacity: 0.85;
 

	
 
  /* Need to fix centered page layouts */
 
  text-align: left;
 

	
 
  border: 6px solid rgba($primary-background-color, $primary-background-transparency);
 
  // border: 6px solid rgba(43, 51, 63, 0.5);
 

	
 
  box-sizing: border-box;
 
  background-clip: padding-box;
 
  width: 50px;
 
  height: 50px;
 
  border-radius: 25px;
 
}
 

	
 
.vjs-seeking .vjs-loading-spinner,
 
.vjs-waiting .vjs-loading-spinner {
 
  display: block;
 
}
 

	
 
.vjs-loading-spinner:before,
 
.vjs-loading-spinner:after {
 
  content: "";
 
  position: absolute;
 
  margin: -6px;
 
  box-sizing: inherit;
 
  width: inherit;
 
  height: inherit;
 
  border-radius: inherit;
 
  /* Keep 100% opacity so they don't show through each other */
 
  opacity: 1;
 
  border: inherit;
 
  border-color: transparent;
 
  border-top-color: white;
 
}
 

	
 
/* only animate when showing because it can be processor heavy */
 
.vjs-seeking .vjs-loading-spinner:before,
 
.vjs-seeking .vjs-loading-spinner:after,
 
.vjs-waiting .vjs-loading-spinner:before,
 
.vjs-waiting .vjs-loading-spinner:after {
 
  -webkit-animation: vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite, vjs-spinner-fade 1.1s linear infinite;
 
  animation: vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite, vjs-spinner-fade 1.1s linear infinite;
 
}
 

	
 
.vjs-seeking .vjs-loading-spinner:before,
 
.vjs-waiting .vjs-loading-spinner:before {
 
  border-top-color: rgb(255,255,255);
 
}
 

	
 
.vjs-seeking .vjs-loading-spinner:after,
 
.vjs-waiting .vjs-loading-spinner:after {
 
  border-top-color: rgb(255,255,255);
 
  -webkit-animation-delay: 0.44s;
 
  animation-delay: 0.44s;
 
}
 

	
 
@keyframes vjs-spinner-spin {
 
  100% {
 
    transform: rotate(360deg);
 
  }
 
}
 

	
 
@-webkit-keyframes vjs-spinner-spin {
 
  100% {
 
    -webkit-transform: rotate(360deg);
 
  }
 
}
 

	
 
@keyframes vjs-spinner-fade {
 
  0% {
 
    border-top-color: $secondary-background-color;
 
  }
 
  20% {
 
    border-top-color: $secondary-background-color;
 
  }
 
  35% {
 
    border-top-color: white;
 
  }
 
  60% {
 
    border-top-color: $secondary-background-color;
 
  }
 
  100% {
 
    border-top-color: $secondary-background-color;
 
  }
 
}
 

	
 
@-webkit-keyframes vjs-spinner-fade {
 
  0% {
 
    border-top-color: $secondary-background-color;
 
  }
 
  20% {
 
    border-top-color: $secondary-background-color;
 
  }
 
  35% {
 
    border-top-color: white;
 
  }
 
  60% {
 
    border-top-color: $secondary-background-color;
 
  }
 
  100% {
 
    border-top-color: $secondary-background-color;
 
  }
 
}
ennstatus/static/js/video.js/src/css/components/_play-pause.scss
Show inline comments
 
new file 100644
 
.video-js .vjs-play-control {
 
  cursor: pointer;
 
  @include flex(none);
 
}
 
.video-js .vjs-play-control {
 
  @extend .vjs-icon-play;
 
}
 
.video-js .vjs-play-control.vjs-playing {
 
  @extend .vjs-icon-pause;
 
}
ennstatus/static/js/video.js/src/css/components/_playback-rate.scss
Show inline comments
 
new file 100644
 
// TODO: I feel like this should be a generic menu. Research later.
 
.vjs-playback-rate .vjs-playback-rate-value {
 
  font-size: 1.5em;
 
  line-height: 2;
 
  position: absolute;
 
  top: 0;
 
  left: 0;
 
  width: 100%;
 
  height: 100%;
 
  text-align: center;
 
}
 

	
 
.vjs-playback-rate .vjs-menu {
 
  width: 4em;
 
  left: 0em;
 
}
ennstatus/static/js/video.js/src/css/components/_poster.scss
Show inline comments
 
new file 100644
 
.vjs-poster {
 
  display: inline-block;
 
  vertical-align: middle;
 
  background-repeat: no-repeat;
 
  background-position: 50% 50%;
 
  background-size: contain;
 
  cursor: pointer;
 
  margin: 0;
 
  padding: 0;
 
  position: absolute;
 
  top: 0;
 
  right: 0;
 
  bottom: 0;
 
  left: 0;
 
  height: 100%;
 
}
 

	
 
/* Used for IE8 fallback */
 
.vjs-poster img {
 
  display: block;
 
  vertical-align: middle;
 
  margin: 0 auto;
 
  max-height: 100%;
 
  padding: 0;
 
  width: 100%;
 
}
 

	
 
/* Hide the poster after the video has started playing */
 
.vjs-has-started .vjs-poster {
 
  display: none;
 
}
 

	
 
/* Don't hide the poster if we're playing audio */
 
.vjs-audio.vjs-has-started .vjs-poster {
 
  display: block;
 
}
 

	
 
/* Hide the poster when controls are disabled because it's clickable
 
and the native poster can take over */
 
.vjs-controls-disabled .vjs-poster {
 
  display: none;
 
}
 

	
 
/* Hide the poster when native controls are used otherwise it covers them */
 
.vjs-using-native-controls .vjs-poster {
 
  display: none;
 
}
ennstatus/static/js/video.js/src/css/components/_progress.scss
Show inline comments
 
new file 100644
 
/**
 
 * Let's talk pixel math!
 
 * Start with a base font size of 10px (assuming that hasn't changed)
 
 * No Hover:
 
 * - Progress holder is 3px
 
 * - Progress handle is 9px
 
 * - Progress handle is pulled up 3px to center it.
 
 *
 
 * Hover:
 
 * - Progress holder becomes 5px
 
 * - Progress handle becomes 15px
 
 * - Progress handle is pulled up 5px to center it
 
 */
 

	
 
.video-js .vjs-progress-control {
 
  @include flex(auto);
 
  @include display-flex(center);
 
}
 

	
 
.vjs-live .vjs-progress-control {
 
  display: none;
 
}
 

	
 
/* Box containing play and load progresses. Also acts as seek scrubber. */
 
.video-js .vjs-progress-holder {
 
  @include flex(auto);
 
  @include transition(all 0.2s);
 
  height: 0.3em;
 
}
 

	
 
/* We need an increased hit area on hover */
 
.video-js .vjs-progress-control:hover .vjs-progress-holder {
 
  font-size: 1.666666666666666666em
 
}
 

	
 
/* Also show the current time tooltip */
 
.video-js .vjs-progress-control:hover .vjs-mouse-display:after,
 
.video-js .vjs-progress-control:hover .vjs-play-progress:after {
 
  display: block;
 

	
 
  /* If we let the font size grow as much as everything else, the current time tooltip ends up
 
     ginormous. If you'd like to enable the current time tooltip all the time, this should be disabled
 
     to avoid a weird hitch when you roll off the hover. */
 
  font-size: 0.6em;
 
}
 

	
 
/* Progress Bars */
 
.video-js .vjs-progress-holder .vjs-play-progress,
 
.video-js .vjs-progress-holder .vjs-load-progress,
 
.video-js .vjs-progress-holder .vjs-load-progress div {
 
  position: absolute;
 
  display: block;
 
  height: 0.3em;
 
  margin: 0;
 
  padding: 0;
 
  /* updated by javascript during playback */
 
  width: 0;
 
  /* Needed for IE6 *///
 
  left: 0;
 
  top: 0;
 
}
 

	
 
.video-js .vjs-mouse-display {
 
  @extend .vjs-icon-circle;
 

	
 
  &:before {
 
    display: none;
 
  }
 
}
 
.video-js .vjs-play-progress {
 
  background-color: $primary-foreground-color;
 
  @extend .vjs-icon-circle;
 

	
 
  // Progress handle
 
  &:before {
 
    position: absolute;
 
    top: -0.333333333333333em;
 
    right: -0.5em;
 
    font-size: 0.9em;
 
  }
 
}
 

	
 
// Current Time "tooltip"
 
.video-js .vjs-mouse-display:after,
 
.video-js .vjs-play-progress:after {
 
  /* By default this is hidden and only shown when hovering over the progress control */
 
  display: none;
 
  position: absolute;
 
  top: -2.4em;
 
  right: -1.5em;
 
  font-size: 0.9em;
 
  color: #000;
 
  content: attr(data-current-time);
 
  padding: 0.2em 0.5em;
 
  @include background-color-with-alpha(#fff, 0.8);
 
  @include border-radius(0.3em);
 
}
 
.video-js .vjs-play-progress:before,
 
.video-js .vjs-play-progress:after {
 
  z-index: 1;
 
}
 

	
 
.video-js .vjs-load-progress {
 
  /* For IE8 we'll lighten the color */
 
  background: ligthen($secondary-background-color, 25%);
 
  /* Otherwise we'll rely on stacked opacities */
 
  background: rgba($secondary-background-color, $secondary-background-transparency);
 
}
 

	
 
/* there are child elements of the load progress bar that represent the
 
specific time ranges that have been buffered */
 
.video-js .vjs-load-progress div {
 
  /* For IE8 we'll lighten the color */
 
  background: ligthen($secondary-background-color, 50%);
 
  /* Otherwise we'll rely on stacked opacities */
 
  background: rgba($secondary-background-color, 0.75);
 
}
 

	
 
.video-js.vjs-no-flex .vjs-progress-control {
 
  width: auto;
 
}
 

	
 
.video-js .vjs-progress-control .vjs-mouse-display {
 
  display: none;
 
  position: absolute;
 
  width: 1px;
 
  height: 100%;
 
  background-color: #000;
 
  z-index: 1;
 
}
 
.vjs-no-flex .vjs-progress-control .vjs-mouse-display {
 
  z-index: 0;
 
}
 
.video-js .vjs-progress-control:hover .vjs-mouse-display {
 
  display: block;
 
}
 
.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display,
 
.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display:after {
 
  visibility: hidden;
 
  opacity: 0;
 
  $trans: visibility 1.0s, opacity 1.0s;
 
  @include transition($trans);
 
}
 
.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display,
 
.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display:after {
 
  display: none;
 
}
 
.video-js .vjs-progress-control .vjs-mouse-display:after {
 
  color: #fff;
 
  @include background-color-with-alpha(#000, 0.8);
 
}
ennstatus/static/js/video.js/src/css/components/_slider.scss
Show inline comments
 
new file 100644
 
.video-js .vjs-slider {
 
  outline: 0;
 
  position: relative;
 
  cursor: pointer;
 
  padding: 0;
 
  margin: 0 0.45em 0 0.45em;
 

	
 
  @include background-color-with-alpha($secondary-background-color, $secondary-background-transparency);
 
}
 

	
 
.video-js .vjs-slider:focus {
 
  text-shadow: 0em 0em 1em rgba($primary-foreground-color, 1);
 

	
 
  @include box-shadow(0 0 1em $primary-foreground-color);
 
}
ennstatus/static/js/video.js/src/css/components/_subtitles.scss
Show inline comments
 
new file 100644
 
.video-js .vjs-subtitles-button {
 
  @extend .vjs-icon-subtitles;
 
}
ennstatus/static/js/video.js/src/css/components/_text-track.scss
Show inline comments
 
new file 100644
 
.vjs-text-track-display {
 
  position: absolute;
 
  bottom: 3em;
 
  left: 0;
 
  right: 0;
 
  top: 0;
 
  pointer-events: none;
 
}
 

	
 
/* Move captions down when controls aren't being shown */
 
.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display {
 
  bottom: 1em;
 
}
 

	
 
/* Individual tracks */
 
.video-js .vjs-text-track {
 
  font-size: 1.4em;
 
  text-align: center;
 
  margin-bottom: 0.1em;
 
  /* Transparent black background, or fallback to all black (oldIE) */
 
  @include background-color-with-alpha(#000, 0.5);
 
}
 

	
 
.vjs-subtitles { color: #fff /* Subtitles are white */; }
 
.vjs-captions { color: #fc6 /* Captions are yellow */; }
 
.vjs-tt-cue { display: block; }
ennstatus/static/js/video.js/src/css/components/_time.scss
Show inline comments
 
new file 100644
 
.video-js .vjs-time-control {
 
  @include flex(none);
 
  font-size: 1em;
 
  line-height: 3em;
 
}
 

	
 
.vjs-live .vjs-time-control {
 
  display: none;
 
}
 

	
 
/* We need the extra specificity that referencing .vjs-no-flex provides. */
 
.video-js .vjs-current-time,
 
.vjs-no-flex .vjs-current-time {
 
  display: none;
 
}
 

	
 
.video-js .vjs-duration,
 
.vjs-no-flex .vjs-duration {
 
  display: none;
 
}
 

	
 
.vjs-time-divider {
 
  display: none;
 
  line-height: 3em;
 
}
 

	
 
.vjs-live .vjs-time-divider {
 
  // Already the default, but we want to ensure when the player is live
 
  // this hides in the same way as the other time controls for other skins
 
  display: none;
 
}
ennstatus/static/js/video.js/src/css/components/_volume.scss
Show inline comments
 
new file 100644
 
.video-js .vjs-mute-control,
 
.video-js .vjs-volume-menu-button {
 
  cursor: pointer;
 
  @include flex(none);
 
  @extend .vjs-icon-volume-high;
 
}
 

	
 
.video-js .vjs-mute-control.vjs-vol-0,
 
.video-js .vjs-volume-menu-button.vjs-vol-0 {
 
  @extend .vjs-icon-volume-mute;
 
}
 
.video-js .vjs-mute-control.vjs-vol-1,
 
.video-js .vjs-volume-menu-button.vjs-vol-1 {
 
  @extend .vjs-icon-volume-low;
 
}
 
.video-js .vjs-mute-control.vjs-vol-2,
 
.video-js .vjs-volume-menu-button.vjs-vol-2 {
 
  @extend .vjs-icon-volume-mid;
 
}
 

	
 
.video-js .vjs-volume-control {
 
  width: 5em;
 
  @include flex(none);
 
  @include display-flex(center);
 
}
 

	
 
.video-js .vjs-volume-bar {
 
  margin: 1.35em;
 
}
 

	
 
.vjs-volume-bar.vjs-slider-horizontal {
 
  width: 5em;
 
  height: 0.3em;
 
}
 

	
 
.vjs-volume-bar.vjs-slider-vertical {
 
  width: 0.3em;
 
  height: 5em;
 
}
 

	
 
.video-js .vjs-volume-level {
 
  position: absolute;
 
  bottom: 0;
 
  left: 0;
 

	
 
  background-color: $primary-foreground-color;
 

	
 
  @extend .vjs-icon-circle;
 

	
 
  // Volume handle
 
  &:before {
 
    position: absolute;
 
    font-size: 0.9em; // Doing this to match the handle on play progress.
 
  }
 
}
 

	
 
.vjs-slider-vertical .vjs-volume-level {
 
  width: 0.3em;
 

	
 
  // Volume handle
 
  &:before {
 
    top: -0.5em;
 
    left: -0.3em;
 
  }
 
}
 
.vjs-slider-horizontal .vjs-volume-level {
 
  height: 0.3em;
 

	
 
  // Volume handle
 
  &:before {
 
    top: -0.3em;
 
    right: -0.5em;
 
  }
 
}
 

	
 
/* Assumes volume starts at 1.0. */
 
.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level {
 
  height: 100%;
 
}
 

	
 
.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level {
 
  width: 100%;
 
}
 

	
 
/* The volume menu button is like menu buttons (captions/subtitles) but works
 
a little differently. It needs to be possible to tab to the volume slider
 
without hitting space bar on the menu button. To do this we're not using
 
display:none to hide the slider menu by default, and instead setting the
 
width and height to zero. */
 
.vjs-menu-button-popup.vjs-volume-menu-button .vjs-menu {
 
  display: block;
 
  width: 0;
 
  height: 0;
 
  border-top-color: transparent;
 
}
 

	
 
.vjs-menu-button-popup.vjs-volume-menu-button-vertical .vjs-menu {
 
  left: 0.5em;
 
}
 
.vjs-menu-button-popup.vjs-volume-menu-button-horizontal .vjs-menu {
 
  left: -2em;
 
}
 

	
 
.vjs-menu-button-popup.vjs-volume-menu-button .vjs-menu-content {
 
  height: 0;
 
  width: 0;
 

	
 
  // Avoids unnecessary scrollbars in the menu content. Primarily noticed in Chrome on Linux.
 
  overflow-x: hidden;
 
  overflow-y: hidden;
 
}
 

	
 
.vjs-volume-menu-button-vertical:hover .vjs-menu-content,
 
.vjs-volume-menu-button-vertical .vjs-lock-showing .vjs-menu-content {
 
  height: 8em;
 
  width: 2.9em;
 
}
 

	
 
.vjs-volume-menu-button-horizontal:hover .vjs-menu-content,
 
.vjs-volume-menu-button-horizontal .vjs-lock-showing .vjs-menu-content {
 
  height: 2.9em;
 
  width: 8em;
 
}
 

	
 
.vjs-volume-menu-button.vjs-menu-button-inline .vjs-menu-content {
 
  /* An inline volume should never have a menu background color.
 
     This protects it from external changes to background colors. */
 
  background-color: transparent !important;
 
}
ennstatus/static/js/video.js/src/css/components/menu/_menu-inline.scss
Show inline comments
 
new file 100644
 
.video-js .vjs-menu-button-inline {
 
  @include transition(all 0.4s);
 
  overflow: hidden;
 
}
 

	
 
.video-js .vjs-menu-button-inline:before {
 
  // Icon pseudoelement has a different base font size (1.8em), so we need to
 
  // account for that in the width. 4em (standard button width) divided by 1.8
 
  // to get the same button width as normal.
 
  width: 2.222222222em;
 
}
 

	
 
// Hover state
 
.video-js .vjs-menu-button-inline:hover,
 
.video-js .vjs-menu-button-inline:focus,
 
.video-js .vjs-menu-button-inline.vjs-slider-active,
 
.video-js.vjs-no-flex .vjs-menu-button-inline {
 
  // This width is currently specific to the inline volume bar.
 
  width: 12em;
 
}
 
// Don't transition when tabbing in reverse to the volume menu
 
// because it looks weird
 
.video-js .vjs-menu-button-inline.vjs-slider-active {
 
  @include transition(none);
 
}
 

	
 
.vjs-menu-button-inline .vjs-menu {
 
  opacity: 0;
 
  height: 100%;
 
  width: auto;
 

	
 
  position: absolute;
 
  left: 2.2222222em;
 
  top: 0;
 

	
 
  padding: 0;
 
  margin: 0;
 

	
 
  @include transition(all 0.4s);
 
}
 

	
 
.vjs-menu-button-inline:hover .vjs-menu,
 
.vjs-menu-button-inline:focus .vjs-menu,
 
.vjs-menu-button-inline.vjs-slider-active .vjs-menu {
 
  display: block;
 
  opacity: 1;
 
}
 

	
 
.vjs-no-flex .vjs-menu-button-inline .vjs-menu {
 
  display: block;
 
  opacity: 1;
 
  position: relative;
 
  width: auto;
 
}
 

	
 
.vjs-no-flex .vjs-menu-button-inline:hover .vjs-menu,
 
.vjs-no-flex .vjs-menu-button-inline:focus .vjs-menu,
 
.vjs-no-flex .vjs-menu-button-inline.vjs-slider-active .vjs-menu {
 
  width: auto;
 
}
 

	
 
.vjs-menu-button-inline .vjs-menu-content {
 
  width: auto;
 
  height: 100%;
 
  margin: 0;
 
  overflow: hidden;
 
}
ennstatus/static/js/video.js/src/css/components/menu/_menu-popup.scss
Show inline comments
 
new file 100644
 
.vjs-menu-button-popup .vjs-menu {
 
  display: none;
 
  position: absolute;
 
  bottom: 0;
 
  width: 10em;
 
  left: -3em; /* (Width of vjs-menu - width of button) / 2 */
 
  height: 0em;
 
  margin-bottom: 1.5em;
 
  border-top-color: rgba($primary-background-color, $primary-background-transparency); /* Same as ul background */
 
}
 

	
 
/* Button Pop-up Menu */
 
.vjs-menu-button-popup .vjs-menu ul {
 
  @include background-color-with-alpha($primary-background-color, $primary-background-transparency);
 

	
 
  position: absolute;
 
  width: 100%;
 
  bottom: 1.5em; /* Same bottom as vjs-menu border-top */
 
  max-height: 15em;
 
}
 

	
 
.vjs-menu-button-popup:hover .vjs-menu,
 
.vjs-menu-button-popup .vjs-menu.vjs-lock-showing {
 
  display: block;
 
}
ennstatus/static/js/video.js/src/css/components/menu/_menu.scss
Show inline comments
 
new file 100644
 
.vjs-menu-button {
 
  cursor: pointer;
 
}
 

	
 
.vjs-menu .vjs-menu-content {
 
  display: block;
 
  padding: 0; margin: 0;
 
  overflow: auto;
 
}
 

	
 
/* prevent menus from opening while scrubbing (FF, IE) */
 
.vjs-scrubbing .vjs-menu-button:hover .vjs-menu {
 
  display: none;
 
}
 

	
 
.vjs-menu li {
 
  list-style: none;
 
  margin: 0;
 
  padding: 0.2em 0;
 
  line-height: 1.4em;
 
  font-size: 1.2em;
 
  text-align: center;
 
  text-transform: lowercase;
 
}
 

	
 
.vjs-menu li:focus,
 
.vjs-menu li:hover {
 
  outline: 0;
 
  @include background-color-with-alpha($secondary-background-color, $secondary-background-transparency);
 
}
 

	
 
.vjs-menu li.vjs-selected,
 
.vjs-menu li.vjs-selected:focus,
 
.vjs-menu li.vjs-selected:hover {
 
  background-color: $primary-foreground-color;
 
  color: $primary-background-color;
 
}
 

	
 
.vjs-menu li.vjs-menu-title {
 
  text-align: center;
 
  text-transform: uppercase;
 
  font-size: 1em;
 
  line-height: 2em;
 
  padding: 0;
 
  margin: 0 0 0.3em 0;
 
  font-weight: bold;
 
  cursor: default;
 
}
ennstatus/static/js/video.js/src/css/video-js.scss
Show inline comments
 
new file 100644
 
@import "variables";
 
@import "private-variables";
 
@import "utilities";
 

	
 
@import "../../node_modules/videojs-font/scss/icons";
 

	
 
@import "components/layout";
 
@import "components/big-play";
 
@import "components/button";
 

	
 
@import "components/menu/menu";
 
@import "components/menu/menu-popup";
 
@import "components/menu/menu-inline";
 

	
 
@import "components/control-bar";
 
@import "components/control";
 
@import "components/control-spacer";
 

	
 
@import "components/progress";
 
@import "components/slider";
 

	
 
@import "components/volume";
 

	
 
@import "components/poster";
 
@import "components/live";
 
@import "components/time";
 
@import "components/play-pause";
 
@import "components/text-track";
 
@import "components/fullscreen";
 
@import "components/playback-rate";
 
@import "components/error";
 
@import "components/loading";
 
@import "components/captions";
 
@import "components/chapters";
 
@import "components/subtitles";
 
@import "components/adaptive";
 
@import "components/captions-settings";
ennstatus/static/js/video.js/src/js/base-styles.js
Show inline comments
 
new file 100644
 
/**
 
 * @file base-styles.js
 
 *
 
 * This code injects the required base styles in the head of the document.
 
 */
 
import window from 'global/window';
 
import document from 'global/document';
 

	
 
if (window.VIDEOJS_NO_BASE_THEME) return;
 

	
 
const styles = '{{GENERATED_STYLES}}';
 

	
 
if (styles === '{{GENERATED'+'_STYLES}}');
 

	
 
const styleNode = document.createElement('style');
 
styleNode.innerHTML = styles;
 

	
 
document.head.insertBefore(styleNode, document.head.firstChild);
ennstatus/static/js/video.js/src/js/big-play-button.js
Show inline comments
 
new file 100644
 
/**
 
 * @file big-play-button.js
 
 */
 
import Button from './button.js';
 
import Component from './component.js';
 

	
 
/**
 
 * Initial play button. Shows before the video has played. The hiding of the
 
 * big play button is done via CSS and player states.
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @extends Button
 
 * @class BigPlayButton
 
 */
 
class BigPlayButton extends Button {
 

	
 
  constructor(player, options) {
 
    super(player, options);
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 
  buildCSSClass() {
 
    return 'vjs-big-play-button';
 
  }
 

	
 
  /**
 
   * Handles click for play
 
   *
 
   * @method handleClick
 
   */
 
  handleClick() {
 
    this.player_.play();
 
  }
 

	
 
}
 

	
 
BigPlayButton.prototype.controlText_ = 'Play Video';
 

	
 
Component.registerComponent('BigPlayButton', BigPlayButton);
 
export default BigPlayButton;
ennstatus/static/js/video.js/src/js/button.js
Show inline comments
 
new file 100644
 
/**
 
 * @file button.js
 
 */
 
import Component from './component';
 
import * as Dom from './utils/dom.js';
 
import * as Events from './utils/events.js';
 
import * as Fn from './utils/fn.js';
 
import document from 'global/document';
 
import assign from 'object.assign';
 

	
 
/**
 
 * Base class for all buttons
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @extends Component
 
 * @class Button
 
 */
 
class Button extends Component {
 

	
 
  constructor(player, options) {
 
    super(player, options);
 

	
 
    this.emitTapEvents();
 

	
 
    this.on('tap', this.handleClick);
 
    this.on('click', this.handleClick);
 
    this.on('focus', this.handleFocus);
 
    this.on('blur', this.handleBlur);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @param {String=} type Element's node type. e.g. 'div'
 
   * @param {Object=} props An object of element attributes that should be set on the element Tag name
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl(tag='button', props={}, attributes={}) {
 
    props = assign({
 
      className: this.buildCSSClass(),
 
      tabIndex: 0
 
    }, props);
 

	
 
    // Add standard Aria info
 
    attributes = assign({
 
      role: 'button',
 
      type: 'button', // Necessary since the default button type is "submit"
 
      'aria-live': 'polite' // let the screen reader user know that the text of the button may change
 
    }, attributes);
 

	
 
    let el = super.createEl(tag, props, attributes);
 

	
 
    this.controlTextEl_ = Dom.createEl('span', {
 
      className: 'vjs-control-text'
 
    });
 

	
 
    el.appendChild(this.controlTextEl_);
 

	
 
    this.controlText(this.controlText_);
 

	
 
    return el;
 
  }
 

	
 
  /**
 
   * Controls text - both request and localize
 
   *
 
   * @param {String} text Text for button
 
   * @return {String}
 
   * @method controlText
 
   */
 
  controlText(text) {
 
    if (!text) return this.controlText_ || 'Need Text';
 

	
 
    this.controlText_ = text;
 
    this.controlTextEl_.innerHTML = this.localize(this.controlText_);
 

	
 
    return this;
 
  }
 

	
 
  /**
 
   * Allows sub components to stack CSS class names
 
   *
 
   * @return {String}
 
   * @method buildCSSClass
 
   */
 
  buildCSSClass() {
 
    return `vjs-control vjs-button ${super.buildCSSClass()}`;
 
  }
 

	
 
  /**
 
   * Handle Click - Override with specific functionality for button
 
   *
 
   * @method handleClick
 
   */
 
  handleClick() {}
 

	
 
  /**
 
   * Handle Focus - Add keyboard functionality to element
 
   *
 
   * @method handleFocus
 
   */
 
  handleFocus() {
 
    Events.on(document, 'keydown', Fn.bind(this, this.handleKeyPress));
 
  }
 

	
 
  /**
 
   * Handle KeyPress (document level) - Trigger click when keys are pressed
 
   *
 
   * @method handleKeyPress
 
   */
 
  handleKeyPress(event) {
 
    // Check for space bar (32) or enter (13) keys
 
    if (event.which === 32 || event.which === 13) {
 
      event.preventDefault();
 
      this.handleClick(event);
 
    }
 
  }
 

	
 
  /**
 
   * Handle Blur - Remove keyboard triggers
 
   *
 
   * @method handleBlur
 
   */
 
  handleBlur() {
 
    Events.off(document, 'keydown', Fn.bind(this, this.handleKeyPress));
 
  }
 

	
 
}
 

	
 

	
 
Component.registerComponent('Button', Button);
 
export default Button;
ennstatus/static/js/video.js/src/js/component.js
Show inline comments
 
new file 100644
 
/**
 
 * @file component.js
 
 *
 
 * Player Component - Base class for all UI objects
 
 */
 

	
 
import window from 'global/window';
 
import * as Dom from './utils/dom.js';
 
import * as Fn from './utils/fn.js';
 
import * as Guid from './utils/guid.js';
 
import * as Events from './utils/events.js';
 
import log from './utils/log.js';
 
import toTitleCase from './utils/to-title-case.js';
 
import assign from 'object.assign';
 
import mergeOptions from './utils/merge-options.js';
 

	
 

	
 
/**
 
 * Base UI Component class
 
 * Components are embeddable UI objects that are represented by both a
 
 * javascript object and an element in the DOM. They can be children of other
 
 * components, and can have many children themselves.
 
 * ```js
 
 *     // adding a button to the player
 
 *     var button = player.addChild('button');
 
 *     button.el(); // -> button element
 
 * ```
 
 * ```html
 
 *     <div class="video-js">
 
 *       <div class="vjs-button">Button</div>
 
 *     </div>
 
 * ```
 
 * Components are also event targets.
 
 * ```js
 
 *     button.on('click', function(){
 
 *       console.log('Button Clicked!');
 
 *     });
 
 *     button.trigger('customevent');
 
 * ```
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @class Component
 
 */
 
class Component {
 

	
 
  constructor(player, options, ready) {
 

	
 
    // The component might be the player itself and we can't pass `this` to super
 
    if (!player && this.play) {
 
      this.player_ = player = this; // eslint-disable-line
 
    } else {
 
      this.player_ = player;
 
    }
 

	
 
    // Make a copy of prototype.options_ to protect against overriding defaults
 
    this.options_ = mergeOptions({}, this.options_);
 

	
 
    // Updated options with supplied options
 
    options = this.options_ = mergeOptions(this.options_, options);
 

	
 
    // Get ID from options or options element if one is supplied
 
    this.id_ = options.id || (options.el && options.el.id);
 

	
 
    // If there was no ID from the options, generate one
 
    if (!this.id_) {
 
      // Don't require the player ID function in the case of mock players
 
      let id = player && player.id && player.id() || 'no_player';
 

	
 
      this.id_ = `${id}_component_${Guid.newGUID()}`;
 
    }
 

	
 
    this.name_ = options.name || null;
 

	
 
    // Create element if one wasn't provided in options
 
    if (options.el) {
 
      this.el_ = options.el;
 
    } else if (options.createEl !== false) {
 
      this.el_ = this.createEl();
 
    }
 

	
 
    this.children_ = [];
 
    this.childIndex_ = {};
 
    this.childNameIndex_ = {};
 

	
 
    // Add any child components in options
 
    if (options.initChildren !== false) {
 
      this.initChildren();
 
    }
 

	
 
    this.ready(ready);
 
    // Don't want to trigger ready here or it will before init is actually
 
    // finished for all children that run this constructor
 

	
 
    if (options.reportTouchActivity !== false) {
 
      this.enableTouchActivity();
 
    }
 
  }
 

	
 
  /**
 
   * Dispose of the component and all child components
 
   *
 
   * @method dispose
 
   */
 
  dispose() {
 
    this.trigger({ type: 'dispose', bubbles: false });
 

	
 
    // Dispose all children.
 
    if (this.children_) {
 
      for (let i = this.children_.length - 1; i >= 0; i--) {
 
        if (this.children_[i].dispose) {
 
          this.children_[i].dispose();
 
        }
 
      }
 
    }
 

	
 
    // Delete child references
 
    this.children_ = null;
 
    this.childIndex_ = null;
 
    this.childNameIndex_ = null;
 

	
 
    // Remove all event listeners.
 
    this.off();
 

	
 
    // Remove element from DOM
 
    if (this.el_.parentNode) {
 
      this.el_.parentNode.removeChild(this.el_);
 
    }
 

	
 
    Dom.removeElData(this.el_);
 
    this.el_ = null;
 
  }
 

	
 
  /**
 
   * Return the component's player
 
   *
 
   * @return {Player}
 
   * @method player
 
   */
 
  player() {
 
    return this.player_;
 
  }
 

	
 
  /**
 
   * Deep merge of options objects
 
   * Whenever a property is an object on both options objects
 
   * the two properties will be merged using mergeOptions.
 
   *
 
   * ```js
 
   *     Parent.prototype.options_ = {
 
   *       optionSet: {
 
   *         'childOne': { 'foo': 'bar', 'asdf': 'fdsa' },
 
   *         'childTwo': {},
 
   *         'childThree': {}
 
   *       }
 
   *     }
 
   *     newOptions = {
 
   *       optionSet: {
 
   *         'childOne': { 'foo': 'baz', 'abc': '123' }
 
   *         'childTwo': null,
 
   *         'childFour': {}
 
   *       }
 
   *     }
 
   *
 
   *     this.options(newOptions);
 
   * ```
 
   * RESULT
 
   * ```js
 
   *     {
 
   *       optionSet: {
 
   *         'childOne': { 'foo': 'baz', 'asdf': 'fdsa', 'abc': '123' },
 
   *         'childTwo': null, // Disabled. Won't be initialized.
 
   *         'childThree': {},
 
   *         'childFour': {}
 
   *       }
 
   *     }
 
   * ```
 
   *
 
   * @param  {Object} obj Object of new option values
 
   * @return {Object}     A NEW object of this.options_ and obj merged
 
   * @method options
 
   */
 
  options(obj) {
 
    log.warn('this.options() has been deprecated and will be moved to the constructor in 6.0');
 

	
 
    if (!obj) {
 
      return this.options_;
 
    }
 

	
 
    this.options_ = mergeOptions(this.options_, obj);
 
    return this.options_;
 
  }
 

	
 
  /**
 
   * Get the component's DOM element
 
   * ```js
 
   *     var domEl = myComponent.el();
 
   * ```
 
   *
 
   * @return {Element}
 
   * @method el
 
   */
 
  el() {
 
    return this.el_;
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @param  {String=} tagName  Element's node type. e.g. 'div'
 
   * @param  {Object=} properties An object of properties that should be set
 
   * @param  {Object=} attributes An object of attributes that should be set
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl(tagName, properties, attributes) {
 
    return Dom.createEl(tagName, properties, attributes);
 
  }
 

	
 
  localize(string) {
 
    let code = this.player_.language && this.player_.language();
 
    let languages = this.player_.languages && this.player_.languages();
 

	
 
    if (!code || !languages) {
 
      return string;
 
    }
 

	
 
    let language = languages[code];
 

	
 
    if (language && language[string]) {
 
      return language[string];
 
    }
 

	
 
    let primaryCode = code.split('-')[0];
 
    let primaryLang = languages[primaryCode];
 

	
 
    if (primaryLang && primaryLang[string]) {
 
      return primaryLang[string];
 
    }
 

	
 
    return string;
 
  }
 

	
 
  /**
 
   * Return the component's DOM element where children are inserted.
 
   * Will either be the same as el() or a new element defined in createEl().
 
   *
 
   * @return {Element}
 
   * @method contentEl
 
   */
 
  contentEl() {
 
    return this.contentEl_ || this.el_;
 
  }
 

	
 
  /**
 
   * Get the component's ID
 
   * ```js
 
   *     var id = myComponent.id();
 
   * ```
 
   *
 
   * @return {String}
 
   * @method id
 
   */
 
  id() {
 
    return this.id_;
 
  }
 

	
 
  /**
 
   * Get the component's name. The name is often used to reference the component.
 
   * ```js
 
   *     var name = myComponent.name();
 
   * ```
 
   *
 
   * @return {String}
 
   * @method name
 
   */
 
  name() {
 
    return this.name_;
 
  }
 

	
 
  /**
 
   * Get an array of all child components
 
   * ```js
 
   *     var kids = myComponent.children();
 
   * ```
 
   *
 
   * @return {Array} The children
 
   * @method children
 
   */
 
  children() {
 
    return this.children_;
 
  }
 

	
 
  /**
 
   * Returns a child component with the provided ID
 
   *
 
   * @return {Component}
 
   * @method getChildById
 
   */
 
  getChildById(id) {
 
    return this.childIndex_[id];
 
  }
 

	
 
  /**
 
   * Returns a child component with the provided name
 
   *
 
   * @return {Component}
 
   * @method getChild
 
   */
 
  getChild(name) {
 
    return this.childNameIndex_[name];
 
  }
 

	
 
  /**
 
   * Adds a child component inside this component
 
   * ```js
 
   *     myComponent.el();
 
   *     // -> <div class='my-component'></div>
 
   *     myComponent.children();
 
   *     // [empty array]
 
   *
 
   *     var myButton = myComponent.addChild('MyButton');
 
   *     // -> <div class='my-component'><div class="my-button">myButton<div></div>
 
   *     // -> myButton === myComponent.children()[0];
 
   * ```
 
   * Pass in options for child constructors and options for children of the child
 
   * ```js
 
   *     var myButton = myComponent.addChild('MyButton', {
 
   *       text: 'Press Me',
 
   *       buttonChildExample: {
 
   *         buttonChildOption: true
 
   *       }
 
   *     });
 
   * ```
 
   *
 
   * @param {String|Component} child The class name or instance of a child to add
 
   * @param {Object=} options Options, including options to be passed to children of the child.
 
   * @return {Component} The child component (created by this process if a string was used)
 
   * @method addChild
 
   */
 
  addChild(child, options={}) {
 
    let component;
 
    let componentName;
 

	
 
    // If child is a string, create nt with options
 
    if (typeof child === 'string') {
 
      componentName = child;
 

	
 
      // Options can also be specified as a boolean, so convert to an empty object if false.
 
      if (!options) {
 
        options = {};
 
      }
 

	
 
      // Same as above, but true is deprecated so show a warning.
 
      if (options === true) {
 
        log.warn('Initializing a child component with `true` is deprecated. Children should be defined in an array when possible, but if necessary use an object instead of `true`.');
 
        options = {};
 
      }
 

	
 
      // If no componentClass in options, assume componentClass is the name lowercased
 
      // (e.g. playButton)
 
      let componentClassName = options.componentClass || toTitleCase(componentName);
 

	
 
      // Set name through options
 
      options.name = componentName;
 

	
 
      // Create a new object & element for this controls set
 
      // If there's no .player_, this is a player
 
      let ComponentClass = Component.getComponent(componentClassName);
 

	
 
      component = new ComponentClass(this.player_ || this, options);
 

	
 
    // child is a component instance
 
    } else {
 
      component = child;
 
    }
 

	
 
    this.children_.push(component);
 

	
 
    if (typeof component.id === 'function') {
 
      this.childIndex_[component.id()] = component;
 
    }
 

	
 
    // If a name wasn't used to create the component, check if we can use the
 
    // name function of the component
 
    componentName = componentName || (component.name && component.name());
 

	
 
    if (componentName) {
 
      this.childNameIndex_[componentName] = component;
 
    }
 

	
 
    // Add the UI object's element to the container div (box)
 
    // Having an element is not required
 
    if (typeof component.el === 'function' && component.el()) {
 
      this.contentEl().appendChild(component.el());
 
    }
 

	
 
    // Return so it can stored on parent object if desired.
 
    return component;
 
  }
 

	
 
  /**
 
   * Remove a child component from this component's list of children, and the
 
   * child component's element from this component's element
 
   *
 
   * @param  {Component} component Component to remove
 
   * @method removeChild
 
   */
 
  removeChild(component) {
 
    if (typeof component === 'string') {
 
      component = this.getChild(component);
 
    }
 

	
 
    if (!component || !this.children_) {
 
      return;
 
    }
 

	
 
    let childFound = false;
 

	
 
    for (let i = this.children_.length - 1; i >= 0; i--) {
 
      if (this.children_[i] === component) {
 
        childFound = true;
 
        this.children_.splice(i, 1);
 
        break;
 
      }
 
    }
 

	
 
    if (!childFound) {
 
      return;
 
    }
 

	
 
    this.childIndex_[component.id()] = null;
 
    this.childNameIndex_[component.name()] = null;
 

	
 
    let compEl = component.el();
 

	
 
    if (compEl && compEl.parentNode === this.contentEl()) {
 
      this.contentEl().removeChild(component.el());
 
    }
 
  }
 

	
 
  /**
 
   * Add and initialize default child components from options
 
   * ```js
 
   *     // when an instance of MyComponent is created, all children in options
 
   *     // will be added to the instance by their name strings and options
 
   *     MyComponent.prototype.options_ = {
 
   *       children: [
 
   *         'myChildComponent'
 
   *       ],
 
   *       myChildComponent: {
 
   *         myChildOption: true
 
   *       }
 
   *     };
 
   *
 
   *     // Or when creating the component
 
   *     var myComp = new MyComponent(player, {
 
   *       children: [
 
   *         'myChildComponent'
 
   *       ],
 
   *       myChildComponent: {
 
   *         myChildOption: true
 
   *       }
 
   *     });
 
   * ```
 
   * The children option can also be an array of
 
   * child options objects (that also include a 'name' key).
 
   * This can be used if you have two child components of the
 
   * same type that need different options.
 
   * ```js
 
   *     var myComp = new MyComponent(player, {
 
   *       children: [
 
   *         'button',
 
   *         {
 
   *           name: 'button',
 
   *           someOtherOption: true
 
   *         },
 
   *         {
 
   *           name: 'button',
 
   *           someOtherOption: false
 
   *         }
 
   *       ]
 
   *     });
 
   * ```
 
   *
 
   * @method initChildren
 
   */
 
  initChildren() {
 
    let children = this.options_.children;
 

	
 
    if (children) {
 
      // `this` is `parent`
 
      let parentOptions = this.options_;
 

	
 
      let handleAdd = (name, opts) => {
 
        // Allow options for children to be set at the parent options
 
        // e.g. videojs(id, { controlBar: false });
 
        // instead of videojs(id, { children: { controlBar: false });
 
        if (parentOptions[name] !== undefined) {
 
          opts = parentOptions[name];
 
        }
 

	
 
        // Allow for disabling default components
 
        // e.g. options['children']['posterImage'] = false
 
        if (opts === false) {
 
          return;
 
        }
 

	
 
        // Allow options to be passed as a simple boolean if no configuration
 
        // is necessary.
 
        if (opts === true) {
 
          opts = {};
 
        }
 

	
 
        // We also want to pass the original player options to each component as well so they don't need to
 
        // reach back into the player for options later.
 
        opts.playerOptions = this.options_.playerOptions;
 

	
 
        // Create and add the child component.
 
        // Add a direct reference to the child by name on the parent instance.
 
        // If two of the same component are used, different names should be supplied
 
        // for each
 
        this[name] = this.addChild(name, opts);
 
      };
 

	
 
      // Allow for an array of children details to passed in the options
 
      if (Array.isArray(children)) {
 
        for (let i = 0; i < children.length; i++) {
 
          let child = children[i];
 
          let name;
 
          let opts;
 

	
 
          if (typeof child === 'string') {
 
            // ['myComponent']
 
            name = child;
 
            opts = {};
 
          } else {
 
            // [{ name: 'myComponent', otherOption: true }]
 
            name = child.name;
 
            opts = child;
 
          }
 

	
 
          handleAdd(name, opts);
 
        }
 
      } else {
 
        Object.getOwnPropertyNames(children).forEach(function(name){
 
          handleAdd(name, children[name]);
 
        });
 
      }
 
    }
 
  }
 

	
 
  /**
 
   * Allows sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 
  buildCSSClass() {
 
    // Child classes can include a function that does:
 
    // return 'CLASS NAME' + this._super();
 
    return '';
 
  }
 

	
 
  /**
 
   * Add an event listener to this component's element
 
   * ```js
 
   *     var myFunc = function(){
 
   *       var myComponent = this;
 
   *       // Do something when the event is fired
 
   *     };
 
   *
 
   *     myComponent.on('eventType', myFunc);
 
   * ```
 
   * The context of myFunc will be myComponent unless previously bound.
 
   * Alternatively, you can add a listener to another element or component.
 
   * ```js
 
   *     myComponent.on(otherElement, 'eventName', myFunc);
 
   *     myComponent.on(otherComponent, 'eventName', myFunc);
 
   * ```
 
   * The benefit of using this over `VjsEvents.on(otherElement, 'eventName', myFunc)`
 
   * and `otherComponent.on('eventName', myFunc)` is that this way the listeners
 
   * will be automatically cleaned up when either component is disposed.
 
   * It will also bind myComponent as the context of myFunc.
 
   * **NOTE**: When using this on elements in the page other than window
 
   * and document (both permanent), if you remove the element from the DOM
 
   * you need to call `myComponent.trigger(el, 'dispose')` on it to clean up
 
   * references to it and allow the browser to garbage collect it.
 
   *
 
   * @param  {String|Component} first   The event type or other component
 
   * @param  {Function|String}      second  The event handler or event type
 
   * @param  {Function}             third   The event handler
 
   * @return {Component}
 
   * @method on
 
   */
 
  on(first, second, third) {
 
    if (typeof first === 'string' || Array.isArray(first)) {
 
      Events.on(this.el_, first, Fn.bind(this, second));
 

	
 
    // Targeting another component or element
 
    } else {
 
      const target = first;
 
      const type = second;
 
      const fn = Fn.bind(this, third);
 

	
 
      // When this component is disposed, remove the listener from the other component
 
      const removeOnDispose = () => this.off(target, type, fn);
 

	
 
      // Use the same function ID so we can remove it later it using the ID
 
      // of the original listener
 
      removeOnDispose.guid = fn.guid;
 
      this.on('dispose', removeOnDispose);
 

	
 
      // If the other component is disposed first we need to clean the reference
 
      // to the other component in this component's removeOnDispose listener
 
      // Otherwise we create a memory leak.
 
      const cleanRemover = () => this.off('dispose', removeOnDispose);
 

	
 
      // Add the same function ID so we can easily remove it later
 
      cleanRemover.guid = fn.guid;
 

	
 
      // Check if this is a DOM node
 
      if (first.nodeName) {
 
        // Add the listener to the other element
 
        Events.on(target, type, fn);
 
        Events.on(target, 'dispose', cleanRemover);
 

	
 
      // Should be a component
 
      // Not using `instanceof Component` because it makes mock players difficult
 
      } else if (typeof first.on === 'function') {
 
        // Add the listener to the other component
 
        target.on(type, fn);
 
        target.on('dispose', cleanRemover);
 
      }
 
    }
 

	
 
    return this;
 
  }
 

	
 
  /**
 
   * Remove an event listener from this component's element
 
   * ```js
 
   *     myComponent.off('eventType', myFunc);
 
   * ```
 
   * If myFunc is excluded, ALL listeners for the event type will be removed.
 
   * If eventType is excluded, ALL listeners will be removed from the component.
 
   * Alternatively you can use `off` to remove listeners that were added to other
 
   * elements or components using `myComponent.on(otherComponent...`.
 
   * In this case both the event type and listener function are REQUIRED.
 
   * ```js
 
   *     myComponent.off(otherElement, 'eventType', myFunc);
 
   *     myComponent.off(otherComponent, 'eventType', myFunc);
 
   * ```
 
   *
 
   * @param  {String=|Component}  first  The event type or other component
 
   * @param  {Function=|String}       second The listener function or event type
 
   * @param  {Function=}              third  The listener for other component
 
   * @return {Component}
 
   * @method off
 
   */
 
  off(first, second, third) {
 
    if (!first || typeof first === 'string' || Array.isArray(first)) {
 
      Events.off(this.el_, first, second);
 
    } else {
 
      const target = first;
 
      const type = second;
 
      // Ensure there's at least a guid, even if the function hasn't been used
 
      const fn = Fn.bind(this, third);
 

	
 
      // Remove the dispose listener on this component,
 
      // which was given the same guid as the event listener
 
      this.off('dispose', fn);
 

	
 
      if (first.nodeName) {
 
        // Remove the listener
 
        Events.off(target, type, fn);
 
        // Remove the listener for cleaning the dispose listener
 
        Events.off(target, 'dispose', fn);
 
      } else {
 
        target.off(type, fn);
 
        target.off('dispose', fn);
 
      }
 
    }
 

	
 
    return this;
 
  }
 

	
 
  /**
 
   * Add an event listener to be triggered only once and then removed
 
   * ```js
 
   *     myComponent.one('eventName', myFunc);
 
   * ```
 
   * Alternatively you can add a listener to another element or component
 
   * that will be triggered only once.
 
   * ```js
 
   *     myComponent.one(otherElement, 'eventName', myFunc);
 
   *     myComponent.one(otherComponent, 'eventName', myFunc);
 
   * ```
 
   *
 
   * @param  {String|Component}  first   The event type or other component
 
   * @param  {Function|String}       second  The listener function or event type
 
   * @param  {Function=}             third   The listener function for other component
 
   * @return {Component}
 
   * @method one
 
   */
 
  one(first, second, third) {
 
    if (typeof first === 'string' || Array.isArray(first)) {
 
      Events.one(this.el_, first, Fn.bind(this, second));
 
    } else {
 
      const target = first;
 
      const type = second;
 
      const fn = Fn.bind(this, third);
 

	
 
      const newFunc = () => {
 
        this.off(target, type, newFunc);
 
        fn.apply(null, arguments);
 
      };
 

	
 
      // Keep the same function ID so we can remove it later
 
      newFunc.guid = fn.guid;
 

	
 
      this.on(target, type, newFunc);
 
    }
 

	
 
    return this;
 
  }
 

	
 
  /**
 
   * Trigger an event on an element
 
   * ```js
 
   *     myComponent.trigger('eventName');
 
   *     myComponent.trigger({'type':'eventName'});
 
   *     myComponent.trigger('eventName', {data: 'some data'});
 
   *     myComponent.trigger({'type':'eventName'}, {data: 'some data'});
 
   * ```
 
   *
 
   * @param  {Event|Object|String} event  A string (the type) or an event object with a type attribute
 
   * @param  {Object} [hash] data hash to pass along with the event
 
   * @return {Component}       self
 
   * @method trigger
 
   */
 
  trigger(event, hash) {
 
    Events.trigger(this.el_, event, hash);
 
    return this;
 
  }
 

	
 
  /**
 
   * Bind a listener to the component's ready state.
 
   * Different from event listeners in that if the ready event has already happened
 
   * it will trigger the function immediately.
 
   *
 
   * @param  {Function} fn Ready listener
 
   * @param  {Boolean} sync Exec the listener synchronously if component is ready
 
   * @return {Component}
 
   * @method ready
 
   */
 
  ready(fn, sync=false) {
 
    if (fn) {
 
      if (this.isReady_) {
 
        if (sync) {
 
          fn.call(this);
 
        } else {
 
          // Call the function asynchronously by default for consistency
 
          this.setTimeout(fn, 1);
 
        }
 
      } else {
 
        this.readyQueue_ = this.readyQueue_ || [];
 
        this.readyQueue_.push(fn);
 
      }
 
    }
 
    return this;
 
  }
 

	
 
  /**
 
   * Trigger the ready listeners
 
   *
 
   * @return {Component}
 
   * @method triggerReady
 
   */
 
  triggerReady() {
 
    this.isReady_ = true;
 

	
 
    // Ensure ready is triggerd asynchronously
 
    this.setTimeout(function(){
 
      let readyQueue = this.readyQueue_;
 

	
 
      // Reset Ready Queue
 
      this.readyQueue_ = [];
 

	
 
      if (readyQueue && readyQueue.length > 0) {
 
        readyQueue.forEach(function(fn){
 
          fn.call(this);
 
        }, this);
 
      }
 

	
 
      // Allow for using event listeners also
 
      this.trigger('ready');
 
    }, 1);
 
  }
 

	
 
  /**
 
   * Check if a component's element has a CSS class name
 
   *
 
   * @param {String} classToCheck Classname to check
 
   * @return {Component}
 
   * @method hasClass
 
   */
 
  hasClass(classToCheck) {
 
    return Dom.hasElClass(this.el_, classToCheck);
 
  }
 

	
 
  /**
 
   * Add a CSS class name to the component's element
 
   *
 
   * @param {String} classToAdd Classname to add
 
   * @return {Component}
 
   * @method addClass
 
   */
 
  addClass(classToAdd) {
 
    Dom.addElClass(this.el_, classToAdd);
 
    return this;
 
  }
 

	
 
  /**
 
   * Remove and return a CSS class name from the component's element
 
   *
 
   * @param {String} classToRemove Classname to remove
 
   * @return {Component}
 
   * @method removeClass
 
   */
 
  removeClass(classToRemove) {
 
    Dom.removeElClass(this.el_, classToRemove);
 
    return this;
 
  }
 

	
 
  /**
 
   * Show the component element if hidden
 
   *
 
   * @return {Component}
 
   * @method show
 
   */
 
  show() {
 
    this.removeClass('vjs-hidden');
 
    return this;
 
  }
 

	
 
  /**
 
   * Hide the component element if currently showing
 
   *
 
   * @return {Component}
 
   * @method hide
 
   */
 
  hide() {
 
    this.addClass('vjs-hidden');
 
    return this;
 
  }
 

	
 
  /**
 
   * Lock an item in its visible state
 
   * To be used with fadeIn/fadeOut.
 
   *
 
   * @return {Component}
 
   * @private
 
   * @method lockShowing
 
   */
 
  lockShowing() {
 
    this.addClass('vjs-lock-showing');
 
    return this;
 
  }
 

	
 
  /**
 
   * Unlock an item to be hidden
 
   * To be used with fadeIn/fadeOut.
 
   *
 
   * @return {Component}
 
   * @private
 
   * @method unlockShowing
 
   */
 
  unlockShowing() {
 
    this.removeClass('vjs-lock-showing');
 
    return this;
 
  }
 

	
 
  /**
 
   * Set or get the width of the component (CSS values)
 
   * Setting the video tag dimension values only works with values in pixels.
 
   * Percent values will not work.
 
   * Some percents can be used, but width()/height() will return the number + %,
 
   * not the actual computed width/height.
 
   *
 
   * @param  {Number|String=} num   Optional width number
 
   * @param  {Boolean} skipListeners Skip the 'resize' event trigger
 
   * @return {Component} This component, when setting the width
 
   * @return {Number|String} The width, when getting
 
   * @method width
 
   */
 
  width(num, skipListeners) {
 
    return this.dimension('width', num, skipListeners);
 
  }
 

	
 
  /**
 
   * Get or set the height of the component (CSS values)
 
   * Setting the video tag dimension values only works with values in pixels.
 
   * Percent values will not work.
 
   * Some percents can be used, but width()/height() will return the number + %,
 
   * not the actual computed width/height.
 
   *
 
   * @param  {Number|String=} num     New component height
 
   * @param  {Boolean=} skipListeners Skip the resize event trigger
 
   * @return {Component} This component, when setting the height
 
   * @return {Number|String} The height, when getting
 
   * @method height
 
   */
 
  height(num, skipListeners) {
 
    return this.dimension('height', num, skipListeners);
 
  }
 

	
 
  /**
 
   * Set both width and height at the same time
 
   *
 
   * @param  {Number|String} width Width of player
 
   * @param  {Number|String} height Height of player
 
   * @return {Component} The component
 
   * @method dimensions
 
   */
 
  dimensions(width, height) {
 
    // Skip resize listeners on width for optimization
 
    return this.width(width, true).height(height);
 
  }
 

	
 
  /**
 
   * Get or set width or height
 
   * This is the shared code for the width() and height() methods.
 
   * All for an integer, integer + 'px' or integer + '%';
 
   * Known issue: Hidden elements officially have a width of 0. We're defaulting
 
   * to the style.width value and falling back to computedStyle which has the
 
   * hidden element issue. Info, but probably not an efficient fix:
 
   * http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/
 
   *
 
   * @param  {String} widthOrHeight  'width' or 'height'
 
   * @param  {Number|String=} num     New dimension
 
   * @param  {Boolean=} skipListeners Skip resize event trigger
 
   * @return {Component} The component if a dimension was set
 
   * @return {Number|String} The dimension if nothing was set
 
   * @private
 
   * @method dimension
 
   */
 
  dimension(widthOrHeight, num, skipListeners) {
 
    if (num !== undefined) {
 
      // Set to zero if null or literally NaN (NaN !== NaN)
 
      if (num === null || num !== num) {
 
        num = 0;
 
      }
 

	
 
      // Check if using css width/height (% or px) and adjust
 
      if (('' + num).indexOf('%') !== -1 || ('' + num).indexOf('px') !== -1) {
 
        this.el_.style[widthOrHeight] = num;
 
      } else if (num === 'auto') {
 
        this.el_.style[widthOrHeight] = '';
 
      } else {
 
        this.el_.style[widthOrHeight] = num + 'px';
 
      }
 

	
 
      // skipListeners allows us to avoid triggering the resize event when setting both width and height
 
      if (!skipListeners) {
 
        this.trigger('resize');
 
      }
 

	
 
      // Return component
 
      return this;
 
    }
 

	
 
    // Not setting a value, so getting it
 
    // Make sure element exists
 
    if (!this.el_) {
 
      return 0;
 
    }
 

	
 
    // Get dimension value from style
 
    let val = this.el_.style[widthOrHeight];
 
    let pxIndex = val.indexOf('px');
 

	
 
    if (pxIndex !== -1) {
 
      // Return the pixel value with no 'px'
 
      return parseInt(val.slice(0, pxIndex), 10);
 
    }
 

	
 
    // No px so using % or no style was set, so falling back to offsetWidth/height
 
    // If component has display:none, offset will return 0
 
    // TODO: handle display:none and no dimension style using px
 
    return parseInt(this.el_['offset' + toTitleCase(widthOrHeight)], 10);
 
  }
 

	
 
  /**
 
   * Emit 'tap' events when touch events are supported
 
   * This is used to support toggling the controls through a tap on the video.
 
   * We're requiring them to be enabled because otherwise every component would
 
   * have this extra overhead unnecessarily, on mobile devices where extra
 
   * overhead is especially bad.
 
   *
 
   * @private
 
   * @method emitTapEvents
 
   */
 
  emitTapEvents() {
 
    // Track the start time so we can determine how long the touch lasted
 
    let touchStart = 0;
 
    let firstTouch = null;
 

	
 
    // Maximum movement allowed during a touch event to still be considered a tap
 
    // Other popular libs use anywhere from 2 (hammer.js) to 15, so 10 seems like a nice, round number.
 
    const tapMovementThreshold = 10;
 

	
 
    // The maximum length a touch can be while still being considered a tap
 
    const touchTimeThreshold = 200;
 

	
 
    let couldBeTap;
 

	
 
    this.on('touchstart', function(event) {
 
      // If more than one finger, don't consider treating this as a click
 
      if (event.touches.length === 1) {
 
        // Copy the touches object to prevent modifying the original
 
        firstTouch = assign({}, event.touches[0]);
 
        // Record start time so we can detect a tap vs. "touch and hold"
 
        touchStart = new Date().getTime();
 
        // Reset couldBeTap tracking
 
        couldBeTap = true;
 
      }
 
    });
 

	
 
    this.on('touchmove', function(event) {
 
      // If more than one finger, don't consider treating this as a click
 
      if (event.touches.length > 1) {
 
        couldBeTap = false;
 
      } else if (firstTouch) {
 
        // Some devices will throw touchmoves for all but the slightest of taps.
 
        // So, if we moved only a small distance, this could still be a tap
 
        const xdiff = event.touches[0].pageX - firstTouch.pageX;
 
        const ydiff = event.touches[0].pageY - firstTouch.pageY;
 
        const touchDistance = Math.sqrt(xdiff  * xdiff + ydiff  * ydiff);
 

	
 
        if (touchDistance > tapMovementThreshold) {
 
          couldBeTap = false;
 
        }
 
      }
 
    });
 

	
 
    const noTap = function() {
 
      couldBeTap = false;
 
    };
 

	
 
    // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s
 
    this.on('touchleave', noTap);
 
    this.on('touchcancel', noTap);
 

	
 
    // When the touch ends, measure how long it took and trigger the appropriate
 
    // event
 
    this.on('touchend', function(event) {
 
      firstTouch = null;
 
      // Proceed only if the touchmove/leave/cancel event didn't happen
 
      if (couldBeTap === true) {
 
        // Measure how long the touch lasted
 
        const touchTime = new Date().getTime() - touchStart;
 

	
 
        // Make sure the touch was less than the threshold to be considered a tap
 
        if (touchTime < touchTimeThreshold) {
 
          // Don't let browser turn this into a click
 
          event.preventDefault();
 
          this.trigger('tap');
 
          // It may be good to copy the touchend event object and change the
 
          // type to tap, if the other event properties aren't exact after
 
          // Events.fixEvent runs (e.g. event.target)
 
        }
 
      }
 
    });
 
  }
 

	
 
  /**
 
   * Report user touch activity when touch events occur
 
   * User activity is used to determine when controls should show/hide. It's
 
   * relatively simple when it comes to mouse events, because any mouse event
 
   * should show the controls. So we capture mouse events that bubble up to the
 
   * player and report activity when that happens.
 
   * With touch events it isn't as easy. We can't rely on touch events at the
 
   * player level, because a tap (touchstart + touchend) on the video itself on
 
   * mobile devices is meant to turn controls off (and on). User activity is
 
   * checked asynchronously, so what could happen is a tap event on the video
 
   * turns the controls off, then the touchend event bubbles up to the player,
 
   * which if it reported user activity, would turn the controls right back on.
 
   * (We also don't want to completely block touch events from bubbling up)
 
   * Also a touchmove, touch+hold, and anything other than a tap is not supposed
 
   * to turn the controls back on on a mobile device.
 
   * Here we're setting the default component behavior to report user activity
 
   * whenever touch events happen, and this can be turned off by components that
 
   * want touch events to act differently.
 
   *
 
   * @method enableTouchActivity
 
   */
 
  enableTouchActivity() {
 
    // Don't continue if the root player doesn't support reporting user activity
 
    if (!this.player() || !this.player().reportUserActivity) {
 
      return;
 
    }
 

	
 
    // listener for reporting that the user is active
 
    const report = Fn.bind(this.player(), this.player().reportUserActivity);
 

	
 
    let touchHolding;
 

	
 
    this.on('touchstart', function() {
 
      report();
 
      // For as long as the they are touching the device or have their mouse down,
 
      // we consider them active even if they're not moving their finger or mouse.
 
      // So we want to continue to update that they are active
 
      this.clearInterval(touchHolding);
 
      // report at the same interval as activityCheck
 
      touchHolding = this.setInterval(report, 250);
 
    });
 

	
 
    const touchEnd = function(event) {
 
      report();
 
      // stop the interval that maintains activity if the touch is holding
 
      this.clearInterval(touchHolding);
 
    };
 

	
 
    this.on('touchmove', report);
 
    this.on('touchend', touchEnd);
 
    this.on('touchcancel', touchEnd);
 
  }
 

	
 
  /**
 
   * Creates timeout and sets up disposal automatically.
 
   *
 
   * @param {Function} fn The function to run after the timeout.
 
   * @param {Number} timeout Number of ms to delay before executing specified function.
 
   * @return {Number} Returns the timeout ID
 
   * @method setTimeout
 
   */
 
  setTimeout(fn, timeout) {
 
    fn = Fn.bind(this, fn);
 

	
 
    // window.setTimeout would be preferable here, but due to some bizarre issue with Sinon and/or Phantomjs, we can't.
 
    let timeoutId = window.setTimeout(fn, timeout);
 

	
 
    const disposeFn = function() {
 
      this.clearTimeout(timeoutId);
 
    };
 

	
 
    disposeFn.guid = `vjs-timeout-${timeoutId}`;
 

	
 
    this.on('dispose', disposeFn);
 

	
 
    return timeoutId;
 
  }
 

	
 
  /**
 
   * Clears a timeout and removes the associated dispose listener
 
   *
 
   * @param {Number} timeoutId The id of the timeout to clear
 
   * @return {Number} Returns the timeout ID
 
   * @method clearTimeout
 
   */
 
  clearTimeout(timeoutId) {
 
    window.clearTimeout(timeoutId);
 

	
 
    const disposeFn = function() {};
 

	
 
    disposeFn.guid = `vjs-timeout-${timeoutId}`;
 

	
 
    this.off('dispose', disposeFn);
 

	
 
    return timeoutId;
 
  }
 

	
 
  /**
 
   * Creates an interval and sets up disposal automatically.
 
   *
 
   * @param {Function} fn The function to run every N seconds.
 
   * @param {Number} interval Number of ms to delay before executing specified function.
 
   * @return {Number} Returns the interval ID
 
   * @method setInterval
 
   */
 
  setInterval(fn, interval) {
 
    fn = Fn.bind(this, fn);
 

	
 
    let intervalId = window.setInterval(fn, interval);
 

	
 
    const disposeFn = function() {
 
      this.clearInterval(intervalId);
 
    };
 

	
 
    disposeFn.guid = `vjs-interval-${intervalId}`;
 

	
 
    this.on('dispose', disposeFn);
 

	
 
    return intervalId;
 
  }
 

	
 
  /**
 
   * Clears an interval and removes the associated dispose listener
 
   *
 
   * @param {Number} intervalId The id of the interval to clear
 
   * @return {Number} Returns the interval ID
 
   * @method clearInterval
 
   */
 
  clearInterval(intervalId) {
 
    window.clearInterval(intervalId);
 

	
 
    const disposeFn = function() {};
 

	
 
    disposeFn.guid = `vjs-interval-${intervalId}`;
 

	
 
    this.off('dispose', disposeFn);
 

	
 
    return intervalId;
 
  }
 

	
 
  /**
 
   * Registers a component
 
   *
 
   * @param {String} name Name of the component to register
 
   * @param {Object} comp The component to register
 
   * @static
 
   * @method registerComponent
 
   */
 
  static registerComponent(name, comp) {
 
    if (!Component.components_) {
 
      Component.components_ = {};
 
    }
 

	
 
    Component.components_[name] = comp;
 
    return comp;
 
  }
 

	
 
  /**
 
   * Gets a component by name
 
   *
 
   * @param {String} name Name of the component to get
 
   * @return {Component}
 
   * @static
 
   * @method getComponent
 
   */
 
  static getComponent(name) {
 
    if (Component.components_ && Component.components_[name]) {
 
      return Component.components_[name];
 
    }
 

	
 
    if (window && window.videojs && window.videojs[name]) {
 
      log.warn(`The ${name} component was added to the videojs object when it should be registered using videojs.registerComponent(name, component)`);
 
      return window.videojs[name];
 
    }
 
  }
 

	
 
  /**
 
   * Sets up the constructor using the supplied init method
 
   * or uses the init of the parent object
 
   *
 
   * @param {Object} props An object of properties
 
   * @static
 
   * @deprecated
 
   * @method extend
 
   */
 
  static extend(props) {
 
    props = props || {};
 

	
 
    log.warn('Component.extend({}) has been deprecated, use videojs.extend(Component, {}) instead');
 

	
 
    // Set up the constructor using the supplied init method
 
    // or using the init of the parent object
 
    // Make sure to check the unobfuscated version for external libs
 
    let init = props.init || props.init || this.prototype.init || this.prototype.init || function() {};
 
    // In Resig's simple class inheritance (previously used) the constructor
 
    //  is a function that calls `this.init.apply(arguments)`
 
    // However that would prevent us from using `ParentObject.call(this);`
 
    //  in a Child constructor because the `this` in `this.init`
 
    //  would still refer to the Child and cause an infinite loop.
 
    // We would instead have to do
 
    //    `ParentObject.prototype.init.apply(this, arguments);`
 
    //  Bleh. We're not creating a _super() function, so it's good to keep
 
    //  the parent constructor reference simple.
 
    let subObj = function() {
 
      init.apply(this, arguments);
 
    };
 

	
 
    // Inherit from this object's prototype
 
    subObj.prototype = Object.create(this.prototype);
 
    // Reset the constructor property for subObj otherwise
 
    // instances of subObj would have the constructor of the parent Object
 
    subObj.prototype.constructor = subObj;
 

	
 
    // Make the class extendable
 
    subObj.extend = Component.extend;
 

	
 
    // Extend subObj's prototype with functions and other properties from props
 
    for (let name in props) {
 
      if (props.hasOwnProperty(name)) {
 
        subObj.prototype[name] = props[name];
 
      }
 
    }
 

	
 
    return subObj;
 
  }
 
}
 

	
 
Component.registerComponent('Component', Component);
 
export default Component;
ennstatus/static/js/video.js/src/js/control-bar/control-bar.js
Show inline comments
 
new file 100644
 
/**
 
 * @file control-bar.js
 
 */
 
import Component from '../component.js';
 

	
 
// Required children
 
import PlayToggle from './play-toggle.js';
 
import CurrentTimeDisplay from './time-controls/current-time-display.js';
 
import DurationDisplay from './time-controls/duration-display.js';
 
import TimeDivider from './time-controls/time-divider.js';
 
import RemainingTimeDisplay from './time-controls/remaining-time-display.js';
 
import LiveDisplay from './live-display.js';
 
import ProgressControl from './progress-control/progress-control.js';
 
import FullscreenToggle from './fullscreen-toggle.js';
 
import VolumeControl from './volume-control/volume-control.js';
 
import VolumeMenuButton from './volume-menu-button.js';
 
import MuteToggle from './mute-toggle.js';
 
import ChaptersButton from './text-track-controls/chapters-button.js';
 
import SubtitlesButton from './text-track-controls/subtitles-button.js';
 
import CaptionsButton from './text-track-controls/captions-button.js';
 
import PlaybackRateMenuButton from './playback-rate-menu/playback-rate-menu-button.js';
 
import CustomControlSpacer from './spacer-controls/custom-control-spacer.js';
 

	
 
/**
 
 * Container of main controls
 
 *
 
 * @extends Component
 
 * @class ControlBar
 
 */
 
class ControlBar extends Component {
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    return super.createEl('div', {
 
      className: 'vjs-control-bar'
 
    });
 
  }
 
}
 

	
 
ControlBar.prototype.options_ = {
 
  loadEvent: 'play',
 
  children: [
 
    'playToggle',
 
    'volumeMenuButton',
 
    'currentTimeDisplay',
 
    'timeDivider',
 
    'durationDisplay',
 
    'progressControl',
 
    'liveDisplay',
 
    'remainingTimeDisplay',
 
    'customControlSpacer',
 
    'playbackRateMenuButton',
 
    'chaptersButton',
 
    'subtitlesButton',
 
    'captionsButton',
 
    'fullscreenToggle'
 
  ]
 
};
 

	
 
Component.registerComponent('ControlBar', ControlBar);
 
export default ControlBar;
ennstatus/static/js/video.js/src/js/control-bar/fullscreen-toggle.js
Show inline comments
 
new file 100644
 
/**
 
 * @file fullscreen-toggle.js
 
 */
 
import Button from '../button.js';
 
import Component from '../component.js';
 

	
 
/**
 
 * Toggle fullscreen video
 
 *
 
 * @extends Button
 
 * @class FullscreenToggle
 
 */
 
class FullscreenToggle extends Button {
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 
  buildCSSClass() {
 
    return `vjs-fullscreen-control ${super.buildCSSClass()}`;
 
  }
 

	
 
  /**
 
   * Handles click for full screen
 
   *
 
   * @method handleClick
 
   */
 
  handleClick() {
 
    if (!this.player_.isFullscreen()) {
 
      this.player_.requestFullscreen();
 
      this.controlText('Non-Fullscreen');
 
    } else {
 
      this.player_.exitFullscreen();
 
      this.controlText('Fullscreen');
 
    }
 
  }
 

	
 
}
 

	
 
FullscreenToggle.prototype.controlText_ = 'Fullscreen';
 

	
 
Component.registerComponent('FullscreenToggle', FullscreenToggle);
 
export default FullscreenToggle;
ennstatus/static/js/video.js/src/js/control-bar/live-display.js
Show inline comments
 
new file 100644
 
/**
 
 * @file live-display.js
 
 */
 
import Component from '../component';
 
import * as Dom from '../utils/dom.js';
 

	
 
/**
 
 * Displays the live indicator
 
 * TODO - Future make it click to snap to live
 
 *
 
 * @extends Component
 
 * @class LiveDisplay
 
 */
 
class LiveDisplay extends Component {
 

	
 
  constructor(player, options) {
 
    super(player, options);
 

	
 
    this.updateShowing();
 
    this.on(this.player(), 'durationchange', this.updateShowing);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    var el = super.createEl('div', {
 
      className: 'vjs-live-control vjs-control'
 
    });
 

	
 
    this.contentEl_ = Dom.createEl('div', {
 
      className: 'vjs-live-display',
 
      innerHTML: `<span class="vjs-control-text">${this.localize('Stream Type')}</span>${this.localize('LIVE')}`
 
    }, {
 
      'aria-live': 'off'
 
    });
 

	
 
    el.appendChild(this.contentEl_);
 
    return el;
 
  }
 

	
 
  updateShowing() {
 
    if (this.player().duration() === Infinity) {
 
      this.show();
 
    } else {
 
      this.hide();
 
    }
 
  }
 

	
 
}
 

	
 
Component.registerComponent('LiveDisplay', LiveDisplay);
 
export default LiveDisplay;
ennstatus/static/js/video.js/src/js/control-bar/mute-toggle.js
Show inline comments
 
new file 100644
 
/**
 
 * @file mute-toggle.js
 
 */
 
import Button from '../button';
 
import Component from '../component';
 
import * as Dom from '../utils/dom.js';
 

	
 
/**
 
 * A button component for muting the audio
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Button
 
 * @class MuteToggle
 
 */
 
class MuteToggle extends Button {
 

	
 
  constructor(player, options) {
 
    super(player, options);
 

	
 
    this.on(player, 'volumechange', this.update);
 

	
 
    // hide mute toggle if the current tech doesn't support volume control
 
    if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {
 
      this.addClass('vjs-hidden');
 
    }
 

	
 
    this.on(player, 'loadstart', function() {
 
      this.update(); // We need to update the button to account for a default muted state.
 

	
 
      if (player.tech_['featuresVolumeControl'] === false) {
 
        this.addClass('vjs-hidden');
 
      } else {
 
        this.removeClass('vjs-hidden');
 
      }
 
    });
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 
  buildCSSClass() {
 
    return `vjs-mute-control ${super.buildCSSClass()}`;
 
  }
 

	
 
  /**
 
   * Handle click on mute
 
   *
 
   * @method handleClick
 
   */
 
  handleClick() {
 
    this.player_.muted( this.player_.muted() ? false : true );
 
  }
 

	
 
  /**
 
   * Update volume
 
   *
 
   * @method update
 
   */
 
  update() {
 
    var vol = this.player_.volume(),
 
        level = 3;
 

	
 
    if (vol === 0 || this.player_.muted()) {
 
      level = 0;
 
    } else if (vol < 0.33) {
 
      level = 1;
 
    } else if (vol < 0.67) {
 
      level = 2;
 
    }
 

	
 
    // Don't rewrite the button text if the actual text doesn't change.
 
    // This causes unnecessary and confusing information for screen reader users.
 
    // This check is needed because this function gets called every time the volume level is changed.
 
    let toMute = this.player_.muted() ? 'Unmute' : 'Mute';
 
    let localizedMute = this.localize(toMute);
 
    if (this.controlText() !== localizedMute) {
 
      this.controlText(localizedMute);
 
    }
 

	
 
    /* TODO improve muted icon classes */
 
    for (var i = 0; i < 4; i++) {
 
      Dom.removeElClass(this.el_, `vjs-vol-${i}`);
 
    }
 
    Dom.addElClass(this.el_, `vjs-vol-${level}`);
 
  }
 

	
 
}
 

	
 
MuteToggle.prototype.controlText_ = 'Mute';
 

	
 
Component.registerComponent('MuteToggle', MuteToggle);
 
export default MuteToggle;
ennstatus/static/js/video.js/src/js/control-bar/play-toggle.js
Show inline comments
 
new file 100644
 
/**
 
 * @file play-toggle.js
 
 */
 
import Button from '../button.js';
 
import Component from '../component.js';
 

	
 
/**
 
 * Button to toggle between play and pause
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Button
 
 * @class PlayToggle
 
 */
 
class PlayToggle extends Button {
 

	
 
  constructor(player, options){
 
    super(player, options);
 

	
 
    this.on(player, 'play', this.handlePlay);
 
    this.on(player, 'pause', this.handlePause);
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 
  buildCSSClass() {
 
    return `vjs-play-control ${super.buildCSSClass()}`;
 
  }
 

	
 
  /**
 
   * Handle click to toggle between play and pause
 
   *
 
   * @method handleClick
 
   */
 
  handleClick() {
 
    if (this.player_.paused()) {
 
      this.player_.play();
 
    } else {
 
      this.player_.pause();
 
    }
 
  }
 

	
 
  /**
 
   * Add the vjs-playing class to the element so it can change appearance
 
   *
 
   * @method handlePlay
 
   */
 
  handlePlay() {
 
    this.removeClass('vjs-paused');
 
    this.addClass('vjs-playing');
 
    this.controlText('Pause'); // change the button text to "Pause"
 
  }
 

	
 
  /**
 
   * Add the vjs-paused class to the element so it can change appearance
 
   *
 
   * @method handlePause
 
   */
 
  handlePause() {
 
    this.removeClass('vjs-playing');
 
    this.addClass('vjs-paused');
 
    this.controlText('Play'); // change the button text to "Play"
 
  }
 

	
 
}
 

	
 
PlayToggle.prototype.controlText_ = 'Play';
 

	
 
Component.registerComponent('PlayToggle', PlayToggle);
 
export default PlayToggle;
ennstatus/static/js/video.js/src/js/control-bar/playback-rate-menu/playback-rate-menu-button.js
Show inline comments
 
new file 100644
 
/**
 
 * @file playback-rate-menu-button.js
 
 */
 
import MenuButton from '../../menu/menu-button.js';
 
import Menu from '../../menu/menu.js';
 
import PlaybackRateMenuItem from './playback-rate-menu-item.js';
 
import Component from '../../component.js';
 
import * as Dom from '../../utils/dom.js';
 

	
 
/**
 
 * The component for controlling the playback rate
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuButton
 
 * @class PlaybackRateMenuButton
 
 */
 
class PlaybackRateMenuButton extends MenuButton {
 

	
 
  constructor(player, options){
 
    super(player, options);
 

	
 
    this.updateVisibility();
 
    this.updateLabel();
 

	
 
    this.on(player, 'loadstart', this.updateVisibility);
 
    this.on(player, 'ratechange', this.updateLabel);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    let el = super.createEl();
 

	
 
    this.labelEl_ = Dom.createEl('div', {
 
      className: 'vjs-playback-rate-value',
 
      innerHTML: 1.0
 
    });
 

	
 
    el.appendChild(this.labelEl_);
 

	
 
    return el;
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 
  buildCSSClass() {
 
    return `vjs-playback-rate ${super.buildCSSClass()}`;
 
  }
 

	
 
  /**
 
   * Create the playback rate menu
 
   *
 
   * @return {Menu} Menu object populated with items
 
   * @method createMenu
 
   */
 
  createMenu() {
 
    let menu = new Menu(this.player());
 
    let rates = this.playbackRates();
 

	
 
    if (rates) {
 
      for (let i = rates.length - 1; i >= 0; i--) {
 
        menu.addChild(
 
          new PlaybackRateMenuItem(this.player(), { 'rate': rates[i] + 'x'})
 
        );
 
      }
 
    }
 

	
 
    return menu;
 
  }
 

	
 
  /**
 
   * Updates ARIA accessibility attributes
 
   *
 
   * @method updateARIAAttributes
 
   */
 
  updateARIAAttributes() {
 
    // Current playback rate
 
    this.el().setAttribute('aria-valuenow', this.player().playbackRate());
 
  }
 

	
 
  /**
 
   * Handle menu item click
 
   *
 
   * @method handleClick
 
   */
 
  handleClick() {
 
    // select next rate option
 
    let currentRate = this.player().playbackRate();
 
    let rates = this.playbackRates();
 

	
 
    // this will select first one if the last one currently selected
 
    let newRate = rates[0];
 
    for (let i = 0; i < rates.length ; i++) {
 
      if (rates[i] > currentRate) {
 
        newRate = rates[i];
 
        break;
 
      }
 
    }
 
    this.player().playbackRate(newRate);
 
  }
 

	
 
  /**
 
   * Get possible playback rates
 
   *
 
   * @return {Array} Possible playback rates
 
   * @method playbackRates
 
   */
 
  playbackRates() {
 
    return this.options_['playbackRates'] || (this.options_.playerOptions && this.options_.playerOptions['playbackRates']);
 
  }
 

	
 
  /**
 
   * Get supported playback rates
 
   *
 
   * @return {Array} Supported playback rates
 
   * @method playbackRateSupported
 
   */
 
  playbackRateSupported() {
 
    return this.player().tech_
 
      && this.player().tech_['featuresPlaybackRate']
 
      && this.playbackRates()
 
      && this.playbackRates().length > 0
 
    ;
 
  }
 

	
 
  /**
 
   * Hide playback rate controls when they're no playback rate options to select
 
   *
 
   * @method updateVisibility
 
   */
 
  updateVisibility() {
 
    if (this.playbackRateSupported()) {
 
      this.removeClass('vjs-hidden');
 
    } else {
 
      this.addClass('vjs-hidden');
 
    }
 
  }
 

	
 
  /**
 
   * Update button label when rate changed
 
   *
 
   * @method updateLabel
 
   */
 
  updateLabel() {
 
    if (this.playbackRateSupported()) {
 
      this.labelEl_.innerHTML = this.player().playbackRate() + 'x';
 
    }
 
  }
 

	
 
}
 

	
 
PlaybackRateMenuButton.prototype.controlText_ = 'Playback Rate';
 

	
 
Component.registerComponent('PlaybackRateMenuButton', PlaybackRateMenuButton);
 
export default PlaybackRateMenuButton;
ennstatus/static/js/video.js/src/js/control-bar/playback-rate-menu/playback-rate-menu-item.js
Show inline comments
 
new file 100644
 
/**
 
 * @file playback-rate-menu-item.js
 
 */
 
import MenuItem from '../../menu/menu-item.js';
 
import Component from '../../component.js';
 

	
 
/**
 
 * The specific menu item type for selecting a playback rate
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuItem
 
 * @class PlaybackRateMenuItem
 
 */
 
class PlaybackRateMenuItem extends MenuItem {
 

	
 
  constructor(player, options){
 
    let label = options['rate'];
 
    let rate = parseFloat(label, 10);
 

	
 
    // Modify options for parent MenuItem class's init.
 
    options['label'] = label;
 
    options['selected'] = rate === 1;
 
    super(player, options);
 

	
 
    this.label = label;
 
    this.rate = rate;
 

	
 
    this.on(player, 'ratechange', this.update);
 
  }
 

	
 
  /**
 
   * Handle click on menu item
 
   *
 
   * @method handleClick
 
   */
 
  handleClick() {
 
    super.handleClick();
 
    this.player().playbackRate(this.rate);
 
  }
 

	
 
  /**
 
   * Update playback rate with selected rate
 
   *
 
   * @method update
 
   */
 
  update() {
 
    this.selected(this.player().playbackRate() === this.rate);
 
  }
 

	
 
}
 

	
 
PlaybackRateMenuItem.prototype.contentElType = 'button';
 

	
 
Component.registerComponent('PlaybackRateMenuItem', PlaybackRateMenuItem);
 
export default PlaybackRateMenuItem;
ennstatus/static/js/video.js/src/js/control-bar/progress-control/load-progress-bar.js
Show inline comments
 
new file 100644
 
/**
 
 * @file load-progress-bar.js
 
 */
 
import Component from '../../component.js';
 
import * as Dom from '../../utils/dom.js';
 

	
 
/**
 
 * Shows load progress
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class LoadProgressBar
 
 */
 
class LoadProgressBar extends Component {
 

	
 
  constructor(player, options){
 
    super(player, options);
 
    this.on(player, 'progress', this.update);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    return super.createEl('div', {
 
      className: 'vjs-load-progress',
 
      innerHTML: `<span class="vjs-control-text"><span>${this.localize('Loaded')}</span>: 0%</span>`
 
    });
 
  }
 

	
 
  /**
 
   * Update progress bar
 
   *
 
   * @method update
 
   */
 
  update() {
 
    let buffered = this.player_.buffered();
 
    let duration = this.player_.duration();
 
    let bufferedEnd = this.player_.bufferedEnd();
 
    let children = this.el_.children;
 

	
 
    // get the percent width of a time compared to the total end
 
    let percentify = function (time, end){
 
      let percent = (time / end) || 0; // no NaN
 
      return ((percent >= 1 ? 1 : percent) * 100) + '%';
 
    };
 

	
 
    // update the width of the progress bar
 
    this.el_.style.width = percentify(bufferedEnd, duration);
 

	
 
    // add child elements to represent the individual buffered time ranges
 
    for (let i = 0; i < buffered.length; i++) {
 
      let start = buffered.start(i);
 
      let end = buffered.end(i);
 
      let part = children[i];
 

	
 
      if (!part) {
 
        part = this.el_.appendChild(Dom.createEl());
 
      }
 

	
 
      // set the percent based on the width of the progress bar (bufferedEnd)
 
      part.style.left = percentify(start, bufferedEnd);
 
      part.style.width = percentify(end - start, bufferedEnd);
 
    }
 

	
 
    // remove unused buffered range elements
 
    for (let i = children.length; i > buffered.length; i--) {
 
      this.el_.removeChild(children[i-1]);
 
    }
 
  }
 

	
 
}
 

	
 
Component.registerComponent('LoadProgressBar', LoadProgressBar);
 
export default LoadProgressBar;
ennstatus/static/js/video.js/src/js/control-bar/progress-control/mouse-time-display.js
Show inline comments
 
new file 100644
 
/**
 
 * @file mouse-time-display.js
 
 */
 
import Component from '../../component.js';
 
import * as Dom from '../../utils/dom.js';
 
import * as Fn from '../../utils/fn.js';
 
import formatTime from '../../utils/format-time.js';
 
import throttle from 'lodash-compat/function/throttle';
 

	
 
/**
 
 * The Mouse Time Display component shows the time you will seek to
 
 * when hovering over the progress bar
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class MouseTimeDisplay
 
 */
 
class MouseTimeDisplay extends Component {
 

	
 
  constructor(player, options) {
 
    super(player, options);
 

	
 
    this.update(0, 0);
 

	
 
    player.on('ready', () => {
 
      this.on(player.controlBar.progressControl.el(), 'mousemove', throttle(Fn.bind(this, this.handleMouseMove), 25));
 
    });
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    return super.createEl('div', {
 
      className: 'vjs-mouse-display'
 
    });
 
  }
 

	
 
  handleMouseMove(event) {
 
    let duration = this.player_.duration();
 
    let newTime = this.calculateDistance(event) * duration;
 
    let position = event.pageX - Dom.findElPosition(this.el().parentNode).left;
 

	
 
    this.update(newTime, position);
 
  }
 

	
 
  update(newTime, position) {
 
    let time = formatTime(newTime, this.player_.duration());
 

	
 
    this.el().style.left = position + 'px';
 
    this.el().setAttribute('data-current-time', time);
 
  }
 

	
 
  calculateDistance(event) {
 
    return Dom.getPointerPosition(this.el().parentNode, event).x;
 
  }
 
}
 

	
 
Component.registerComponent('MouseTimeDisplay', MouseTimeDisplay);
 
export default MouseTimeDisplay;
ennstatus/static/js/video.js/src/js/control-bar/progress-control/play-progress-bar.js
Show inline comments
 
new file 100644
 
/**
 
 * @file play-progress-bar.js
 
 */
 
import Component from '../../component.js';
 
import * as Fn from '../../utils/fn.js';
 
import formatTime from '../../utils/format-time.js';
 

	
 
/**
 
 * Shows play progress
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class PlayProgressBar
 
 */
 
class PlayProgressBar extends Component {
 

	
 
  constructor(player, options){
 
    super(player, options);
 
    this.updateDataAttr();
 
    this.on(player, 'timeupdate', this.updateDataAttr);
 
    player.ready(Fn.bind(this, this.updateDataAttr));
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    return super.createEl('div', {
 
      className: 'vjs-play-progress vjs-slider-bar',
 
      innerHTML: `<span class="vjs-control-text"><span>${this.localize('Progress')}</span>: 0%</span>`
 
    });
 
  }
 

	
 
  updateDataAttr() {
 
    let time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();
 
    this.el_.setAttribute('data-current-time', formatTime(time, this.player_.duration()));
 
  }
 

	
 
}
 

	
 
Component.registerComponent('PlayProgressBar', PlayProgressBar);
 
export default PlayProgressBar;
ennstatus/static/js/video.js/src/js/control-bar/progress-control/progress-control.js
Show inline comments
 
new file 100644
 
/**
 
 * @file progress-control.js
 
 */
 
import Component from '../../component.js';
 
import SeekBar from './seek-bar.js';
 
import MouseTimeDisplay from './mouse-time-display.js';
 

	
 
/**
 
 * The Progress Control component contains the seek bar, load progress,
 
 * and play progress
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class ProgressControl
 
 */
 
class ProgressControl extends Component {
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    return super.createEl('div', {
 
      className: 'vjs-progress-control vjs-control'
 
    });
 
  }
 
}
 

	
 
ProgressControl.prototype.options_ = {
 
  children: [
 
    'seekBar'
 
  ]
 
};
 

	
 
Component.registerComponent('ProgressControl', ProgressControl);
 
export default ProgressControl;
ennstatus/static/js/video.js/src/js/control-bar/progress-control/seek-bar.js
Show inline comments
 
new file 100644
 
/**
 
 * @file seek-bar.js
 
 */
 
import Slider from '../../slider/slider.js';
 
import Component from '../../component.js';
 
import LoadProgressBar from './load-progress-bar.js';
 
import PlayProgressBar from './play-progress-bar.js';
 
import * as Fn from '../../utils/fn.js';
 
import formatTime from '../../utils/format-time.js';
 
import assign from 'object.assign';
 

	
 
/**
 
 * Seek Bar and holder for the progress bars
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Slider
 
 * @class SeekBar
 
 */
 
class SeekBar extends Slider {
 

	
 
  constructor(player, options){
 
    super(player, options);
 
    this.on(player, 'timeupdate', this.updateARIAAttributes);
 
    player.ready(Fn.bind(this, this.updateARIAAttributes));
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    return super.createEl('div', {
 
      className: 'vjs-progress-holder'
 
    }, {
 
      'aria-label': 'video progress bar'
 
    });
 
  }
 

	
 
  /**
 
   * Update ARIA accessibility attributes
 
   *
 
   * @method updateARIAAttributes
 
   */
 
  updateARIAAttributes() {
 
      // Allows for smooth scrubbing, when player can't keep up.
 
      let time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();
 
      this.el_.setAttribute('aria-valuenow', (this.getPercent() * 100).toFixed(2)); // machine readable value of progress bar (percentage complete)
 
      this.el_.setAttribute('aria-valuetext', formatTime(time, this.player_.duration())); // human readable value of progress bar (time complete)
 
  }
 

	
 
  /**
 
   * Get percentage of video played
 
   *
 
   * @return {Number} Percentage played
 
   * @method getPercent
 
   */
 
  getPercent() {
 
    let percent = this.player_.currentTime() / this.player_.duration();
 
    return percent >= 1 ? 1 : percent;
 
  }
 

	
 
  /**
 
   * Handle mouse down on seek bar
 
   *
 
   * @method handleMouseDown
 
   */
 
  handleMouseDown(event) {
 
    super.handleMouseDown(event);
 

	
 
    this.player_.scrubbing(true);
 

	
 
    this.videoWasPlaying = !this.player_.paused();
 
    this.player_.pause();
 
  }
 

	
 
  /**
 
   * Handle mouse move on seek bar
 
   *
 
   * @method handleMouseMove
 
   */
 
  handleMouseMove(event) {
 
    let newTime = this.calculateDistance(event) * this.player_.duration();
 

	
 
    // Don't let video end while scrubbing.
 
    if (newTime === this.player_.duration()) { newTime = newTime - 0.1; }
 

	
 
    // Set new time (tell player to seek to new time)
 
    this.player_.currentTime(newTime);
 
  }
 

	
 
  /**
 
   * Handle mouse up on seek bar
 
   *
 
   * @method handleMouseUp
 
   */
 
  handleMouseUp(event) {
 
    super.handleMouseUp(event);
 

	
 
    this.player_.scrubbing(false);
 
    if (this.videoWasPlaying) {
 
      this.player_.play();
 
    }
 
  }
 

	
 
  /**
 
   * Move more quickly fast forward for keyboard-only users
 
   *
 
   * @method stepForward
 
   */
 
  stepForward() {
 
    this.player_.currentTime(this.player_.currentTime() + 5); // more quickly fast forward for keyboard-only users
 
  }
 

	
 
  /**
 
   * Move more quickly rewind for keyboard-only users
 
   *
 
   * @method stepBack
 
   */
 
  stepBack() {
 
    this.player_.currentTime(this.player_.currentTime() - 5); // more quickly rewind for keyboard-only users
 
  }
 

	
 
}
 

	
 
SeekBar.prototype.options_ = {
 
  children: [
 
    'loadProgressBar',
 
    'mouseTimeDisplay',
 
    'playProgressBar'
 
  ],
 
  'barName': 'playProgressBar'
 
};
 

	
 
SeekBar.prototype.playerEvent = 'timeupdate';
 

	
 
Component.registerComponent('SeekBar', SeekBar);
 
export default SeekBar;
ennstatus/static/js/video.js/src/js/control-bar/spacer-controls/custom-control-spacer.js
Show inline comments
 
new file 100644
 
/**
 
 * @file custom-control-spacer.js
 
 */
 
import Spacer from './spacer.js';
 
import Component from '../../component.js';
 

	
 
/**
 
 * Spacer specifically meant to be used as an insertion point for new plugins, etc.
 
 *
 
 * @extends Spacer
 
 * @class CustomControlSpacer
 
 */
 
class CustomControlSpacer extends Spacer {
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 
  buildCSSClass() {
 
    return `vjs-custom-control-spacer ${super.buildCSSClass()}`;
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    let el = super.createEl({
 
      className: this.buildCSSClass(),
 
    });
 

	
 
    // No-flex/table-cell mode requires there be some content
 
    // in the cell to fill the remaining space of the table.
 
    el.innerHTML = '&nbsp;';
 
    return el;
 
  }
 
}
 

	
 
Component.registerComponent('CustomControlSpacer', CustomControlSpacer);
 
export default CustomControlSpacer;
ennstatus/static/js/video.js/src/js/control-bar/spacer-controls/spacer.js
Show inline comments
 
new file 100644
 
/**
 
 * @file spacer.js
 
 */
 
import Component from '../../component.js';
 

	
 
/**
 
 * Just an empty spacer element that can be used as an append point for plugins, etc.
 
 * Also can be used to create space between elements when necessary.
 
 *
 
 * @extends Component
 
 * @class Spacer
 
 */
 
class Spacer extends Component {
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 
  buildCSSClass() {
 
    return `vjs-spacer ${super.buildCSSClass()}`;
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    return super.createEl('div', {
 
      className: this.buildCSSClass()
 
    });
 
  }
 
}
 

	
 
Component.registerComponent('Spacer', Spacer);
 

	
 
export default Spacer;
ennstatus/static/js/video.js/src/js/control-bar/text-track-controls/caption-settings-menu-item.js
Show inline comments
 
new file 100644
 
/**
 
 * @file caption-settings-menu-item.js
 
 */
 
import TextTrackMenuItem from './text-track-menu-item.js';
 
import Component from '../../component.js';
 

	
 
/**
 
 * The menu item for caption track settings menu
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends TextTrackMenuItem
 
 * @class CaptionSettingsMenuItem
 
 */
 
 class CaptionSettingsMenuItem extends TextTrackMenuItem {
 

	
 
  constructor(player, options) {
 
    options['track'] = {
 
      'kind': options['kind'],
 
      'player': player,
 
      'label': options['kind'] + ' settings',
 
      'default': false,
 
      mode: 'disabled'
 
    };
 

	
 
    super(player, options);
 
    this.addClass('vjs-texttrack-settings');
 
  }
 

	
 
  /**
 
   * Handle click on menu item
 
   *
 
   * @method handleClick
 
   */
 
  handleClick() {
 
    this.player().getChild('textTrackSettings').show();
 
  }
 

	
 
}
 

	
 
Component.registerComponent('CaptionSettingsMenuItem', CaptionSettingsMenuItem);
 
export default CaptionSettingsMenuItem;
ennstatus/static/js/video.js/src/js/control-bar/text-track-controls/captions-button.js
Show inline comments
 
new file 100644
 
/**
 
 * @file captions-button.js
 
 */
 
import TextTrackButton from './text-track-button.js';
 
import Component from '../../component.js';
 
import CaptionSettingsMenuItem from './caption-settings-menu-item.js';
 

	
 
/**
 
 * The button component for toggling and selecting captions
 
 *
 
 * @param {Object} player  Player object
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends TextTrackButton
 
 * @class CaptionsButton
 
 */
 
class CaptionsButton extends TextTrackButton {
 

	
 
  constructor(player, options, ready){
 
    super(player, options, ready);
 
    this.el_.setAttribute('aria-label','Captions Menu');
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 
  buildCSSClass() {
 
    return `vjs-captions-button ${super.buildCSSClass()}`;
 
  }
 

	
 
  /**
 
   * Update caption menu items
 
   *
 
   * @method update
 
   */
 
  update() {
 
    let threshold = 2;
 
    super.update();
 

	
 
    // if native, then threshold is 1 because no settings button
 
    if (this.player().tech_ && this.player().tech_['featuresNativeTextTracks']) {
 
      threshold = 1;
 
    }
 

	
 
    if (this.items && this.items.length > threshold) {
 
      this.show();
 
    } else {
 
      this.hide();
 
    }
 
  }
 

	
 
  /**
 
   * Create caption menu items
 
   *
 
   * @return {Array} Array of menu items
 
   * @method createItems
 
   */
 
  createItems() {
 
    let items = [];
 

	
 
    if (!(this.player().tech_ && this.player().tech_['featuresNativeTextTracks'])) {
 
      items.push(new CaptionSettingsMenuItem(this.player_, { 'kind': this.kind_ }));
 
    }
 

	
 
    return super.createItems(items);
 
  }
 

	
 
}
 

	
 
CaptionsButton.prototype.kind_ = 'captions';
 
CaptionsButton.prototype.controlText_ = 'Captions';
 

	
 
Component.registerComponent('CaptionsButton', CaptionsButton);
 
export default CaptionsButton;
ennstatus/static/js/video.js/src/js/control-bar/text-track-controls/chapters-button.js
Show inline comments
 
new file 100644
 
/**
 
 * @file chapters-button.js
 
 */
 
import TextTrackButton from './text-track-button.js';
 
import Component from '../../component.js';
 
import TextTrackMenuItem from './text-track-menu-item.js';
 
import ChaptersTrackMenuItem from './chapters-track-menu-item.js';
 
import Menu from '../../menu/menu.js';
 
import * as Dom from '../../utils/dom.js';
 
import * as Fn from '../../utils/fn.js';
 
import toTitleCase from '../../utils/to-title-case.js';
 
import window from 'global/window';
 

	
 
/**
 
 * The button component for toggling and selecting chapters
 
 * Chapters act much differently than other text tracks
 
 * Cues are navigation vs. other tracks of alternative languages
 
 *
 
 * @param {Object} player  Player object
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends TextTrackButton
 
 * @class ChaptersButton
 
 */
 
class ChaptersButton extends TextTrackButton {
 

	
 
  constructor(player, options, ready){
 
    super(player, options, ready);
 
    this.el_.setAttribute('aria-label','Chapters Menu');
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 
  buildCSSClass() {
 
    return `vjs-chapters-button ${super.buildCSSClass()}`;
 
  }
 

	
 
  /**
 
   * Create a menu item for each text track
 
   *
 
   * @return {Array} Array of menu items
 
   * @method createItems
 
   */
 
  createItems() {
 
    let items = [];
 

	
 
    let tracks = this.player_.textTracks();
 

	
 
    if (!tracks) {
 
      return items;
 
    }
 

	
 
    for (let i = 0; i < tracks.length; i++) {
 
      let track = tracks[i];
 
      if (track['kind'] === this.kind_) {
 
        items.push(new TextTrackMenuItem(this.player_, {
 
          'track': track
 
        }));
 
      }
 
    }
 

	
 
    return items;
 
  }
 

	
 
  /**
 
   * Create menu from chapter buttons
 
   *
 
   * @return {Menu} Menu of chapter buttons
 
   * @method createMenu
 
   */
 
  createMenu() {
 
    let tracks = this.player_.textTracks() || [];
 
    let chaptersTrack;
 
    let items = this.items = [];
 

	
 
    for (let i = 0, l = tracks.length; i < l; i++) {
 
      let track = tracks[i];
 
      if (track['kind'] === this.kind_) {
 
        if (!track.cues) {
 
          track['mode'] = 'hidden';
 
          /* jshint loopfunc:true */
 
          // TODO see if we can figure out a better way of doing this https://github.com/videojs/video.js/issues/1864
 
          window.setTimeout(Fn.bind(this, function() {
 
            this.createMenu();
 
          }), 100);
 
          /* jshint loopfunc:false */
 
        } else {
 
          chaptersTrack = track;
 
          break;
 
        }
 
      }
 
    }
 

	
 
    let menu = this.menu;
 
    if (menu === undefined) {
 
      menu = new Menu(this.player_);
 
      menu.contentEl().appendChild(Dom.createEl('li', {
 
        className: 'vjs-menu-title',
 
        innerHTML: toTitleCase(this.kind_),
 
        tabIndex: -1
 
      }));
 
    }
 

	
 
    if (chaptersTrack) {
 
      let cues = chaptersTrack['cues'], cue;
 

	
 
      for (let i = 0, l = cues.length; i < l; i++) {
 
        cue = cues[i];
 

	
 
        let mi = new ChaptersTrackMenuItem(this.player_, {
 
          'track': chaptersTrack,
 
          'cue': cue
 
        });
 

	
 
        items.push(mi);
 

	
 
        menu.addChild(mi);
 
      }
 
      this.addChild(menu);
 
    }
 

	
 
    if (this.items.length > 0) {
 
      this.show();
 
    }
 

	
 
    return menu;
 
  }
 

	
 
}
 

	
 
ChaptersButton.prototype.kind_ = 'chapters';
 
ChaptersButton.prototype.controlText_ = 'Chapters';
 

	
 
Component.registerComponent('ChaptersButton', ChaptersButton);
 
export default ChaptersButton;
ennstatus/static/js/video.js/src/js/control-bar/text-track-controls/chapters-track-menu-item.js
Show inline comments
 
new file 100644
 
/**
 
 * @file chapters-track-menu-item.js
 
 */
 
import MenuItem from '../../menu/menu-item.js';
 
import Component from '../../component.js';
 
import * as Fn from '../../utils/fn.js';
 

	
 
/**
 
 * The chapter track menu item
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuItem
 
 * @class ChaptersTrackMenuItem
 
 */
 
class ChaptersTrackMenuItem extends MenuItem {
 

	
 
  constructor(player, options){
 
    let track = options['track'];
 
    let cue = options['cue'];
 
    let currentTime = player.currentTime();
 

	
 
    // Modify options for parent MenuItem class's init.
 
    options['label'] = cue.text;
 
    options['selected'] = (cue['startTime'] <= currentTime && currentTime < cue['endTime']);
 
    super(player, options);
 

	
 
    this.track = track;
 
    this.cue = cue;
 
    track.addEventListener('cuechange', Fn.bind(this, this.update));
 
  }
 

	
 
  /**
 
   * Handle click on menu item
 
   *
 
   * @method handleClick
 
   */
 
  handleClick() {
 
    super.handleClick();
 
    this.player_.currentTime(this.cue.startTime);
 
    this.update(this.cue.startTime);
 
  }
 

	
 
  /**
 
   * Update chapter menu item
 
   *
 
   * @method update
 
   */
 
  update() {
 
    let cue = this.cue;
 
    let currentTime = this.player_.currentTime();
 

	
 
    // vjs.log(currentTime, cue.startTime);
 
    this.selected(cue['startTime'] <= currentTime && currentTime < cue['endTime']);
 
  }
 

	
 
}
 

	
 
Component.registerComponent('ChaptersTrackMenuItem', ChaptersTrackMenuItem);
 
export default ChaptersTrackMenuItem;
ennstatus/static/js/video.js/src/js/control-bar/text-track-controls/off-text-track-menu-item.js
Show inline comments
 
new file 100644
 
/**
 
 * @file off-text-track-menu-item.js
 
 */
 
import TextTrackMenuItem from './text-track-menu-item.js';
 
import Component from '../../component.js';
 

	
 
/**
 
 * A special menu item for turning of a specific type of text track
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends TextTrackMenuItem
 
 * @class OffTextTrackMenuItem
 
 */
 
class OffTextTrackMenuItem extends TextTrackMenuItem {
 

	
 
  constructor(player, options){
 
    // Create pseudo track info
 
    // Requires options['kind']
 
    options['track'] = {
 
      'kind': options['kind'],
 
      'player': player,
 
      'label': options['kind'] + ' off',
 
      'default': false,
 
      'mode': 'disabled'
 
    };
 

	
 
    super(player, options);
 
    this.selected(true);
 
  }
 

	
 
  /**
 
   * Handle text track change
 
   *
 
   * @param {Object} event Event object
 
   * @method handleTracksChange
 
   */
 
  handleTracksChange(event){
 
    let tracks = this.player().textTracks();
 
    let selected = true;
 

	
 
    for (let i = 0, l = tracks.length; i < l; i++) {
 
      let track = tracks[i];
 
      if (track['kind'] === this.track['kind'] && track['mode'] === 'showing') {
 
        selected = false;
 
        break;
 
      }
 
    }
 

	
 
    this.selected(selected);
 
  }
 

	
 
}
 

	
 
Component.registerComponent('OffTextTrackMenuItem', OffTextTrackMenuItem);
 
export default OffTextTrackMenuItem;
ennstatus/static/js/video.js/src/js/control-bar/text-track-controls/subtitles-button.js
Show inline comments
 
new file 100644
 
/**
 
 * @file subtitles-button.js
 
 */
 
import TextTrackButton from './text-track-button.js';
 
import Component from '../../component.js';
 

	
 
/**
 
 * The button component for toggling and selecting subtitles
 
 *
 
 * @param {Object} player  Player object
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends TextTrackButton
 
 * @class SubtitlesButton
 
 */
 
class SubtitlesButton extends TextTrackButton {
 

	
 
  constructor(player, options, ready){
 
    super(player, options, ready);
 
    this.el_.setAttribute('aria-label','Subtitles Menu');
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 
  buildCSSClass() {
 
    return `vjs-subtitles-button ${super.buildCSSClass()}`;
 
  }
 

	
 
}
 

	
 
SubtitlesButton.prototype.kind_ = 'subtitles';
 
SubtitlesButton.prototype.controlText_ = 'Subtitles';
 

	
 
Component.registerComponent('SubtitlesButton', SubtitlesButton);
 
export default SubtitlesButton;
ennstatus/static/js/video.js/src/js/control-bar/text-track-controls/text-track-button.js
Show inline comments
 
new file 100644
 
/**
 
 * @file text-track-button.js
 
 */
 
import MenuButton from '../../menu/menu-button.js';
 
import Component from '../../component.js';
 
import * as Fn from '../../utils/fn.js';
 
import TextTrackMenuItem from './text-track-menu-item.js';
 
import OffTextTrackMenuItem from './off-text-track-menu-item.js';
 

	
 
/**
 
 * The base class for buttons that toggle specific text track types (e.g. subtitles)
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuButton
 
 * @class TextTrackButton
 
 */
 
class TextTrackButton extends MenuButton {
 

	
 
  constructor(player, options){
 
    super(player, options);
 

	
 
    let tracks = this.player_.textTracks();
 

	
 
    if (this.items.length <= 1) {
 
      this.hide();
 
    }
 

	
 
    if (!tracks) {
 
      return;
 
    }
 

	
 
    let updateHandler = Fn.bind(this, this.update);
 
    tracks.addEventListener('removetrack', updateHandler);
 
    tracks.addEventListener('addtrack', updateHandler);
 

	
 
    this.player_.on('dispose', function() {
 
      tracks.removeEventListener('removetrack', updateHandler);
 
      tracks.removeEventListener('addtrack', updateHandler);
 
    });
 
  }
 

	
 
  // Create a menu item for each text track
 
  createItems(items=[]) {
 
    // Add an OFF menu item to turn all tracks off
 
    items.push(new OffTextTrackMenuItem(this.player_, { 'kind': this.kind_ }));
 

	
 
    let tracks = this.player_.textTracks();
 

	
 
    if (!tracks) {
 
      return items;
 
    }
 

	
 
    for (let i = 0; i < tracks.length; i++) {
 
      let track = tracks[i];
 

	
 
      // only add tracks that are of the appropriate kind and have a label
 
      if (track['kind'] === this.kind_) {
 
        items.push(new TextTrackMenuItem(this.player_, {
 
          'track': track
 
        }));
 
      }
 
    }
 

	
 
    return items;
 
  }
 

	
 
}
 

	
 
Component.registerComponent('TextTrackButton', TextTrackButton);
 
export default TextTrackButton;
ennstatus/static/js/video.js/src/js/control-bar/text-track-controls/text-track-menu-item.js
Show inline comments
 
new file 100644
 
/**
 
 * @file text-track-menu-item.js
 
 */
 
import MenuItem from '../../menu/menu-item.js';
 
import Component from '../../component.js';
 
import * as Fn from '../../utils/fn.js';
 
import window from 'global/window';
 
import document from 'global/document';
 

	
 
/**
 
 * The specific menu item type for selecting a language within a text track kind
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuItem
 
 * @class TextTrackMenuItem
 
 */
 
class TextTrackMenuItem extends MenuItem {
 

	
 
  constructor(player, options){
 
    let track = options['track'];
 
    let tracks = player.textTracks();
 

	
 
    // Modify options for parent MenuItem class's init.
 
    options['label'] = track['label'] || track['language'] || 'Unknown';
 
    options['selected'] = track['default'] || track['mode'] === 'showing';
 
    super(player, options);
 

	
 
    this.track = track;
 

	
 
    if (tracks) {
 
      let changeHandler = Fn.bind(this, this.handleTracksChange);
 

	
 
      tracks.addEventListener('change', changeHandler);
 
      this.on('dispose', function() {
 
        tracks.removeEventListener('change', changeHandler);
 
      });
 
    }
 

	
 
    // iOS7 doesn't dispatch change events to TextTrackLists when an
 
    // associated track's mode changes. Without something like
 
    // Object.observe() (also not present on iOS7), it's not
 
    // possible to detect changes to the mode attribute and polyfill
 
    // the change event. As a poor substitute, we manually dispatch
 
    // change events whenever the controls modify the mode.
 
    if (tracks && tracks.onchange === undefined) {
 
      let event;
 

	
 
      this.on(['tap', 'click'], function() {
 
        if (typeof window.Event !== 'object') {
 
          // Android 2.3 throws an Illegal Constructor error for window.Event
 
          try {
 
            event = new window.Event('change');
 
          } catch(err){}
 
        }
 

	
 
        if (!event) {
 
          event = document.createEvent('Event');
 
          event.initEvent('change', true, true);
 
        }
 

	
 
        tracks.dispatchEvent(event);
 
      });
 
    }
 
  }
 

	
 
  /**
 
   * Handle click on text track
 
   *
 
   * @method handleClick
 
   */
 
  handleClick(event) {
 
    let kind = this.track['kind'];
 
    let tracks = this.player_.textTracks();
 

	
 
    super.handleClick(event);
 

	
 
    if (!tracks) return;
 

	
 
    for (let i = 0; i < tracks.length; i++) {
 
      let track = tracks[i];
 

	
 
      if (track['kind'] !== kind) {
 
        continue;
 
      }
 

	
 
      if (track === this.track) {
 
        track['mode'] = 'showing';
 
      } else {
 
        track['mode'] = 'disabled';
 
      }
 
    }
 
  }
 

	
 
  /**
 
   * Handle text track change
 
   *
 
   * @method handleTracksChange
 
   */
 
  handleTracksChange(event){
 
    this.selected(this.track['mode'] === 'showing');
 
  }
 

	
 
}
 

	
 
Component.registerComponent('TextTrackMenuItem', TextTrackMenuItem);
 
export default TextTrackMenuItem;
ennstatus/static/js/video.js/src/js/control-bar/time-controls/current-time-display.js
Show inline comments
 
new file 100644
 
/**
 
 * @file current-time-display.js
 
 */
 
import Component from '../../component.js';
 
import * as Dom from '../../utils/dom.js';
 
import formatTime from '../../utils/format-time.js';
 

	
 
/**
 
 * Displays the current time
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class CurrentTimeDisplay
 
 */
 
class CurrentTimeDisplay extends Component {
 

	
 
  constructor(player, options){
 
    super(player, options);
 

	
 
    this.on(player, 'timeupdate', this.updateContent);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    let el = super.createEl('div', {
 
      className: 'vjs-current-time vjs-time-control vjs-control'
 
    });
 

	
 
    this.contentEl_ = Dom.createEl('div', {
 
      className: 'vjs-current-time-display',
 
      // label the current time for screen reader users
 
      innerHTML: '<span class="vjs-control-text">Current Time </span>' + '0:00',
 
    }, {
 
      // tell screen readers not to automatically read the time as it changes
 
      'aria-live': 'off'
 
    });
 

	
 
    el.appendChild(this.contentEl_);
 
    return el;
 
  }
 

	
 
  /**
 
   * Update current time display
 
   *
 
   * @method updateContent
 
   */
 
  updateContent() {
 
    // Allows for smooth scrubbing, when player can't keep up.
 
    let time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();
 
    let localizedText = this.localize('Current Time');
 
    let formattedTime = formatTime(time, this.player_.duration());
 
    this.contentEl_.innerHTML = `<span class="vjs-control-text">${localizedText}</span> ${formattedTime}`;
 
  }
 

	
 
}
 

	
 
Component.registerComponent('CurrentTimeDisplay', CurrentTimeDisplay);
 
export default CurrentTimeDisplay;
ennstatus/static/js/video.js/src/js/control-bar/time-controls/duration-display.js
Show inline comments
 
new file 100644
 
/**
 
 * @file duration-display.js
 
 */
 
import Component from '../../component.js';
 
import * as Dom from '../../utils/dom.js';
 
import formatTime from '../../utils/format-time.js';
 

	
 
/**
 
 * Displays the duration
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class DurationDisplay
 
 */
 
class DurationDisplay extends Component {
 

	
 
  constructor(player, options){
 
    super(player, options);
 

	
 
    // this might need to be changed to 'durationchange' instead of 'timeupdate' eventually,
 
    // however the durationchange event fires before this.player_.duration() is set,
 
    // so the value cannot be written out using this method.
 
    // Once the order of durationchange and this.player_.duration() being set is figured out,
 
    // this can be updated.
 
    this.on(player, 'timeupdate', this.updateContent);
 
    this.on(player, 'loadedmetadata', this.updateContent);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    let el = super.createEl('div', {
 
      className: 'vjs-duration vjs-time-control vjs-control'
 
    });
 

	
 
    this.contentEl_ = Dom.createEl('div', {
 
      className: 'vjs-duration-display',
 
      // label the duration time for screen reader users
 
      innerHTML: `<span class="vjs-control-text">${this.localize('Duration Time')}</span> 0:00`
 
    }, {
 
      // tell screen readers not to automatically read the time as it changes
 
      'aria-live': 'off'
 
    });
 

	
 
    el.appendChild(this.contentEl_);
 
    return el;
 
  }
 

	
 
  /**
 
   * Update duration time display
 
   *
 
   * @method updateContent
 
   */
 
  updateContent() {
 
    let duration = this.player_.duration();
 
    if (duration) {
 
      let localizedText = this.localize('Duration Time');
 
      let formattedTime = formatTime(duration);
 
      this.contentEl_.innerHTML = `<span class="vjs-control-text">${localizedText}</span> ${formattedTime}`; // label the duration time for screen reader users
 
    }
 
  }
 

	
 
}
 

	
 
Component.registerComponent('DurationDisplay', DurationDisplay);
 
export default DurationDisplay;
ennstatus/static/js/video.js/src/js/control-bar/time-controls/remaining-time-display.js
Show inline comments
 
new file 100644
 
/**
 
 * @file remaining-time-display.js
 
 */
 
import Component from '../../component.js';
 
import * as Dom from '../../utils/dom.js';
 
import formatTime from '../../utils/format-time.js';
 

	
 
/**
 
 * Displays the time left in the video
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class RemainingTimeDisplay
 
 */
 
class RemainingTimeDisplay extends Component {
 

	
 
  constructor(player, options){
 
    super(player, options);
 

	
 
    this.on(player, 'timeupdate', this.updateContent);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    let el = super.createEl('div', {
 
      className: 'vjs-remaining-time vjs-time-control vjs-control'
 
    });
 

	
 
    this.contentEl_ = Dom.createEl('div', {
 
      className: 'vjs-remaining-time-display',
 
      // label the remaining time for screen reader users
 
      innerHTML: `<span class="vjs-control-text">${this.localize('Remaining Time')}</span> -0:00`,
 
    }, {
 
      // tell screen readers not to automatically read the time as it changes
 
      'aria-live': 'off'
 
    });
 

	
 
    el.appendChild(this.contentEl_);
 
    return el;
 
  }
 

	
 
  /**
 
   * Update remaining time display
 
   *
 
   * @method updateContent
 
   */
 
  updateContent() {
 
    if (this.player_.duration()) {
 
      const localizedText = this.localize('Remaining Time');
 
      const formattedTime = formatTime(this.player_.remainingTime());
 
      this.contentEl_.innerHTML = `<span class="vjs-control-text">${localizedText}</span> -${formattedTime}`;
 
    }
 

	
 
    // Allows for smooth scrubbing, when player can't keep up.
 
    // var time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();
 
    // this.contentEl_.innerHTML = vjs.formatTime(time, this.player_.duration());
 
  }
 

	
 
}
 

	
 
Component.registerComponent('RemainingTimeDisplay', RemainingTimeDisplay);
 
export default RemainingTimeDisplay;
ennstatus/static/js/video.js/src/js/control-bar/time-controls/time-divider.js
Show inline comments
 
new file 100644
 
/**
 
 * @file time-divider.js
 
 */
 
import Component from '../../component.js';
 

	
 
/**
 
 * The separator between the current time and duration.
 
 * Can be hidden if it's not needed in the design.
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class TimeDivider
 
 */
 
class TimeDivider extends Component {
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    return super.createEl('div', {
 
      className: 'vjs-time-control vjs-time-divider',
 
      innerHTML: '<div><span>/</span></div>'
 
    });
 
  }
 

	
 
}
 

	
 
Component.registerComponent('TimeDivider', TimeDivider);
 
export default TimeDivider;
ennstatus/static/js/video.js/src/js/control-bar/volume-control/volume-bar.js
Show inline comments
 
new file 100644
 
/**
 
 * @file volume-bar.js
 
 */
 
import Slider from '../../slider/slider.js';
 
import Component from '../../component.js';
 
import * as Fn from '../../utils/fn.js';
 

	
 
// Required children
 
import VolumeLevel from './volume-level.js';
 

	
 
/**
 
 * The bar that contains the volume level and can be clicked on to adjust the level
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Slider
 
 * @class VolumeBar
 
 */
 
class VolumeBar extends Slider {
 

	
 
  constructor(player, options){
 
    super(player, options);
 
    this.on(player, 'volumechange', this.updateARIAAttributes);
 
    player.ready(Fn.bind(this, this.updateARIAAttributes));
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    return super.createEl('div', {
 
      className: 'vjs-volume-bar vjs-slider-bar'
 
    }, {
 
      'aria-label': 'volume level'
 
    });
 
  }
 

	
 
  /**
 
   * Handle mouse move on volume bar
 
   *
 
   * @method handleMouseMove
 
   */
 
  handleMouseMove(event) {
 
    if (this.player_.muted()) {
 
      this.player_.muted(false);
 
    }
 

	
 
    this.player_.volume(this.calculateDistance(event));
 
  }
 

	
 
  /**
 
   * Get percent of volume level
 
   *
 
   * @retun {Number} Volume level percent
 
   * @method getPercent
 
   */
 
  getPercent() {
 
    if (this.player_.muted()) {
 
      return 0;
 
    } else {
 
      return this.player_.volume();
 
    }
 
  }
 

	
 
  /**
 
   * Increase volume level for keyboard users
 
   *
 
   * @method stepForward
 
   */
 
  stepForward() {
 
    this.player_.volume(this.player_.volume() + 0.1);
 
  }
 

	
 
  /**
 
   * Decrease volume level for keyboard users
 
   *
 
   * @method stepBack
 
   */
 
  stepBack() {
 
    this.player_.volume(this.player_.volume() - 0.1);
 
  }
 

	
 
  /**
 
   * Update ARIA accessibility attributes
 
   *
 
   * @method updateARIAAttributes
 
   */
 
  updateARIAAttributes() {
 
    // Current value of volume bar as a percentage
 
    let volume = (this.player_.volume() * 100).toFixed(2);
 
    this.el_.setAttribute('aria-valuenow', volume);
 
    this.el_.setAttribute('aria-valuetext', volume + '%');
 
  }
 

	
 
}
 

	
 
VolumeBar.prototype.options_ = {
 
  children: [
 
    'volumeLevel'
 
  ],
 
  'barName': 'volumeLevel'
 
};
 

	
 
VolumeBar.prototype.playerEvent = 'volumechange';
 

	
 
Component.registerComponent('VolumeBar', VolumeBar);
 
export default VolumeBar;
ennstatus/static/js/video.js/src/js/control-bar/volume-control/volume-control.js
Show inline comments
 
new file 100644
 
/**
 
 * @file volume-control.js
 
 */
 
import Component from '../../component.js';
 

	
 
// Required children
 
import VolumeBar from './volume-bar.js';
 

	
 
/**
 
 * The component for controlling the volume level
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class VolumeControl
 
 */
 
class VolumeControl extends Component {
 

	
 
  constructor(player, options){
 
    super(player, options);
 

	
 
    // hide volume controls when they're not supported by the current tech
 
    if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {
 
      this.addClass('vjs-hidden');
 
    }
 
    this.on(player, 'loadstart', function(){
 
      if (player.tech_['featuresVolumeControl'] === false) {
 
        this.addClass('vjs-hidden');
 
      } else {
 
        this.removeClass('vjs-hidden');
 
      }
 
    });
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    return super.createEl('div', {
 
      className: 'vjs-volume-control vjs-control'
 
    });
 
  }
 

	
 
}
 

	
 
VolumeControl.prototype.options_ = {
 
  children: [
 
    'volumeBar'
 
  ]
 
};
 

	
 
Component.registerComponent('VolumeControl', VolumeControl);
 
export default VolumeControl;
ennstatus/static/js/video.js/src/js/control-bar/volume-control/volume-level.js
Show inline comments
 
new file 100644
 
/**
 
 * @file volume-level.js
 
 */
 
import Component from '../../component.js';
 

	
 
/**
 
 * Shows volume level
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class VolumeLevel
 
 */
 
class VolumeLevel extends Component {
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    return super.createEl('div', {
 
      className: 'vjs-volume-level',
 
      innerHTML: '<span class="vjs-control-text"></span>'
 
    });
 
  }
 

	
 
}
 

	
 
Component.registerComponent('VolumeLevel', VolumeLevel);
 
export default VolumeLevel;
ennstatus/static/js/video.js/src/js/control-bar/volume-menu-button.js
Show inline comments
 
new file 100644
 
/**
 
 * @file volume-menu-button.js
 
 */
 
import Button from '../button.js';
 
import Component from '../component.js';
 
import Menu from '../menu/menu.js';
 
import MenuButton from '../menu/menu-button.js';
 
import MuteToggle from './mute-toggle.js';
 
import VolumeBar from './volume-control/volume-bar.js';
 

	
 
/**
 
 * Button for volume menu
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends MenuButton
 
 * @class VolumeMenuButton
 
 */
 
class VolumeMenuButton extends MenuButton {
 

	
 
  constructor(player, options={}){
 
    // Default to inline
 
    if (options.inline === undefined) {
 
      options.inline = true;
 
    }
 

	
 
    // If the vertical option isn't passed at all, default to true.
 
    if (options.vertical === undefined) {
 
      // If an inline volumeMenuButton is used, we should default to using
 
      // a horizontal slider for obvious reasons.
 
      if (options.inline) {
 
        options.vertical = false;
 
      } else {
 
        options.vertical = true;
 
      }
 
    }
 

	
 
    // The vertical option needs to be set on the volumeBar as well,
 
    // since that will need to be passed along to the VolumeBar constructor
 
    options.volumeBar = options.volumeBar || {};
 
    options.volumeBar.vertical = !!options.vertical;
 

	
 
    super(player, options);
 

	
 
    // Same listeners as MuteToggle
 
    this.on(player, 'volumechange', this.volumeUpdate);
 
    this.on(player, 'loadstart', this.volumeUpdate);
 

	
 
    // hide mute toggle if the current tech doesn't support volume control
 
    function updateVisibility() {
 
      if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {
 
        this.addClass('vjs-hidden');
 
      } else {
 
        this.removeClass('vjs-hidden');
 
      }
 
    }
 

	
 
    updateVisibility.call(this);
 
    this.on(player, 'loadstart', updateVisibility);
 

	
 
    this.on(this.volumeBar, ['slideractive', 'focus'], function(){
 
      this.addClass('vjs-slider-active');
 
    });
 

	
 
    this.on(this.volumeBar, ['sliderinactive', 'blur'], function(){
 
      this.removeClass('vjs-slider-active');
 
    });
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 
  buildCSSClass() {
 
    let orientationClass = '';
 
    if (!!this.options_.vertical) {
 
      orientationClass = 'vjs-volume-menu-button-vertical';
 
    } else {
 
      orientationClass = 'vjs-volume-menu-button-horizontal';
 
    }
 

	
 
    return `vjs-volume-menu-button ${super.buildCSSClass()} ${orientationClass}`;
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {Menu} The volume menu button
 
   * @method createMenu
 
   */
 
  createMenu() {
 
    let menu = new Menu(this.player_, {
 
      contentElType: 'div'
 
    });
 

	
 
    let vb = new VolumeBar(this.player_, this.options_.volumeBar);
 

	
 
    menu.addChild(vb);
 

	
 
    this.volumeBar = vb;
 
    return menu;
 
  }
 

	
 
  /**
 
   * Handle click on volume menu and calls super
 
   *
 
   * @method handleClick
 
   */
 
  handleClick() {
 
    MuteToggle.prototype.handleClick.call(this);
 
    super.handleClick();
 
  }
 

	
 
}
 

	
 
VolumeMenuButton.prototype.volumeUpdate = MuteToggle.prototype.update;
 
VolumeMenuButton.prototype.controlText_ = 'Mute';
 

	
 
Component.registerComponent('VolumeMenuButton', VolumeMenuButton);
 
export default VolumeMenuButton;
ennstatus/static/js/video.js/src/js/error-display.js
Show inline comments
 
new file 100644
 
/**
 
 * @file error-display.js
 
 */
 
import Component from './component';
 
import  * as Dom from './utils/dom.js';
 

	
 
/**
 
 * Display that an error has occurred making the video unplayable
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @extends Component
 
 * @class ErrorDisplay
 
 */
 
class ErrorDisplay extends Component {
 

	
 
  constructor(player, options) {
 
    super(player, options);
 

	
 
    this.update();
 
    this.on(player, 'error', this.update);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    var el = super.createEl('div', {
 
      className: 'vjs-error-display'
 
    });
 

	
 
    this.contentEl_ = Dom.createEl('div');
 
    el.appendChild(this.contentEl_);
 

	
 
    return el;
 
  }
 

	
 
  /**
 
   * Update the error message in localized language
 
   *
 
   * @method update
 
   */
 
  update() {
 
    if (this.player().error()) {
 
      this.contentEl_.innerHTML = this.localize(this.player().error().message);
 
    }
 
  }
 
}
 

	
 
Component.registerComponent('ErrorDisplay', ErrorDisplay);
 
export default ErrorDisplay;
ennstatus/static/js/video.js/src/js/event-target.js
Show inline comments
 
new file 100644
 
/**
 
 * @file event-target.js
 
 */
 
import * as Events from './utils/events.js';
 

	
 
var EventTarget = function() {};
 

	
 
EventTarget.prototype.allowedEvents_ = {};
 

	
 
EventTarget.prototype.on = function(type, fn) {
 
  // Remove the addEventListener alias before calling Events.on
 
  // so we don't get into an infinite type loop
 
  let ael = this.addEventListener;
 
  this.addEventListener = Function.prototype;
 
  Events.on(this, type, fn);
 
  this.addEventListener = ael;
 
};
 
EventTarget.prototype.addEventListener = EventTarget.prototype.on;
 

	
 
EventTarget.prototype.off = function(type, fn) {
 
  Events.off(this, type, fn);
 
};
 
EventTarget.prototype.removeEventListener = EventTarget.prototype.off;
 

	
 
EventTarget.prototype.one = function(type, fn) {
 
  Events.one(this, type, fn);
 
};
 

	
 
EventTarget.prototype.trigger = function(event) {
 
  let type = event.type || event;
 

	
 
  if (typeof event === 'string') {
 
    event = {
 
      type: type
 
    };
 
  }
 
  event = Events.fixEvent(event);
 

	
 
  if (this.allowedEvents_[type] && this['on' + type]) {
 
    this['on' + type](event);
 
  }
 

	
 
  Events.trigger(this, event);
 
};
 
// The standard DOM EventTarget.dispatchEvent() is aliased to trigger()
 
EventTarget.prototype.dispatchEvent = EventTarget.prototype.trigger;
 

	
 
export default EventTarget;
ennstatus/static/js/video.js/src/js/extend.js
Show inline comments
 
new file 100644
 
import log from './utils/log';
 

	
 
/*
 
 * @file extend.js
 
 *
 
 * A combination of node inherits and babel's inherits (after transpile).
 
 * Both work the same but node adds `super_` to the subClass
 
 * and Bable adds the superClass as __proto__. Both seem useful.
 
 */
 
const _inherits = function (subClass, superClass) {
 
  if (typeof superClass !== 'function' && superClass !== null) {
 
    throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);
 
  }
 

	
 
  subClass.prototype = Object.create(superClass && superClass.prototype, {
 
    constructor: {
 
      value: subClass,
 
      enumerable: false,
 
      writable: true,
 
      configurable: true
 
    }
 
  });
 

	
 
  if (superClass) {
 
    // node
 
    subClass.super_ = superClass;
 
  }
 
};
 

	
 
/*
 
 * Function for subclassing using the same inheritance that
 
 * videojs uses internally
 
 * ```js
 
 * var Button = videojs.getComponent('Button');
 
 * ```
 
 * ```js
 
 * var MyButton = videojs.extend(Button, {
 
 *   constructor: function(player, options) {
 
 *     Button.call(this, player, options);
 
 *   },
 
 *   onClick: function() {
 
 *     // doSomething
 
 *   }
 
 * });
 
 * ```
 
 */
 
const extendFn = function(superClass, subClassMethods={}) {
 
  let subClass = function() {
 
    superClass.apply(this, arguments);
 
  };
 
  let methods = {};
 

	
 
  if (typeof subClassMethods === 'object') {
 
    if (typeof subClassMethods.init === 'function') {
 
      log.warn('Constructor logic via init() is deprecated; please use constructor() instead.');
 
      subClassMethods.constructor = subClassMethods.init;
 
    }
 
    if (subClassMethods.constructor !== Object.prototype.constructor) {
 
      subClass = subClassMethods.constructor;
 
    }
 
    methods = subClassMethods;
 
  } else if (typeof subClassMethods === 'function') {
 
    subClass = subClassMethods;
 
  }
 

	
 
  _inherits(subClass, superClass);
 

	
 
  // Extend subObj's prototype with functions and other properties from props
 
  for (var name in methods) {
 
    if (methods.hasOwnProperty(name)) {
 
      subClass.prototype[name] = methods[name];
 
    }
 
  }
 

	
 
  return subClass;
 
};
 

	
 
export default extendFn;
ennstatus/static/js/video.js/src/js/fullscreen-api.js
Show inline comments
 
new file 100644
 
/**
 
 * @file fullscreen-api.js
 
 */
 
import document from 'global/document';
 

	
 
/*
 
 * Store the browser-specific methods for the fullscreen API
 
 * @type {Object|undefined}
 
 * @private
 
 */
 
let FullscreenApi = {};
 

	
 
// browser API methods
 
// map approach from Screenful.js - https://github.com/sindresorhus/screenfull.js
 
const apiMap = [
 
  // Spec: https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
 
  [
 
    'requestFullscreen',
 
    'exitFullscreen',
 
    'fullscreenElement',
 
    'fullscreenEnabled',
 
    'fullscreenchange',
 
    'fullscreenerror'
 
  ],
 
  // WebKit
 
  [
 
    'webkitRequestFullscreen',
 
    'webkitExitFullscreen',
 
    'webkitFullscreenElement',
 
    'webkitFullscreenEnabled',
 
    'webkitfullscreenchange',
 
    'webkitfullscreenerror'
 
  ],
 
  // Old WebKit (Safari 5.1)
 
  [
 
    'webkitRequestFullScreen',
 
    'webkitCancelFullScreen',
 
    'webkitCurrentFullScreenElement',
 
    'webkitCancelFullScreen',
 
    'webkitfullscreenchange',
 
    'webkitfullscreenerror'
 
  ],
 
  // Mozilla
 
  [
 
    'mozRequestFullScreen',
 
    'mozCancelFullScreen',
 
    'mozFullScreenElement',
 
    'mozFullScreenEnabled',
 
    'mozfullscreenchange',
 
    'mozfullscreenerror'
 
  ],
 
  // Microsoft
 
  [
 
    'msRequestFullscreen',
 
    'msExitFullscreen',
 
    'msFullscreenElement',
 
    'msFullscreenEnabled',
 
    'MSFullscreenChange',
 
    'MSFullscreenError'
 
  ]
 
];
 

	
 
let specApi = apiMap[0];
 
let browserApi;
 

	
 
// determine the supported set of functions
 
for (let i = 0; i < apiMap.length; i++) {
 
  // check for exitFullscreen function
 
  if (apiMap[i][1] in document) {
 
    browserApi = apiMap[i];
 
    break;
 
  }
 
}
 

	
 
// map the browser API names to the spec API names
 
if (browserApi) {
 
  for (let i=0; i<browserApi.length; i++) {
 
    FullscreenApi[specApi[i]] = browserApi[i];
 
  }
 
}
 

	
 
export default FullscreenApi;
ennstatus/static/js/video.js/src/js/loading-spinner.js
Show inline comments
 
new file 100644
 
/**
 
 * @file loading-spinner.js
 
 */
 
import Component from './component';
 

	
 
/* Loading Spinner
 
================================================================================ */
 
/**
 
 * Loading spinner for waiting events
 
 *
 
 * @extends Component
 
 * @class LoadingSpinner
 
 */
 
class LoadingSpinner extends Component {
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @method createEl
 
   */
 
  createEl() {
 
    return super.createEl('div', {
 
      className: 'vjs-loading-spinner'
 
    });
 
  }
 
}
 

	
 
Component.registerComponent('LoadingSpinner', LoadingSpinner);
 
export default LoadingSpinner;
ennstatus/static/js/video.js/src/js/media-error.js
Show inline comments
 
new file 100644
 
/**
 
 * @file media-error.js
 
 */
 
import assign from 'object.assign';
 

	
 
/*
 
 * Custom MediaError to mimic the HTML5 MediaError
 
 *
 
 * @param {Number} code The media error code
 
 */
 
let MediaError = function(code){
 
  if (typeof code === 'number') {
 
    this.code = code;
 
  } else if (typeof code === 'string') {
 
    // default code is zero, so this is a custom error
 
    this.message = code;
 
  } else if (typeof code === 'object') { // object
 
    assign(this, code);
 
  }
 

	
 
  if (!this.message) {
 
    this.message = MediaError.defaultMessages[this.code] || '';
 
  }
 
};
 

	
 
/*
 
 * The error code that refers two one of the defined
 
 * MediaError types
 
 *
 
 * @type {Number}
 
 */
 
MediaError.prototype.code = 0;
 

	
 
/*
 
 * An optional message to be shown with the error.
 
 * Message is not part of the HTML5 video spec
 
 * but allows for more informative custom errors.
 
 *
 
 * @type {String}
 
 */
 
MediaError.prototype.message = '';
 

	
 
/*
 
 * An optional status code that can be set by plugins
 
 * to allow even more detail about the error.
 
 * For example the HLS plugin might provide the specific
 
 * HTTP status code that was returned when the error
 
 * occurred, then allowing a custom error overlay
 
 * to display more information.
 
 *
 
 * @type {Array}
 
 */
 
MediaError.prototype.status = null;
 

	
 
MediaError.errorTypes = [
 
  'MEDIA_ERR_CUSTOM',            // = 0
 
  'MEDIA_ERR_ABORTED',           // = 1
 
  'MEDIA_ERR_NETWORK',           // = 2
 
  'MEDIA_ERR_DECODE',            // = 3
 
  'MEDIA_ERR_SRC_NOT_SUPPORTED', // = 4
 
  'MEDIA_ERR_ENCRYPTED'          // = 5
 
];
 

	
 
MediaError.defaultMessages = {
 
  1: 'You aborted the media playback',
 
  2: 'A network error caused the media download to fail part-way.',
 
  3: 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.',
 
  4: 'The media could not be loaded, either because the server or network failed or because the format is not supported.',
 
  5: 'The media is encrypted and we do not have the keys to decrypt it.'
 
};
 

	
 
// Add types as properties on MediaError
 
// e.g. MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
 
for (var errNum = 0; errNum < MediaError.errorTypes.length; errNum++) {
 
  MediaError[MediaError.errorTypes[errNum]] = errNum;
 
  // values should be accessible on both the class and instance
 
  MediaError.prototype[MediaError.errorTypes[errNum]] = errNum;
 
}
 

	
 
export default MediaError;
ennstatus/static/js/video.js/src/js/menu/menu-button.js
Show inline comments
 
new file 100644
 
/**
 
 * @file menu-button.js
 
 */
 
import Button from '../button.js';
 
import Component from '../component.js';
 
import Menu from './menu.js';
 
import * as Dom from '../utils/dom.js';
 
import * as Fn from '../utils/fn.js';
 
import toTitleCase from '../utils/to-title-case.js';
 

	
 
/**
 
 * A button class with a popup menu
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Button
 
 * @class MenuButton
 
 */
 
class MenuButton extends Button {
 

	
 
  constructor(player, options={}){
 
    super(player, options);
 

	
 
    this.update();
 

	
 
    this.on('keydown', this.handleKeyPress);
 
    this.el_.setAttribute('aria-haspopup', true);
 
    this.el_.setAttribute('role', 'button');
 
  }
 

	
 
  /**
 
   * Update menu
 
   *
 
   * @method update
 
   */
 
  update() {
 
    let menu = this.createMenu();
 

	
 
    if (this.menu) {
 
      this.removeChild(this.menu);
 
    }
 

	
 
    this.menu = menu;
 
    this.addChild(menu);
 

	
 
    /**
 
     * Track the state of the menu button
 
     *
 
     * @type {Boolean}
 
     * @private
 
     */
 
    this.buttonPressed_ = false;
 

	
 
    if (this.items && this.items.length === 0) {
 
      this.hide();
 
    } else if (this.items && this.items.length > 1) {
 
      this.show();
 
    }
 
  }
 

	
 
  /**
 
   * Create menu
 
   *
 
   * @return {Menu} The constructed menu
 
   * @method createMenu
 
   */
 
  createMenu() {
 
    var menu = new Menu(this.player_);
 

	
 
    // Add a title list item to the top
 
    if (this.options_.title) {
 
      menu.contentEl().appendChild(Dom.createEl('li', {
 
        className: 'vjs-menu-title',
 
        innerHTML: toTitleCase(this.options_.title),
 
        tabIndex: -1
 
      }));
 
    }
 

	
 
    this.items = this['createItems']();
 

	
 
    if (this.items) {
 
      // Add menu items to the menu
 
      for (var i = 0; i < this.items.length; i++) {
 
        menu.addItem(this.items[i]);
 
      }
 
    }
 

	
 
    return menu;
 
  }
 

	
 
  /**
 
   * Create the list of menu items. Specific to each subclass.
 
   *
 
   * @method createItems
 
   */
 
  createItems(){}
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    return super.createEl('div', {
 
      className: this.buildCSSClass()
 
    });
 
  }
 

	
 
  /**
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @return {String} The constructed class name
 
   * @method buildCSSClass
 
   */
 
  buildCSSClass() {
 
    var menuButtonClass = 'vjs-menu-button';
 

	
 
    // If the inline option is passed, we want to use different styles altogether.
 
    if (this.options_.inline === true) {
 
      menuButtonClass += '-inline';
 
    } else {
 
      menuButtonClass += '-popup';
 
    }
 

	
 
    return `vjs-menu-button ${menuButtonClass} ${super.buildCSSClass()}`;
 
  }
 

	
 
  /**
 
   * Focus - Add keyboard functionality to element
 
   * This function is not needed anymore. Instead, the
 
   * keyboard functionality is handled by
 
   * treating the button as triggering a submenu.
 
   * When the button is pressed, the submenu
 
   * appears. Pressing the button again makes
 
   * the submenu disappear.
 
   *
 
   * @method handleFocus
 
   */
 
  handleFocus() {}
 

	
 
  /**
 
   * Can't turn off list display that we turned
 
   * on with focus, because list would go away.
 
   *
 
   * @method handleBlur
 
   */
 
  handleBlur() {}
 

	
 
  /**
 
   * When you click the button it adds focus, which
 
   * will show the menu indefinitely.
 
   * So we'll remove focus when the mouse leaves the button.
 
   * Focus is needed for tab navigation.
 
   * Allow sub components to stack CSS class names
 
   *
 
   * @method handleClick
 
   */
 
  handleClick() {
 
    this.one('mouseout', Fn.bind(this, function(){
 
      this.menu.unlockShowing();
 
      this.el_.blur();
 
    }));
 
    if (this.buttonPressed_){
 
      this.unpressButton();
 
    } else {
 
      this.pressButton();
 
    }
 
  }
 

	
 
  /**
 
   * Handle key press on menu
 
   *
 
   * @param {Object} Key press event
 
   * @method handleKeyPress
 
   */
 
  handleKeyPress(event) {
 

	
 
    // Check for space bar (32) or enter (13) keys
 
    if (event.which === 32 || event.which === 13) {
 
      if (this.buttonPressed_){
 
        this.unpressButton();
 
      } else {
 
        this.pressButton();
 
      }
 
      event.preventDefault();
 
    // Check for escape (27) key
 
    } else if (event.which === 27){
 
      if (this.buttonPressed_){
 
        this.unpressButton();
 
      }
 
      event.preventDefault();
 
    }
 
  }
 

	
 
  /**
 
   * Makes changes based on button pressed
 
   *
 
   * @method pressButton
 
   */
 
  pressButton() {
 
    this.buttonPressed_ = true;
 
    this.menu.lockShowing();
 
    this.el_.setAttribute('aria-pressed', true);
 
    if (this.items && this.items.length > 0) {
 
      this.items[0].el().focus(); // set the focus to the title of the submenu
 
    }
 
  }
 

	
 
  /**
 
   * Makes changes based on button unpressed
 
   *
 
   * @method unpressButton
 
   */
 
  unpressButton() {
 
    this.buttonPressed_ = false;
 
    this.menu.unlockShowing();
 
    this.el_.setAttribute('aria-pressed', false);
 
  }
 
}
 

	
 
Component.registerComponent('MenuButton', MenuButton);
 
export default MenuButton;
ennstatus/static/js/video.js/src/js/menu/menu-item.js
Show inline comments
 
new file 100644
 
/**
 
 * @file menu-item.js
 
 */
 
import Button from '../button.js';
 
import Component from '../component.js';
 
import assign from 'object.assign';
 

	
 
/**
 
 * The component for a menu item. `<li>`
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Button
 
 * @class MenuItem
 
 */
 
class MenuItem extends Button {
 

	
 
  constructor(player, options) {
 
    super(player, options);
 
    this.selected(options['selected']);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @param {String=} type Desc
 
   * @param {Object=} props Desc
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl(type, props, attrs) {
 
    return super.createEl('li', assign({
 
      className: 'vjs-menu-item',
 
      innerHTML: this.localize(this.options_['label'])
 
    }, props), attrs);
 
  }
 

	
 
  /**
 
   * Handle a click on the menu item, and set it to selected
 
   *
 
   * @method handleClick
 
   */
 
  handleClick() {
 
    this.selected(true);
 
  }
 

	
 
  /**
 
   * Set this menu item as selected or not
 
   *
 
   * @param  {Boolean} selected
 
   * @method selected
 
   */
 
  selected(selected) {
 
    if (selected) {
 
      this.addClass('vjs-selected');
 
      this.el_.setAttribute('aria-selected',true);
 
    } else {
 
      this.removeClass('vjs-selected');
 
      this.el_.setAttribute('aria-selected',false);
 
    }
 
  }
 

	
 
}
 

	
 
Component.registerComponent('MenuItem', MenuItem);
 
export default MenuItem;
ennstatus/static/js/video.js/src/js/menu/menu.js
Show inline comments
 
new file 100644
 
/**
 
 * @file menu.js
 
 */
 
import Component from '../component.js';
 
import * as Dom from '../utils/dom.js';
 
import * as Fn from '../utils/fn.js';
 
import * as Events from '../utils/events.js';
 

	
 
/**
 
 * The Menu component is used to build pop up menus, including subtitle and
 
 * captions selection menus.
 
 *
 
 * @extends Component
 
 * @class Menu
 
 */
 
class Menu extends Component {
 

	
 
  /**
 
   * Add a menu item to the menu
 
   *
 
   * @param {Object|String} component Component or component type to add
 
   * @method addItem
 
   */
 
  addItem(component) {
 
    this.addChild(component);
 
    component.on('click', Fn.bind(this, function(){
 
      this.unlockShowing();
 
    }));
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    let contentElType = this.options_.contentElType || 'ul';
 
    this.contentEl_ = Dom.createEl(contentElType, {
 
      className: 'vjs-menu-content'
 
    });
 
    var el = super.createEl('div', {
 
      append: this.contentEl_,
 
      className: 'vjs-menu'
 
    });
 
    el.appendChild(this.contentEl_);
 

	
 
    // Prevent clicks from bubbling up. Needed for Menu Buttons,
 
    // where a click on the parent is significant
 
    Events.on(el, 'click', function(event){
 
      event.preventDefault();
 
      event.stopImmediatePropagation();
 
    });
 

	
 
    return el;
 
  }
 
}
 

	
 
Component.registerComponent('Menu', Menu);
 
export default Menu;
ennstatus/static/js/video.js/src/js/player.js
Show inline comments
 
new file 100644
 
/**
 
 * @file player.js
 
 */
 
 // Subclasses Component
 
import Component from './component.js';
 

	
 
import document from 'global/document';
 
import window from 'global/window';
 
import * as Events from './utils/events.js';
 
import * as Dom from './utils/dom.js';
 
import * as Fn from './utils/fn.js';
 
import * as Guid from './utils/guid.js';
 
import * as browser from './utils/browser.js';
 
import log from './utils/log.js';
 
import toTitleCase from './utils/to-title-case.js';
 
import { createTimeRange } from './utils/time-ranges.js';
 
import { bufferedPercent } from './utils/buffer.js';
 
import * as stylesheet from './utils/stylesheet.js';
 
import FullscreenApi from './fullscreen-api.js';
 
import MediaError from './media-error.js';
 
import safeParseTuple from 'safe-json-parse/tuple';
 
import assign from 'object.assign';
 
import mergeOptions from './utils/merge-options.js';
 
import textTrackConverter from './tracks/text-track-list-converter.js';
 

	
 
// Include required child components (importing also registers them)
 
import MediaLoader from './tech/loader.js';
 
import PosterImage from './poster-image.js';
 
import TextTrackDisplay from './tracks/text-track-display.js';
 
import LoadingSpinner from './loading-spinner.js';
 
import BigPlayButton from './big-play-button.js';
 
import ControlBar from './control-bar/control-bar.js';
 
import ErrorDisplay from './error-display.js';
 
import TextTrackSettings from './tracks/text-track-settings.js';
 

	
 
// Require html5 tech, at least for disposing the original video tag
 
import Html5 from './tech/html5.js';
 

	
 
/**
 
 * An instance of the `Player` class is created when any of the Video.js setup methods are used to initialize a video.
 
 * ```js
 
 * var myPlayer = videojs('example_video_1');
 
 * ```
 
 * In the following example, the `data-setup` attribute tells the Video.js library to create a player instance when the library is ready.
 
 * ```html
 
 * <video id="example_video_1" data-setup='{}' controls>
 
 *   <source src="my-source.mp4" type="video/mp4">
 
 * </video>
 
 * ```
 
 * After an instance has been created it can be accessed globally using `Video('example_video_1')`.
 
 *
 
 * @param {Element} tag        The original video tag used for configuring options
 
 * @param {Object=} options    Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends Component
 
 * @class Player
 
 */
 
class Player extends Component {
 

	
 
  /**
 
   * player's constructor function
 
   *
 
   * @constructs
 
   * @method init
 
   * @param {Element} tag        The original video tag used for configuring options
 
   * @param {Object=} options    Player options
 
   * @param {Function=} ready    Ready callback function
 
   */
 
  constructor(tag, options, ready){
 
    // Make sure tag ID exists
 
    tag.id = tag.id || `vjs_video_${Guid.newGUID()}`;
 

	
 
    // Set Options
 
    // The options argument overrides options set in the video tag
 
    // which overrides globally set options.
 
    // This latter part coincides with the load order
 
    // (tag must exist before Player)
 
    options = assign(Player.getTagSettings(tag), options);
 

	
 
    // Delay the initialization of children because we need to set up
 
    // player properties first, and can't use `this` before `super()`
 
    options.initChildren = false;
 

	
 
    // Same with creating the element
 
    options.createEl = false;
 

	
 
    // we don't want the player to report touch activity on itself
 
    // see enableTouchActivity in Component
 
    options.reportTouchActivity = false;
 

	
 
    // Run base component initializing with new options
 
    super(null, options, ready);
 

	
 
    // if the global option object was accidentally blown away by
 
    // someone, bail early with an informative error
 
    if (!this.options_ ||
 
        !this.options_.techOrder ||
 
        !this.options_.techOrder.length) {
 
      throw new Error('No techOrder specified. Did you overwrite ' +
 
                      'videojs.options instead of just changing the ' +
 
                      'properties you want to override?');
 
    }
 

	
 
    this.tag = tag; // Store the original tag used to set options
 

	
 
    // Store the tag attributes used to restore html5 element
 
    this.tagAttributes = tag && Dom.getElAttributes(tag);
 

	
 
    // Update current language
 
    this.language(this.options_.language);
 

	
 
    // Update Supported Languages
 
    if (options.languages) {
 
      // Normalise player option languages to lowercase
 
      let languagesToLower = {};
 

	
 
      Object.getOwnPropertyNames(options.languages).forEach(function(name) {
 
        languagesToLower[name.toLowerCase()] = options.languages[name];
 
      });
 
      this.languages_ = languagesToLower;
 
    } else {
 
      this.languages_ = Player.prototype.options_.languages;
 
    }
 

	
 
    // Cache for video property values.
 
    this.cache_ = {};
 

	
 
    // Set poster
 
    this.poster_ = options.poster || '';
 

	
 
    // Set controls
 
    this.controls_ = !!options.controls;
 

	
 
    // Original tag settings stored in options
 
    // now remove immediately so native controls don't flash.
 
    // May be turned back on by HTML5 tech if nativeControlsForTouch is true
 
    tag.controls = false;
 

	
 
    /*
 
     * Store the internal state of scrubbing
 
     *
 
     * @private
 
     * @return {Boolean} True if the user is scrubbing
 
     */
 
    this.scrubbing_ = false;
 

	
 
    this.el_ = this.createEl();
 

	
 
    // We also want to pass the original player options to each component and plugin
 
    // as well so they don't need to reach back into the player for options later.
 
    // We also need to do another copy of this.options_ so we don't end up with
 
    // an infinite loop.
 
    let playerOptionsCopy = mergeOptions(this.options_);
 

	
 
    // Load plugins
 
    if (options.plugins) {
 
      let plugins = options.plugins;
 

	
 
      Object.getOwnPropertyNames(plugins).forEach(function(name){
 
        if (typeof this[name] === 'function') {
 
          this[name](plugins[name]);
 
        } else {
 
          log.error('Unable to find plugin:', name);
 
        }
 
      }, this);
 
    }
 

	
 
    this.options_.playerOptions = playerOptionsCopy;
 

	
 
    this.initChildren();
 

	
 
    // Set isAudio based on whether or not an audio tag was used
 
    this.isAudio(tag.nodeName.toLowerCase() === 'audio');
 

	
 
    // Update controls className. Can't do this when the controls are initially
 
    // set because the element doesn't exist yet.
 
    if (this.controls()) {
 
      this.addClass('vjs-controls-enabled');
 
    } else {
 
      this.addClass('vjs-controls-disabled');
 
    }
 

	
 
    if (this.isAudio()) {
 
      this.addClass('vjs-audio');
 
    }
 

	
 
    if (this.flexNotSupported_()) {
 
      this.addClass('vjs-no-flex');
 
    }
 

	
 
    // TODO: Make this smarter. Toggle user state between touching/mousing
 
    // using events, since devices can have both touch and mouse events.
 
    // if (browser.TOUCH_ENABLED) {
 
    //   this.addClass('vjs-touch-enabled');
 
    // }
 

	
 
    // Make player easily findable by ID
 
    Player.players[this.id_] = this;
 

	
 
    // When the player is first initialized, trigger activity so components
 
    // like the control bar show themselves if needed
 
    this.userActive(true);
 
    this.reportUserActivity();
 
    this.listenForUserActivity_();
 

	
 
    this.on('fullscreenchange', this.handleFullscreenChange_);
 
    this.on('stageclick', this.handleStageClick_);
 
  }
 

	
 
  /**
 
   * Destroys the video player and does any necessary cleanup
 
   * ```js
 
   *     myPlayer.dispose();
 
   * ```
 
   * This is especially helpful if you are dynamically adding and removing videos
 
   * to/from the DOM.
 
   *
 
   * @method dispose
 
   */
 
  dispose() {
 
    this.trigger('dispose');
 
    // prevent dispose from being called twice
 
    this.off('dispose');
 

	
 
    if (this.styleEl_) {
 
      this.styleEl_.parentNode.removeChild(this.styleEl_);
 
    }
 

	
 
    // Kill reference to this player
 
    Player.players[this.id_] = null;
 
    if (this.tag && this.tag.player) { this.tag.player = null; }
 
    if (this.el_ && this.el_.player) { this.el_.player = null; }
 

	
 
    if (this.tech_) { this.tech_.dispose(); }
 

	
 
    super.dispose();
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    let el = this.el_ = super.createEl('div');
 
    let tag = this.tag;
 

	
 
    // Remove width/height attrs from tag so CSS can make it 100% width/height
 
    tag.removeAttribute('width');
 
    tag.removeAttribute('height');
 

	
 
    // Copy over all the attributes from the tag, including ID and class
 
    // ID will now reference player box, not the video tag
 
    const attrs = Dom.getElAttributes(tag);
 

	
 
    Object.getOwnPropertyNames(attrs).forEach(function(attr){
 
      // workaround so we don't totally break IE7
 
      // http://stackoverflow.com/questions/3653444/css-styles-not-applied-on-dynamic-elements-in-internet-explorer-7
 
      if (attr === 'class') {
 
        el.className = attrs[attr];
 
      } else {
 
        el.setAttribute(attr, attrs[attr]);
 
      }
 
    });
 

	
 
    // Update tag id/class for use as HTML5 playback tech
 
    // Might think we should do this after embedding in container so .vjs-tech class
 
    // doesn't flash 100% width/height, but class only applies with .video-js parent
 
    tag.id += '_html5_api';
 
    tag.className = 'vjs-tech';
 

	
 
    // Make player findable on elements
 
    tag.player = el.player = this;
 
    // Default state of video is paused
 
    this.addClass('vjs-paused');
 

	
 
    // Add a style element in the player that we'll use to set the width/height
 
    // of the player in a way that's still overrideable by CSS, just like the
 
    // video element
 
    this.styleEl_ = stylesheet.createStyleElement('vjs-styles-dimensions');
 
    let defaultsStyleEl = document.querySelector('.vjs-styles-defaults');
 
    let head = document.querySelector('head');
 
    head.insertBefore(this.styleEl_, defaultsStyleEl ? defaultsStyleEl.nextSibling : head.firstChild);
 

	
 
    // Pass in the width/height/aspectRatio options which will update the style el
 
    this.width(this.options_.width);
 
    this.height(this.options_.height);
 
    this.fluid(this.options_.fluid);
 
    this.aspectRatio(this.options_.aspectRatio);
 

	
 
    // insertElFirst seems to cause the networkState to flicker from 3 to 2, so
 
    // keep track of the original for later so we can know if the source originally failed
 
    tag.initNetworkState_ = tag.networkState;
 

	
 
    // Wrap video tag in div (el/box) container
 
    if (tag.parentNode) {
 
      tag.parentNode.insertBefore(el, tag);
 
    }
 
    Dom.insertElFirst(tag, el); // Breaks iPhone, fixed in HTML5 setup.
 

	
 
    this.el_ = el;
 

	
 
    return el;
 
  }
 

	
 
  /**
 
   * Get/set player width
 
   *
 
   * @param {Number=} value Value for width
 
   * @return {Number} Width when getting
 
   * @method width
 
   */
 
  width(value) {
 
    return this.dimension('width', value);
 
  }
 

	
 
  /**
 
   * Get/set player height
 
   *
 
   * @param {Number=} value Value for height
 
   * @return {Number} Height when getting
 
   * @method height
 
   */
 
  height(value) {
 
    return this.dimension('height', value);
 
  }
 

	
 
  /**
 
   * Get/set dimension for player
 
   *
 
   * @param {String} dimension Either width or height
 
   * @param {Number=} value Value for dimension
 
   * @return {Component}
 
   * @method dimension
 
   */
 
  dimension(dimension, value) {
 
    let privDimension = dimension + '_';
 

	
 
    if (value === undefined) {
 
      return this[privDimension] || 0;
 
    }
 

	
 
    if (value === '') {
 
      // If an empty string is given, reset the dimension to be automatic
 
      this[privDimension] = undefined;
 
    } else {
 
      let parsedVal = parseFloat(value);
 

	
 
      if (isNaN(parsedVal)) {
 
        log.error(`Improper value "${value}" supplied for for ${dimension}`);
 
        return this;
 
      }
 

	
 
      this[privDimension] = parsedVal;
 
    }
 

	
 
    this.updateStyleEl_();
 
    return this;
 
  }
 

	
 
  /**
 
   * Add/remove the vjs-fluid class
 
   *
 
   * @param {Boolean} bool Value of true adds the class, value of false removes the class
 
   * @method fluid
 
   */
 
  fluid(bool) {
 
    if (bool === undefined) {
 
      return !!this.fluid_;
 
    }
 

	
 
    this.fluid_ = !!bool;
 

	
 
    if (bool) {
 
      this.addClass('vjs-fluid');
 
    } else {
 
      this.removeClass('vjs-fluid');
 
    }
 
  }
 

	
 
  /**
 
   * Get/Set the aspect ratio
 
   *
 
   * @param {String=} ratio Aspect ratio for player
 
   * @return aspectRatio
 
   * @method aspectRatio
 
   */
 
  aspectRatio(ratio) {
 
    if (ratio === undefined) {
 
      return this.aspectRatio_;
 
    }
 

	
 
    // Check for width:height format
 
    if (!/^\d+\:\d+$/.test(ratio)) {
 
      throw new Error('Improper value supplied for aspect ratio. The format should be width:height, for example 16:9.');
 
    }
 
    this.aspectRatio_ = ratio;
 

	
 
    // We're assuming if you set an aspect ratio you want fluid mode,
 
    // because in fixed mode you could calculate width and height yourself.
 
    this.fluid(true);
 

	
 
    this.updateStyleEl_();
 
  }
 

	
 
  /**
 
   * Update styles of the player element (height, width and aspect ratio)
 
   *
 
   * @method updateStyleEl_
 
   */
 
  updateStyleEl_() {
 
    let width;
 
    let height;
 
    let aspectRatio;
 

	
 
    // The aspect ratio is either used directly or to calculate width and height.
 
    if (this.aspectRatio_ !== undefined && this.aspectRatio_ !== 'auto') {
 
      // Use any aspectRatio that's been specifically set
 
      aspectRatio = this.aspectRatio_;
 
    } else if (this.videoWidth()) {
 
      // Otherwise try to get the aspect ratio from the video metadata
 
      aspectRatio = this.videoWidth() + ':' + this.videoHeight();
 
    } else {
 
      // Or use a default. The video element's is 2:1, but 16:9 is more common.
 
      aspectRatio = '16:9';
 
    }
 

	
 
    // Get the ratio as a decimal we can use to calculate dimensions
 
    let ratioParts = aspectRatio.split(':');
 
    let ratioMultiplier = ratioParts[1] / ratioParts[0];
 

	
 
    if (this.width_ !== undefined) {
 
      // Use any width that's been specifically set
 
      width = this.width_;
 
    } else if (this.height_ !== undefined) {
 
      // Or calulate the width from the aspect ratio if a height has been set
 
      width = this.height_ / ratioMultiplier;
 
    } else {
 
      // Or use the video's metadata, or use the video el's default of 300
 
      width = this.videoWidth() || 300;
 
    }
 

	
 
    if (this.height_ !== undefined) {
 
      // Use any height that's been specifically set
 
      height = this.height_;
 
    } else {
 
      // Otherwise calculate the height from the ratio and the width
 
      height = width  * ratioMultiplier;
 
    }
 

	
 
    let idClass = this.id()+'-dimensions';
 

	
 
    // Ensure the right class is still on the player for the style element
 
    this.addClass(idClass);
 

	
 
    stylesheet.setTextContent(this.styleEl_, `
 
      .${idClass} {
 
        width: ${width}px;
 
        height: ${height}px;
 
      }
 

	
 
      .${idClass}.vjs-fluid {
 
        padding-top: ${ratioMultiplier * 100}%;
 
      }
 
    `);
 
  }
 

	
 
  /**
 
   * Load the Media Playback Technology (tech)
 
   * Load/Create an instance of playback technology including element and API methods
 
   * And append playback element in player div.
 
   *
 
   * @param {String} techName Name of the playback technology
 
   * @param {String} source Video source
 
   * @method loadTech_
 
   * @private
 
   */
 
  loadTech_(techName, source) {
 

	
 
    // Pause and remove current playback technology
 
    if (this.tech_) {
 
      this.unloadTech_();
 
    }
 

	
 
    // get rid of the HTML5 video tag as soon as we are using another tech
 
    if (techName !== 'Html5' && this.tag) {
 
      Component.getComponent('Html5').disposeMediaElement(this.tag);
 
      this.tag.player = null;
 
      this.tag = null;
 
    }
 

	
 
    this.techName_ = techName;
 

	
 
    // Turn off API access because we're loading a new tech that might load asynchronously
 
    this.isReady_ = false;
 

	
 
    // Grab tech-specific options from player options and add source and parent element to use.
 
    var techOptions = assign({
 
      'nativeControlsForTouch': this.options_.nativeControlsForTouch,
 
      'source': source,
 
      'playerId': this.id(),
 
      'techId': `${this.id()}_${techName}_api`,
 
      'textTracks': this.textTracks_,
 
      'autoplay': this.options_.autoplay,
 
      'preload': this.options_.preload,
 
      'loop': this.options_.loop,
 
      'muted': this.options_.muted,
 
      'poster': this.poster(),
 
      'language': this.language(),
 
      'vtt.js': this.options_['vtt.js']
 
    }, this.options_[techName.toLowerCase()]);
 

	
 
    if (this.tag) {
 
      techOptions.tag = this.tag;
 
    }
 

	
 
    if (source) {
 
      this.currentType_ = source.type;
 
      if (source.src === this.cache_.src && this.cache_.currentTime > 0) {
 
        techOptions.startTime = this.cache_.currentTime;
 
      }
 

	
 
      this.cache_.src = source.src;
 
    }
 

	
 
    // Initialize tech instance
 
    let techComponent = Component.getComponent(techName);
 
    this.tech_ = new techComponent(techOptions);
 

	
 
    // player.triggerReady is always async, so don't need this to be async
 
    this.tech_.ready(Fn.bind(this, this.handleTechReady_), true);
 

	
 
    textTrackConverter.jsonToTextTracks(this.textTracksJson_ || [], this.tech_);
 

	
 
    // Listen to all HTML5-defined events and trigger them on the player
 
    this.on(this.tech_, 'loadstart', this.handleTechLoadStart_);
 
    this.on(this.tech_, 'waiting', this.handleTechWaiting_);
 
    this.on(this.tech_, 'canplay', this.handleTechCanPlay_);
 
    this.on(this.tech_, 'canplaythrough', this.handleTechCanPlayThrough_);
 
    this.on(this.tech_, 'playing', this.handleTechPlaying_);
 
    this.on(this.tech_, 'ended', this.handleTechEnded_);
 
    this.on(this.tech_, 'seeking', this.handleTechSeeking_);
 
    this.on(this.tech_, 'seeked', this.handleTechSeeked_);
 
    this.on(this.tech_, 'play', this.handleTechPlay_);
 
    this.on(this.tech_, 'firstplay', this.handleTechFirstPlay_);
 
    this.on(this.tech_, 'pause', this.handleTechPause_);
 
    this.on(this.tech_, 'progress', this.handleTechProgress_);
 
    this.on(this.tech_, 'durationchange', this.handleTechDurationChange_);
 
    this.on(this.tech_, 'fullscreenchange', this.handleTechFullscreenChange_);
 
    this.on(this.tech_, 'error', this.handleTechError_);
 
    this.on(this.tech_, 'suspend', this.handleTechSuspend_);
 
    this.on(this.tech_, 'abort', this.handleTechAbort_);
 
    this.on(this.tech_, 'emptied', this.handleTechEmptied_);
 
    this.on(this.tech_, 'stalled', this.handleTechStalled_);
 
    this.on(this.tech_, 'loadedmetadata', this.handleTechLoadedMetaData_);
 
    this.on(this.tech_, 'loadeddata', this.handleTechLoadedData_);
 
    this.on(this.tech_, 'timeupdate', this.handleTechTimeUpdate_);
 
    this.on(this.tech_, 'ratechange', this.handleTechRateChange_);
 
    this.on(this.tech_, 'volumechange', this.handleTechVolumeChange_);
 
    this.on(this.tech_, 'texttrackchange', this.handleTechTextTrackChange_);
 
    this.on(this.tech_, 'loadedmetadata', this.updateStyleEl_);
 
    this.on(this.tech_, 'posterchange', this.handleTechPosterChange_);
 

	
 
    this.usingNativeControls(this.techGet_('controls'));
 

	
 
    if (this.controls() && !this.usingNativeControls()) {
 
      this.addTechControlsListeners_();
 
    }
 

	
 
    // Add the tech element in the DOM if it was not already there
 
    // Make sure to not insert the original video element if using Html5
 
    if (this.tech_.el().parentNode !== this.el() && (techName !== 'Html5' || !this.tag)) {
 
      Dom.insertElFirst(this.tech_.el(), this.el());
 
    }
 

	
 
    // Get rid of the original video tag reference after the first tech is loaded
 
    if (this.tag) {
 
      this.tag.player = null;
 
      this.tag = null;
 
    }
 
  }
 

	
 
  /**
 
   * Unload playback technology
 
   *
 
   * @method unloadTech_
 
   * @private
 
   */
 
  unloadTech_() {
 
    // Save the current text tracks so that we can reuse the same text tracks with the next tech
 
    this.textTracks_ = this.textTracks();
 
    this.textTracksJson_ = textTrackConverter.textTracksToJson(this);
 

	
 
    this.isReady_ = false;
 

	
 
    this.tech_.dispose();
 

	
 
    this.tech_ = false;
 
  }
 

	
 
  /**
 
   * Set up click and touch listeners for the playback element
 
   *
 
   * On desktops, a click on the video itself will toggle playback,
 
   * on a mobile device a click on the video toggles controls.
 
   * (toggling controls is done by toggling the user state between active and
 
   * inactive)
 
   * A tap can signal that a user has become active, or has become inactive
 
   * e.g. a quick tap on an iPhone movie should reveal the controls. Another
 
   * quick tap should hide them again (signaling the user is in an inactive
 
   * viewing state)
 
   * In addition to this, we still want the user to be considered inactive after
 
   * a few seconds of inactivity.
 
   * Note: the only part of iOS interaction we can't mimic with this setup
 
   * is a touch and hold on the video element counting as activity in order to
 
   * keep the controls showing, but that shouldn't be an issue. A touch and hold
 
   * on any controls will still keep the user active
 
   *
 
   * @private
 
   * @method addTechControlsListeners_
 
   */
 
  addTechControlsListeners_() {
 
    // Make sure to remove all the previous listeners in case we are called multiple times.
 
    this.removeTechControlsListeners_();
 

	
 
    // Some browsers (Chrome & IE) don't trigger a click on a flash swf, but do
 
    // trigger mousedown/up.
 
    // http://stackoverflow.com/questions/1444562/javascript-onclick-event-over-flash-object
 
    // Any touch events are set to block the mousedown event from happening
 
    this.on(this.tech_, 'mousedown', this.handleTechClick_);
 

	
 
    // If the controls were hidden we don't want that to change without a tap event
 
    // so we'll check if the controls were already showing before reporting user
 
    // activity
 
    this.on(this.tech_, 'touchstart', this.handleTechTouchStart_);
 
    this.on(this.tech_, 'touchmove', this.handleTechTouchMove_);
 
    this.on(this.tech_, 'touchend', this.handleTechTouchEnd_);
 

	
 
    // The tap listener needs to come after the touchend listener because the tap
 
    // listener cancels out any reportedUserActivity when setting userActive(false)
 
    this.on(this.tech_, 'tap', this.handleTechTap_);
 
  }
 

	
 
  /**
 
   * Remove the listeners used for click and tap controls. This is needed for
 
   * toggling to controls disabled, where a tap/touch should do nothing.
 
   *
 
   * @method removeTechControlsListeners_
 
   * @private
 
   */
 
  removeTechControlsListeners_() {
 
    // We don't want to just use `this.off()` because there might be other needed
 
    // listeners added by techs that extend this.
 
    this.off(this.tech_, 'tap', this.handleTechTap_);
 
    this.off(this.tech_, 'touchstart', this.handleTechTouchStart_);
 
    this.off(this.tech_, 'touchmove', this.handleTechTouchMove_);
 
    this.off(this.tech_, 'touchend', this.handleTechTouchEnd_);
 
    this.off(this.tech_, 'mousedown', this.handleTechClick_);
 
  }
 

	
 
  /**
 
   * Player waits for the tech to be ready
 
   *
 
   * @method handleTechReady_
 
   * @private
 
   */
 
  handleTechReady_() {
 
    this.triggerReady();
 

	
 
    // Keep the same volume as before
 
    if (this.cache_.volume) {
 
      this.techCall_('setVolume', this.cache_.volume);
 
    }
 

	
 
    // Look if the tech found a higher resolution poster while loading
 
    this.handleTechPosterChange_();
 

	
 
    // Update the duration if available
 
    this.handleTechDurationChange_();
 

	
 
    // Chrome and Safari both have issues with autoplay.
 
    // In Safari (5.1.1), when we move the video element into the container div, autoplay doesn't work.
 
    // In Chrome (15), if you have autoplay + a poster + no controls, the video gets hidden (but audio plays)
 
    // This fixes both issues. Need to wait for API, so it updates displays correctly
 
    if (this.tag && this.options_.autoplay && this.paused()) {
 
      delete this.tag.poster; // Chrome Fix. Fixed in Chrome v16.
 
      this.play();
 
    }
 
  }
 

	
 
  /**
 
   * Fired when the user agent begins looking for media data
 
   *
 
   * @private
 
   * @method handleTechLoadStart_
 
   */
 
  handleTechLoadStart_() {
 
    // TODO: Update to use `emptied` event instead. See #1277.
 

	
 
    this.removeClass('vjs-ended');
 

	
 
    // reset the error state
 
    this.error(null);
 

	
 
    // If it's already playing we want to trigger a firstplay event now.
 
    // The firstplay event relies on both the play and loadstart events
 
    // which can happen in any order for a new source
 
    if (!this.paused()) {
 
      this.trigger('loadstart');
 
      this.trigger('firstplay');
 
    } else {
 
      // reset the hasStarted state
 
      this.hasStarted(false);
 
      this.trigger('loadstart');
 
    }
 
  }
 

	
 
  /**
 
   * Add/remove the vjs-has-started class
 
   *
 
   * @param {Boolean} hasStarted The value of true adds the class the value of false remove the class
 
   * @return {Boolean} Boolean value if has started
 
   * @private
 
   * @method hasStarted
 
   */
 
  hasStarted(hasStarted) {
 
    if (hasStarted !== undefined) {
 
      // only update if this is a new value
 
      if (this.hasStarted_ !== hasStarted) {
 
        this.hasStarted_ = hasStarted;
 
        if (hasStarted) {
 
          this.addClass('vjs-has-started');
 
          // trigger the firstplay event if this newly has played
 
          this.trigger('firstplay');
 
        } else {
 
          this.removeClass('vjs-has-started');
 
        }
 
      }
 
      return this;
 
    }
 
    return !!this.hasStarted_;
 
  }
 

	
 
  /**
 
   * Fired whenever the media begins or resumes playback
 
   *
 
   * @private
 
   * @method handleTechPlay_
 
   */
 
  handleTechPlay_() {
 
    this.removeClass('vjs-ended');
 
    this.removeClass('vjs-paused');
 
    this.addClass('vjs-playing');
 

	
 
    // hide the poster when the user hits play
 
    // https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-play
 
    this.hasStarted(true);
 

	
 
    this.trigger('play');
 
  }
 

	
 
  /**
 
   * Fired whenever the media begins waiting
 
   *
 
   * @private
 
   * @method handleTechWaiting_
 
   */
 
  handleTechWaiting_() {
 
    this.addClass('vjs-waiting');
 
    this.trigger('waiting');
 
  }
 

	
 
  /**
 
   * A handler for events that signal that waiting has ended
 
   * which is not consistent between browsers. See #1351
 
   *
 
   * @private
 
   * @method handleTechCanPlay_
 
   */
 
  handleTechCanPlay_() {
 
    this.removeClass('vjs-waiting');
 
    this.trigger('canplay');
 
  }
 

	
 
  /**
 
   * A handler for events that signal that waiting has ended
 
   * which is not consistent between browsers. See #1351
 
   *
 
   * @private
 
   * @method handleTechCanPlayThrough_
 
   */
 
  handleTechCanPlayThrough_() {
 
    this.removeClass('vjs-waiting');
 
    this.trigger('canplaythrough');
 
  }
 

	
 
  /**
 
   * A handler for events that signal that waiting has ended
 
   * which is not consistent between browsers. See #1351
 
   *
 
   * @private
 
   * @method handleTechPlaying_
 
   */
 
  handleTechPlaying_() {
 
    this.removeClass('vjs-waiting');
 
    this.trigger('playing');
 
  }
 

	
 
  /**
 
   * Fired whenever the player is jumping to a new time
 
   *
 
   * @private
 
   * @method handleTechSeeking_
 
   */
 
  handleTechSeeking_() {
 
    this.addClass('vjs-seeking');
 
    this.trigger('seeking');
 
  }
 

	
 
  /**
 
   * Fired when the player has finished jumping to a new time
 
   *
 
   * @private
 
   * @method handleTechSeeked_
 
   */
 
  handleTechSeeked_() {
 
    this.removeClass('vjs-seeking');
 
    this.trigger('seeked');
 
  }
 

	
 
  /**
 
   * Fired the first time a video is played
 
   * Not part of the HLS spec, and we're not sure if this is the best
 
   * implementation yet, so use sparingly. If you don't have a reason to
 
   * prevent playback, use `myPlayer.one('play');` instead.
 
   *
 
   * @private
 
   * @method handleTechFirstPlay_
 
   */
 
  handleTechFirstPlay_() {
 
    //If the first starttime attribute is specified
 
    //then we will start at the given offset in seconds
 
    if(this.options_.starttime){
 
      this.currentTime(this.options_.starttime);
 
    }
 

	
 
    this.addClass('vjs-has-started');
 
    this.trigger('firstplay');
 
  }
 

	
 
  /**
 
   * Fired whenever the media has been paused
 
   *
 
   * @private
 
   * @method handleTechPause_
 
   */
 
  handleTechPause_() {
 
    this.removeClass('vjs-playing');
 
    this.addClass('vjs-paused');
 
    this.trigger('pause');
 
  }
 

	
 
  /**
 
   * Fired while the user agent is downloading media data
 
   *
 
   * @private
 
   * @method handleTechProgress_
 
   */
 
  handleTechProgress_() {
 
    this.trigger('progress');
 
  }
 

	
 
  /**
 
   * Fired when the end of the media resource is reached (currentTime == duration)
 
   *
 
   * @private
 
   * @method handleTechEnded_
 
   */
 
  handleTechEnded_() {
 
    this.addClass('vjs-ended');
 
    if (this.options_.loop) {
 
      this.currentTime(0);
 
      this.play();
 
    } else if (!this.paused()) {
 
      this.pause();
 
    }
 

	
 
    this.trigger('ended');
 
  }
 

	
 
  /**
 
   * Fired when the duration of the media resource is first known or changed
 
   *
 
   * @private
 
   * @method handleTechDurationChange_
 
   */
 
  handleTechDurationChange_() {
 
    this.duration(this.techGet_('duration'));
 
  }
 

	
 
  /**
 
   * Handle a click on the media element to play/pause
 
   *
 
   * @param {Object=} event Event object
 
   * @private
 
   * @method handleTechClick_
 
   */
 
  handleTechClick_(event) {
 
    // We're using mousedown to detect clicks thanks to Flash, but mousedown
 
    // will also be triggered with right-clicks, so we need to prevent that
 
    if (event.button !== 0) return;
 

	
 
    // When controls are disabled a click should not toggle playback because
 
    // the click is considered a control
 
    if (this.controls()) {
 
      if (this.paused()) {
 
        this.play();
 
      } else {
 
        this.pause();
 
      }
 
    }
 
  }
 

	
 
  /**
 
   * Handle a tap on the media element. It will toggle the user
 
   * activity state, which hides and shows the controls.
 
   *
 
   * @private
 
   * @method handleTechTap_
 
   */
 
  handleTechTap_() {
 
    this.userActive(!this.userActive());
 
  }
 

	
 
  /**
 
   * Handle touch to start
 
   *
 
   * @private
 
   * @method handleTechTouchStart_
 
   */
 
  handleTechTouchStart_() {
 
    this.userWasActive = this.userActive();
 
  }
 

	
 
  /**
 
   * Handle touch to move
 
   *
 
   * @private
 
   * @method handleTechTouchMove_
 
   */
 
  handleTechTouchMove_() {
 
    if (this.userWasActive){
 
      this.reportUserActivity();
 
    }
 
  }
 

	
 
  /**
 
   * Handle touch to end
 
   *
 
   * @private
 
   * @method handleTechTouchEnd_
 
   */
 
  handleTechTouchEnd_(event) {
 
    // Stop the mouse events from also happening
 
    event.preventDefault();
 
  }
 

	
 
  /**
 
   * Fired when the player switches in or out of fullscreen mode
 
   *
 
   * @private
 
   * @method handleFullscreenChange_
 
   */
 
  handleFullscreenChange_() {
 
    if (this.isFullscreen()) {
 
      this.addClass('vjs-fullscreen');
 
    } else {
 
      this.removeClass('vjs-fullscreen');
 
    }
 
  }
 

	
 
  /**
 
   * native click events on the SWF aren't triggered on IE11, Win8.1RT
 
   * use stageclick events triggered from inside the SWF instead
 
   *
 
   * @private
 
   * @method handleStageClick_
 
   */
 
  handleStageClick_() {
 
    this.reportUserActivity();
 
  }
 

	
 
  /**
 
   * Handle Tech Fullscreen Change
 
   *
 
   * @private
 
   * @method handleTechFullscreenChange_
 
   */
 
  handleTechFullscreenChange_(event, data) {
 
    if (data) {
 
      this.isFullscreen(data.isFullscreen);
 
    }
 
    this.trigger('fullscreenchange');
 
  }
 

	
 
  /**
 
   * Fires when an error occurred during the loading of an audio/video
 
   *
 
   * @private
 
   * @method handleTechError_
 
   */
 
  handleTechError_() {
 
    let error = this.tech_.error();
 
    this.error(error && error.code);
 
  }
 

	
 
  /**
 
   * Fires when the browser is intentionally not getting media data
 
   *
 
   * @private
 
   * @method handleTechSuspend_
 
   */
 
  handleTechSuspend_() {
 
    this.trigger('suspend');
 
  }
 

	
 
  /**
 
   * Fires when the loading of an audio/video is aborted
 
   *
 
   * @private
 
   * @method handleTechAbort_
 
   */
 
  handleTechAbort_() {
 
    this.trigger('abort');
 
  }
 

	
 
  /**
 
   * Fires when the current playlist is empty
 
   *
 
   * @private
 
   * @method handleTechEmptied_
 
   */
 
  handleTechEmptied_() {
 
    this.trigger('emptied');
 
  }
 

	
 
  /**
 
   * Fires when the browser is trying to get media data, but data is not available
 
   *
 
   * @private
 
   * @method handleTechStalled_
 
   */
 
  handleTechStalled_() {
 
    this.trigger('stalled');
 
  }
 

	
 
  /**
 
   * Fires when the browser has loaded meta data for the audio/video
 
   *
 
   * @private
 
   * @method handleTechLoadedMetaData_
 
   */
 
  handleTechLoadedMetaData_() {
 
    this.trigger('loadedmetadata');
 
  }
 

	
 
  /**
 
   * Fires when the browser has loaded the current frame of the audio/video
 
   *
 
   * @private
 
   * @method handleTechLoadedData_
 
   */
 
  handleTechLoadedData_() {
 
    this.trigger('loadeddata');
 
  }
 

	
 
  /**
 
   * Fires when the current playback position has changed
 
   *
 
   * @private
 
   * @method handleTechTimeUpdate_
 
   */
 
  handleTechTimeUpdate_() {
 
    this.trigger('timeupdate');
 
  }
 

	
 
  /**
 
   * Fires when the playing speed of the audio/video is changed
 
   *
 
   * @private
 
   * @method handleTechRateChange_
 
   */
 
  handleTechRateChange_() {
 
    this.trigger('ratechange');
 
  }
 

	
 
  /**
 
   * Fires when the volume has been changed
 
   *
 
   * @private
 
   * @method handleTechVolumeChange_
 
   */
 
  handleTechVolumeChange_() {
 
    this.trigger('volumechange');
 
  }
 

	
 
  /**
 
   * Fires when the text track has been changed
 
   *
 
   * @private
 
   * @method handleTechTextTrackChange_
 
   */
 
  handleTechTextTrackChange_() {
 
    this.trigger('texttrackchange');
 
  }
 

	
 
  /**
 
   * Get object for cached values.
 
   *
 
   * @return {Object}
 
   * @method getCache
 
   */
 
  getCache() {
 
    return this.cache_;
 
  }
 

	
 
  /**
 
   * Pass values to the playback tech
 
   *
 
   * @param {String=} method Method
 
   * @param {Object=} arg Argument
 
   * @private
 
   * @method techCall_
 
   */
 
  techCall_(method, arg) {
 
    // If it's not ready yet, call method when it is
 
    if (this.tech_ && !this.tech_.isReady_) {
 
      this.tech_.ready(function(){
 
        this[method](arg);
 
      }, true);
 

	
 
    // Otherwise call method now
 
    } else {
 
      try {
 
        this.tech_[method](arg);
 
      } catch(e) {
 
        log(e);
 
        throw e;
 
      }
 
    }
 
  }
 

	
 
  /**
 
   * Get calls can't wait for the tech, and sometimes don't need to.
 
   *
 
   * @param {String} method Tech method
 
   * @return {Method}
 
   * @private
 
   * @method techGet_
 
   */
 
  techGet_(method) {
 
    if (this.tech_ && this.tech_.isReady_) {
 

	
 
      // Flash likes to die and reload when you hide or reposition it.
 
      // In these cases the object methods go away and we get errors.
 
      // When that happens we'll catch the errors and inform tech that it's not ready any more.
 
      try {
 
        return this.tech_[method]();
 
      } catch(e) {
 
        // When building additional tech libs, an expected method may not be defined yet
 
        if (this.tech_[method] === undefined) {
 
          log(`Video.js: ${method} method not defined for ${this.techName_} playback technology.`, e);
 
        } else {
 
          // When a method isn't available on the object it throws a TypeError
 
          if (e.name === 'TypeError') {
 
            log(`Video.js: ${method} unavailable on ${this.techName_} playback technology element.`, e);
 
            this.tech_.isReady_ = false;
 
          } else {
 
            log(e);
 
          }
 
        }
 
        throw e;
 
      }
 
    }
 

	
 
    return;
 
  }
 

	
 
  /**
 
   * start media playback
 
   * ```js
 
   *     myPlayer.play();
 
   * ```
 
   *
 
   * @return {Player} self
 
   * @method play
 
   */
 
  play() {
 
    this.techCall_('play');
 
    return this;
 
  }
 

	
 
  /**
 
   * Pause the video playback
 
   * ```js
 
   *     myPlayer.pause();
 
   * ```
 
   *
 
   * @return {Player} self
 
   * @method pause
 
   */
 
  pause() {
 
    this.techCall_('pause');
 
    return this;
 
  }
 

	
 
  /**
 
   * Check if the player is paused
 
   * ```js
 
   *     var isPaused = myPlayer.paused();
 
   *     var isPlaying = !myPlayer.paused();
 
   * ```
 
   *
 
   * @return {Boolean} false if the media is currently playing, or true otherwise
 
   * @method paused
 
   */
 
  paused() {
 
    // The initial state of paused should be true (in Safari it's actually false)
 
    return (this.techGet_('paused') === false) ? false : true;
 
  }
 

	
 
  /**
 
   * Returns whether or not the user is "scrubbing". Scrubbing is when the user
 
   * has clicked the progress bar handle and is dragging it along the progress bar.
 
   *
 
   * @param  {Boolean} isScrubbing   True/false the user is scrubbing
 
   * @return {Boolean}               The scrubbing status when getting
 
   * @return {Object}                The player when setting
 
   * @method scrubbing
 
   */
 
  scrubbing(isScrubbing) {
 
    if (isScrubbing !== undefined) {
 
      this.scrubbing_ = !!isScrubbing;
 

	
 
      if (isScrubbing) {
 
        this.addClass('vjs-scrubbing');
 
      } else {
 
        this.removeClass('vjs-scrubbing');
 
      }
 

	
 
      return this;
 
    }
 

	
 
    return this.scrubbing_;
 
  }
 

	
 
  /**
 
   * Get or set the current time (in seconds)
 
   * ```js
 
   *     // get
 
   *     var whereYouAt = myPlayer.currentTime();
 
   *     // set
 
   *     myPlayer.currentTime(120); // 2 minutes into the video
 
   * ```
 
   *
 
   * @param  {Number|String=} seconds The time to seek to
 
   * @return {Number}        The time in seconds, when not setting
 
   * @return {Player}    self, when the current time is set
 
   * @method currentTime
 
   */
 
  currentTime(seconds) {
 
    if (seconds !== undefined) {
 

	
 
      this.techCall_('setCurrentTime', seconds);
 

	
 
      return this;
 
    }
 

	
 
    // cache last currentTime and return. default to 0 seconds
 
    //
 
    // Caching the currentTime is meant to prevent a massive amount of reads on the tech's
 
    // currentTime when scrubbing, but may not provide much performance benefit afterall.
 
    // Should be tested. Also something has to read the actual current time or the cache will
 
    // never get updated.
 
    return this.cache_.currentTime = (this.techGet_('currentTime') || 0);
 
  }
 

	
 
  /**
 
   * Get the length in time of the video in seconds
 
   * ```js
 
   *     var lengthOfVideo = myPlayer.duration();
 
   * ```
 
   * **NOTE**: The video must have started loading before the duration can be
 
   * known, and in the case of Flash, may not be known until the video starts
 
   * playing.
 
   *
 
   * @param {Number} seconds Duration when setting
 
   * @return {Number} The duration of the video in seconds when getting
 
   * @method duration
 
   */
 
  duration(seconds) {
 
    if (seconds === undefined) {
 
      return this.cache_.duration || 0;
 
    }
 

	
 
    seconds = parseFloat(seconds) || 0;
 

	
 
    // Standardize on Inifity for signaling video is live
 
    if (seconds < 0) {
 
      seconds = Infinity;
 
    }
 

	
 
    if (seconds !== this.cache_.duration) {
 
      // Cache the last set value for optimized scrubbing (esp. Flash)
 
      this.cache_.duration = seconds;
 

	
 
      if (seconds === Infinity) {
 
        this.addClass('vjs-live');
 
      } else {
 
        this.removeClass('vjs-live');
 
      }
 

	
 
      this.trigger('durationchange');
 
    }
 

	
 
    return this;
 
  }
 

	
 
  /**
 
   * Calculates how much time is left.
 
   * ```js
 
   *     var timeLeft = myPlayer.remainingTime();
 
   * ```
 
   * Not a native video element function, but useful
 
   *
 
   * @return {Number} The time remaining in seconds
 
   * @method remainingTime
 
   */
 
  remainingTime() {
 
    return this.duration() - this.currentTime();
 
  }
 

	
 
  // http://dev.w3.org/html5/spec/video.html#dom-media-buffered
 
  // Buffered returns a timerange object.
 
  // Kind of like an array of portions of the video that have been downloaded.
 

	
 
  /**
 
   * Get a TimeRange object with the times of the video that have been downloaded
 
   * If you just want the percent of the video that's been downloaded,
 
   * use bufferedPercent.
 
   * ```js
 
   *     // Number of different ranges of time have been buffered. Usually 1.
 
   *     numberOfRanges = bufferedTimeRange.length,
 
   *     // Time in seconds when the first range starts. Usually 0.
 
   *     firstRangeStart = bufferedTimeRange.start(0),
 
   *     // Time in seconds when the first range ends
 
   *     firstRangeEnd = bufferedTimeRange.end(0),
 
   *     // Length in seconds of the first time range
 
   *     firstRangeLength = firstRangeEnd - firstRangeStart;
 
   * ```
 
   *
 
   * @return {Object} A mock TimeRange object (following HTML spec)
 
   * @method buffered
 
   */
 
  buffered() {
 
    var buffered = this.techGet_('buffered');
 

	
 
    if (!buffered || !buffered.length) {
 
      buffered = createTimeRange(0,0);
 
    }
 

	
 
    return buffered;
 
  }
 

	
 
  /**
 
   * Get the percent (as a decimal) of the video that's been downloaded
 
   * ```js
 
   *     var howMuchIsDownloaded = myPlayer.bufferedPercent();
 
   * ```
 
   * 0 means none, 1 means all.
 
   * (This method isn't in the HTML5 spec, but it's very convenient)
 
   *
 
   * @return {Number} A decimal between 0 and 1 representing the percent
 
   * @method bufferedPercent
 
   */
 
  bufferedPercent() {
 
    return bufferedPercent(this.buffered(), this.duration());
 
  }
 

	
 
  /**
 
   * Get the ending time of the last buffered time range
 
   * This is used in the progress bar to encapsulate all time ranges.
 
   *
 
   * @return {Number} The end of the last buffered time range
 
   * @method bufferedEnd
 
   */
 
  bufferedEnd() {
 
    var buffered = this.buffered(),
 
        duration = this.duration(),
 
        end = buffered.end(buffered.length-1);
 

	
 
    if (end > duration) {
 
      end = duration;
 
    }
 

	
 
    return end;
 
  }
 

	
 
  /**
 
   * Get or set the current volume of the media
 
   * ```js
 
   *     // get
 
   *     var howLoudIsIt = myPlayer.volume();
 
   *     // set
 
   *     myPlayer.volume(0.5); // Set volume to half
 
   * ```
 
   * 0 is off (muted), 1.0 is all the way up, 0.5 is half way.
 
   *
 
   * @param  {Number} percentAsDecimal The new volume as a decimal percent
 
   * @return {Number}              The current volume when getting
 
   * @return {Player}              self when setting
 
   * @method volume
 
   */
 
  volume(percentAsDecimal) {
 
    let vol;
 

	
 
    if (percentAsDecimal !== undefined) {
 
      vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal))); // Force value to between 0 and 1
 
      this.cache_.volume = vol;
 
      this.techCall_('setVolume', vol);
 

	
 
      return this;
 
    }
 

	
 
    // Default to 1 when returning current volume.
 
    vol = parseFloat(this.techGet_('volume'));
 
    return (isNaN(vol)) ? 1 : vol;
 
  }
 

	
 

	
 
  /**
 
   * Get the current muted state, or turn mute on or off
 
   * ```js
 
   *     // get
 
   *     var isVolumeMuted = myPlayer.muted();
 
   *     // set
 
   *     myPlayer.muted(true); // mute the volume
 
   * ```
 
   *
 
   * @param  {Boolean=} muted True to mute, false to unmute
 
   * @return {Boolean} True if mute is on, false if not when getting
 
   * @return {Player} self when setting mute
 
   * @method muted
 
   */
 
  muted(muted) {
 
    if (muted !== undefined) {
 
      this.techCall_('setMuted', muted);
 
      return this;
 
    }
 
    return this.techGet_('muted') || false; // Default to false
 
  }
 

	
 
  // Check if current tech can support native fullscreen
 
  // (e.g. with built in controls like iOS, so not our flash swf)
 
  /**
 
   * Check to see if fullscreen is supported
 
   *
 
   * @return {Boolean}
 
   * @method supportsFullScreen
 
   */
 
  supportsFullScreen() {
 
    return this.techGet_('supportsFullScreen') || false;
 
  }
 

	
 
  /**
 
   * Check if the player is in fullscreen mode
 
   * ```js
 
   *     // get
 
   *     var fullscreenOrNot = myPlayer.isFullscreen();
 
   *     // set
 
   *     myPlayer.isFullscreen(true); // tell the player it's in fullscreen
 
   * ```
 
   * NOTE: As of the latest HTML5 spec, isFullscreen is no longer an official
 
   * property and instead document.fullscreenElement is used. But isFullscreen is
 
   * still a valuable property for internal player workings.
 
   *
 
   * @param  {Boolean=} isFS Update the player's fullscreen state
 
   * @return {Boolean} true if fullscreen false if not when getting
 
   * @return {Player} self when setting
 
   * @method isFullscreen
 
   */
 
  isFullscreen(isFS) {
 
    if (isFS !== undefined) {
 
      this.isFullscreen_ = !!isFS;
 
      return this;
 
    }
 
    return !!this.isFullscreen_;
 
  }
 

	
 
  /**
 
   * Increase the size of the video to full screen
 
   * ```js
 
   *     myPlayer.requestFullscreen();
 
   * ```
 
   * In some browsers, full screen is not supported natively, so it enters
 
   * "full window mode", where the video fills the browser window.
 
   * In browsers and devices that support native full screen, sometimes the
 
   * browser's default controls will be shown, and not the Video.js custom skin.
 
   * This includes most mobile devices (iOS, Android) and older versions of
 
   * Safari.
 
   *
 
   * @return {Player} self
 
   * @method requestFullscreen
 
   */
 
  requestFullscreen() {
 
    var fsApi = FullscreenApi;
 

	
 
    this.isFullscreen(true);
 

	
 
    if (fsApi.requestFullscreen) {
 
      // the browser supports going fullscreen at the element level so we can
 
      // take the controls fullscreen as well as the video
 

	
 
      // Trigger fullscreenchange event after change
 
      // We have to specifically add this each time, and remove
 
      // when canceling fullscreen. Otherwise if there's multiple
 
      // players on a page, they would all be reacting to the same fullscreen
 
      // events
 
      Events.on(document, fsApi.fullscreenchange, Fn.bind(this, function documentFullscreenChange(e){
 
        this.isFullscreen(document[fsApi.fullscreenElement]);
 

	
 
        // If cancelling fullscreen, remove event listener.
 
        if (this.isFullscreen() === false) {
 
          Events.off(document, fsApi.fullscreenchange, documentFullscreenChange);
 
        }
 

	
 
        this.trigger('fullscreenchange');
 
      }));
 

	
 
      this.el_[fsApi.requestFullscreen]();
 

	
 
    } else if (this.tech_.supportsFullScreen()) {
 
      // we can't take the video.js controls fullscreen but we can go fullscreen
 
      // with native controls
 
      this.techCall_('enterFullScreen');
 
    } else {
 
      // fullscreen isn't supported so we'll just stretch the video element to
 
      // fill the viewport
 
      this.enterFullWindow();
 
      this.trigger('fullscreenchange');
 
    }
 

	
 
    return this;
 
  }
 

	
 
  /**
 
   * Return the video to its normal size after having been in full screen mode
 
   * ```js
 
   *     myPlayer.exitFullscreen();
 
   * ```
 
   *
 
   * @return {Player} self
 
   * @method exitFullscreen
 
   */
 
  exitFullscreen() {
 
    var fsApi = FullscreenApi;
 
    this.isFullscreen(false);
 

	
 
    // Check for browser element fullscreen support
 
    if (fsApi.requestFullscreen) {
 
      document[fsApi.exitFullscreen]();
 
    } else if (this.tech_.supportsFullScreen()) {
 
     this.techCall_('exitFullScreen');
 
    } else {
 
     this.exitFullWindow();
 
     this.trigger('fullscreenchange');
 
    }
 

	
 
    return this;
 
  }
 

	
 
  /**
 
   * When fullscreen isn't supported we can stretch the video container to as wide as the browser will let us.
 
   *
 
   * @method enterFullWindow
 
   */
 
  enterFullWindow() {
 
    this.isFullWindow = true;
 

	
 
    // Storing original doc overflow value to return to when fullscreen is off
 
    this.docOrigOverflow = document.documentElement.style.overflow;
 

	
 
    // Add listener for esc key to exit fullscreen
 
    Events.on(document, 'keydown', Fn.bind(this, this.fullWindowOnEscKey));
 

	
 
    // Hide any scroll bars
 
    document.documentElement.style.overflow = 'hidden';
 

	
 
    // Apply fullscreen styles
 
    Dom.addElClass(document.body, 'vjs-full-window');
 

	
 
    this.trigger('enterFullWindow');
 
  }
 

	
 
  /**
 
   * Check for call to either exit full window or full screen on ESC key
 
   *
 
   * @param {String} event Event to check for key press
 
   * @method fullWindowOnEscKey
 
   */
 
  fullWindowOnEscKey(event) {
 
    if (event.keyCode === 27) {
 
      if (this.isFullscreen() === true) {
 
        this.exitFullscreen();
 
      } else {
 
        this.exitFullWindow();
 
      }
 
    }
 
  }
 

	
 
  /**
 
   * Exit full window
 
   *
 
   * @method exitFullWindow
 
   */
 
  exitFullWindow() {
 
    this.isFullWindow = false;
 
    Events.off(document, 'keydown', this.fullWindowOnEscKey);
 

	
 
    // Unhide scroll bars.
 
    document.documentElement.style.overflow = this.docOrigOverflow;
 

	
 
    // Remove fullscreen styles
 
    Dom.removeElClass(document.body, 'vjs-full-window');
 

	
 
    // Resize the box, controller, and poster to original sizes
 
    // this.positionAll();
 
    this.trigger('exitFullWindow');
 
  }
 

	
 
  /**
 
   * Select source based on tech order
 
   *
 
   * @param {Array} sources The sources for a media asset
 
   * @return {Object|Boolean} Object of source and tech order, otherwise false
 
   * @method selectSource
 
   */
 
  selectSource(sources) {
 
    // Loop through each playback technology in the options order
 
    for (var i=0,j=this.options_.techOrder;i<j.length;i++) {
 
      let techName = toTitleCase(j[i]);
 
      let tech = Component.getComponent(techName);
 

	
 
      // Check if the current tech is defined before continuing
 
      if (!tech) {
 
        log.error(`The "${techName}" tech is undefined. Skipped browser support check for that tech.`);
 
        continue;
 
      }
 

	
 
      // Check if the browser supports this technology
 
      if (tech.isSupported()) {
 
        // Loop through each source object
 
        for (var a=0,b=sources;a<b.length;a++) {
 
          var source = b[a];
 

	
 
          // Check if source can be played with this technology
 
          if (tech.canPlaySource(source)) {
 
            return { source: source, tech: techName };
 
          }
 
        }
 
      }
 
    }
 

	
 
    return false;
 
  }
 

	
 
  /**
 
   * The source function updates the video source
 
   * There are three types of variables you can pass as the argument.
 
   * **URL String**: A URL to the the video file. Use this method if you are sure
 
   * the current playback technology (HTML5/Flash) can support the source you
 
   * provide. Currently only MP4 files can be used in both HTML5 and Flash.
 
   * ```js
 
   *     myPlayer.src("http://www.example.com/path/to/video.mp4");
 
   * ```
 
   * **Source Object (or element):* * A javascript object containing information
 
   * about the source file. Use this method if you want the player to determine if
 
   * it can support the file using the type information.
 
   * ```js
 
   *     myPlayer.src({ type: "video/mp4", src: "http://www.example.com/path/to/video.mp4" });
 
   * ```
 
   * **Array of Source Objects:* * To provide multiple versions of the source so
 
   * that it can be played using HTML5 across browsers you can use an array of
 
   * source objects. Video.js will detect which version is supported and load that
 
   * file.
 
   * ```js
 
   *     myPlayer.src([
 
   *       { type: "video/mp4", src: "http://www.example.com/path/to/video.mp4" },
 
   *       { type: "video/webm", src: "http://www.example.com/path/to/video.webm" },
 
   *       { type: "video/ogg", src: "http://www.example.com/path/to/video.ogv" }
 
   *     ]);
 
   * ```
 
   *
 
   * @param  {String|Object|Array=} source The source URL, object, or array of sources
 
   * @return {String} The current video source when getting
 
   * @return {String} The player when setting
 
   * @method src
 
   */
 
  src(source) {
 
    if (source === undefined) {
 
      return this.techGet_('src');
 
    }
 

	
 
    let currentTech = Component.getComponent(this.techName_);
 

	
 
    // case: Array of source objects to choose from and pick the best to play
 
    if (Array.isArray(source)) {
 
      this.sourceList_(source);
 

	
 
    // case: URL String (http://myvideo...)
 
    } else if (typeof source === 'string') {
 
      // create a source object from the string
 
      this.src({ src: source });
 

	
 
    // case: Source object { src: '', type: '' ... }
 
    } else if (source instanceof Object) {
 
      // check if the source has a type and the loaded tech cannot play the source
 
      // if there's no type we'll just try the current tech
 
      if (source.type && !currentTech.canPlaySource(source)) {
 
        // create a source list with the current source and send through
 
        // the tech loop to check for a compatible technology
 
        this.sourceList_([source]);
 
      } else {
 
        this.cache_.src = source.src;
 
        this.currentType_ = source.type || '';
 

	
 
        // wait until the tech is ready to set the source
 
        this.ready(function(){
 

	
 
          // The setSource tech method was added with source handlers
 
          // so older techs won't support it
 
          // We need to check the direct prototype for the case where subclasses
 
          // of the tech do not support source handlers
 
          if (currentTech.prototype.hasOwnProperty('setSource')) {
 
            this.techCall_('setSource', source);
 
          } else {
 
            this.techCall_('src', source.src);
 
          }
 

	
 
          if (this.options_.preload === 'auto') {
 
            this.load();
 
          }
 

	
 
          if (this.options_.autoplay) {
 
            this.play();
 
          }
 

	
 
        // Set the source synchronously if possible (#2326)
 
        }, true);
 
      }
 
    }
 

	
 
    return this;
 
  }
 

	
 
  /**
 
   * Handle an array of source objects
 
   *
 
   * @param  {Array} sources Array of source objects
 
   * @private
 
   * @method sourceList_
 
   */
 
  sourceList_(sources) {
 
    var sourceTech = this.selectSource(sources);
 

	
 
    if (sourceTech) {
 
      if (sourceTech.tech === this.techName_) {
 
        // if this technology is already loaded, set the source
 
        this.src(sourceTech.source);
 
      } else {
 
        // load this technology with the chosen source
 
        this.loadTech_(sourceTech.tech, sourceTech.source);
 
      }
 
    } else {
 
      // We need to wrap this in a timeout to give folks a chance to add error event handlers
 
      this.setTimeout( function() {
 
        this.error({ code: 4, message: this.localize(this.options_.notSupportedMessage) });
 
      }, 0);
 

	
 
      // we could not find an appropriate tech, but let's still notify the delegate that this is it
 
      // this needs a better comment about why this is needed
 
      this.triggerReady();
 
    }
 
  }
 

	
 
  /**
 
   * Begin loading the src data.
 
   *
 
   * @return {Player} Returns the player
 
   * @method load
 
   */
 
  load() {
 
    this.techCall_('load');
 
    return this;
 
  }
 

	
 
  /**
 
   * Returns the fully qualified URL of the current source value e.g. http://mysite.com/video.mp4
 
   * Can be used in conjuction with `currentType` to assist in rebuilding the current source object.
 
   *
 
   * @return {String} The current source
 
   * @method currentSrc
 
   */
 
  currentSrc() {
 
    return this.techGet_('currentSrc') || this.cache_.src || '';
 
  }
 

	
 
  /**
 
   * Get the current source type e.g. video/mp4
 
   * This can allow you rebuild the current source object so that you could load the same
 
   * source and tech later
 
   *
 
   * @return {String} The source MIME type
 
   * @method currentType
 
   */
 
  currentType() {
 
    return this.currentType_ || '';
 
  }
 

	
 
  /**
 
   * Get or set the preload attribute
 
   *
 
   * @param {Boolean} value Boolean to determine if preload should be used
 
   * @return {String} The preload attribute value when getting
 
   * @return {Player} Returns the player when setting
 
   * @method preload
 
   */
 
  preload(value) {
 
    if (value !== undefined) {
 
      this.techCall_('setPreload', value);
 
      this.options_.preload = value;
 
      return this;
 
    }
 
    return this.techGet_('preload');
 
  }
 

	
 
  /**
 
   * Get or set the autoplay attribute.
 
   *
 
   * @param {Boolean} value Boolean to determine if preload should be used
 
   * @return {String} The autoplay attribute value when getting
 
   * @return {Player} Returns the player when setting
 
   * @method autoplay
 
   */
 
  autoplay(value) {
 
    if (value !== undefined) {
 
      this.techCall_('setAutoplay', value);
 
      this.options_.autoplay = value;
 
      return this;
 
    }
 
    return this.techGet_('autoplay', value);
 
  }
 

	
 
  /**
 
   * Get or set the loop attribute on the video element.
 
   *
 
   * @param {Boolean} value Boolean to determine if preload should be used
 
   * @return {String} The loop attribute value when getting
 
   * @return {Player} Returns the player when setting
 
   * @method loop
 
   */
 
  loop(value) {
 
    if (value !== undefined) {
 
      this.techCall_('setLoop', value);
 
      this.options_['loop'] = value;
 
      return this;
 
    }
 
    return this.techGet_('loop');
 
  }
 

	
 
  /**
 
   * Get or set the poster image source url
 
   *
 
   * ##### EXAMPLE:
 
   * ```js
 
   *     // get
 
   *     var currentPoster = myPlayer.poster();
 
   *     // set
 
   *     myPlayer.poster('http://example.com/myImage.jpg');
 
   * ```
 
   *
 
   * @param  {String=} src Poster image source URL
 
   * @return {String} poster URL when getting
 
   * @return {Player} self when setting
 
   * @method poster
 
   */
 
  poster(src) {
 
    if (src === undefined) {
 
      return this.poster_;
 
    }
 

	
 
    // The correct way to remove a poster is to set as an empty string
 
    // other falsey values will throw errors
 
    if (!src) {
 
      src = '';
 
    }
 

	
 
    // update the internal poster variable
 
    this.poster_ = src;
 

	
 
    // update the tech's poster
 
    this.techCall_('setPoster', src);
 

	
 
    // alert components that the poster has been set
 
    this.trigger('posterchange');
 

	
 
    return this;
 
  }
 

	
 
  /**
 
   * Some techs (e.g. YouTube) can provide a poster source in an
 
   * asynchronous way. We want the poster component to use this
 
   * poster source so that it covers up the tech's controls.
 
   * (YouTube's play button). However we only want to use this
 
   * soruce if the player user hasn't set a poster through
 
   * the normal APIs.
 
   *
 
   * @private
 
   * @method handleTechPosterChange_
 
   */
 
  handleTechPosterChange_() {
 
    if (!this.poster_ && this.tech_ && this.tech_.poster) {
 
      this.poster_ = this.tech_.poster() || '';
 

	
 
      // Let components know the poster has changed
 
      this.trigger('posterchange');
 
    }
 
  }
 

	
 
  /**
 
   * Get or set whether or not the controls are showing.
 
   *
 
   * @param  {Boolean} bool Set controls to showing or not
 
   * @return {Boolean}    Controls are showing
 
   * @method controls
 
   */
 
  controls(bool) {
 
    if (bool !== undefined) {
 
      bool = !!bool; // force boolean
 
      // Don't trigger a change event unless it actually changed
 
      if (this.controls_ !== bool) {
 
        this.controls_ = bool;
 

	
 
        if (this.usingNativeControls()) {
 
          this.techCall_('setControls', bool);
 
        }
 

	
 
        if (bool) {
 
          this.removeClass('vjs-controls-disabled');
 
          this.addClass('vjs-controls-enabled');
 
          this.trigger('controlsenabled');
 

	
 
          if (!this.usingNativeControls()) {
 
            this.addTechControlsListeners_();
 
          }
 
        } else {
 
          this.removeClass('vjs-controls-enabled');
 
          this.addClass('vjs-controls-disabled');
 
          this.trigger('controlsdisabled');
 

	
 
          if (!this.usingNativeControls()) {
 
            this.removeTechControlsListeners_();
 
          }
 
        }
 
      }
 
      return this;
 
    }
 
    return !!this.controls_;
 
  }
 

	
 
  /**
 
   * Toggle native controls on/off. Native controls are the controls built into
 
   * devices (e.g. default iPhone controls), Flash, or other techs
 
   * (e.g. Vimeo Controls)
 
   * **This should only be set by the current tech, because only the tech knows
 
   * if it can support native controls**
 
   *
 
   * @param  {Boolean} bool    True signals that native controls are on
 
   * @return {Player}      Returns the player
 
   * @private
 
   * @method usingNativeControls
 
   */
 
  usingNativeControls(bool) {
 
    if (bool !== undefined) {
 
      bool = !!bool; // force boolean
 
      // Don't trigger a change event unless it actually changed
 
      if (this.usingNativeControls_ !== bool) {
 
        this.usingNativeControls_ = bool;
 
        if (bool) {
 
          this.addClass('vjs-using-native-controls');
 

	
 
          /**
 
            * player is using the native device controls
 
           *
 
            * @event usingnativecontrols
 
            * @memberof Player
 
            * @instance
 
            * @private
 
            */
 
          this.trigger('usingnativecontrols');
 
        } else {
 
          this.removeClass('vjs-using-native-controls');
 

	
 
          /**
 
            * player is using the custom HTML controls
 
           *
 
            * @event usingcustomcontrols
 
            * @memberof Player
 
            * @instance
 
            * @private
 
            */
 
          this.trigger('usingcustomcontrols');
 
        }
 
      }
 
      return this;
 
    }
 
    return !!this.usingNativeControls_;
 
  }
 

	
 
  /**
 
   * Set or get the current MediaError
 
   *
 
   * @param  {*} err A MediaError or a String/Number to be turned into a MediaError
 
   * @return {MediaError|null}     when getting
 
   * @return {Player}              when setting
 
   * @method error
 
   */
 
  error(err) {
 
    if (err === undefined) {
 
      return this.error_ || null;
 
    }
 

	
 
    // restoring to default
 
    if (err === null) {
 
      this.error_ = err;
 
      this.removeClass('vjs-error');
 
      return this;
 
    }
 

	
 
    // error instance
 
    if (err instanceof MediaError) {
 
      this.error_ = err;
 
    } else {
 
      this.error_ = new MediaError(err);
 
    }
 

	
 
    // fire an error event on the player
 
    this.trigger('error');
 

	
 
    // add the vjs-error classname to the player
 
    this.addClass('vjs-error');
 

	
 
    // log the name of the error type and any message
 
    // ie8 just logs "[object object]" if you just log the error object
 
    log.error(`(CODE:${this.error_.code} ${MediaError.errorTypes[this.error_.code]})`, this.error_.message, this.error_);
 

	
 
    return this;
 
  }
 

	
 
  /**
 
   * Returns whether or not the player is in the "ended" state.
 
   *
 
   * @return {Boolean} True if the player is in the ended state, false if not.
 
   * @method ended
 
   */
 
  ended() { return this.techGet_('ended'); }
 

	
 
  /**
 
   * Returns whether or not the player is in the "seeking" state.
 
   *
 
   * @return {Boolean} True if the player is in the seeking state, false if not.
 
   * @method seeking
 
   */
 
  seeking() { return this.techGet_('seeking'); }
 

	
 
  /**
 
   * Returns the TimeRanges of the media that are currently available
 
   * for seeking to.
 
   *
 
   * @return {TimeRanges} the seekable intervals of the media timeline
 
   * @method seekable
 
   */
 
  seekable() { return this.techGet_('seekable'); }
 

	
 
  /**
 
   * Report user activity
 
   *
 
   * @param {Object} event Event object
 
   * @method reportUserActivity
 
   */
 
  reportUserActivity(event) {
 
    this.userActivity_ = true;
 
  }
 

	
 
  /**
 
   * Get/set if user is active
 
   *
 
   * @param {Boolean} bool Value when setting
 
   * @return {Boolean} Value if user is active user when getting
 
   * @method userActive
 
   */
 
  userActive(bool) {
 
    if (bool !== undefined) {
 
      bool = !!bool;
 
      if (bool !== this.userActive_) {
 
        this.userActive_ = bool;
 
        if (bool) {
 
          // If the user was inactive and is now active we want to reset the
 
          // inactivity timer
 
          this.userActivity_ = true;
 
          this.removeClass('vjs-user-inactive');
 
          this.addClass('vjs-user-active');
 
          this.trigger('useractive');
 
        } else {
 
          // We're switching the state to inactive manually, so erase any other
 
          // activity
 
          this.userActivity_ = false;
 

	
 
          // Chrome/Safari/IE have bugs where when you change the cursor it can
 
          // trigger a mousemove event. This causes an issue when you're hiding
 
          // the cursor when the user is inactive, and a mousemove signals user
 
          // activity. Making it impossible to go into inactive mode. Specifically
 
          // this happens in fullscreen when we really need to hide the cursor.
 
          //
 
          // When this gets resolved in ALL browsers it can be removed
 
          // https://code.google.com/p/chromium/issues/detail?id=103041
 
          if(this.tech_) {
 
            this.tech_.one('mousemove', function(e){
 
              e.stopPropagation();
 
              e.preventDefault();
 
            });
 
          }
 

	
 
          this.removeClass('vjs-user-active');
 
          this.addClass('vjs-user-inactive');
 
          this.trigger('userinactive');
 
        }
 
      }
 
      return this;
 
    }
 
    return this.userActive_;
 
  }
 

	
 
  /**
 
   * Listen for user activity based on timeout value
 
   *
 
   * @private
 
   * @method listenForUserActivity_
 
   */
 
  listenForUserActivity_() {
 
    let mouseInProgress, lastMoveX, lastMoveY;
 

	
 
    let handleActivity = Fn.bind(this, this.reportUserActivity);
 

	
 
    let handleMouseMove = function(e) {
 
      // #1068 - Prevent mousemove spamming
 
      // Chrome Bug: https://code.google.com/p/chromium/issues/detail?id=366970
 
      if(e.screenX !== lastMoveX || e.screenY !== lastMoveY) {
 
        lastMoveX = e.screenX;
 
        lastMoveY = e.screenY;
 
        handleActivity();
 
      }
 
    };
 

	
 
    let handleMouseDown = function() {
 
      handleActivity();
 
      // For as long as the they are touching the device or have their mouse down,
 
      // we consider them active even if they're not moving their finger or mouse.
 
      // So we want to continue to update that they are active
 
      this.clearInterval(mouseInProgress);
 
      // Setting userActivity=true now and setting the interval to the same time
 
      // as the activityCheck interval (250) should ensure we never miss the
 
      // next activityCheck
 
      mouseInProgress = this.setInterval(handleActivity, 250);
 
    };
 

	
 
    let handleMouseUp = function(event) {
 
      handleActivity();
 
      // Stop the interval that maintains activity if the mouse/touch is down
 
      this.clearInterval(mouseInProgress);
 
    };
 

	
 
    // Any mouse movement will be considered user activity
 
    this.on('mousedown', handleMouseDown);
 
    this.on('mousemove', handleMouseMove);
 
    this.on('mouseup', handleMouseUp);
 

	
 
    // Listen for keyboard navigation
 
    // Shouldn't need to use inProgress interval because of key repeat
 
    this.on('keydown', handleActivity);
 
    this.on('keyup', handleActivity);
 

	
 
    // Run an interval every 250 milliseconds instead of stuffing everything into
 
    // the mousemove/touchmove function itself, to prevent performance degradation.
 
    // `this.reportUserActivity` simply sets this.userActivity_ to true, which
 
    // then gets picked up by this loop
 
    // http://ejohn.org/blog/learning-from-twitter/
 
    let inactivityTimeout;
 
    let activityCheck = this.setInterval(function() {
 
      // Check to see if mouse/touch activity has happened
 
      if (this.userActivity_) {
 
        // Reset the activity tracker
 
        this.userActivity_ = false;
 

	
 
        // If the user state was inactive, set the state to active
 
        this.userActive(true);
 

	
 
        // Clear any existing inactivity timeout to start the timer over
 
        this.clearTimeout(inactivityTimeout);
 

	
 
        var timeout = this.options_['inactivityTimeout'];
 
        if (timeout > 0) {
 
          // In <timeout> milliseconds, if no more activity has occurred the
 
          // user will be considered inactive
 
          inactivityTimeout = this.setTimeout(function () {
 
            // Protect against the case where the inactivityTimeout can trigger just
 
            // before the next user activity is picked up by the activityCheck loop
 
            // causing a flicker
 
            if (!this.userActivity_) {
 
                this.userActive(false);
 
            }
 
          }, timeout);
 
        }
 
      }
 
    }, 250);
 
  }
 

	
 
  /**
 
   * Gets or sets the current playback rate.  A playback rate of
 
   * 1.0 represents normal speed and 0.5 would indicate half-speed
 
   * playback, for instance.
 
   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-playbackrate
 
   *
 
   * @param  {Number} rate    New playback rate to set.
 
   * @return {Number}         Returns the new playback rate when setting
 
   * @return {Number}         Returns the current playback rate when getting
 
   * @method playbackRate
 
   */
 
  playbackRate(rate) {
 
    if (rate !== undefined) {
 
      this.techCall_('setPlaybackRate', rate);
 
      return this;
 
    }
 

	
 
    if (this.tech_ && this.tech_['featuresPlaybackRate']) {
 
      return this.techGet_('playbackRate');
 
    } else {
 
      return 1.0;
 
    }
 
  }
 

	
 
  /**
 
   * Gets or sets the audio flag
 
   *
 
   * @param  {Boolean} bool    True signals that this is an audio player.
 
   * @return {Boolean}         Returns true if player is audio, false if not when getting
 
   * @return {Player}      Returns the player if setting
 
   * @private
 
   * @method isAudio
 
   */
 
  isAudio(bool) {
 
    if (bool !== undefined) {
 
      this.isAudio_ = !!bool;
 
      return this;
 
    }
 

	
 
    return !!this.isAudio_;
 
  }
 

	
 
  /**
 
   * Returns the current state of network activity for the element, from
 
   * the codes in the list below.
 
   * - NETWORK_EMPTY (numeric value 0)
 
   *   The element has not yet been initialised. All attributes are in
 
   *   their initial states.
 
   * - NETWORK_IDLE (numeric value 1)
 
   *   The element's resource selection algorithm is active and has
 
   *   selected a resource, but it is not actually using the network at
 
   *   this time.
 
   * - NETWORK_LOADING (numeric value 2)
 
   *   The user agent is actively trying to download data.
 
   * - NETWORK_NO_SOURCE (numeric value 3)
 
   *   The element's resource selection algorithm is active, but it has
 
   *   not yet found a resource to use.
 
   *
 
   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#network-states
 
   * @return {Number} the current network activity state
 
   * @method networkState
 
   */
 
  networkState() {
 
    return this.techGet_('networkState');
 
  }
 

	
 
  /**
 
   * Returns a value that expresses the current state of the element
 
   * with respect to rendering the current playback position, from the
 
   * codes in the list below.
 
   * - HAVE_NOTHING (numeric value 0)
 
   *   No information regarding the media resource is available.
 
   * - HAVE_METADATA (numeric value 1)
 
   *   Enough of the resource has been obtained that the duration of the
 
   *   resource is available.
 
   * - HAVE_CURRENT_DATA (numeric value 2)
 
   *   Data for the immediate current playback position is available.
 
   * - HAVE_FUTURE_DATA (numeric value 3)
 
   *   Data for the immediate current playback position is available, as
 
   *   well as enough data for the user agent to advance the current
 
   *   playback position in the direction of playback.
 
   * - HAVE_ENOUGH_DATA (numeric value 4)
 
   *   The user agent estimates that enough data is available for
 
   *   playback to proceed uninterrupted.
 
   *
 
   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-readystate
 
   * @return {Number} the current playback rendering state
 
   * @method readyState
 
   */
 
  readyState() {
 
    return this.techGet_('readyState');
 
  }
 

	
 
  /*
 
    * Text tracks are tracks of timed text events.
 
    * Captions - text displayed over the video for the hearing impaired
 
    * Subtitles - text displayed over the video for those who don't understand language in the video
 
    * Chapters - text displayed in a menu allowing the user to jump to particular points (chapters) in the video
 
    * Descriptions (not supported yet) - audio descriptions that are read back to the user by a screen reading device
 
    */
 

	
 
  /**
 
   * Get an array of associated text tracks. captions, subtitles, chapters, descriptions
 
   * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-texttracks
 
   *
 
   * @return {Array}           Array of track objects
 
   * @method textTracks
 
   */
 
  textTracks() {
 
    // cannot use techGet_ directly because it checks to see whether the tech is ready.
 
    // Flash is unlikely to be ready in time but textTracks should still work.
 
    return this.tech_ && this.tech_['textTracks']();
 
  }
 

	
 
  /**
 
   * Get an array of remote text tracks
 
   *
 
   * @return {Array}
 
   * @method remoteTextTracks
 
   */
 
  remoteTextTracks() {
 
    return this.tech_ && this.tech_['remoteTextTracks']();
 
  }
 

	
 
  /**
 
   * Add a text track
 
   * In addition to the W3C settings we allow adding additional info through options.
 
   * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-addtexttrack
 
   *
 
   * @param {String}  kind        Captions, subtitles, chapters, descriptions, or metadata
 
   * @param {String=} label       Optional label
 
   * @param {String=} language    Optional language
 
   * @method addTextTrack
 
   */
 
  addTextTrack(kind, label, language) {
 
    return this.tech_ && this.tech_['addTextTrack'](kind, label, language);
 
  }
 

	
 
  /**
 
   * Add a remote text track
 
   *
 
   * @param {Object} options    Options for remote text track
 
   * @method addRemoteTextTrack
 
   */
 
  addRemoteTextTrack(options) {
 
    return this.tech_ && this.tech_['addRemoteTextTrack'](options);
 
  }
 

	
 
  /**
 
   * Remove a remote text track
 
   *
 
   * @param {Object} track    Remote text track to remove
 
   * @method removeRemoteTextTrack
 
   */
 
  removeRemoteTextTrack(track) {
 
    this.tech_ && this.tech_['removeRemoteTextTrack'](track);
 
  }
 

	
 
  /**
 
   * Get video width
 
   *
 
   * @return {Number} Video width
 
   * @method videoWidth
 
   */
 
  videoWidth() {
 
    return this.tech_ && this.tech_.videoWidth && this.tech_.videoWidth() || 0;
 
  }
 

	
 
  /**
 
   * Get video height
 
   *
 
   * @return {Number} Video height
 
   * @method videoHeight
 
   */
 
  videoHeight() {
 
    return this.tech_ && this.tech_.videoHeight && this.tech_.videoHeight() || 0;
 
  }
 

	
 
  // Methods to add support for
 
  // initialTime: function(){ return this.techCall_('initialTime'); },
 
  // startOffsetTime: function(){ return this.techCall_('startOffsetTime'); },
 
  // played: function(){ return this.techCall_('played'); },
 
  // videoTracks: function(){ return this.techCall_('videoTracks'); },
 
  // audioTracks: function(){ return this.techCall_('audioTracks'); },
 
  // defaultPlaybackRate: function(){ return this.techCall_('defaultPlaybackRate'); },
 
  // defaultMuted: function(){ return this.techCall_('defaultMuted'); }
 

	
 
  /**
 
   * The player's language code
 
   * NOTE: The language should be set in the player options if you want the
 
   * the controls to be built with a specific language. Changing the lanugage
 
   * later will not update controls text.
 
   *
 
   * @param {String} code  The locale string
 
   * @return {String}      The locale string when getting
 
   * @return {Player}      self when setting
 
   * @method language
 
   */
 
  language(code) {
 
    if (code === undefined) {
 
      return this.language_;
 
    }
 

	
 
    this.language_ = (''+code).toLowerCase();
 
    return this;
 
  }
 

	
 
  /**
 
   * Get the player's language dictionary
 
   * Merge every time, because a newly added plugin might call videojs.addLanguage() at any time
 
   * Languages specified directly in the player options have precedence
 
   *
 
   * @return {Array} Array of languages
 
   * @method languages
 
   */
 
  languages() {
 
    return  mergeOptions(Player.prototype.options_.languages, this.languages_);
 
  }
 

	
 
  /**
 
   * Converts track info to JSON
 
   *
 
   * @return {Object} JSON object of options
 
   * @method toJSON
 
   */
 
  toJSON() {
 
    let options = mergeOptions(this.options_);
 
    let tracks = options.tracks;
 

	
 
    options.tracks = [];
 

	
 
    for (let i = 0; i < tracks.length; i++) {
 
      let track = tracks[i];
 

	
 
      // deep merge tracks and null out player so no circular references
 
      track = mergeOptions(track);
 
      track.player = undefined;
 
      options.tracks[i] = track;
 
    }
 

	
 
    return options;
 
  }
 

	
 
  /**
 
   * Gets tag settings
 
   *
 
   * @param {Element} tag The player tag
 
   * @return {Array} An array of sources and track objects
 
   * @static
 
   * @method getTagSettings
 
   */
 
  static getTagSettings(tag) {
 
    let baseOptions = {
 
      'sources': [],
 
      'tracks': []
 
    };
 

	
 
    const tagOptions = Dom.getElAttributes(tag);
 
    const dataSetup = tagOptions['data-setup'];
 

	
 
    // Check if data-setup attr exists.
 
    if (dataSetup !== null){
 
      // Parse options JSON
 
      // If empty string, make it a parsable json object.
 
      const [err, data] = safeParseTuple(dataSetup || '{}');
 
      if (err) {
 
        log.error(err);
 
      }
 
      assign(tagOptions, data);
 
    }
 

	
 
    assign(baseOptions, tagOptions);
 

	
 
    // Get tag children settings
 
    if (tag.hasChildNodes()) {
 
      const children = tag.childNodes;
 

	
 
      for (let i=0, j=children.length; i<j; i++) {
 
        const child = children[i];
 
        // Change case needed: http://ejohn.org/blog/nodename-case-sensitivity/
 
        const childName = child.nodeName.toLowerCase();
 
        if (childName === 'source') {
 
          baseOptions.sources.push(Dom.getElAttributes(child));
 
        } else if (childName === 'track') {
 
          baseOptions.tracks.push(Dom.getElAttributes(child));
 
        }
 
      }
 
    }
 

	
 
    return baseOptions;
 
  }
 

	
 
}
 

	
 
/*
 
 * Global player list
 
 *
 
 * @type {Object}
 
 */
 
Player.players = {};
 

	
 
let navigator = window.navigator;
 
/*
 
 * Player instance options, surfaced using options
 
 * options = Player.prototype.options_
 
 * Make changes in options, not here.
 
 *
 
 * @type {Object}
 
 * @private
 
 */
 
Player.prototype.options_ = {
 
  // Default order of fallback technology
 
  techOrder: ['html5','flash'],
 
  // techOrder: ['flash','html5'],
 

	
 
  html5: {},
 
  flash: {},
 

	
 
  // defaultVolume: 0.85,
 
  defaultVolume: 0.00, // The freakin seaguls are driving me crazy!
 

	
 
  // default inactivity timeout
 
  inactivityTimeout: 2000,
 

	
 
  // default playback rates
 
  playbackRates: [],
 
  // Add playback rate selection by adding rates
 
  // 'playbackRates': [0.5, 1, 1.5, 2],
 

	
 
  // Included control sets
 
  children: [
 
    'mediaLoader',
 
    'posterImage',
 
    'textTrackDisplay',
 
    'loadingSpinner',
 
    'bigPlayButton',
 
    'controlBar',
 
    'errorDisplay',
 
    'textTrackSettings'
 
  ],
 

	
 
  language: document.getElementsByTagName('html')[0].getAttribute('lang') || navigator.languages && navigator.languages[0] || navigator.userLanguage || navigator.language || 'en',
 

	
 
  // locales and their language translations
 
  languages: {},
 

	
 
  // Default message to show when a video cannot be played.
 
  notSupportedMessage: 'No compatible source was found for this video.'
 
};
 

	
 
/**
 
 * Fired when the player has initial duration and dimension information
 
 *
 
 * @event loadedmetadata
 
 */
 
Player.prototype.handleLoadedMetaData_;
 

	
 
/**
 
 * Fired when the player has downloaded data at the current playback position
 
 *
 
 * @event loadeddata
 
 */
 
Player.prototype.handleLoadedData_;
 

	
 
/**
 
 * Fired when the user is active, e.g. moves the mouse over the player
 
 *
 
 * @event useractive
 
 */
 
Player.prototype.handleUserActive_;
 

	
 
/**
 
 * Fired when the user is inactive, e.g. a short delay after the last mouse move or control interaction
 
 *
 
 * @event userinactive
 
 */
 
Player.prototype.handleUserInactive_;
 

	
 
/**
 
 * Fired when the current playback position has changed *
 
 * During playback this is fired every 15-250 milliseconds, depending on the
 
 * playback technology in use.
 
 *
 
 * @event timeupdate
 
 */
 
Player.prototype.handleTimeUpdate_;
 

	
 
/**
 
 * Fired when the volume changes
 
 *
 
 * @event volumechange
 
 */
 
Player.prototype.handleVolumeChange_;
 

	
 
/**
 
 * Fired when an error occurs
 
 *
 
 * @event error
 
 */
 
Player.prototype.handleError_;
 

	
 
Player.prototype.flexNotSupported_ = function() {
 
  var elem = document.createElement('i');
 

	
 
  // Note: We don't actually use flexBasis (or flexOrder), but it's one of the more
 
  // common flex features that we can rely on when checking for flex support.
 
  return !('flexBasis' in elem.style ||
 
          'webkitFlexBasis' in elem.style ||
 
          'mozFlexBasis' in elem.style ||
 
          'msFlexBasis' in elem.style ||
 
          'msFlexOrder' in elem.style /* IE10-specific (2012 flex spec)  */);
 
};
 

	
 
Component.registerComponent('Player', Player);
 
export default Player;
ennstatus/static/js/video.js/src/js/plugins.js
Show inline comments
 
new file 100644
 
/**
 
 * @file plugins.js
 
 */
 
import Player from './player.js';
 

	
 
/**
 
 * The method for registering a video.js plugin
 
 *
 
 * @param  {String} name The name of the plugin
 
 * @param  {Function} init The function that is run when the player inits
 
 * @method plugin
 
 */
 
var plugin = function(name, init){
 
  Player.prototype[name] = init;
 
};
 

	
 
export default plugin;
ennstatus/static/js/video.js/src/js/poster-image.js
Show inline comments
 
new file 100644
 
/**
 
 * @file poster-image.js
 
 */
 
import Button from './button.js';
 
import Component from './component.js';
 
import * as Fn from './utils/fn.js';
 
import * as Dom from './utils/dom.js';
 
import * as browser from './utils/browser.js';
 

	
 
/**
 
 * The component that handles showing the poster image.
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Button
 
 * @class PosterImage
 
 */
 
class PosterImage extends Button {
 

	
 
  constructor(player, options){
 
    super(player, options);
 

	
 
    this.update();
 
    player.on('posterchange', Fn.bind(this, this.update));
 
  }
 

	
 
  /**
 
   * Clean up the poster image
 
   *
 
   * @method dispose
 
   */
 
  dispose() {
 
    this.player().off('posterchange', this.update);
 
    super.dispose();
 
  }
 

	
 
  /**
 
   * Create the poster's image element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    let el = Dom.createEl('div', {
 
      className: 'vjs-poster',
 

	
 
      // Don't want poster to be tabbable.
 
      tabIndex: -1
 
    });
 

	
 
    // To ensure the poster image resizes while maintaining its original aspect
 
    // ratio, use a div with `background-size` when available. For browsers that
 
    // do not support `background-size` (e.g. IE8), fall back on using a regular
 
    // img element.
 
    if (!browser.BACKGROUND_SIZE_SUPPORTED) {
 
      this.fallbackImg_ = Dom.createEl('img');
 
      el.appendChild(this.fallbackImg_);
 
    }
 

	
 
    return el;
 
  }
 

	
 
  /**
 
   * Event handler for updates to the player's poster source
 
   *
 
   * @method update
 
   */
 
  update() {
 
    let url = this.player().poster();
 

	
 
    this.setSrc(url);
 

	
 
    // If there's no poster source we should display:none on this component
 
    // so it's not still clickable or right-clickable
 
    if (url) {
 
      this.show();
 
    } else {
 
      this.hide();
 
    }
 
  }
 

	
 
  /**
 
   * Set the poster source depending on the display method
 
   *
 
   * @param {String} url The URL to the poster source
 
   * @method setSrc
 
   */
 
  setSrc(url) {
 
    if (this.fallbackImg_) {
 
      this.fallbackImg_.src = url;
 
    } else {
 
      let backgroundImage = '';
 
      // Any falsey values should stay as an empty string, otherwise
 
      // this will throw an extra error
 
      if (url) {
 
        backgroundImage = `url("${url}")`;
 
      }
 

	
 
      this.el_.style.backgroundImage = backgroundImage;
 
    }
 
  }
 

	
 
  /**
 
   * Event handler for clicks on the poster image
 
   *
 
   * @method handleClick
 
   */
 
  handleClick() {
 
    // We don't want a click to trigger playback when controls are disabled
 
    // but CSS should be hiding the poster to prevent that from happening
 
    if (this.player_.paused()) {
 
      this.player_.play();
 
    } else {
 
      this.player_.pause();
 
    }
 
  }
 

	
 
}
 

	
 
Component.registerComponent('PosterImage', PosterImage);
 
export default PosterImage;
ennstatus/static/js/video.js/src/js/setup.js
Show inline comments
 
new file 100644
 
/**
 
 * @file setup.js
 
 *
 
 * Functions for automatically setting up a player
 
 * based on the data-setup attribute of the video tag
 
 */
 
import * as Events from './utils/events.js';
 
import document from 'global/document';
 
import window from 'global/window';
 

	
 
let _windowLoaded = false;
 
let videojs;
 

	
 

	
 
// Automatically set up any tags that have a data-setup attribute
 
var autoSetup = function(){
 
  // One day, when we stop supporting IE8, go back to this, but in the meantime...*hack hack hack*
 
  // var vids = Array.prototype.slice.call(document.getElementsByTagName('video'));
 
  // var audios = Array.prototype.slice.call(document.getElementsByTagName('audio'));
 
  // var mediaEls = vids.concat(audios);
 

	
 
  // Because IE8 doesn't support calling slice on a node list, we need to loop through each list of elements
 
  // to build up a new, combined list of elements.
 
  var vids = document.getElementsByTagName('video');
 
  var audios = document.getElementsByTagName('audio');
 
  var mediaEls = [];
 
  if (vids && vids.length > 0) {
 
    for(let i=0, e=vids.length; i<e; i++) {
 
      mediaEls.push(vids[i]);
 
    }
 
  }
 
  if (audios && audios.length > 0) {
 
    for(let i=0, e=audios.length; i<e; i++) {
 
      mediaEls.push(audios[i]);
 
    }
 
  }
 

	
 
  // Check if any media elements exist
 
  if (mediaEls && mediaEls.length > 0) {
 

	
 
    for (let i=0, e=mediaEls.length; i<e; i++) {
 
      let mediaEl = mediaEls[i];
 

	
 
      // Check if element exists, has getAttribute func.
 
      // IE seems to consider typeof el.getAttribute == 'object' instead of 'function' like expected, at least when loading the player immediately.
 
      if (mediaEl && mediaEl.getAttribute) {
 

	
 
        // Make sure this player hasn't already been set up.
 
        if (mediaEl['player'] === undefined) {
 
          let options = mediaEl.getAttribute('data-setup');
 

	
 
          // Check if data-setup attr exists.
 
          // We only auto-setup if they've added the data-setup attr.
 
          if (options !== null) {
 
            // Create new video.js instance.
 
            let player = videojs(mediaEl);
 
          }
 
        }
 

	
 
      // If getAttribute isn't defined, we need to wait for the DOM.
 
      } else {
 
        autoSetupTimeout(1);
 
        break;
 
      }
 
    }
 

	
 
  // No videos were found, so keep looping unless page is finished loading.
 
  } else if (!_windowLoaded) {
 
    autoSetupTimeout(1);
 
  }
 
};
 

	
 
// Pause to let the DOM keep processing
 
var autoSetupTimeout = function(wait, vjs){
 
  videojs = vjs;
 
  setTimeout(autoSetup, wait);
 
};
 

	
 
if (document.readyState === 'complete') {
 
  _windowLoaded = true;
 
} else {
 
  Events.one(window, 'load', function(){
 
    _windowLoaded = true;
 
  });
 
}
 

	
 
var hasLoaded = function() {
 
  return _windowLoaded;
 
};
 

	
 
export { autoSetup, autoSetupTimeout, hasLoaded };
ennstatus/static/js/video.js/src/js/slider/slider.js
Show inline comments
 
new file 100644
 
/**
 
 * @file slider.js
 
 */
 
import Component from '../component.js';
 
import * as Dom from '../utils/dom.js';
 
import document from 'global/document';
 
import assign from 'object.assign';
 

	
 
/**
 
 * The base functionality for sliders like the volume bar and seek bar
 
 *
 
 * @param {Player|Object} player
 
 * @param {Object=} options
 
 * @extends Component
 
 * @class Slider
 
 */
 
class Slider extends Component {
 

	
 
  constructor(player, options) {
 
    super(player, options);
 

	
 
    // Set property names to bar to match with the child Slider class is looking for
 
    this.bar = this.getChild(this.options_.barName);
 

	
 
    // Set a horizontal or vertical class on the slider depending on the slider type
 
    this.vertical(!!this.options_.vertical);
 

	
 
    this.on('mousedown', this.handleMouseDown);
 
    this.on('touchstart', this.handleMouseDown);
 
    this.on('focus', this.handleFocus);
 
    this.on('blur', this.handleBlur);
 
    this.on('click', this.handleClick);
 

	
 
    this.on(player, 'controlsvisible', this.update);
 
    this.on(player, this.playerEvent, this.update);
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @param {String} type Type of element to create
 
   * @param {Object=} props List of properties in Object form
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl(type, props={}, attributes={}) {
 
    // Add the slider element class to all sub classes
 
    props.className = props.className + ' vjs-slider';
 
    props = assign({
 
      tabIndex: 0
 
    }, props);
 

	
 
    attributes = assign({
 
      'role': 'slider',
 
      'aria-valuenow': 0,
 
      'aria-valuemin': 0,
 
      'aria-valuemax': 100,
 
      tabIndex: 0
 
    }, attributes);
 

	
 
    return super.createEl(type, props, attributes);
 
  }
 

	
 
  /**
 
   * Handle mouse down on slider
 
   *
 
   * @param {Object} event Mouse down event object
 
   * @method handleMouseDown
 
   */
 
  handleMouseDown(event) {
 
    event.preventDefault();
 
    Dom.blockTextSelection();
 

	
 
    this.addClass('vjs-sliding');
 
    this.trigger('slideractive');
 

	
 
    this.on(document, 'mousemove', this.handleMouseMove);
 
    this.on(document, 'mouseup', this.handleMouseUp);
 
    this.on(document, 'touchmove', this.handleMouseMove);
 
    this.on(document, 'touchend', this.handleMouseUp);
 

	
 
    this.handleMouseMove(event);
 
  }
 

	
 
  /**
 
   * To be overridden by a subclass
 
   *
 
   * @method handleMouseMove
 
   */
 
  handleMouseMove() {}
 

	
 
  /**
 
   * Handle mouse up on Slider
 
   *
 
   * @method handleMouseUp
 
   */
 
  handleMouseUp() {
 
    Dom.unblockTextSelection();
 

	
 
    this.removeClass('vjs-sliding');
 
    this.trigger('sliderinactive');
 

	
 
    this.off(document, 'mousemove', this.handleMouseMove);
 
    this.off(document, 'mouseup', this.handleMouseUp);
 
    this.off(document, 'touchmove', this.handleMouseMove);
 
    this.off(document, 'touchend', this.handleMouseUp);
 

	
 
    this.update();
 
  }
 

	
 
  /**
 
   * Update slider
 
   *
 
   * @method update
 
   */
 
  update() {
 
    // In VolumeBar init we have a setTimeout for update that pops and update to the end of the
 
    // execution stack. The player is destroyed before then update will cause an error
 
    if (!this.el_) return;
 

	
 
    // If scrubbing, we could use a cached value to make the handle keep up with the user's mouse.
 
    // On HTML5 browsers scrubbing is really smooth, but some flash players are slow, so we might want to utilize this later.
 
    // var progress =  (this.player_.scrubbing()) ? this.player_.getCache().currentTime / this.player_.duration() : this.player_.currentTime() / this.player_.duration();
 
    let progress = this.getPercent();
 
    let bar = this.bar;
 

	
 
    // If there's no bar...
 
    if (!bar) return;
 

	
 
    // Protect against no duration and other division issues
 
    if (typeof progress !== 'number' ||
 
        progress !== progress ||
 
        progress < 0 ||
 
        progress === Infinity) {
 
          progress = 0;
 
    }
 

	
 
    // Convert to a percentage for setting
 
    let percentage = (progress * 100).toFixed(2) + '%';
 

	
 
    // Set the new bar width or height
 
    if (this.vertical()) {
 
      bar.el().style.height = percentage;
 
    } else {
 
      bar.el().style.width = percentage;
 
    }
 
  }
 

	
 
  /**
 
   * Calculate distance for slider
 
   *
 
   * @param {Object} event Event object
 
   * @method calculateDistance
 
   */
 
  calculateDistance(event){
 
    let position = Dom.getPointerPosition(this.el_, event);
 
    if (this.vertical()) {
 
      return position.y;
 
    }
 
    return position.x;
 
  }
 

	
 
  /**
 
   * Handle on focus for slider
 
   *
 
   * @method handleFocus
 
   */
 
  handleFocus() {
 
    this.on(document, 'keydown', this.handleKeyPress);
 
  }
 

	
 
  /**
 
   * Handle key press for slider
 
   *
 
   * @param {Object} event Event object
 
   * @method handleKeyPress
 
   */
 
  handleKeyPress(event) {
 
    if (event.which === 37 || event.which === 40) { // Left and Down Arrows
 
      event.preventDefault();
 
      this.stepBack();
 
    } else if (event.which === 38 || event.which === 39) { // Up and Right Arrows
 
      event.preventDefault();
 
      this.stepForward();
 
    }
 
  }
 

	
 
  /**
 
   * Handle on blur for slider
 
   *
 
   * @method handleBlur
 
   */
 
  handleBlur() {
 
    this.off(document, 'keydown', this.handleKeyPress);
 
  }
 

	
 
  /**
 
   * Listener for click events on slider, used to prevent clicks
 
   *   from bubbling up to parent elements like button menus.
 
   *
 
   * @param {Object} event Event object
 
   * @method handleClick
 
   */
 
  handleClick(event) {
 
    event.stopImmediatePropagation();
 
    event.preventDefault();
 
  }
 

	
 
  /**
 
   * Get/set if slider is horizontal for vertical
 
   *
 
   * @param {Boolean} bool True if slider is vertical, false is horizontal
 
   * @return {Boolean} True if slider is vertical, false is horizontal
 
   * @method vertical
 
   */
 
  vertical(bool) {
 
    if (bool === undefined) {
 
      return this.vertical_ || false;
 
    }
 

	
 
    this.vertical_ = !!bool;
 

	
 
    if (this.vertical_) {
 
      this.addClass('vjs-slider-vertical');
 
    } else {
 
      this.addClass('vjs-slider-horizontal');
 
    }
 

	
 
    return this;
 
  }
 

	
 
}
 

	
 
Component.registerComponent('Slider', Slider);
 
export default Slider;
ennstatus/static/js/video.js/src/js/tech/flash-rtmp.js
Show inline comments
 
new file 100644
 
/**
 
 * @file flash-rtmp.js
 
 */
 
function FlashRtmpDecorator(Flash) {
 
  Flash.streamingFormats = {
 
    'rtmp/mp4': 'MP4',
 
    'rtmp/flv': 'FLV'
 
  };
 

	
 
  Flash.streamFromParts = function(connection, stream) {
 
    return connection + '&' + stream;
 
  };
 

	
 
  Flash.streamToParts = function(src) {
 
    let parts = {
 
      connection: '',
 
      stream: ''
 
    };
 

	
 
    if (!src) return parts;
 

	
 
    // Look for the normal URL separator we expect, '&'.
 
    // If found, we split the URL into two pieces around the
 
    // first '&'.
 
    let connEnd = src.indexOf('&');
 
    let streamBegin;
 
    if (connEnd !== -1) {
 
      streamBegin = connEnd + 1;
 
    }
 
    else {
 
      // If there's not a '&', we use the last '/' as the delimiter.
 
      connEnd = streamBegin = src.lastIndexOf('/') + 1;
 
      if (connEnd === 0) {
 
        // really, there's not a '/'?
 
        connEnd = streamBegin = src.length;
 
      }
 
    }
 
    parts.connection = src.substring(0, connEnd);
 
    parts.stream = src.substring(streamBegin, src.length);
 

	
 
    return parts;
 
  };
 

	
 
  Flash.isStreamingType = function(srcType) {
 
    return srcType in Flash.streamingFormats;
 
  };
 

	
 
  // RTMP has four variations, any string starting
 
  // with one of these protocols should be valid
 
  Flash.RTMP_RE = /^rtmp[set]?:\/\//i;
 

	
 
  Flash.isStreamingSrc = function(src) {
 
    return Flash.RTMP_RE.test(src);
 
  };
 

	
 
  /**
 
   * A source handler for RTMP urls
 
   * @type {Object}
 
   */
 
  Flash.rtmpSourceHandler = {};
 

	
 
  /**
 
   * Check Flash can handle the source natively
 
   * @param  {Object} source  The source object
 
   * @return {String}         'probably', 'maybe', or '' (empty string)
 
   */
 
  Flash.rtmpSourceHandler.canHandleSource = function(source){
 
    if (Flash.isStreamingType(source.type) || Flash.isStreamingSrc(source.src)) {
 
      return 'maybe';
 
    }
 

	
 
    return '';
 
  };
 

	
 
  /**
 
   * Pass the source to the flash object
 
   * Adaptive source handlers will have more complicated workflows before passing
 
   * video data to the video element
 
   * @param  {Object} source    The source object
 
   * @param  {Flash} tech   The instance of the Flash tech
 
   */
 
  Flash.rtmpSourceHandler.handleSource = function(source, tech){
 
    let srcParts = Flash.streamToParts(source.src);
 

	
 
    tech['setRtmpConnection'](srcParts.connection);
 
    tech['setRtmpStream'](srcParts.stream);
 
  };
 

	
 
  // Register the native source handler
 
  Flash.registerSourceHandler(Flash.rtmpSourceHandler);
 

	
 
  return Flash;
 
}
 

	
 
export default FlashRtmpDecorator;
ennstatus/static/js/video.js/src/js/tech/flash.js
Show inline comments
 
new file 100644
 
/**
 
 * @file flash.js
 
 * VideoJS-SWF - Custom Flash Player with HTML5-ish API
 
 * https://github.com/zencoder/video-js-swf
 
 * Not using setupTriggers. Using global onEvent func to distribute events
 
 */
 

	
 
import Tech from './tech';
 
import * as Dom from '../utils/dom.js';
 
import * as Url from '../utils/url.js';
 
import { createTimeRange } from '../utils/time-ranges.js';
 
import FlashRtmpDecorator from './flash-rtmp';
 
import Component from '../component';
 
import window from 'global/window';
 
import assign from 'object.assign';
 

	
 
let navigator = window.navigator;
 
/**
 
 * Flash Media Controller - Wrapper for fallback SWF API
 
 *
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready Ready callback function
 
 * @extends Tech
 
 * @class Flash
 
 */
 
class Flash extends Tech {
 

	
 
  constructor(options, ready){
 
    super(options, ready);
 

	
 
    // Set the source when ready
 
    if (options.source) {
 
      this.ready(function(){
 
        this.setSource(options.source);
 
      }, true);
 
    }
 

	
 
    // Having issues with Flash reloading on certain page actions (hide/resize/fullscreen) in certain browsers
 
    // This allows resetting the playhead when we catch the reload
 
    if (options.startTime) {
 
      this.ready(function(){
 
        this.load();
 
        this.play();
 
        this.currentTime(options.startTime);
 
      }, true);
 
    }
 

	
 
    // Add global window functions that the swf expects
 
    // A 4.x workflow we weren't able to solve for in 5.0
 
    // because of the need to hard code these functions
 
    // into the swf for security reasons
 
    window.videojs = window.videojs || {};
 
    window.videojs.Flash = window.videojs.Flash || {};
 
    window.videojs.Flash.onReady = Flash.onReady;
 
    window.videojs.Flash.onEvent = Flash.onEvent;
 
    window.videojs.Flash.onError = Flash.onError;
 

	
 
    this.on('seeked', function() {
 
      this.lastSeekTarget_ = undefined;
 
    });
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    let options = this.options_;
 

	
 
    // If video.js is hosted locally you should also set the location
 
    // for the hosted swf, which should be relative to the page (not video.js)
 
    // Otherwise this adds a CDN url.
 
    // The CDN also auto-adds a swf URL for that specific version.
 
    if (!options.swf) {
 
      options.swf = '//vjs.zencdn.net/swf/__SWF_VERSION__/video-js.swf';
 
    }
 

	
 
    // Generate ID for swf object
 
    let objId = options.techId;
 

	
 
    // Merge default flashvars with ones passed in to init
 
    let flashVars = assign({
 

	
 
      // SWF Callback Functions
 
      'readyFunction': 'videojs.Flash.onReady',
 
      'eventProxyFunction': 'videojs.Flash.onEvent',
 
      'errorEventProxyFunction': 'videojs.Flash.onError',
 

	
 
      // Player Settings
 
      'autoplay': options.autoplay,
 
      'preload': options.preload,
 
      'loop': options.loop,
 
      'muted': options.muted
 

	
 
    }, options.flashVars);
 

	
 
    // Merge default parames with ones passed in
 
    let params = assign({
 
      'wmode': 'opaque', // Opaque is needed to overlay controls, but can affect playback performance
 
      'bgcolor': '#000000' // Using bgcolor prevents a white flash when the object is loading
 
    }, options.params);
 

	
 
    // Merge default attributes with ones passed in
 
    let attributes = assign({
 
      'id': objId,
 
      'name': objId, // Both ID and Name needed or swf to identify itself
 
      'class': 'vjs-tech'
 
    }, options.attributes);
 

	
 
    this.el_ = Flash.embed(options.swf, flashVars, params, attributes);
 
    this.el_.tech = this;
 

	
 
    return this.el_;
 
  }
 

	
 
  /**
 
   * Play for flash tech
 
   *
 
   * @method play
 
   */
 
  play() {
 
    if (this.ended()) {
 
      this.setCurrentTime(0);
 
    }
 
    this.el_.vjs_play();
 
  }
 

	
 
  /**
 
   * Pause for flash tech
 
   *
 
   * @method pause
 
   */
 
  pause() {
 
    this.el_.vjs_pause();
 
  }
 

	
 
  /**
 
   * Get/set video
 
   *
 
   * @param {Object=} src Source object
 
   * @return {Object}
 
   * @method src
 
   */
 
  src(src) {
 
    if (src === undefined) {
 
      return this.currentSrc();
 
    }
 

	
 
    // Setting src through `src` not `setSrc` will be deprecated
 
    return this.setSrc(src);
 
  }
 

	
 
  /**
 
   * Set video
 
   *
 
   * @param {Object=} src Source object
 
   * @deprecated
 
   * @method setSrc
 
   */
 
  setSrc(src) {
 
    // Make sure source URL is absolute.
 
    src = Url.getAbsoluteURL(src);
 
    this.el_.vjs_src(src);
 

	
 
    // Currently the SWF doesn't autoplay if you load a source later.
 
    // e.g. Load player w/ no source, wait 2s, set src.
 
    if (this.autoplay()) {
 
      var tech = this;
 
      this.setTimeout(function(){ tech.play(); }, 0);
 
    }
 
  }
 

	
 
  /**
 
   * Returns true if the tech is currently seeking.
 
   * @return {boolean} true if seeking
 
   */
 
  seeking() {
 
    return this.lastSeekTarget_ !== undefined;
 
  }
 

	
 
  /**
 
   * Set current time
 
   *
 
   * @param {Number} time Current time of video
 
   * @method setCurrentTime
 
   */
 
  setCurrentTime(time) {
 
    let seekable = this.seekable();
 
    if (seekable.length) {
 
      // clamp to the current seekable range
 
      time = time > seekable.start(0) ? time : seekable.start(0);
 
      time = time < seekable.end(seekable.length - 1) ? time : seekable.end(seekable.length - 1);
 

	
 
      this.lastSeekTarget_ = time;
 
      this.trigger('seeking');
 
      this.el_.vjs_setProperty('currentTime', time);
 
      super.setCurrentTime();
 
    }
 
  }
 

	
 
  /**
 
   * Get current time
 
   *
 
   * @param {Number=} time Current time of video
 
   * @return {Number} Current time
 
   * @method currentTime
 
   */
 
  currentTime(time) {
 
    // when seeking make the reported time keep up with the requested time
 
    // by reading the time we're seeking to
 
    if (this.seeking()) {
 
      return this.lastSeekTarget_ || 0;
 
    }
 
    return this.el_.vjs_getProperty('currentTime');
 
  }
 

	
 
  /**
 
   * Get current source
 
   *
 
   * @method currentSrc
 
   */
 
  currentSrc() {
 
    if (this.currentSource_) {
 
      return this.currentSource_.src;
 
    } else {
 
      return this.el_.vjs_getProperty('currentSrc');
 
    }
 
  }
 

	
 
  /**
 
   * Load media into player
 
   *
 
   * @method load
 
   */
 
  load() {
 
    this.el_.vjs_load();
 
  }
 

	
 
  /**
 
   * Get poster
 
   *
 
   * @method poster
 
   */
 
  poster() {
 
    this.el_.vjs_getProperty('poster');
 
  }
 

	
 
  /**
 
   * Poster images are not handled by the Flash tech so make this a no-op
 
   *
 
   * @method setPoster
 
   */
 
  setPoster() {}
 

	
 
  /**
 
   * Determine if can seek in media
 
   *
 
   * @return {TimeRangeObject}
 
   * @method seekable
 
   */
 
  seekable() {
 
    const duration = this.duration();
 
    if (duration === 0) {
 
      return createTimeRange();
 
    }
 
    return createTimeRange(0, duration);
 
  }
 

	
 
  /**
 
   * Get buffered time range
 
   *
 
   * @return {TimeRangeObject}
 
   * @method buffered
 
   */
 
  buffered() {
 
    let ranges = this.el_.vjs_getProperty('buffered');
 
    if (ranges.length === 0) {
 
      return createTimeRange();
 
    }
 
    return createTimeRange(ranges[0][0], ranges[0][1]);
 
  }
 

	
 
  /**
 
   * Get fullscreen support -
 
   * Flash does not allow fullscreen through javascript
 
   * so always returns false
 
   *
 
   * @return {Boolean} false
 
   * @method supportsFullScreen
 
   */
 
  supportsFullScreen() {
 
    return false; // Flash does not allow fullscreen through javascript
 
  }
 

	
 
  /**
 
   * Request to enter fullscreen
 
   * Flash does not allow fullscreen through javascript
 
   * so always returns false
 
   *
 
   * @return {Boolean} false
 
   * @method enterFullScreen
 
   */
 
  enterFullScreen() {
 
    return false;
 
  }
 

	
 
}
 

	
 

	
 
// Create setters and getters for attributes
 
const _api = Flash.prototype;
 
const _readWrite = 'rtmpConnection,rtmpStream,preload,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted'.split(',');
 
const _readOnly = 'networkState,readyState,initialTime,duration,startOffsetTime,paused,ended,videoTracks,audioTracks,videoWidth,videoHeight'.split(',');
 

	
 
function _createSetter(attr){
 
  var attrUpper = attr.charAt(0).toUpperCase() + attr.slice(1);
 
  _api['set'+attrUpper] = function(val){ return this.el_.vjs_setProperty(attr, val); };
 
}
 
function _createGetter(attr) {
 
  _api[attr] = function(){ return this.el_.vjs_getProperty(attr); };
 
}
 

	
 
// Create getter and setters for all read/write attributes
 
for (let i = 0; i < _readWrite.length; i++) {
 
  _createGetter(_readWrite[i]);
 
  _createSetter(_readWrite[i]);
 
}
 

	
 
// Create getters for read-only attributes
 
for (let i = 0; i < _readOnly.length; i++) {
 
  _createGetter(_readOnly[i]);
 
}
 

	
 
/* Flash Support Testing -------------------------------------------------------- */
 

	
 
Flash.isSupported = function(){
 
  return Flash.version()[0] >= 10;
 
  // return swfobject.hasFlashPlayerVersion('10');
 
};
 

	
 
// Add Source Handler pattern functions to this tech
 
Tech.withSourceHandlers(Flash);
 

	
 
/*
 
 * The default native source handler.
 
 * This simply passes the source to the video element. Nothing fancy.
 
 *
 
 * @param  {Object} source   The source object
 
 * @param  {Flash} tech  The instance of the Flash tech
 
 */
 
Flash.nativeSourceHandler = {};
 

	
 
/*
 
 * Check Flash can handle the source natively
 
 *
 
 * @param  {Object} source  The source object
 
 * @return {String}         'probably', 'maybe', or '' (empty string)
 
 */
 
Flash.nativeSourceHandler.canHandleSource = function(source){
 
  var type;
 

	
 
  function guessMimeType(src) {
 
    var ext = Url.getFileExtension(src);
 
    if (ext) {
 
      return `video/${ext}`;
 
    }
 
    return '';
 
  }
 

	
 
  if (!source.type) {
 
    type = guessMimeType(source.src);
 
  } else {
 
    // Strip code information from the type because we don't get that specific
 
    type = source.type.replace(/;.*/, '').toLowerCase();
 
  }
 

	
 
  if (type in Flash.formats) {
 
    return 'maybe';
 
  }
 

	
 
  return '';
 
};
 

	
 
/*
 
 * Pass the source to the flash object
 
 * Adaptive source handlers will have more complicated workflows before passing
 
 * video data to the video element
 
 *
 
 * @param  {Object} source    The source object
 
 * @param  {Flash} tech   The instance of the Flash tech
 
 */
 
Flash.nativeSourceHandler.handleSource = function(source, tech){
 
  tech.setSrc(source.src);
 
};
 

	
 
/*
 
 * Clean up the source handler when disposing the player or switching sources..
 
 * (no cleanup is needed when supporting the format natively)
 
 */
 
Flash.nativeSourceHandler.dispose = function(){};
 

	
 
// Register the native source handler
 
Flash.registerSourceHandler(Flash.nativeSourceHandler);
 

	
 
Flash.formats = {
 
  'video/flv': 'FLV',
 
  'video/x-flv': 'FLV',
 
  'video/mp4': 'MP4',
 
  'video/m4v': 'MP4'
 
};
 

	
 
Flash.onReady = function(currSwf){
 
  let el = Dom.getEl(currSwf);
 
  let tech = el && el.tech;
 

	
 
  // if there is no el then the tech has been disposed
 
  // and the tech element was removed from the player div
 
  if (tech && tech.el()) {
 
    // check that the flash object is really ready
 
    Flash.checkReady(tech);
 
  }
 
};
 

	
 
// The SWF isn't always ready when it says it is. Sometimes the API functions still need to be added to the object.
 
// If it's not ready, we set a timeout to check again shortly.
 
Flash.checkReady = function(tech){
 
  // stop worrying if the tech has been disposed
 
  if (!tech.el()) {
 
    return;
 
  }
 

	
 
  // check if API property exists
 
  if (tech.el().vjs_getProperty) {
 
    // tell tech it's ready
 
    tech.triggerReady();
 
  } else {
 
    // wait longer
 
    this.setTimeout(function(){
 
      Flash['checkReady'](tech);
 
    }, 50);
 
  }
 
};
 

	
 
// Trigger events from the swf on the player
 
Flash.onEvent = function(swfID, eventName){
 
  let tech = Dom.getEl(swfID).tech;
 
  tech.trigger(eventName);
 
};
 

	
 
// Log errors from the swf
 
Flash.onError = function(swfID, err){
 
  const tech = Dom.getEl(swfID).tech;
 

	
 
  // trigger MEDIA_ERR_SRC_NOT_SUPPORTED
 
  if (err === 'srcnotfound') {
 
    return tech.error(4);
 
  }
 

	
 
  // trigger a custom error
 
  tech.error('FLASH: ' + err);
 
};
 

	
 
// Flash Version Check
 
Flash.version = function(){
 
  let version = '0,0,0';
 

	
 
  // IE
 
  try {
 
    version = new window.ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
 

	
 
  // other browsers
 
  } catch(e) {
 
    try {
 
      if (navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin){
 
        version = (navigator.plugins['Shockwave Flash 2.0'] || navigator.plugins['Shockwave Flash']).description.replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
 
      }
 
    } catch(err) {}
 
  }
 
  return version.split(',');
 
};
 

	
 
// Flash embedding method. Only used in non-iframe mode
 
Flash.embed = function(swf, flashVars, params, attributes){
 
  const code = Flash.getEmbedCode(swf, flashVars, params, attributes);
 

	
 
  // Get element by embedding code and retrieving created element
 
  const obj = Dom.createEl('div', { innerHTML: code }).childNodes[0];
 

	
 
  return obj;
 
};
 

	
 
Flash.getEmbedCode = function(swf, flashVars, params, attributes){
 
  const objTag = '<object type="application/x-shockwave-flash" ';
 
  let flashVarsString = '';
 
  let paramsString = '';
 
  let attrsString = '';
 

	
 
  // Convert flash vars to string
 
  if (flashVars) {
 
    Object.getOwnPropertyNames(flashVars).forEach(function(key){
 
      flashVarsString += `${key}=${flashVars[key]}&amp;`;
 
    });
 
  }
 

	
 
  // Add swf, flashVars, and other default params
 
  params = assign({
 
    'movie': swf,
 
    'flashvars': flashVarsString,
 
    'allowScriptAccess': 'always', // Required to talk to swf
 
    'allowNetworking': 'all' // All should be default, but having security issues.
 
  }, params);
 

	
 
  // Create param tags string
 
  Object.getOwnPropertyNames(params).forEach(function(key){
 
    paramsString += `<param name="${key}" value="${params[key]}" />`;
 
  });
 

	
 
  attributes = assign({
 
    // Add swf to attributes (need both for IE and Others to work)
 
    'data': swf,
 

	
 
    // Default to 100% width/height
 
    'width': '100%',
 
    'height': '100%'
 

	
 
  }, attributes);
 

	
 
  // Create Attributes string
 
  Object.getOwnPropertyNames(attributes).forEach(function(key){
 
    attrsString += `${key}="${attributes[key]}" `;
 
  });
 

	
 
  return `${objTag}${attrsString}>${paramsString}</object>`;
 
};
 

	
 
// Run Flash through the RTMP decorator
 
FlashRtmpDecorator(Flash);
 

	
 
Component.registerComponent('Flash', Flash);
 
export default Flash;
ennstatus/static/js/video.js/src/js/tech/html5.js
Show inline comments
 
new file 100644
 
/**
 
 * @file html5.js
 
 * HTML5 Media Controller - Wrapper for HTML5 Media API
 
 */
 

	
 
import Tech from './tech.js';
 
import Component from '../component';
 
import * as Dom from '../utils/dom.js';
 
import * as Url from '../utils/url.js';
 
import * as Fn from '../utils/fn.js';
 
import log from '../utils/log.js';
 
import * as browser from '../utils/browser.js';
 
import document from 'global/document';
 
import window from 'global/window';
 
import assign from 'object.assign';
 
import mergeOptions from '../utils/merge-options.js';
 

	
 
/**
 
 * HTML5 Media Controller - Wrapper for HTML5 Media API
 
 *
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready Ready callback function
 
 * @extends Tech
 
 * @class Html5
 
 */
 
class Html5 extends Tech {
 

	
 
  constructor(options, ready){
 
    super(options, ready);
 

	
 
    const source = options.source;
 

	
 
    // Set the source if one is provided
 
    // 1) Check if the source is new (if not, we want to keep the original so playback isn't interrupted)
 
    // 2) Check to see if the network state of the tag was failed at init, and if so, reset the source
 
    // anyway so the error gets fired.
 
    if (source && (this.el_.currentSrc !== source.src || (options.tag && options.tag.initNetworkState_ === 3))) {
 
      this.setSource(source);
 
    } else {
 
      this.handleLateInit_(this.el_);
 
    }
 

	
 
    if (this.el_.hasChildNodes()) {
 

	
 
      let nodes = this.el_.childNodes;
 
      let nodesLength = nodes.length;
 
      let removeNodes = [];
 

	
 
      while (nodesLength--) {
 
        let node = nodes[nodesLength];
 
        let nodeName = node.nodeName.toLowerCase();
 
        if (nodeName === 'track') {
 
          if (!this.featuresNativeTextTracks) {
 
            // Empty video tag tracks so the built-in player doesn't use them also.
 
            // This may not be fast enough to stop HTML5 browsers from reading the tags
 
            // so we'll need to turn off any default tracks if we're manually doing
 
            // captions and subtitles. videoElement.textTracks
 
            removeNodes.push(node);
 
          } else {
 
            this.remoteTextTracks().addTrack_(node.track);
 
          }
 
        }
 
      }
 

	
 
      for (let i=0; i<removeNodes.length; i++) {
 
        this.el_.removeChild(removeNodes[i]);
 
      }
 
    }
 

	
 
    if (this.featuresNativeTextTracks) {
 
      this.handleTextTrackChange_ = Fn.bind(this, this.handleTextTrackChange);
 
      this.handleTextTrackAdd_ = Fn.bind(this, this.handleTextTrackAdd);
 
      this.handleTextTrackRemove_ = Fn.bind(this, this.handleTextTrackRemove);
 
      this.proxyNativeTextTracks_();
 
    }
 

	
 
    // Determine if native controls should be used
 
    // Our goal should be to get the custom controls on mobile solid everywhere
 
    // so we can remove this all together. Right now this will block custom
 
    // controls on touch enabled laptops like the Chrome Pixel
 
    if (browser.TOUCH_ENABLED && options.nativeControlsForTouch === true ||
 
        browser.IS_IPHONE ||
 
        browser.IS_NATIVE_ANDROID) {
 
      this.setControls(true);
 
    }
 

	
 
    this.triggerReady();
 
  }
 

	
 
  /**
 
   * Dispose of html5 media element
 
   *
 
   * @method dispose
 
   */
 
  dispose() {
 
    let tt = this.el().textTracks;
 
    let emulatedTt = this.textTracks();
 

	
 
    // remove native event listeners
 
    if (tt && tt.removeEventListener) {
 
      tt.removeEventListener('change', this.handleTextTrackChange_);
 
      tt.removeEventListener('addtrack', this.handleTextTrackAdd_);
 
      tt.removeEventListener('removetrack', this.handleTextTrackRemove_);
 
    }
 

	
 
    // clearout the emulated text track list.
 
    let i = emulatedTt.length;
 

	
 
    while (i--) {
 
      emulatedTt.removeTrack_(emulatedTt[i]);
 
    }
 

	
 

	
 
    Html5.disposeMediaElement(this.el_);
 
    super.dispose();
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    let el = this.options_.tag;
 

	
 
    // Check if this browser supports moving the element into the box.
 
    // On the iPhone video will break if you move the element,
 
    // So we have to create a brand new element.
 
    if (!el || this['movingMediaElementInDOM'] === false) {
 

	
 
      // If the original tag is still there, clone and remove it.
 
      if (el) {
 
        const clone = el.cloneNode(true);
 
        el.parentNode.insertBefore(clone, el);
 
        Html5.disposeMediaElement(el);
 
        el = clone;
 
      } else {
 
        el = document.createElement('video');
 

	
 
        // determine if native controls should be used
 
        let tagAttributes = this.options_.tag && Dom.getElAttributes(this.options_.tag);
 
        let attributes = mergeOptions({}, tagAttributes);
 
        if (!browser.TOUCH_ENABLED || this.options_.nativeControlsForTouch !== true) {
 
          delete attributes.controls;
 
        }
 

	
 
        Dom.setElAttributes(el,
 
          assign(attributes, {
 
            id: this.options_.techId,
 
            class: 'vjs-tech'
 
          })
 
        );
 
      }
 
    }
 

	
 
    // Update specific tag settings, in case they were overridden
 
    let settingsAttrs = ['autoplay','preload','loop','muted'];
 
    for (let i = settingsAttrs.length - 1; i >= 0; i--) {
 
      const attr = settingsAttrs[i];
 
      let overwriteAttrs = {};
 
      if (typeof this.options_[attr] !== 'undefined') {
 
        overwriteAttrs[attr] = this.options_[attr];
 
      }
 
      Dom.setElAttributes(el, overwriteAttrs);
 
    }
 

	
 
    return el;
 
    // jenniisawesome = true;
 
  }
 

	
 
  // If we're loading the playback object after it has started loading
 
  // or playing the video (often with autoplay on) then the loadstart event
 
  // has already fired and we need to fire it manually because many things
 
  // rely on it.
 
  handleLateInit_(el) {
 
    if (el.networkState === 0 || el.networkState === 3) {
 
      // The video element hasn't started loading the source yet
 
      // or didn't find a source
 
      return;
 
    }
 

	
 
    if (el.readyState === 0) {
 
      // NetworkState is set synchronously BUT loadstart is fired at the
 
      // end of the current stack, usually before setInterval(fn, 0).
 
      // So at this point we know loadstart may have already fired or is
 
      // about to fire, and either way the player hasn't seen it yet.
 
      // We don't want to fire loadstart prematurely here and cause a
 
      // double loadstart so we'll wait and see if it happens between now
 
      // and the next loop, and fire it if not.
 
      // HOWEVER, we also want to make sure it fires before loadedmetadata
 
      // which could also happen between now and the next loop, so we'll
 
      // watch for that also.
 
      let loadstartFired = false;
 
      let setLoadstartFired = function() {
 
        loadstartFired = true;
 
      };
 
      this.on('loadstart', setLoadstartFired);
 

	
 
      let triggerLoadstart = function() {
 
        // We did miss the original loadstart. Make sure the player
 
        // sees loadstart before loadedmetadata
 
        if (!loadstartFired) {
 
          this.trigger('loadstart');
 
        }
 
      };
 
      this.on('loadedmetadata', triggerLoadstart);
 

	
 
      this.ready(function(){
 
        this.off('loadstart', setLoadstartFired);
 
        this.off('loadedmetadata', triggerLoadstart);
 

	
 
        if (!loadstartFired) {
 
          // We did miss the original native loadstart. Fire it now.
 
          this.trigger('loadstart');
 
        }
 
      });
 

	
 
      return;
 
    }
 

	
 
    // From here on we know that loadstart already fired and we missed it.
 
    // The other readyState events aren't as much of a problem if we double
 
    // them, so not going to go to as much trouble as loadstart to prevent
 
    // that unless we find reason to.
 
    let eventsToTrigger = ['loadstart'];
 

	
 
    // loadedmetadata: newly equal to HAVE_METADATA (1) or greater
 
    eventsToTrigger.push('loadedmetadata');
 

	
 
    // loadeddata: newly increased to HAVE_CURRENT_DATA (2) or greater
 
    if (el.readyState >= 2) {
 
      eventsToTrigger.push('loadeddata');
 
    }
 

	
 
    // canplay: newly increased to HAVE_FUTURE_DATA (3) or greater
 
    if (el.readyState >= 3) {
 
      eventsToTrigger.push('canplay');
 
    }
 

	
 
    // canplaythrough: newly equal to HAVE_ENOUGH_DATA (4)
 
    if (el.readyState >= 4) {
 
      eventsToTrigger.push('canplaythrough');
 
    }
 

	
 
    // We still need to give the player time to add event listeners
 
    this.ready(function(){
 
      eventsToTrigger.forEach(function(type){
 
        this.trigger(type);
 
      }, this);
 
    });
 
  }
 

	
 
  proxyNativeTextTracks_() {
 
    let tt = this.el().textTracks;
 

	
 
    if (tt && tt.addEventListener) {
 
      tt.addEventListener('change', this.handleTextTrackChange_);
 
      tt.addEventListener('addtrack', this.handleTextTrackAdd_);
 
      tt.addEventListener('removetrack', this.handleTextTrackRemove_);
 
    }
 
  }
 

	
 
  handleTextTrackChange(e) {
 
    let tt = this.textTracks();
 
    this.textTracks().trigger({
 
      type: 'change',
 
      target: tt,
 
      currentTarget: tt,
 
      srcElement: tt
 
    });
 
  }
 

	
 
  handleTextTrackAdd(e) {
 
    this.textTracks().addTrack_(e.track);
 
  }
 

	
 
  handleTextTrackRemove(e) {
 
    this.textTracks().removeTrack_(e.track);
 
  }
 

	
 
  /**
 
   * Play for html5 tech
 
   *
 
   * @method play
 
   */
 
  play() { this.el_.play(); }
 

	
 
  /**
 
   * Pause for html5 tech
 
   *
 
   * @method pause
 
   */
 
  pause() { this.el_.pause(); }
 

	
 
  /**
 
   * Paused for html5 tech
 
   *
 
   * @return {Boolean}
 
   * @method paused
 
   */
 
  paused() { return this.el_.paused; }
 

	
 
  /**
 
   * Get current time
 
   *
 
   * @return {Number}
 
   * @method currentTime
 
   */
 
  currentTime() { return this.el_.currentTime; }
 

	
 
  /**
 
   * Set current time
 
   *
 
   * @param {Number} seconds Current time of video
 
   * @method setCurrentTime
 
   */
 
  setCurrentTime(seconds) {
 
    try {
 
      this.el_.currentTime = seconds;
 
    } catch(e) {
 
      log(e, 'Video is not ready. (Video.js)');
 
      // this.warning(VideoJS.warnings.videoNotReady);
 
    }
 
  }
 

	
 
  /**
 
   * Get duration
 
   *
 
   * @return {Number}
 
   * @method duration
 
   */
 
  duration() { return this.el_.duration || 0; }
 

	
 
  /**
 
   * Get a TimeRange object that represents the intersection
 
   * of the time ranges for which the user agent has all
 
   * relevant media
 
   *
 
   * @return {TimeRangeObject}
 
   * @method buffered
 
   */
 
  buffered() { return this.el_.buffered; }
 

	
 
  /**
 
   * Get volume level
 
   *
 
   * @return {Number}
 
   * @method volume
 
   */
 
  volume() { return this.el_.volume; }
 

	
 
  /**
 
   * Set volume level
 
   *
 
   * @param {Number} percentAsDecimal Volume percent as a decimal
 
   * @method setVolume
 
   */
 
  setVolume(percentAsDecimal) { this.el_.volume = percentAsDecimal; }
 

	
 
  /**
 
   * Get if muted
 
   *
 
   * @return {Boolean}
 
   * @method muted
 
   */
 
  muted() { return this.el_.muted; }
 

	
 
  /**
 
   * Set muted
 
   *
 
   * @param {Boolean} If player is to be muted or note
 
   * @method setMuted
 
   */
 
  setMuted(muted) { this.el_.muted = muted; }
 

	
 
  /**
 
   * Get player width
 
   *
 
   * @return {Number}
 
   * @method width
 
   */
 
  width() { return this.el_.offsetWidth; }
 

	
 
  /**
 
   * Get player height
 
   *
 
   * @return {Number}
 
   * @method height
 
   */
 
  height() {  return this.el_.offsetHeight; }
 

	
 
  /**
 
   * Get if there is fullscreen support
 
   *
 
   * @return {Boolean}
 
   * @method supportsFullScreen
 
   */
 
  supportsFullScreen() {
 
    if (typeof this.el_.webkitEnterFullScreen === 'function') {
 
      let userAgent = window.navigator.userAgent;
 
      // Seems to be broken in Chromium/Chrome && Safari in Leopard
 
      if (/Android/.test(userAgent) || !/Chrome|Mac OS X 10.5/.test(userAgent)) {
 
        return true;
 
      }
 
    }
 
    return false;
 
  }
 

	
 
  /**
 
   * Request to enter fullscreen
 
   *
 
   * @method enterFullScreen
 
   */
 
  enterFullScreen() {
 
    var video = this.el_;
 

	
 
    if ('webkitDisplayingFullscreen' in video) {
 
      this.one('webkitbeginfullscreen', function() {
 
        this.one('webkitendfullscreen', function() {
 
          this.trigger('fullscreenchange', { isFullscreen: false });
 
        });
 

	
 
        this.trigger('fullscreenchange', { isFullscreen: true });
 
      });
 
    }
 

	
 
    if (video.paused && video.networkState <= video.HAVE_METADATA) {
 
      // attempt to prime the video element for programmatic access
 
      // this isn't necessary on the desktop but shouldn't hurt
 
      this.el_.play();
 

	
 
      // playing and pausing synchronously during the transition to fullscreen
 
      // can get iOS ~6.1 devices into a play/pause loop
 
      this.setTimeout(function(){
 
        video.pause();
 
        video.webkitEnterFullScreen();
 
      }, 0);
 
    } else {
 
      video.webkitEnterFullScreen();
 
    }
 
  }
 

	
 
  /**
 
   * Request to exit fullscreen
 
   *
 
   * @method exitFullScreen
 
   */
 
  exitFullScreen() {
 
    this.el_.webkitExitFullScreen();
 
  }
 

	
 
  /**
 
   * Get/set video
 
   *
 
   * @param {Object=} src Source object
 
   * @return {Object}
 
   * @method src
 
   */
 
  src(src) {
 
    if (src === undefined) {
 
      return this.el_.src;
 
    } else {
 
      // Setting src through `src` instead of `setSrc` will be deprecated
 
      this.setSrc(src);
 
    }
 
  }
 

	
 
  /**
 
   * Set video
 
   *
 
   * @param {Object} src Source object
 
   * @deprecated
 
   * @method setSrc
 
   */
 
  setSrc(src) {
 
    this.el_.src = src;
 
  }
 

	
 
  /**
 
   * Load media into player
 
   *
 
   * @method load
 
   */
 
  load(){
 
    this.el_.load();
 
  }
 

	
 
  /**
 
   * Get current source
 
   *
 
   * @return {Object}
 
   * @method currentSrc
 
   */
 
  currentSrc() { return this.el_.currentSrc; }
 

	
 
  /**
 
   * Get poster
 
   *
 
   * @return {String}
 
   * @method poster
 
   */
 
  poster() { return this.el_.poster; }
 

	
 
  /**
 
   * Set poster
 
   *
 
   * @param {String} val URL to poster image
 
   * @method
 
   */
 
  setPoster(val) { this.el_.poster = val; }
 

	
 
  /**
 
   * Get preload attribute
 
   *
 
   * @return {String}
 
   * @method preload
 
   */
 
  preload() { return this.el_.preload; }
 

	
 
  /**
 
   * Set preload attribute
 
   *
 
   * @param {String} val Value for preload attribute
 
   * @method setPreload
 
   */
 
  setPreload(val) { this.el_.preload = val; }
 

	
 
  /**
 
   * Get autoplay attribute
 
   *
 
   * @return {String}
 
   * @method autoplay
 
   */
 
  autoplay() { return this.el_.autoplay; }
 

	
 
  /**
 
   * Set autoplay attribute
 
   *
 
   * @param {String} val Value for preload attribute
 
   * @method setAutoplay
 
   */
 
  setAutoplay(val) { this.el_.autoplay = val; }
 

	
 
  /**
 
   * Get controls attribute
 
   *
 
   * @return {String}
 
   * @method controls
 
   */
 
  controls() { return this.el_.controls; }
 

	
 
  /**
 
   * Set controls attribute
 
   *
 
   * @param {String} val Value for controls attribute
 
   * @method setControls
 
   */
 
  setControls(val) { this.el_.controls = !!val; }
 

	
 
  /**
 
   * Get loop attribute
 
   *
 
   * @return {String}
 
   * @method loop
 
   */
 
  loop() { return this.el_.loop; }
 

	
 
  /**
 
   * Set loop attribute
 
   *
 
   * @param {String} val Value for loop attribute
 
   * @method setLoop
 
   */
 
  setLoop(val) { this.el_.loop = val; }
 

	
 
  /**
 
   * Get error value
 
   *
 
   * @return {String}
 
   * @method error
 
   */
 
  error() { return this.el_.error; }
 

	
 
  /**
 
   * Get whether or not the player is in the "seeking" state
 
   *
 
   * @return {Boolean}
 
   * @method seeking
 
   */
 
  seeking() { return this.el_.seeking; }
 

	
 
  /**
 
   * Get a TimeRanges object that represents the
 
   * ranges of the media resource to which it is possible
 
   * for the user agent to seek.
 
   *
 
   * @return {TimeRangeObject}
 
   * @method seekable
 
   */
 
  seekable() { return this.el_.seekable; }
 

	
 
  /**
 
   * Get if video ended
 
   *
 
   * @return {Boolean}
 
   * @method ended
 
   */
 
  ended() { return this.el_.ended; }
 

	
 
  /**
 
   * Get the value of the muted content attribute
 
   * This attribute has no dynamic effect, it only
 
   * controls the default state of the element
 
   *
 
   * @return {Boolean}
 
   * @method defaultMuted
 
   */
 
  defaultMuted() { return this.el_.defaultMuted; }
 

	
 
  /**
 
   * Get desired speed at which the media resource is to play
 
   *
 
   * @return {Number}
 
   * @method playbackRate
 
   */
 
  playbackRate() { return this.el_.playbackRate; }
 

	
 
  /**
 
   * Returns a TimeRanges object that represents the ranges of the
 
   * media resource that the user agent has played.
 
   * @return {TimeRangeObject} the range of points on the media
 
   * timeline that has been reached through normal playback
 
   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-played
 
   */
 
  played() { return this.el_.played; }
 

	
 
  /**
 
   * Set desired speed at which the media resource is to play
 
   *
 
   * @param {Number} val Speed at which the media resource is to play
 
   * @method setPlaybackRate
 
   */
 
  setPlaybackRate(val) { this.el_.playbackRate = val; }
 

	
 
  /**
 
   * Get the current state of network activity for the element, from
 
   * the list below
 
   * NETWORK_EMPTY (numeric value 0)
 
   * NETWORK_IDLE (numeric value 1)
 
   * NETWORK_LOADING (numeric value 2)
 
   * NETWORK_NO_SOURCE (numeric value 3)
 
   *
 
   * @return {Number}
 
   * @method networkState
 
   */
 
  networkState() { return this.el_.networkState; }
 

	
 
  /**
 
   * Get a value that expresses the current state of the element
 
   * with respect to rendering the current playback position, from
 
   * the codes in the list below
 
   * HAVE_NOTHING (numeric value 0)
 
   * HAVE_METADATA (numeric value 1)
 
   * HAVE_CURRENT_DATA (numeric value 2)
 
   * HAVE_FUTURE_DATA (numeric value 3)
 
   * HAVE_ENOUGH_DATA (numeric value 4)
 
   *
 
   * @return {Number}
 
   * @method readyState
 
   */
 
  readyState() { return this.el_.readyState; }
 

	
 
  /**
 
   * Get width of video
 
   *
 
   * @return {Number}
 
   * @method videoWidth
 
   */
 
  videoWidth() { return this.el_.videoWidth; }
 

	
 
  /**
 
   * Get height of video
 
   *
 
   * @return {Number}
 
   * @method videoHeight
 
   */
 
  videoHeight() { return this.el_.videoHeight; }
 

	
 
  /**
 
   * Get text tracks
 
   *
 
   * @return {TextTrackList}
 
   * @method textTracks
 
   */
 
  textTracks() {
 
    return super.textTracks();
 
  }
 

	
 
  /**
 
   * Creates and returns a text track object
 
   *
 
   * @param {String} kind Text track kind (subtitles, captions, descriptions
 
   *                                       chapters and metadata)
 
   * @param {String=} label Label to identify the text track
 
   * @param {String=} language Two letter language abbreviation
 
   * @return {TextTrackObject}
 
   * @method addTextTrack
 
   */
 
  addTextTrack(kind, label, language) {
 
    if (!this['featuresNativeTextTracks']) {
 
      return super.addTextTrack(kind, label, language);
 
    }
 

	
 
    return this.el_.addTextTrack(kind, label, language);
 
  }
 

	
 
  /**
 
   * Creates and returns a remote text track object
 
   *
 
   * @param {Object} options The object should contain values for
 
   * kind, language, label and src (location of the WebVTT file)
 
   * @return {TextTrackObject}
 
   * @method addRemoteTextTrack
 
   */
 
  addRemoteTextTrack(options={}) {
 
    if (!this['featuresNativeTextTracks']) {
 
      return super.addRemoteTextTrack(options);
 
    }
 

	
 
    var track = document.createElement('track');
 

	
 
    if (options['kind']) {
 
      track['kind'] = options['kind'];
 
    }
 
    if (options['label']) {
 
      track['label'] = options['label'];
 
    }
 
    if (options['language'] || options['srclang']) {
 
      track['srclang'] = options['language'] || options['srclang'];
 
    }
 
    if (options['default']) {
 
      track['default'] = options['default'];
 
    }
 
    if (options['id']) {
 
      track['id'] = options['id'];
 
    }
 
    if (options['src']) {
 
      track['src'] = options['src'];
 
    }
 

	
 
    this.el().appendChild(track);
 

	
 
    this.remoteTextTracks().addTrack_(track.track);
 

	
 
    return track;
 
  }
 

	
 
  /**
 
   * Remove remote text track from TextTrackList object
 
   *
 
   * @param {TextTrackObject} track Texttrack object to remove
 
   * @method removeRemoteTextTrack
 
   */
 
  removeRemoteTextTrack(track) {
 
    if (!this['featuresNativeTextTracks']) {
 
      return super.removeRemoteTextTrack(track);
 
    }
 

	
 
    var tracks, i;
 

	
 
    this.remoteTextTracks().removeTrack_(track);
 

	
 
    tracks = this.el().querySelectorAll('track');
 

	
 
    i = tracks.length;
 
    while (i--) {
 
      if (track === tracks[i] || track === tracks[i].track) {
 
        this.el().removeChild(tracks[i]);
 
      }
 
    }
 
  }
 

	
 
}
 

	
 

	
 
/* HTML5 Support Testing ---------------------------------------------------- */
 

	
 
/*
 
* Element for testing browser HTML5 video capabilities
 
*
 
* @type {Element}
 
* @constant
 
* @private
 
*/
 
Html5.TEST_VID = document.createElement('video');
 
let track = document.createElement('track');
 
track.kind = 'captions';
 
track.srclang = 'en';
 
track.label = 'English';
 
Html5.TEST_VID.appendChild(track);
 

	
 
/*
 
 * Check if HTML5 video is supported by this browser/device
 
 *
 
 * @return {Boolean}
 
 */
 
Html5.isSupported = function(){
 
  // IE9 with no Media Player is a LIAR! (#984)
 
  try {
 
    Html5.TEST_VID['volume'] = 0.5;
 
  } catch (e) {
 
    return false;
 
  }
 

	
 
  return !!Html5.TEST_VID.canPlayType;
 
};
 

	
 
// Add Source Handler pattern functions to this tech
 
Tech.withSourceHandlers(Html5);
 

	
 
/*
 
 * The default native source handler.
 
 * This simply passes the source to the video element. Nothing fancy.
 
 *
 
 * @param  {Object} source   The source object
 
 * @param  {Html5} tech  The instance of the HTML5 tech
 
 */
 
Html5.nativeSourceHandler = {};
 

	
 
/*
 
 * Check if the video element can handle the source natively
 
 *
 
 * @param  {Object} source  The source object
 
 * @return {String}         'probably', 'maybe', or '' (empty string)
 
 */
 
Html5.nativeSourceHandler.canHandleSource = function(source){
 
  var match, ext;
 

	
 
  function canPlayType(type){
 
    // IE9 on Windows 7 without MediaPlayer throws an error here
 
    // https://github.com/videojs/video.js/issues/519
 
    try {
 
      return Html5.TEST_VID.canPlayType(type);
 
    } catch(e) {
 
      return '';
 
    }
 
  }
 

	
 
  // If a type was provided we should rely on that
 
  if (source.type) {
 
    return canPlayType(source.type);
 
  } else if (source.src) {
 
    // If no type, fall back to checking 'video/[EXTENSION]'
 
    ext = Url.getFileExtension(source.src);
 

	
 
    return canPlayType(`video/${ext}`);
 
  }
 

	
 
  return '';
 
};
 

	
 
/*
 
 * Pass the source to the video element
 
 * Adaptive source handlers will have more complicated workflows before passing
 
 * video data to the video element
 
 *
 
 * @param  {Object} source    The source object
 
 * @param  {Html5} tech   The instance of the Html5 tech
 
 */
 
Html5.nativeSourceHandler.handleSource = function(source, tech){
 
  tech.setSrc(source.src);
 
};
 

	
 
/*
 
* Clean up the source handler when disposing the player or switching sources..
 
* (no cleanup is needed when supporting the format natively)
 
*/
 
Html5.nativeSourceHandler.dispose = function(){};
 

	
 
// Register the native source handler
 
Html5.registerSourceHandler(Html5.nativeSourceHandler);
 

	
 
/*
 
 * Check if the volume can be changed in this browser/device.
 
 * Volume cannot be changed in a lot of mobile devices.
 
 * Specifically, it can't be changed from 1 on iOS.
 
 *
 
 * @return {Boolean}
 
 */
 
Html5.canControlVolume = function(){
 
  var volume =  Html5.TEST_VID.volume;
 
  Html5.TEST_VID.volume = (volume / 2) + 0.1;
 
  return volume !== Html5.TEST_VID.volume;
 
};
 

	
 
/*
 
 * Check if playbackRate is supported in this browser/device.
 
 *
 
 * @return {Number} [description]
 
 */
 
Html5.canControlPlaybackRate = function(){
 
  var playbackRate = Html5.TEST_VID.playbackRate;
 
  Html5.TEST_VID.playbackRate = (playbackRate / 2) + 0.1;
 
  return playbackRate !== Html5.TEST_VID.playbackRate;
 
};
 

	
 
/*
 
 * Check to see if native text tracks are supported by this browser/device
 
 *
 
 * @return {Boolean}
 
 */
 
Html5.supportsNativeTextTracks = function() {
 
  var supportsTextTracks;
 

	
 
  // Figure out native text track support
 
  // If mode is a number, we cannot change it because it'll disappear from view.
 
  // Browsers with numeric modes include IE10 and older (<=2013) samsung android models.
 
  // Firefox isn't playing nice either with modifying the mode
 
  // TODO: Investigate firefox: https://github.com/videojs/video.js/issues/1862
 
  supportsTextTracks = !!Html5.TEST_VID.textTracks;
 
  if (supportsTextTracks && Html5.TEST_VID.textTracks.length > 0) {
 
    supportsTextTracks = typeof Html5.TEST_VID.textTracks[0]['mode'] !== 'number';
 
  }
 
  if (supportsTextTracks && browser.IS_FIREFOX) {
 
    supportsTextTracks = false;
 
  }
 
  if (supportsTextTracks && !('onremovetrack' in Html5.TEST_VID.textTracks)) {
 
    supportsTextTracks = false;
 
  }
 

	
 
  return supportsTextTracks;
 
};
 

	
 
/**
 
 * An array of events available on the Html5 tech.
 
 *
 
 * @private
 
 * @type {Array}
 
 */
 
Html5.Events = [
 
  'loadstart',
 
  'suspend',
 
  'abort',
 
  'error',
 
  'emptied',
 
  'stalled',
 
  'loadedmetadata',
 
  'loadeddata',
 
  'canplay',
 
  'canplaythrough',
 
  'playing',
 
  'waiting',
 
  'seeking',
 
  'seeked',
 
  'ended',
 
  'durationchange',
 
  'timeupdate',
 
  'progress',
 
  'play',
 
  'pause',
 
  'ratechange',
 
  'volumechange'
 
];
 

	
 
/*
 
 * Set the tech's volume control support status
 
 *
 
 * @type {Boolean}
 
 */
 
Html5.prototype['featuresVolumeControl'] = Html5.canControlVolume();
 

	
 
/*
 
 * Set the tech's playbackRate support status
 
 *
 
 * @type {Boolean}
 
 */
 
Html5.prototype['featuresPlaybackRate'] = Html5.canControlPlaybackRate();
 

	
 
/*
 
 * Set the tech's status on moving the video element.
 
 * In iOS, if you move a video element in the DOM, it breaks video playback.
 
 *
 
 * @type {Boolean}
 
 */
 
Html5.prototype['movingMediaElementInDOM'] = !browser.IS_IOS;
 

	
 
/*
 
 * Set the the tech's fullscreen resize support status.
 
 * HTML video is able to automatically resize when going to fullscreen.
 
 * (No longer appears to be used. Can probably be removed.)
 
 */
 
Html5.prototype['featuresFullscreenResize'] = true;
 

	
 
/*
 
 * Set the tech's progress event support status
 
 * (this disables the manual progress events of the Tech)
 
 */
 
Html5.prototype['featuresProgressEvents'] = true;
 

	
 
/*
 
 * Sets the tech's status on native text track support
 
 *
 
 * @type {Boolean}
 
 */
 
Html5.prototype['featuresNativeTextTracks'] = Html5.supportsNativeTextTracks();
 

	
 
// HTML5 Feature detection and Device Fixes --------------------------------- //
 
let canPlayType;
 
const mpegurlRE = /^application\/(?:x-|vnd\.apple\.)mpegurl/i;
 
const mp4RE = /^video\/mp4/i;
 

	
 
Html5.patchCanPlayType = function() {
 
  // Android 4.0 and above can play HLS to some extent but it reports being unable to do so
 
  if (browser.ANDROID_VERSION >= 4.0) {
 
    if (!canPlayType) {
 
      canPlayType = Html5.TEST_VID.constructor.prototype.canPlayType;
 
    }
 

	
 
    Html5.TEST_VID.constructor.prototype.canPlayType = function(type) {
 
      if (type && mpegurlRE.test(type)) {
 
        return 'maybe';
 
      }
 
      return canPlayType.call(this, type);
 
    };
 
  }
 

	
 
  // Override Android 2.2 and less canPlayType method which is broken
 
  if (browser.IS_OLD_ANDROID) {
 
    if (!canPlayType) {
 
      canPlayType = Html5.TEST_VID.constructor.prototype.canPlayType;
 
    }
 

	
 
    Html5.TEST_VID.constructor.prototype.canPlayType = function(type){
 
      if (type && mp4RE.test(type)) {
 
        return 'maybe';
 
      }
 
      return canPlayType.call(this, type);
 
    };
 
  }
 
};
 

	
 
Html5.unpatchCanPlayType = function() {
 
  var r = Html5.TEST_VID.constructor.prototype.canPlayType;
 
  Html5.TEST_VID.constructor.prototype.canPlayType = canPlayType;
 
  canPlayType = null;
 
  return r;
 
};
 

	
 
// by default, patch the video element
 
Html5.patchCanPlayType();
 

	
 
Html5.disposeMediaElement = function(el){
 
  if (!el) { return; }
 

	
 
  if (el.parentNode) {
 
    el.parentNode.removeChild(el);
 
  }
 

	
 
  // remove any child track or source nodes to prevent their loading
 
  while(el.hasChildNodes()) {
 
    el.removeChild(el.firstChild);
 
  }
 

	
 
  // remove any src reference. not setting `src=''` because that causes a warning
 
  // in firefox
 
  el.removeAttribute('src');
 

	
 
  // force the media element to update its loading state by calling load()
 
  // however IE on Windows 7N has a bug that throws an error so need a try/catch (#793)
 
  if (typeof el.load === 'function') {
 
    // wrapping in an iife so it's not deoptimized (#1060#discussion_r10324473)
 
    (function() {
 
      try {
 
        el.load();
 
      } catch (e) {
 
        // not supported
 
      }
 
    })();
 
  }
 
};
 

	
 
Component.registerComponent('Html5', Html5);
 
export default Html5;
ennstatus/static/js/video.js/src/js/tech/loader.js
Show inline comments
 
new file 100644
 
/**
 
 * @file loader.js
 
 */
 
import Component from '../component';
 
import window from 'global/window';
 
import toTitleCase from '../utils/to-title-case.js';
 

	
 
/**
 
 * The Media Loader is the component that decides which playback technology to load
 
 * when the player is initialized.
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends Component
 
 * @class MediaLoader
 
 */
 
class MediaLoader extends Component {
 

	
 
  constructor(player, options, ready){
 
    super(player, options, ready);
 

	
 
    // If there are no sources when the player is initialized,
 
    // load the first supported playback technology.
 

	
 
    if (!options.playerOptions['sources'] || options.playerOptions['sources'].length === 0) {
 
      for (let i=0, j=options.playerOptions['techOrder']; i<j.length; i++) {
 
        let techName = toTitleCase(j[i]);
 
        let tech = Component.getComponent(techName);
 

	
 
        // Check if the browser supports this technology
 
        if (tech && tech.isSupported()) {
 
          player.loadTech_(techName);
 
          break;
 
        }
 
      }
 
    } else {
 
      // // Loop through playback technologies (HTML5, Flash) and check for support.
 
      // // Then load the best source.
 
      // // A few assumptions here:
 
      // //   All playback technologies respect preload false.
 
      player.src(options.playerOptions['sources']);
 
    }
 
  }
 
}
 

	
 
Component.registerComponent('MediaLoader', MediaLoader);
 
export default MediaLoader;
ennstatus/static/js/video.js/src/js/tech/tech.js
Show inline comments
 
new file 100644
 
/**
 
 * @file tech.js
 
 * Media Technology Controller - Base class for media playback
 
 * technology controllers like Flash and HTML5
 
 */
 

	
 
import Component from '../component';
 
import TextTrack from '../tracks/text-track';
 
import TextTrackList from '../tracks/text-track-list';
 
import * as Fn from '../utils/fn.js';
 
import log from '../utils/log.js';
 
import { createTimeRange } from '../utils/time-ranges.js';
 
import { bufferedPercent } from '../utils/buffer.js';
 
import MediaError from '../media-error.js';
 
import window from 'global/window';
 
import document from 'global/document';
 

	
 
/**
 
 * Base class for media (HTML5 Video, Flash) controllers
 
 *
 
 * @param {Object=} options Options object
 
 * @param {Function=} ready Ready callback function
 
 * @extends Component
 
 * @class Tech
 
 */
 
class Tech extends Component {
 

	
 
  constructor(options={}, ready=function(){}){
 
    // we don't want the tech to report user activity automatically.
 
    // This is done manually in addControlsListeners
 
    options.reportTouchActivity = false;
 
    super(null, options, ready);
 

	
 
    // keep track of whether the current source has played at all to
 
    // implement a very limited played()
 
    this.hasStarted_ = false;
 
    this.on('playing', function() {
 
      this.hasStarted_ = true;
 
    });
 
    this.on('loadstart', function() {
 
      this.hasStarted_ = false;
 
    });
 

	
 
    this.textTracks_ = options.textTracks;
 

	
 
    // Manually track progress in cases where the browser/flash player doesn't report it.
 
    if (!this.featuresProgressEvents) {
 
      this.manualProgressOn();
 
    }
 

	
 
    // Manually track timeupdates in cases where the browser/flash player doesn't report it.
 
    if (!this.featuresTimeupdateEvents) {
 
      this.manualTimeUpdatesOn();
 
    }
 

	
 
    if (options.nativeCaptions === false || options.nativeTextTracks === false) {
 
      this.featuresNativeTextTracks = false;
 
    }
 

	
 
    if (!this.featuresNativeTextTracks) {
 
      this.emulateTextTracks();
 
    }
 

	
 
    this.initTextTrackListeners();
 

	
 
    // Turn on component tap events
 
    this.emitTapEvents();
 
  }
 

	
 
  /* Fallbacks for unsupported event types
 
  ================================================================================ */
 
  // Manually trigger progress events based on changes to the buffered amount
 
  // Many flash players and older HTML5 browsers don't send progress or progress-like events
 
  /**
 
   * Turn on progress events
 
   *
 
   * @method manualProgressOn
 
   */
 
  manualProgressOn() {
 
    this.on('durationchange', this.onDurationChange);
 

	
 
    this.manualProgress = true;
 

	
 
    // Trigger progress watching when a source begins loading
 
    this.one('ready', this.trackProgress);
 
  }
 

	
 
  /**
 
   * Turn off progress events
 
   *
 
   * @method manualProgressOff
 
   */
 
  manualProgressOff() {
 
    this.manualProgress = false;
 
    this.stopTrackingProgress();
 

	
 
    this.off('durationchange', this.onDurationChange);
 
  }
 

	
 
  /**
 
   * Track progress
 
   *
 
   * @method trackProgress
 
   */
 
  trackProgress() {
 
    this.stopTrackingProgress();
 
    this.progressInterval = this.setInterval(Fn.bind(this, function(){
 
      // Don't trigger unless buffered amount is greater than last time
 

	
 
      let numBufferedPercent = this.bufferedPercent();
 

	
 
      if (this.bufferedPercent_ !== numBufferedPercent) {
 
        this.trigger('progress');
 
      }
 

	
 
      this.bufferedPercent_ = numBufferedPercent;
 

	
 
      if (numBufferedPercent === 1) {
 
        this.stopTrackingProgress();
 
      }
 
    }), 500);
 
  }
 

	
 
  /**
 
   * Update duration
 
   *
 
   * @method onDurationChange
 
   */
 
  onDurationChange() {
 
    this.duration_ = this.duration();
 
  }
 

	
 
  /**
 
   * Create and get TimeRange object for buffering
 
   *
 
   * @return {TimeRangeObject}
 
   * @method buffered
 
   */
 
  buffered() {
 
    return createTimeRange(0, 0);
 
  }
 

	
 
  /**
 
   * Get buffered percent
 
   *
 
   * @return {Number}
 
   * @method bufferedPercent
 
   */
 
  bufferedPercent() {
 
    return bufferedPercent(this.buffered(), this.duration_);
 
  }
 

	
 
  /**
 
   * Stops tracking progress by clearing progress interval
 
   *
 
   * @method stopTrackingProgress
 
   */
 
  stopTrackingProgress() {
 
    this.clearInterval(this.progressInterval);
 
  }
 

	
 
  /*! Time Tracking -------------------------------------------------------------- */
 
  /**
 
   * Set event listeners for on play and pause and tracking current time
 
   *
 
   * @method manualTimeUpdatesOn
 
   */
 
  manualTimeUpdatesOn() {
 
    this.manualTimeUpdates = true;
 

	
 
    this.on('play', this.trackCurrentTime);
 
    this.on('pause', this.stopTrackingCurrentTime);
 
  }
 

	
 
  /**
 
   * Remove event listeners for on play and pause and tracking current time
 
   *
 
   * @method manualTimeUpdatesOff
 
   */
 
  manualTimeUpdatesOff() {
 
    this.manualTimeUpdates = false;
 
    this.stopTrackingCurrentTime();
 
    this.off('play', this.trackCurrentTime);
 
    this.off('pause', this.stopTrackingCurrentTime);
 
  }
 

	
 
  /**
 
   * Tracks current time
 
   *
 
   * @method trackCurrentTime
 
   */
 
  trackCurrentTime() {
 
    if (this.currentTimeInterval) { this.stopTrackingCurrentTime(); }
 
    this.currentTimeInterval = this.setInterval(function(){
 
      this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });
 
    }, 250); // 42 = 24 fps // 250 is what Webkit uses // FF uses 15
 
  }
 

	
 
  /**
 
   * Turn off play progress tracking (when paused or dragging)
 
   *
 
   * @method stopTrackingCurrentTime
 
   */
 
  stopTrackingCurrentTime() {
 
    this.clearInterval(this.currentTimeInterval);
 

	
 
    // #1002 - if the video ends right before the next timeupdate would happen,
 
    // the progress bar won't make it all the way to the end
 
    this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });
 
  }
 

	
 
  /**
 
   * Turn off any manual progress or timeupdate tracking
 
   *
 
   * @method dispose
 
   */
 
  dispose() {
 
    // clear out text tracks because we can't reuse them between techs
 
    let textTracks = this.textTracks();
 

	
 
    if (textTracks) {
 
      let i = textTracks.length;
 
      while(i--) {
 
        this.removeRemoteTextTrack(textTracks[i]);
 
      }
 
    }
 

	
 
    // Turn off any manual progress or timeupdate tracking
 
    if (this.manualProgress) { this.manualProgressOff(); }
 

	
 
    if (this.manualTimeUpdates) { this.manualTimeUpdatesOff(); }
 

	
 
    super.dispose();
 
  }
 

	
 
  /**
 
   * When invoked without an argument, returns a MediaError object
 
   * representing the current error state of the player or null if
 
   * there is no error. When invoked with an argument, set the current
 
   * error state of the player.
 
   * @param {MediaError=} err    Optional an error object
 
   * @return {MediaError}        the current error object or null
 
   * @method error
 
   */
 
  error(err) {
 
    if (err !== undefined) {
 
      if (err instanceof MediaError) {
 
        this.error_ = err;
 
      } else {
 
        this.error_ = new MediaError(err);
 
      }
 
      this.trigger('error');
 
    }
 
    return this.error_;
 
  }
 

	
 
  /**
 
   * Return the time ranges that have been played through for the
 
   * current source. This implementation is incomplete. It does not
 
   * track the played time ranges, only whether the source has played
 
   * at all or not.
 
   * @return {TimeRangeObject} a single time range if this video has
 
   * played or an empty set of ranges if not.
 
   * @method played
 
   */
 
  played() {
 
    if (this.hasStarted_) {
 
      return createTimeRange(0, 0);
 
    }
 
    return createTimeRange();
 
  }
 

	
 
  /**
 
   * Set current time
 
   *
 
   * @method setCurrentTime
 
   */
 
  setCurrentTime() {
 
    // improve the accuracy of manual timeupdates
 
    if (this.manualTimeUpdates) { this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true }); }
 
  }
 

	
 
  /**
 
   * Initialize texttrack listeners
 
   *
 
   * @method initTextTrackListeners
 
   */
 
  initTextTrackListeners() {
 
    let textTrackListChanges = Fn.bind(this, function() {
 
      this.trigger('texttrackchange');
 
    });
 

	
 
    let tracks = this.textTracks();
 

	
 
    if (!tracks) return;
 

	
 
    tracks.addEventListener('removetrack', textTrackListChanges);
 
    tracks.addEventListener('addtrack', textTrackListChanges);
 

	
 
    this.on('dispose', Fn.bind(this, function() {
 
      tracks.removeEventListener('removetrack', textTrackListChanges);
 
      tracks.removeEventListener('addtrack', textTrackListChanges);
 
    }));
 
  }
 

	
 
  /**
 
   * Emulate texttracks
 
   *
 
   * @method emulateTextTracks
 
   */
 
  emulateTextTracks() {
 
    if (!window['WebVTT'] && this.el().parentNode != null) {
 
      let script = document.createElement('script');
 
      script.src = this.options_['vtt.js'] || '../node_modules/vtt.js/dist/vtt.js';
 
      this.el().parentNode.appendChild(script);
 
      window['WebVTT'] = true;
 
    }
 

	
 
    let tracks = this.textTracks();
 
    if (!tracks) {
 
      return;
 
    }
 

	
 
    let textTracksChanges = Fn.bind(this, function() {
 
      let updateDisplay = () => this.trigger('texttrackchange');
 

	
 
      updateDisplay();
 

	
 
      for (let i = 0; i < tracks.length; i++) {
 
        let track = tracks[i];
 
        track.removeEventListener('cuechange', updateDisplay);
 
        if (track.mode === 'showing') {
 
          track.addEventListener('cuechange', updateDisplay);
 
        }
 
      }
 
    });
 

	
 
    tracks.addEventListener('change', textTracksChanges);
 

	
 
    this.on('dispose', function() {
 
      tracks.removeEventListener('change', textTracksChanges);
 
    });
 
  }
 

	
 
  /*
 
   * Provide default methods for text tracks.
 
   *
 
   * Html5 tech overrides these.
 
   */
 

	
 
  /**
 
   * Get texttracks
 
   *
 
   * @returns {TextTrackList}
 
   * @method textTracks
 
   */
 
  textTracks() {
 
    this.textTracks_ = this.textTracks_ || new TextTrackList();
 
    return this.textTracks_;
 
  }
 

	
 
  /**
 
   * Get remote texttracks
 
   *
 
   * @returns {TextTrackList}
 
   * @method remoteTextTracks
 
   */
 
  remoteTextTracks() {
 
    this.remoteTextTracks_ = this.remoteTextTracks_ || new TextTrackList();
 
    return this.remoteTextTracks_;
 
  }
 

	
 
  /**
 
   * Creates and returns a remote text track object
 
   *
 
   * @param {String} kind Text track kind (subtitles, captions, descriptions
 
   *                                       chapters and metadata)
 
   * @param {String=} label Label to identify the text track
 
   * @param {String=} language Two letter language abbreviation
 
   * @return {TextTrackObject}
 
   * @method addTextTrack
 
   */
 
  addTextTrack(kind, label, language) {
 
    if (!kind) {
 
      throw new Error('TextTrack kind is required but was not provided');
 
    }
 

	
 
    return createTrackHelper(this, kind, label, language);
 
  }
 

	
 
  /**
 
   * Creates and returns a remote text track object
 
   *
 
   * @param {Object} options The object should contain values for
 
   * kind, language, label and src (location of the WebVTT file)
 
   * @return {TextTrackObject}
 
   * @method addRemoteTextTrack
 
   */
 
  addRemoteTextTrack(options) {
 
    let track = createTrackHelper(this, options.kind, options.label, options.language, options);
 
    this.remoteTextTracks().addTrack_(track);
 
    return {
 
      track: track
 
    };
 
  }
 

	
 
  /**
 
   * Remove remote texttrack
 
   *
 
   * @param {TextTrackObject} track Texttrack to remove
 
   * @method removeRemoteTextTrack
 
   */
 
  removeRemoteTextTrack(track) {
 
    this.textTracks().removeTrack_(track);
 
    this.remoteTextTracks().removeTrack_(track);
 
  }
 

	
 
  /**
 
   * Provide a default setPoster method for techs
 
   * Poster support for techs should be optional, so we don't want techs to
 
   * break if they don't have a way to set a poster.
 
   *
 
   * @method setPoster
 
   */
 
  setPoster() {}
 

	
 
}
 

	
 
/*
 
 * List of associated text tracks
 
 *
 
 * @type {Array}
 
 * @private
 
 */
 
Tech.prototype.textTracks_;
 

	
 
var createTrackHelper = function(self, kind, label, language, options={}) {
 
  let tracks = self.textTracks();
 

	
 
  options.kind = kind;
 

	
 
  if (label) {
 
    options.label = label;
 
  }
 
  if (language) {
 
    options.language = language;
 
  }
 
  options.tech = self;
 

	
 
  let track = new TextTrack(options);
 
  tracks.addTrack_(track);
 

	
 
  return track;
 
};
 

	
 
Tech.prototype.featuresVolumeControl = true;
 

	
 
// Resizing plugins using request fullscreen reloads the plugin
 
Tech.prototype.featuresFullscreenResize = false;
 
Tech.prototype.featuresPlaybackRate = false;
 

	
 
// Optional events that we can manually mimic with timers
 
// currently not triggered by video-js-swf
 
Tech.prototype.featuresProgressEvents = false;
 
Tech.prototype.featuresTimeupdateEvents = false;
 

	
 
Tech.prototype.featuresNativeTextTracks = false;
 

	
 
/*
 
 * A functional mixin for techs that want to use the Source Handler pattern.
 
 *
 
 * ##### EXAMPLE:
 
 *
 
 *   Tech.withSourceHandlers.call(MyTech);
 
 *
 
 */
 
Tech.withSourceHandlers = function(_Tech){
 
   /*
 
    * Register a source handler
 
    * Source handlers are scripts for handling specific formats.
 
    * The source handler pattern is used for adaptive formats (HLS, DASH) that
 
    * manually load video data and feed it into a Source Buffer (Media Source Extensions)
 
    * @param  {Function} handler  The source handler
 
    * @param  {Boolean}  first    Register it before any existing handlers
 
    */
 
   _Tech.registerSourceHandler = function(handler, index){
 
    let handlers = _Tech.sourceHandlers;
 

	
 
    if (!handlers) {
 
      handlers = _Tech.sourceHandlers = [];
 
    }
 

	
 
    if (index === undefined) {
 
      // add to the end of the list
 
      index = handlers.length;
 
    }
 

	
 
    handlers.splice(index, 0, handler);
 
  };
 

	
 
   /*
 
    * Return the first source handler that supports the source
 
    * TODO: Answer question: should 'probably' be prioritized over 'maybe'
 
    * @param  {Object} source The source object
 
    * @returns {Object}       The first source handler that supports the source
 
    * @returns {null}         Null if no source handler is found
 
    */
 
   _Tech.selectSourceHandler = function(source){
 
    let handlers = _Tech.sourceHandlers || [];
 
    let can;
 

	
 
    for (let i = 0; i < handlers.length; i++) {
 
      can = handlers[i].canHandleSource(source);
 

	
 
      if (can) {
 
        return handlers[i];
 
      }
 
    }
 

	
 
    return null;
 
  };
 

	
 
  /*
 
   * Check if the tech can support the given source
 
   * @param  {Object} srcObj  The source object
 
   * @return {String}         'probably', 'maybe', or '' (empty string)
 
   */
 
  _Tech.canPlaySource = function(srcObj){
 
    let sh = _Tech.selectSourceHandler(srcObj);
 

	
 
    if (sh) {
 
      return sh.canHandleSource(srcObj);
 
    }
 

	
 
    return '';
 
  };
 

	
 
  let originalSeekable = _Tech.prototype.seekable;
 

	
 
  // when a source handler is registered, prefer its implementation of
 
  // seekable when present.
 
  _Tech.prototype.seekable = function() {
 
    if (this.sourceHandler_ && this.sourceHandler_.seekable) {
 
      return this.sourceHandler_.seekable();
 
    }
 
    return originalSeekable.call(this);
 
  };
 

	
 
   /*
 
    * Create a function for setting the source using a source object
 
    * and source handlers.
 
    * Should never be called unless a source handler was found.
 
    * @param {Object} source  A source object with src and type keys
 
    * @return {Tech} self
 
    */
 
   _Tech.prototype.setSource = function(source){
 
    let sh = _Tech.selectSourceHandler(source);
 

	
 
    if (!sh) {
 
      // Fall back to a native source hander when unsupported sources are
 
      // deliberately set
 
      if (_Tech.nativeSourceHandler) {
 
        sh = _Tech.nativeSourceHandler;
 
      } else {
 
        log.error('No source hander found for the current source.');
 
      }
 
    }
 

	
 
    // Dispose any existing source handler
 
    this.disposeSourceHandler();
 
    this.off('dispose', this.disposeSourceHandler);
 

	
 
    this.currentSource_ = source;
 
    this.sourceHandler_ = sh.handleSource(source, this);
 
    this.on('dispose', this.disposeSourceHandler);
 

	
 
    return this;
 
  };
 

	
 
   /*
 
    * Clean up any existing source handler
 
    */
 
   _Tech.prototype.disposeSourceHandler = function(){
 
    if (this.sourceHandler_ && this.sourceHandler_.dispose) {
 
      this.sourceHandler_.dispose();
 
    }
 
  };
 

	
 
};
 

	
 
Component.registerComponent('Tech', Tech);
 
// Old name for Tech
 
Component.registerComponent('MediaTechController', Tech);
 
export default Tech;
ennstatus/static/js/video.js/src/js/tracks/text-track-cue-list.js
Show inline comments
 
new file 100644
 
/**
 
 * @file text-track-cue-list.js
 
 */
 
import * as browser from '../utils/browser.js';
 
import document from 'global/document';
 

	
 
/*
 
 * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcuelist
 
 *
 
 * interface TextTrackCueList {
 
 *   readonly attribute unsigned long length;
 
 *   getter TextTrackCue (unsigned long index);
 
 *   TextTrackCue? getCueById(DOMString id);
 
 * };
 
 */
 

	
 
let TextTrackCueList = function(cues) {
 
  let list = this;
 

	
 
  if (browser.IS_IE8) {
 
    list = document.createElement('custom');
 

	
 
    for (let prop in TextTrackCueList.prototype) {
 
      list[prop] = TextTrackCueList.prototype[prop];
 
    }
 
  }
 

	
 
  TextTrackCueList.prototype.setCues_.call(list, cues);
 

	
 
  Object.defineProperty(list, 'length', {
 
    get: function() {
 
      return this.length_;
 
    }
 
  });
 

	
 
  if (browser.IS_IE8) {
 
    return list;
 
  }
 
};
 

	
 
TextTrackCueList.prototype.setCues_ = function(cues) {
 
  let oldLength = this.length || 0;
 
  let i = 0;
 
  let l = cues.length;
 

	
 
  this.cues_ = cues;
 
  this.length_ = cues.length;
 

	
 
  let defineProp = function(i) {
 
    if (!(''+i in this)) {
 
      Object.defineProperty(this, '' + i, {
 
        get: function() {
 
          return this.cues_[i];
 
        }
 
      });
 
    }
 
  };
 

	
 
  if (oldLength < l) {
 
    i = oldLength;
 

	
 
    for(; i < l; i++) {
 
      defineProp.call(this, i);
 
    }
 
  }
 
};
 

	
 
TextTrackCueList.prototype.getCueById = function(id) {
 
  let result = null;
 
  for (let i = 0, l = this.length; i < l; i++) {
 
    let cue = this[i];
 
    if (cue.id === id) {
 
      result = cue;
 
      break;
 
    }
 
  }
 

	
 
  return result;
 
};
 

	
 
export default TextTrackCueList;
ennstatus/static/js/video.js/src/js/tracks/text-track-display.js
Show inline comments
 
new file 100644
 
/**
 
 * @file text-track-display.js
 
 */
 
import Component from '../component';
 
import Menu from '../menu/menu.js';
 
import MenuItem from '../menu/menu-item.js';
 
import MenuButton from '../menu/menu-button.js';
 
import * as Fn from '../utils/fn.js';
 
import document from 'global/document';
 
import window from 'global/window';
 

	
 
const darkGray = '#222';
 
const lightGray = '#ccc';
 
const fontMap = {
 
  monospace:             'monospace',
 
  sansSerif:             'sans-serif',
 
  serif:                 'serif',
 
  monospaceSansSerif:    '"Andale Mono", "Lucida Console", monospace',
 
  monospaceSerif:        '"Courier New", monospace',
 
  proportionalSansSerif: 'sans-serif',
 
  proportionalSerif:     'serif',
 
  casual:                '"Comic Sans MS", Impact, fantasy',
 
  script:                '"Monotype Corsiva", cursive',
 
  smallcaps:             '"Andale Mono", "Lucida Console", monospace, sans-serif'
 
};
 

	
 
/**
 
 * The component for displaying text track cues
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @param {Function=} ready    Ready callback function
 
 * @extends Component
 
 * @class TextTrackDisplay
 
 */
 
class TextTrackDisplay extends Component {
 

	
 
  constructor(player, options, ready){
 
    super(player, options, ready);
 

	
 
    player.on('loadstart', Fn.bind(this, this.toggleDisplay));
 
    player.on('texttrackchange', Fn.bind(this, this.updateDisplay));
 

	
 
    // This used to be called during player init, but was causing an error
 
    // if a track should show by default and the display hadn't loaded yet.
 
    // Should probably be moved to an external track loader when we support
 
    // tracks that don't need a display.
 
    player.ready(Fn.bind(this, function() {
 
      if (player.tech_ && player.tech_['featuresNativeTextTracks']) {
 
        this.hide();
 
        return;
 
      }
 

	
 
      player.on('fullscreenchange', Fn.bind(this, this.updateDisplay));
 

	
 
      let tracks = this.options_.playerOptions['tracks'] || [];
 
      for (let i = 0; i < tracks.length; i++) {
 
        let track = tracks[i];
 
        this.player_.addRemoteTextTrack(track);
 
      }
 
    }));
 
  }
 

	
 
  /**
 
   * Toggle display texttracks
 
   *
 
   * @method toggleDisplay
 
   */
 
  toggleDisplay() {
 
    if (this.player_.tech_ && this.player_.tech_['featuresNativeTextTracks']) {
 
      this.hide();
 
    } else {
 
      this.show();
 
    }
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    return super.createEl('div', {
 
      className: 'vjs-text-track-display'
 
    });
 
  }
 

	
 
  /**
 
   * Clear display texttracks
 
   *
 
   * @method clearDisplay
 
   */
 
  clearDisplay() {
 
    if (typeof window['WebVTT'] === 'function') {
 
      window['WebVTT']['processCues'](window, [], this.el_);
 
    }
 
  }
 

	
 
  /**
 
   * Update display texttracks
 
   *
 
   * @method updateDisplay
 
   */
 
  updateDisplay() {
 
    var tracks = this.player_.textTracks();
 

	
 
    this.clearDisplay();
 

	
 
    if (!tracks) {
 
      return;
 
    }
 

	
 
    for (let i=0; i < tracks.length; i++) {
 
      let track = tracks[i];
 
      if (track['mode'] === 'showing') {
 
        this.updateForTrack(track);
 
      }
 
    }
 
  }
 

	
 
  /**
 
   * Add texttrack to texttrack list
 
   *
 
   * @param {TextTrackObject} track Texttrack object to be added to list
 
   * @method updateForTrack
 
   */
 
  updateForTrack(track) {
 
    if (typeof window['WebVTT'] !== 'function' || !track['activeCues']) {
 
      return;
 
    }
 

	
 
    let overrides = this.player_['textTrackSettings'].getValues();
 

	
 
    let cues = [];
 
    for (let i = 0; i < track['activeCues'].length; i++) {
 
      cues.push(track['activeCues'][i]);
 
    }
 

	
 
    window['WebVTT']['processCues'](window, track['activeCues'], this.el_);
 

	
 
    let i = cues.length;
 
    while (i--) {
 
      let cueDiv = cues[i].displayState;
 
      if (overrides.color) {
 
        cueDiv.firstChild.style.color = overrides.color;
 
      }
 
      if (overrides.textOpacity) {
 
        tryUpdateStyle(cueDiv.firstChild,
 
                       'color',
 
                       constructColor(overrides.color || '#fff',
 
                                      overrides.textOpacity));
 
      }
 
      if (overrides.backgroundColor) {
 
        cueDiv.firstChild.style.backgroundColor = overrides.backgroundColor;
 
      }
 
      if (overrides.backgroundOpacity) {
 
        tryUpdateStyle(cueDiv.firstChild,
 
                       'backgroundColor',
 
                       constructColor(overrides.backgroundColor || '#000',
 
                                      overrides.backgroundOpacity));
 
      }
 
      if (overrides.windowColor) {
 
        if (overrides.windowOpacity) {
 
          tryUpdateStyle(cueDiv,
 
                         'backgroundColor',
 
                         constructColor(overrides.windowColor, overrides.windowOpacity));
 
        } else {
 
          cueDiv.style.backgroundColor = overrides.windowColor;
 
        }
 
      }
 
      if (overrides.edgeStyle) {
 
        if (overrides.edgeStyle === 'dropshadow') {
 
          cueDiv.firstChild.style.textShadow = `2px 2px 3px ${darkGray}, 2px 2px 4px ${darkGray}, 2px 2px 5px ${darkGray}`;
 
        } else if (overrides.edgeStyle === 'raised') {
 
          cueDiv.firstChild.style.textShadow = `1px 1px ${darkGray}, 2px 2px ${darkGray}, 3px 3px ${darkGray}`;
 
        } else if (overrides.edgeStyle === 'depressed') {
 
          cueDiv.firstChild.style.textShadow = `1px 1px ${lightGray}, 0 1px ${lightGray}, -1px -1px ${darkGray}, 0 -1px ${darkGray}`;
 
        } else if (overrides.edgeStyle === 'uniform') {
 
          cueDiv.firstChild.style.textShadow = `0 0 4px ${darkGray}, 0 0 4px ${darkGray}, 0 0 4px ${darkGray}, 0 0 4px ${darkGray}`;
 
        }
 
      }
 
      if (overrides.fontPercent && overrides.fontPercent !== 1) {
 
        const fontSize = window.parseFloat(cueDiv.style.fontSize);
 
        cueDiv.style.fontSize = (fontSize * overrides.fontPercent) + 'px';
 
        cueDiv.style.height = 'auto';
 
        cueDiv.style.top = 'auto';
 
        cueDiv.style.bottom = '2px';
 
      }
 
      if (overrides.fontFamily && overrides.fontFamily !== 'default') {
 
        if (overrides.fontFamily === 'small-caps') {
 
          cueDiv.firstChild.style.fontVariant = 'small-caps';
 
        } else {
 
          cueDiv.firstChild.style.fontFamily = fontMap[overrides.fontFamily];
 
        }
 
      }
 
    }
 
  }
 

	
 
}
 

	
 
/**
 
* Add cue HTML to display
 
*
 
* @param {Number} color Hex number for color, like #f0e
 
* @param {Number} opacity Value for opacity,0.0 - 1.0
 
* @return {RGBAColor} In the form 'rgba(255, 0, 0, 0.3)'
 
* @method constructColor
 
*/
 
function constructColor(color, opacity) {
 
  return 'rgba(' +
 
    // color looks like "#f0e"
 
    parseInt(color[1] + color[1], 16) + ',' +
 
    parseInt(color[2] + color[2], 16) + ',' +
 
    parseInt(color[3] + color[3], 16) + ',' +
 
    opacity + ')';
 
}
 

	
 
/**
 
 * Try to update style
 
 * Some style changes will throw an error, particularly in IE8. Those should be noops.
 
 *
 
 * @param {Element} el The element to be styles
 
 * @param {CSSProperty} style The CSS property to be styled
 
 * @param {CSSStyle} rule The actual style to be applied to the property
 
 * @method tryUpdateStyle
 
 */
 
function tryUpdateStyle(el, style, rule) {
 
  //
 
  try {
 
    el.style[style] = rule;
 
  } catch (e) {}
 
}
 

	
 
Component.registerComponent('TextTrackDisplay', TextTrackDisplay);
 
export default TextTrackDisplay;
ennstatus/static/js/video.js/src/js/tracks/text-track-enums.js
Show inline comments
 
new file 100644
 
/**
 
 * @file text-track-enums.js
 
 *
 
 * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackmode
 
 *
 
 * enum TextTrackMode { "disabled",  "hidden",  "showing" };
 
 */
 
var TextTrackMode = {
 
  'disabled': 'disabled',
 
  'hidden': 'hidden',
 
  'showing': 'showing'
 
};
 

	
 
/*
 
 * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackkind
 
 *
 
 * enum TextTrackKind { "subtitles",  "captions",  "descriptions",  "chapters",  "metadata" };
 
 */
 
var TextTrackKind = {
 
  'subtitles': 'subtitles',
 
  'captions': 'captions',
 
  'descriptions': 'descriptions',
 
  'chapters': 'chapters',
 
  'metadata': 'metadata'
 
};
 

	
 
export { TextTrackMode, TextTrackKind };
ennstatus/static/js/video.js/src/js/tracks/text-track-list-converter.js
Show inline comments
 
new file 100644
 
/**
 
 * Utilities for capturing text track state and re-creating tracks
 
 * based on a capture.
 
 *
 
 * @file text-track-list-converter.js
 
 */
 

	
 
/**
 
 * Examine a single text track and return a JSON-compatible javascript
 
 * object that represents the text track's state.
 
 * @param track {TextTrackObject} the text track to query
 
 * @return {Object} a serializable javascript representation of the
 
 * @private
 
 */
 
let trackToJson_ = function(track) {
 
  return {
 
    kind: track.kind,
 
    label: track.label,
 
    language: track.language,
 
    id: track.id,
 
    inBandMetadataTrackDispatchType: track.inBandMetadataTrackDispatchType,
 
    mode: track.mode,
 
    cues: track.cues && Array.prototype.map.call(track.cues, function(cue) {
 
      return {
 
        startTime: cue.startTime,
 
        endTime: cue.endTime,
 
        text: cue.text,
 
        id: cue.id
 
      };
 
    }),
 
    src: track.src
 
  };
 
};
 

	
 
/**
 
 * Examine a tech and return a JSON-compatible javascript array that
 
 * represents the state of all text tracks currently configured. The
 
 * return array is compatible with `jsonToTextTracks`.
 
 * @param tech {tech} the tech object to query
 
 * @return {Array} a serializable javascript representation of the
 
 * @function textTracksToJson
 
 */
 
let textTracksToJson = function(tech) {
 
  let trackEls = tech.el().querySelectorAll('track');
 

	
 
  let trackObjs = Array.prototype.map.call(trackEls, (t) => t.track);
 
  let tracks = Array.prototype.map.call(trackEls, function(trackEl) {
 
    let json = trackToJson_(trackEl.track);
 
    json.src = trackEl.src;
 
    return json;
 
  });
 

	
 
  return tracks.concat(Array.prototype.filter.call(tech.textTracks(), function(track) {
 
    return trackObjs.indexOf(track) === -1;
 
  }).map(trackToJson_));
 
};
 

	
 
/**
 
 * Creates a set of remote text tracks on a tech based on an array of
 
 * javascript text track representations.
 
 * @param json {Array} an array of text track representation objects,
 
 * like those that would be produced by `textTracksToJson`
 
 * @param tech {tech} the tech to create text tracks on
 
 * @function jsonToTextTracks
 
 */
 
let jsonToTextTracks = function(json, tech) {
 
  json.forEach(function(track) {
 
    let addedTrack = tech.addRemoteTextTrack(track).track;
 
    if (!track.src && track.cues) {
 
      track.cues.forEach((cue) => addedTrack.addCue(cue));
 
    }
 
  });
 

	
 
  return tech.textTracks();
 
};
 

	
 
export default {textTracksToJson, jsonToTextTracks, trackToJson_};
ennstatus/static/js/video.js/src/js/tracks/text-track-list.js
Show inline comments
 
new file 100644
 
/**
 
 * @file text-track-list.js
 
 */
 
import EventTarget from '../event-target';
 
import * as Fn from '../utils/fn.js';
 
import * as browser from '../utils/browser.js';
 
import document from 'global/document';
 

	
 
/*
 
 * https://html.spec.whatwg.org/multipage/embedded-content.html#texttracklist
 
 *
 
 * interface TextTrackList : EventTarget {
 
 *   readonly attribute unsigned long length;
 
 *   getter TextTrack (unsigned long index);
 
 *   TextTrack? getTrackById(DOMString id);
 
 *
 
 *   attribute EventHandler onchange;
 
 *   attribute EventHandler onaddtrack;
 
 *   attribute EventHandler onremovetrack;
 
 * };
 
 */
 
let TextTrackList = function(tracks) {
 
  let list = this;
 

	
 
  if (browser.IS_IE8) {
 
    list = document.createElement('custom');
 

	
 
    for (let prop in TextTrackList.prototype) {
 
      list[prop] = TextTrackList.prototype[prop];
 
    }
 
  }
 

	
 
  tracks = tracks || [];
 
  list.tracks_ = [];
 

	
 
  Object.defineProperty(list, 'length', {
 
    get: function() {
 
      return this.tracks_.length;
 
    }
 
  });
 

	
 
  for (let i = 0; i < tracks.length; i++) {
 
    list.addTrack_(tracks[i]);
 
  }
 

	
 
  if (browser.IS_IE8) {
 
    return list;
 
  }
 
};
 

	
 
TextTrackList.prototype = Object.create(EventTarget.prototype);
 
TextTrackList.prototype.constructor = TextTrackList;
 

	
 
/*
 
 * change - One or more tracks in the track list have been enabled or disabled.
 
 * addtrack - A track has been added to the track list.
 
 * removetrack - A track has been removed from the track list.
 
 */
 
TextTrackList.prototype.allowedEvents_ = {
 
  'change': 'change',
 
  'addtrack': 'addtrack',
 
  'removetrack': 'removetrack'
 
};
 

	
 
// emulate attribute EventHandler support to allow for feature detection
 
for (let event in TextTrackList.prototype.allowedEvents_) {
 
  TextTrackList.prototype['on' + event] = null;
 
}
 

	
 
TextTrackList.prototype.addTrack_ = function(track) {
 
  let index = this.tracks_.length;
 
  if (!(''+index in this)) {
 
    Object.defineProperty(this, index, {
 
      get: function() {
 
        return this.tracks_[index];
 
      }
 
    });
 
  }
 

	
 
  track.addEventListener('modechange', Fn.bind(this, function() {
 
    this.trigger('change');
 
  }));
 
  this.tracks_.push(track);
 

	
 
  this.trigger({
 
    type: 'addtrack',
 
    track: track
 
  });
 
};
 

	
 
TextTrackList.prototype.removeTrack_ = function(rtrack) {
 
  let result = null;
 
  let track;
 

	
 
  for (let i = 0, l = this.length; i < l; i++) {
 
    track = this[i];
 
    if (track === rtrack) {
 
      this.tracks_.splice(i, 1);
 
      break;
 
    }
 
  }
 

	
 
  this.trigger({
 
    type: 'removetrack',
 
    track: track
 
  });
 
};
 

	
 
TextTrackList.prototype.getTrackById = function(id) {
 
  let result = null;
 

	
 
  for (let i = 0, l = this.length; i < l; i++) {
 
    let track = this[i];
 
    if (track.id === id) {
 
      result = track;
 
      break;
 
    }
 
  }
 

	
 
  return result;
 
};
 

	
 
export default TextTrackList;
ennstatus/static/js/video.js/src/js/tracks/text-track-settings.js
Show inline comments
 
new file 100644
 
/**
 
 * @file text-track-settings.js
 
 */
 
import Component from '../component';
 
import * as Events from '../utils/events.js';
 
import * as Fn from '../utils/fn.js';
 
import log from '../utils/log.js';
 
import safeParseTuple from 'safe-json-parse/tuple';
 
import window from 'global/window';
 

	
 
/**
 
 * Manipulate settings of texttracks
 
 *
 
 * @param {Object} player  Main Player
 
 * @param {Object=} options Object of option names and values
 
 * @extends Component
 
 * @class TextTrackSettings
 
 */
 
class TextTrackSettings extends Component {
 

	
 
  constructor(player, options) {
 
    super(player, options);
 
    this.hide();
 

	
 
    // Grab `persistTextTrackSettings` from the player options if not passed in child options
 
    if (options.persistTextTrackSettings === undefined) {
 
      this.options_.persistTextTrackSettings = this.options_.playerOptions.persistTextTrackSettings;
 
    }
 

	
 
    Events.on(this.el().querySelector('.vjs-done-button'), 'click', Fn.bind(this, function() {
 
      this.saveSettings();
 
      this.hide();
 
    }));
 

	
 
    Events.on(this.el().querySelector('.vjs-default-button'), 'click', Fn.bind(this, function() {
 
      this.el().querySelector('.vjs-fg-color > select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-bg-color > select').selectedIndex = 0;
 
      this.el().querySelector('.window-color > select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-text-opacity > select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-bg-opacity > select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-window-opacity > select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-edge-style select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-font-family select').selectedIndex = 0;
 
      this.el().querySelector('.vjs-font-percent select').selectedIndex = 2;
 
      this.updateDisplay();
 
    }));
 

	
 
    Events.on(this.el().querySelector('.vjs-fg-color > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-bg-color > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.window-color > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-text-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-bg-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-window-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-font-percent select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-edge-style select'), 'change', Fn.bind(this, this.updateDisplay));
 
    Events.on(this.el().querySelector('.vjs-font-family select'), 'change', Fn.bind(this, this.updateDisplay));
 

	
 
    if (this.options_.persistTextTrackSettings) {
 
      this.restoreSettings();
 
    }
 
  }
 

	
 
  /**
 
   * Create the component's DOM element
 
   *
 
   * @return {Element}
 
   * @method createEl
 
   */
 
  createEl() {
 
    return super.createEl('div', {
 
      className: 'vjs-caption-settings vjs-modal-overlay',
 
      innerHTML: captionOptionsMenuTemplate()
 
    });
 
  }
 

	
 
  /**
 
   * Get texttrack settings 
 
   * Settings are
 
   * .vjs-edge-style
 
   * .vjs-font-family
 
   * .vjs-fg-color
 
   * .vjs-text-opacity
 
   * .vjs-bg-color
 
   * .vjs-bg-opacity
 
   * .window-color
 
   * .vjs-window-opacity 
 
   *
 
   * @return {Object} 
 
   * @method getValues
 
   */
 
  getValues() {
 
    const el = this.el();
 

	
 
    const textEdge = getSelectedOptionValue(el.querySelector('.vjs-edge-style select'));
 
    const fontFamily = getSelectedOptionValue(el.querySelector('.vjs-font-family select'));
 
    const fgColor = getSelectedOptionValue(el.querySelector('.vjs-fg-color > select'));
 
    const textOpacity = getSelectedOptionValue(el.querySelector('.vjs-text-opacity > select'));
 
    const bgColor = getSelectedOptionValue(el.querySelector('.vjs-bg-color > select'));
 
    const bgOpacity = getSelectedOptionValue(el.querySelector('.vjs-bg-opacity > select'));
 
    const windowColor = getSelectedOptionValue(el.querySelector('.window-color > select'));
 
    const windowOpacity = getSelectedOptionValue(el.querySelector('.vjs-window-opacity > select'));
 
    const fontPercent = window['parseFloat'](getSelectedOptionValue(el.querySelector('.vjs-font-percent > select')));
 

	
 
    let result = {
 
      'backgroundOpacity': bgOpacity,
 
      'textOpacity': textOpacity,
 
      'windowOpacity': windowOpacity,
 
      'edgeStyle': textEdge,
 
      'fontFamily': fontFamily,
 
      'color': fgColor,
 
      'backgroundColor': bgColor,
 
      'windowColor': windowColor,
 
      'fontPercent': fontPercent
 
    };
 
    for (let name in result) {
 
      if (result[name] === '' || result[name] === 'none' || (name === 'fontPercent' && result[name] === 1.00)) {
 
        delete result[name];
 
      }
 
    }
 
    return result;
 
  }
 

	
 
  /**
 
   * Set texttrack settings 
 
   * Settings are
 
   * .vjs-edge-style
 
   * .vjs-font-family
 
   * .vjs-fg-color
 
   * .vjs-text-opacity
 
   * .vjs-bg-color
 
   * .vjs-bg-opacity
 
   * .window-color
 
   * .vjs-window-opacity 
 
   *
 
   * @param {Object} values Object with texttrack setting values
 
   * @method setValues
 
   */
 
  setValues(values) {
 
    const el = this.el();
 

	
 
    setSelectedOption(el.querySelector('.vjs-edge-style select'), values.edgeStyle);
 
    setSelectedOption(el.querySelector('.vjs-font-family select'), values.fontFamily);
 
    setSelectedOption(el.querySelector('.vjs-fg-color > select'), values.color);
 
    setSelectedOption(el.querySelector('.vjs-text-opacity > select'), values.textOpacity);
 
    setSelectedOption(el.querySelector('.vjs-bg-color > select'), values.backgroundColor);
 
    setSelectedOption(el.querySelector('.vjs-bg-opacity > select'), values.backgroundOpacity);
 
    setSelectedOption(el.querySelector('.window-color > select'), values.windowColor);
 
    setSelectedOption(el.querySelector('.vjs-window-opacity > select'), values.windowOpacity);
 

	
 
    let fontPercent = values.fontPercent;
 

	
 
    if (fontPercent) {
 
      fontPercent = fontPercent.toFixed(2);
 
    }
 

	
 
    setSelectedOption(el.querySelector('.vjs-font-percent > select'), fontPercent);
 
  }
 

	
 
  /**
 
   * Restore texttrack settings 
 
   *
 
   * @method restoreSettings
 
   */
 
  restoreSettings() {
 
    let [err, values] = safeParseTuple(window.localStorage.getItem('vjs-text-track-settings'));
 

	
 
    if (err) {
 
      log.error(err);
 
    }
 

	
 
    if (values) {
 
      this.setValues(values);
 
    }
 
  }
 

	
 
  /**
 
   * Save texttrack settings to local storage 
 
   *
 
   * @method saveSettings
 
   */
 
  saveSettings() {
 
    if (!this.options_.persistTextTrackSettings) {
 
      return;
 
    }
 

	
 
    let values = this.getValues();
 
    try {
 
      if (Object.getOwnPropertyNames(values).length > 0) {
 
        window.localStorage.setItem('vjs-text-track-settings', JSON.stringify(values));
 
      } else {
 
        window.localStorage.removeItem('vjs-text-track-settings');
 
      }
 
    } catch (e) {}
 
  }
 

	
 
  /**
 
   * Update display of texttrack settings  
 
   *
 
   * @method updateDisplay
 
   */
 
  updateDisplay() {
 
    let ttDisplay = this.player_.getChild('textTrackDisplay');
 
    if (ttDisplay) {
 
      ttDisplay.updateDisplay();
 
    }
 
  }
 

	
 
}
 

	
 
Component.registerComponent('TextTrackSettings', TextTrackSettings);
 

	
 
function getSelectedOptionValue(target) {
 
  let selectedOption;
 
  // not all browsers support selectedOptions, so, fallback to options
 
  if (target.selectedOptions) {
 
    selectedOption = target.selectedOptions[0];
 
  } else if (target.options) {
 
    selectedOption = target.options[target.options.selectedIndex];
 
  }
 

	
 
  return selectedOption.value;
 
}
 

	
 
function setSelectedOption(target, value) {
 
  if (!value) {
 
    return;
 
  }
 

	
 
  let i;
 
  for (i = 0; i < target.options.length; i++) {
 
    const option = target.options[i];
 
    if (option.value === value) {
 
      break;
 
    }
 
  }
 

	
 
  target.selectedIndex = i;
 
}
 

	
 
function captionOptionsMenuTemplate() {
 
  let template = `<div class="vjs-tracksettings">
 
      <div class="vjs-tracksettings-colors">
 
        <div class="vjs-fg-color vjs-tracksetting">
 
            <label class="vjs-label">Foreground</label>
 
            <select>
 
              <option value="">---</option>
 
              <option value="#FFF">White</option>
 
              <option value="#000">Black</option>
 
              <option value="#F00">Red</option>
 
              <option value="#0F0">Green</option>
 
              <option value="#00F">Blue</option>
 
              <option value="#FF0">Yellow</option>
 
              <option value="#F0F">Magenta</option>
 
              <option value="#0FF">Cyan</option>
 
            </select>
 
            <span class="vjs-text-opacity vjs-opacity">
 
              <select>
 
                <option value="">---</option>
 
                <option value="1">Opaque</option>
 
                <option value="0.5">Semi-Opaque</option>
 
              </select>
 
            </span>
 
        </div> <!-- vjs-fg-color -->
 
        <div class="vjs-bg-color vjs-tracksetting">
 
            <label class="vjs-label">Background</label>
 
            <select>
 
              <option value="">---</option>
 
              <option value="#FFF">White</option>
 
              <option value="#000">Black</option>
 
              <option value="#F00">Red</option>
 
              <option value="#0F0">Green</option>
 
              <option value="#00F">Blue</option>
 
              <option value="#FF0">Yellow</option>
 
              <option value="#F0F">Magenta</option>
 
              <option value="#0FF">Cyan</option>
 
            </select>
 
            <span class="vjs-bg-opacity vjs-opacity">
 
                <select>
 
                  <option value="">---</option>
 
                  <option value="1">Opaque</option>
 
                  <option value="0.5">Semi-Transparent</option>
 
                  <option value="0">Transparent</option>
 
                </select>
 
            </span>
 
        </div> <!-- vjs-bg-color -->
 
        <div class="window-color vjs-tracksetting">
 
            <label class="vjs-label">Window</label>
 
            <select>
 
              <option value="">---</option>
 
              <option value="#FFF">White</option>
 
              <option value="#000">Black</option>
 
              <option value="#F00">Red</option>
 
              <option value="#0F0">Green</option>
 
              <option value="#00F">Blue</option>
 
              <option value="#FF0">Yellow</option>
 
              <option value="#F0F">Magenta</option>
 
              <option value="#0FF">Cyan</option>
 
            </select>
 
            <span class="vjs-window-opacity vjs-opacity">
 
                <select>
 
                  <option value="">---</option>
 
                  <option value="1">Opaque</option>
 
                  <option value="0.5">Semi-Transparent</option>
 
                  <option value="0">Transparent</option>
 
                </select>
 
            </span>
 
        </div> <!-- vjs-window-color -->
 
      </div> <!-- vjs-tracksettings -->
 
      <div class="vjs-tracksettings-font">
 
        <div class="vjs-font-percent vjs-tracksetting">
 
          <label class="vjs-label">Font Size</label>
 
          <select>
 
            <option value="0.50">50%</option>
 
            <option value="0.75">75%</option>
 
            <option value="1.00" selected>100%</option>
 
            <option value="1.25">125%</option>
 
            <option value="1.50">150%</option>
 
            <option value="1.75">175%</option>
 
            <option value="2.00">200%</option>
 
            <option value="3.00">300%</option>
 
            <option value="4.00">400%</option>
 
          </select>
 
        </div> <!-- vjs-font-percent -->
 
        <div class="vjs-edge-style vjs-tracksetting">
 
          <label class="vjs-label">Text Edge Style</label>
 
          <select>
 
            <option value="none">None</option>
 
            <option value="raised">Raised</option>
 
            <option value="depressed">Depressed</option>
 
            <option value="uniform">Uniform</option>
 
            <option value="dropshadow">Dropshadow</option>
 
          </select>
 
        </div> <!-- vjs-edge-style -->
 
        <div class="vjs-font-family vjs-tracksetting">
 
          <label class="vjs-label">Font Family</label>
 
          <select>
 
            <option value="">Default</option>
 
            <option value="monospaceSerif">Monospace Serif</option>
 
            <option value="proportionalSerif">Proportional Serif</option>
 
            <option value="monospaceSansSerif">Monospace Sans-Serif</option>
 
            <option value="proportionalSansSerif">Proportional Sans-Serif</option>
 
            <option value="casual">Casual</option>
 
            <option value="script">Script</option>
 
            <option value="small-caps">Small Caps</option>
 
          </select>
 
        </div> <!-- vjs-font-family -->
 
      </div>
 
    </div>
 
    <div class="vjs-tracksettings-controls">
 
      <button class="vjs-default-button">Defaults</button>
 
      <button class="vjs-done-button">Done</button>
 
    </div>`;
 

	
 
    return template;
 
}
 

	
 
export default TextTrackSettings;
ennstatus/static/js/video.js/src/js/tracks/text-track.js
Show inline comments
 
new file 100644
 
/**
 
 * @file text-track.js
 
 */
 
import TextTrackCueList from './text-track-cue-list';
 
import * as Fn from '../utils/fn.js';
 
import * as Guid from '../utils/guid.js';
 
import * as browser from '../utils/browser.js';
 
import * as TextTrackEnum from './text-track-enums';
 
import log from '../utils/log.js';
 
import EventTarget from '../event-target';
 
import document from 'global/document';
 
import window from 'global/window';
 
import { isCrossOrigin } from '../utils/url.js';
 
import XHR from 'xhr';
 

	
 
/*
 
 * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrack
 
 *
 
 * interface TextTrack : EventTarget {
 
 *   readonly attribute TextTrackKind kind;
 
 *   readonly attribute DOMString label;
 
 *   readonly attribute DOMString language;
 
 *
 
 *   readonly attribute DOMString id;
 
 *   readonly attribute DOMString inBandMetadataTrackDispatchType;
 
 *
 
 *   attribute TextTrackMode mode;
 
 *
 
 *   readonly attribute TextTrackCueList? cues;
 
 *   readonly attribute TextTrackCueList? activeCues;
 
 *
 
 *   void addCue(TextTrackCue cue);
 
 *   void removeCue(TextTrackCue cue);
 
 *
 
 *   attribute EventHandler oncuechange;
 
 * };
 
 */
 
let TextTrack = function(options={}) {
 
  if (!options.tech) {
 
    throw new Error('A tech was not provided.');
 
  }
 

	
 
  let tt = this;
 
  if (browser.IS_IE8) {
 
    tt = document.createElement('custom');
 

	
 
    for (let prop in TextTrack.prototype) {
 
      tt[prop] = TextTrack.prototype[prop];
 
    }
 
  }
 

	
 
  tt.tech_ = options.tech;
 

	
 
  let mode = TextTrackEnum.TextTrackMode[options['mode']] || 'disabled';
 
  let kind = TextTrackEnum.TextTrackKind[options['kind']] || 'subtitles';
 
  let label = options['label'] || '';
 
  let language = options['language'] || options['srclang'] || '';
 
  let id = options['id'] || 'vjs_text_track_' + Guid.newGUID();
 

	
 
  if (kind === 'metadata' || kind === 'chapters') {
 
    mode = 'hidden';
 
  }
 

	
 
  tt.cues_ = [];
 
  tt.activeCues_ = [];
 

	
 
  let cues = new TextTrackCueList(tt.cues_);
 
  let activeCues = new TextTrackCueList(tt.activeCues_);
 

	
 
  let changed = false;
 
  let timeupdateHandler = Fn.bind(tt, function() {
 
    this['activeCues'];
 
    if (changed) {
 
      this['trigger']('cuechange');
 
      changed = false;
 
    }
 
  });
 
  if (mode !== 'disabled') {
 
    tt.tech_.on('timeupdate', timeupdateHandler);
 
  }
 

	
 
  Object.defineProperty(tt, 'kind', {
 
    get: function() {
 
      return kind;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  Object.defineProperty(tt, 'label', {
 
    get: function() {
 
      return label;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  Object.defineProperty(tt, 'language', {
 
    get: function() {
 
      return language;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  Object.defineProperty(tt, 'id', {
 
    get: function() {
 
      return id;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  Object.defineProperty(tt, 'mode', {
 
    get: function() {
 
      return mode;
 
    },
 
    set: function(newMode) {
 
      if (!TextTrackEnum.TextTrackMode[newMode]) {
 
        return;
 
      }
 
      mode = newMode;
 
      if (mode === 'showing') {
 
        this.tech_.on('timeupdate', timeupdateHandler);
 
      }
 
      this.trigger('modechange');
 
    }
 
  });
 

	
 
  Object.defineProperty(tt, 'cues', {
 
    get: function() {
 
      if (!this.loaded_) {
 
        return null;
 
      }
 

	
 
      return cues;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  Object.defineProperty(tt, 'activeCues', {
 
    get: function() {
 
      if (!this.loaded_) {
 
        return null;
 
      }
 

	
 
      if (this['cues'].length === 0) {
 
        return activeCues; // nothing to do
 
      }
 

	
 
      let ct = this.tech_.currentTime();
 
      let active = [];
 

	
 
      for (let i = 0, l = this['cues'].length; i < l; i++) {
 
        let cue = this['cues'][i];
 
        if (cue['startTime'] <= ct && cue['endTime'] >= ct) {
 
          active.push(cue);
 
        } else if (cue['startTime'] === cue['endTime'] && cue['startTime'] <= ct && cue['startTime'] + 0.5 >= ct) {
 
          active.push(cue);
 
        }
 
      }
 

	
 
      changed = false;
 

	
 
      if (active.length !== this.activeCues_.length) {
 
        changed = true;
 
      } else {
 
        for (let i = 0; i < active.length; i++) {
 
          if (indexOf.call(this.activeCues_, active[i]) === -1) {
 
            changed = true;
 
          }
 
        }
 
      }
 

	
 
      this.activeCues_ = active;
 
      activeCues.setCues_(this.activeCues_);
 

	
 
      return activeCues;
 
    },
 
    set: Function.prototype
 
  });
 

	
 
  if (options.src) {
 
    tt.src = options.src;
 
    loadTrack(options.src, tt);
 
  } else {
 
    tt.loaded_ = true;
 
  }
 

	
 
  if (browser.IS_IE8) {
 
    return tt;
 
  }
 
};
 

	
 
TextTrack.prototype = Object.create(EventTarget.prototype);
 
TextTrack.prototype.constructor = TextTrack;
 

	
 
/*
 
 * cuechange - One or more cues in the track have become active or stopped being active.
 
 */
 
TextTrack.prototype.allowedEvents_ = {
 
  'cuechange': 'cuechange'
 
};
 

	
 
TextTrack.prototype.addCue = function(cue) {
 
  let tracks = this.tech_.textTracks();
 

	
 
  if (tracks) {
 
    for (let i = 0; i < tracks.length; i++) {
 
      if (tracks[i] !== this) {
 
        tracks[i].removeCue(cue);
 
      }
 
    }
 
  }
 

	
 
  this.cues_.push(cue);
 
  this['cues'].setCues_(this.cues_);
 
};
 

	
 
TextTrack.prototype.removeCue = function(removeCue) {
 
  let removed = false;
 

	
 
  for (let i = 0, l = this.cues_.length; i < l; i++) {
 
    let cue = this.cues_[i];
 
    if (cue === removeCue) {
 
      this.cues_.splice(i, 1);
 
      removed = true;
 
    }
 
  }
 

	
 
  if (removed) {
 
    this.cues.setCues_(this.cues_);
 
  }
 
};
 

	
 
/*
 
* Downloading stuff happens below this point
 
*/
 
var parseCues = function(srcContent, track) {
 
  if (typeof window['WebVTT'] !== 'function') {
 
    //try again a bit later
 
    return window.setTimeout(function() {
 
      parseCues(srcContent, track);
 
    }, 25);
 
  }
 

	
 
  let parser = new window['WebVTT']['Parser'](window, window['vttjs'], window['WebVTT']['StringDecoder']());
 

	
 
  parser['oncue'] = function(cue) {
 
    track.addCue(cue);
 
  };
 
  parser['onparsingerror'] = function(error) {
 
    log.error(error);
 
  };
 

	
 
  parser['parse'](srcContent);
 
  parser['flush']();
 
};
 

	
 
var loadTrack = function(src, track) {
 
  let opts = {
 
    uri: src
 
  };
 

	
 
  let crossOrigin = isCrossOrigin(src);
 
  if (crossOrigin) {
 
    opts.cors = crossOrigin;
 
  }
 

	
 
  XHR(opts, Fn.bind(this, function(err, response, responseBody){
 
    if (err) {
 
      return log.error(err, response);
 
    }
 

	
 
    track.loaded_ = true;
 
    parseCues(responseBody, track);
 
  }));
 
};
 

	
 
var indexOf = function(searchElement, fromIndex) {
 
  if (this == null) {
 
    throw new TypeError('"this" is null or not defined');
 
  }
 

	
 
  let O = Object(this);
 

	
 
  let len = O.length >>> 0;
 

	
 
  if (len === 0) {
 
    return -1;
 
  }
 

	
 
  let n = +fromIndex || 0;
 

	
 
  if (Math.abs(n) === Infinity) {
 
    n = 0;
 
  }
 

	
 
  if (n >= len) {
 
    return -1;
 
  }
 

	
 
  let k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
 

	
 
  while (k < len) {
 
    if (k in O && O[k] === searchElement) {
 
      return k;
 
    }
 
    k++;
 
  }
 
  return -1;
 
};
 

	
 
export default TextTrack;
ennstatus/static/js/video.js/src/js/utils/browser.js
Show inline comments
 
new file 100644
 
/**
 
 * @file browser.js
 
 */
 
import document from 'global/document';
 
import window from 'global/window';
 

	
 
const USER_AGENT = window.navigator.userAgent;
 
const webkitVersionMap = (/AppleWebKit\/([\d.]+)/i).exec(USER_AGENT);
 
const appleWebkitVersion = webkitVersionMap ? parseFloat(webkitVersionMap.pop()) : null;
 

	
 
/*
 
 * Device is an iPhone
 
 *
 
 * @type {Boolean}
 
 * @constant
 
 * @private
 
 */
 
export const IS_IPHONE = (/iPhone/i).test(USER_AGENT);
 
export const IS_IPAD = (/iPad/i).test(USER_AGENT);
 
export const IS_IPOD = (/iPod/i).test(USER_AGENT);
 
export const IS_IOS = IS_IPHONE || IS_IPAD || IS_IPOD;
 

	
 
export const IOS_VERSION = (function(){
 
  var match = USER_AGENT.match(/OS (\d+)_/i);
 
  if (match && match[1]) { return match[1]; }
 
})();
 

	
 
export const IS_ANDROID = (/Android/i).test(USER_AGENT);
 
export const ANDROID_VERSION = (function() {
 
  // This matches Android Major.Minor.Patch versions
 
  // ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned
 
  var match = USER_AGENT.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i),
 
    major,
 
    minor;
 

	
 
  if (!match) {
 
    return null;
 
  }
 

	
 
  major = match[1] && parseFloat(match[1]);
 
  minor = match[2] && parseFloat(match[2]);
 

	
 
  if (major && minor) {
 
    return parseFloat(match[1] + '.' + match[2]);
 
  } else if (major) {
 
    return major;
 
  } else {
 
    return null;
 
  }
 
})();
 
// Old Android is defined as Version older than 2.3, and requiring a webkit version of the android browser
 
export const IS_OLD_ANDROID = IS_ANDROID && (/webkit/i).test(USER_AGENT) && ANDROID_VERSION < 2.3;
 
export const IS_NATIVE_ANDROID = IS_ANDROID && ANDROID_VERSION < 5 && appleWebkitVersion < 537;
 

	
 
export const IS_FIREFOX = (/Firefox/i).test(USER_AGENT);
 
export const IS_CHROME = (/Chrome/i).test(USER_AGENT);
 
export const IS_IE8 = (/MSIE\s8\.0/).test(USER_AGENT);
 

	
 
export const TOUCH_ENABLED = !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch);
 
export const BACKGROUND_SIZE_SUPPORTED = 'backgroundSize' in document.createElement('video').style;
ennstatus/static/js/video.js/src/js/utils/buffer.js
Show inline comments
 
new file 100644
 
/**
 
 * @file buffer.js
 
 */
 
import { createTimeRange } from './time-ranges.js';
 

	
 
/**
 
 * Compute how much your video has been buffered
 
 *
 
 * @param  {Object} Buffered object
 
 * @param  {Number} Total duration
 
 * @return {Number} Percent buffered of the total duration
 
 * @private
 
 * @function bufferedPercent
 
 */
 
export function bufferedPercent(buffered, duration) {
 
  var bufferedDuration = 0,
 
      start, end;
 

	
 
  if (!duration) {
 
    return 0;
 
  }
 

	
 
  if (!buffered || !buffered.length) {
 
    buffered = createTimeRange(0, 0);
 
  }
 

	
 
  for (let i = 0; i < buffered.length; i++){
 
    start = buffered.start(i);
 
    end   = buffered.end(i);
 

	
 
    // buffered end can be bigger than duration by a very small fraction
 
    if (end > duration) {
 
      end = duration;
 
    }
 

	
 
    bufferedDuration += end - start;
 
  }
 

	
 
  return bufferedDuration / duration;
 
}
ennstatus/static/js/video.js/src/js/utils/create-deprecation-proxy.js
Show inline comments
 
new file 100644
 
import log from './log.js';
 

	
 
/**
 
 * Object containing the default behaviors for available handler methods.
 
 *
 
 * @private
 
 * @type {Object}
 
 */
 
const defaultBehaviors = {
 
  get(obj, key) {
 
    return obj[key];
 
  },
 
  set(obj, key, value) {
 
    obj[key] = value;
 
    return true;
 
  }
 
};
 

	
 
/**
 
 * Expose private objects publicly using a Proxy to log deprecation warnings.
 
 *
 
 * Browsers that do not support Proxy objects will simply return the `target`
 
 * object, so it can be directly exposed.
 
 *
 
 * @param {Object} target The target object.
 
 * @param {Object} messages Messages to display from a Proxy. Only operations
 
 *                          with an associated message will be proxied.
 
 * @param {String} [messages.get]
 
 * @param {String} [messages.set]
 
 * @return {Object} A Proxy if supported or the `target` argument.
 
 */
 
export default (target, messages={}) => {
 
  if (typeof Proxy === 'function') {
 
    let handler = {};
 

	
 
    // Build a handler object based on those keys that have both messages
 
    // and default behaviors.
 
    Object.keys(messages).forEach(key => {
 
      if (defaultBehaviors.hasOwnProperty(key)) {
 
        handler[key] = function() {
 
          log.warn(messages[key]);
 
          return defaultBehaviors[key].apply(this, arguments);
 
        };
 
      }
 
    });
 

	
 
    return new Proxy(target, handler);
 
  }
 
  return target;
 
};
ennstatus/static/js/video.js/src/js/utils/dom.js
Show inline comments
 
new file 100644
 
/**
 
 * @file dom.js
 
 */
 
import document from 'global/document';
 
import window from 'global/window';
 
import  * as Guid from './guid.js';
 
import log from './log.js';
 
import tsml from 'tsml';
 

	
 
/**
 
 * Shorthand for document.getElementById()
 
 * Also allows for CSS (jQuery) ID syntax. But nothing other than IDs.
 
 *
 
 * @param  {String} id  Element ID
 
 * @return {Element}    Element with supplied ID
 
 * @function getEl
 
 */
 
export function getEl(id){
 
  if (id.indexOf('#') === 0) {
 
    id = id.slice(1);
 
  }
 

	
 
  return document.getElementById(id);
 
}
 

	
 
/**
 
 * Creates an element and applies properties.
 
 *
 
 * @param  {String=} tagName    Name of tag to be created.
 
 * @param  {Object=} properties Element properties to be applied.
 
 * @return {Element}
 
 * @function createEl
 
 */
 
export function createEl(tagName='div', properties={}, attributes={}){
 
  let el = document.createElement(tagName);
 

	
 
  Object.getOwnPropertyNames(properties).forEach(function(propName){
 
    let val = properties[propName];
 

	
 
    // See #2176
 
    // We originally were accepting both properties and attributes in the
 
    // same object, but that doesn't work so well.
 
    if (propName.indexOf('aria-') !== -1 || propName === 'role' || propName === 'type') {
 
      log.warn(tsml`Setting attributes in the second argument of createEl()
 
                has been deprecated. Use the third argument instead.
 
                createEl(type, properties, attributes). Attempting to set ${propName} to ${val}.`);
 
      el.setAttribute(propName, val);
 
    } else {
 
      el[propName] = val;
 
    }
 
  });
 

	
 
  Object.getOwnPropertyNames(attributes).forEach(function(attrName){
 
    let val = attributes[attrName];
 
    el.setAttribute(attrName, attributes[attrName]);
 
  });
 

	
 
  return el;
 
}
 

	
 
/**
 
 * Insert an element as the first child node of another
 
 *
 
 * @param  {Element} child   Element to insert
 
 * @param  {Element} parent Element to insert child into
 
 * @private
 
 * @function insertElFirst
 
 */
 
export function insertElFirst(child, parent){
 
  if (parent.firstChild) {
 
    parent.insertBefore(child, parent.firstChild);
 
  } else {
 
    parent.appendChild(child);
 
  }
 
}
 

	
 
/**
 
 * Element Data Store. Allows for binding data to an element without putting it directly on the element.
 
 * Ex. Event listeners are stored here.
 
 * (also from jsninja.com, slightly modified and updated for closure compiler)
 
 *
 
 * @type {Object}
 
 * @private
 
 */
 
const elData = {};
 

	
 
/*
 
 * Unique attribute name to store an element's guid in
 
 *
 
 * @type {String}
 
 * @constant
 
 * @private
 
 */
 
const elIdAttr = 'vdata' + (new Date()).getTime();
 

	
 
/**
 
 * Returns the cache object where data for an element is stored
 
 *
 
 * @param  {Element} el Element to store data for.
 
 * @return {Object}
 
 * @function getElData
 
 */
 
export function getElData(el) {
 
  let id = el[elIdAttr];
 

	
 
  if (!id) {
 
    id = el[elIdAttr] = Guid.newGUID();
 
  }
 

	
 
  if (!elData[id]) {
 
    elData[id] = {};
 
  }
 

	
 
  return elData[id];
 
}
 

	
 
/**
 
 * Returns whether or not an element has cached data
 
 *
 
 * @param  {Element} el A dom element
 
 * @return {Boolean}
 
 * @private
 
 * @function hasElData
 
 */
 
export function hasElData(el) {
 
  const id = el[elIdAttr];
 

	
 
  if (!id) {
 
    return false;
 
  }
 

	
 
  return !!Object.getOwnPropertyNames(elData[id]).length;
 
}
 

	
 
/**
 
 * Delete data for the element from the cache and the guid attr from getElementById
 
 *
 
 * @param  {Element} el Remove data for an element
 
 * @private
 
 * @function removeElData
 
 */
 
export function removeElData(el) {
 
  let id = el[elIdAttr];
 

	
 
  if (!id) {
 
    return;
 
  }
 

	
 
  // Remove all stored data
 
  delete elData[id];
 

	
 
  // Remove the elIdAttr property from the DOM node
 
  try {
 
    delete el[elIdAttr];
 
  } catch(e) {
 
    if (el.removeAttribute) {
 
      el.removeAttribute(elIdAttr);
 
    } else {
 
      // IE doesn't appear to support removeAttribute on the document element
 
      el[elIdAttr] = null;
 
    }
 
  }
 
}
 

	
 
/**
 
 * Check if an element has a CSS class
 
 *
 
 * @param {Element} element Element to check
 
 * @param {String} classToCheck Classname to check
 
 * @function hasElClass
 
 */
 
export function hasElClass(element, classToCheck) {
 
  return ((' ' + element.className + ' ').indexOf(' ' + classToCheck + ' ') !== -1);
 
}
 

	
 
/**
 
 * Add a CSS class name to an element
 
 *
 
 * @param {Element} element    Element to add class name to
 
 * @param {String} classToAdd Classname to add
 
 * @function addElClass
 
 */
 
export function addElClass(element, classToAdd) {
 
  if (!hasElClass(element, classToAdd)) {
 
    element.className = element.className === '' ? classToAdd : element.className + ' ' + classToAdd;
 
  }
 
}
 

	
 
/**
 
 * Remove a CSS class name from an element
 
 *
 
 * @param {Element} element    Element to remove from class name
 
 * @param {String} classToRemove Classname to remove
 
 * @function removeElClass
 
 */
 
export function removeElClass(element, classToRemove) {
 
  if (!hasElClass(element, classToRemove)) {return;}
 

	
 
  let classNames = element.className.split(' ');
 

	
 
  // no arr.indexOf in ie8, and we don't want to add a big shim
 
  for (let i = classNames.length - 1; i >= 0; i--) {
 
    if (classNames[i] === classToRemove) {
 
      classNames.splice(i,1);
 
    }
 
  }
 

	
 
  element.className = classNames.join(' ');
 
}
 

	
 
/**
 
 * Apply attributes to an HTML element.
 
 *
 
 * @param  {Element} el         Target element.
 
 * @param  {Object=} attributes Element attributes to be applied.
 
 * @private
 
 * @function setElAttributes
 
 */
 
export function setElAttributes(el, attributes) {
 
  Object.getOwnPropertyNames(attributes).forEach(function(attrName){
 
    let attrValue = attributes[attrName];
 

	
 
    if (attrValue === null || typeof attrValue === 'undefined' || attrValue === false) {
 
      el.removeAttribute(attrName);
 
    } else {
 
      el.setAttribute(attrName, (attrValue === true ? '' : attrValue));
 
    }
 
  });
 
}
 

	
 
/**
 
 * Get an element's attribute values, as defined on the HTML tag
 
 * Attributes are not the same as properties. They're defined on the tag
 
 * or with setAttribute (which shouldn't be used with HTML)
 
 * This will return true or false for boolean attributes.
 
 *
 
 * @param  {Element} tag Element from which to get tag attributes
 
 * @return {Object}
 
 * @private
 
 * @function getElAttributes
 
 */
 
export function getElAttributes(tag) {
 
  var obj, knownBooleans, attrs, attrName, attrVal;
 

	
 
  obj = {};
 

	
 
  // known boolean attributes
 
  // we can check for matching boolean properties, but older browsers
 
  // won't know about HTML5 boolean attributes that we still read from
 
  knownBooleans = ','+'autoplay,controls,loop,muted,default'+',';
 

	
 
  if (tag && tag.attributes && tag.attributes.length > 0) {
 
    attrs = tag.attributes;
 

	
 
    for (var i = attrs.length - 1; i >= 0; i--) {
 
      attrName = attrs[i].name;
 
      attrVal = attrs[i].value;
 

	
 
      // check for known booleans
 
      // the matching element property will return a value for typeof
 
      if (typeof tag[attrName] === 'boolean' || knownBooleans.indexOf(','+attrName+',') !== -1) {
 
        // the value of an included boolean attribute is typically an empty
 
        // string ('') which would equal false if we just check for a false value.
 
        // we also don't want support bad code like autoplay='false'
 
        attrVal = (attrVal !== null) ? true : false;
 
      }
 

	
 
      obj[attrName] = attrVal;
 
    }
 
  }
 

	
 
  return obj;
 
}
 

	
 
/**
 
 * Attempt to block the ability to select text while dragging controls
 
 *
 
 * @return {Boolean}
 
 * @method blockTextSelection
 
 */
 
export function blockTextSelection() {
 
  document.body.focus();
 
  document.onselectstart = function() {
 
    return false;
 
  };
 
}
 

	
 
/**
 
 * Turn off text selection blocking
 
 *
 
 * @return {Boolean}
 
 * @method unblockTextSelection
 
 */
 
export function unblockTextSelection() {
 
  document.onselectstart = function() {
 
    return true;
 
  };
 
}
 

	
 
/**
 
 * Offset Left
 
 * getBoundingClientRect technique from
 
 * John Resig http://ejohn.org/blog/getboundingclientrect-is-awesome/
 
 *
 
 * @param {Element} el Element from which to get offset
 
 * @return {Object=}
 
 * @method findElPosition
 
 */
 
export function findElPosition(el) {
 
  let box;
 

	
 
  if (el.getBoundingClientRect && el.parentNode) {
 
    box = el.getBoundingClientRect();
 
  }
 

	
 
  if (!box) {
 
    return {
 
      left: 0,
 
      top: 0
 
    };
 
  }
 

	
 
  const docEl = document.documentElement;
 
  const body = document.body;
 

	
 
  const clientLeft = docEl.clientLeft || body.clientLeft || 0;
 
  const scrollLeft = window.pageXOffset || body.scrollLeft;
 
  const left = box.left + scrollLeft - clientLeft;
 

	
 
  const clientTop = docEl.clientTop || body.clientTop || 0;
 
  const scrollTop = window.pageYOffset || body.scrollTop;
 
  const top = box.top + scrollTop - clientTop;
 

	
 
  // Android sometimes returns slightly off decimal values, so need to round
 
  return {
 
    left: Math.round(left),
 
    top: Math.round(top)
 
  };
 
}
 

	
 
/**
 
 * Get pointer position in element
 
 * Returns an object with x and y coordinates.
 
 * The base on the coordinates are the bottom left of the element.
 
 *
 
 * @param {Element} el Element on which to get the pointer position on
 
 * @param {Event} event Event object
 
 * @return {Object=} position This object will have x and y coordinates corresponding to the mouse position
 
 * @metho getPointerPosition
 
 */
 
export function getPointerPosition(el, event) {
 
  let position = {};
 
  let box = findElPosition(el);
 
  let boxW = el.offsetWidth;
 
  let boxH = el.offsetHeight;
 

	
 
  let boxY = box.top;
 
  let boxX = box.left;
 
  let pageY = event.pageY;
 
  let pageX = event.pageX;
 

	
 
  if (event.changedTouches) {
 
    pageX = event.changedTouches[0].pageX;
 
    pageY = event.changedTouches[0].pageY;
 
  }
 

	
 
  position.y = Math.max(0, Math.min(1, ((boxY - pageY) + boxH) / boxH));
 
  position.x = Math.max(0, Math.min(1, (pageX - boxX) / boxW));
 

	
 
  return position;
 
}
ennstatus/static/js/video.js/src/js/utils/events.js
Show inline comments
 
new file 100644
 
/**
 
 * @file events.js
 
 *
 
 * Event System (John Resig - Secrets of a JS Ninja http://jsninja.com/)
 
 * (Original book version wasn't completely usable, so fixed some things and made Closure Compiler compatible)
 
 * This should work very similarly to jQuery's events, however it's based off the book version which isn't as
 
 * robust as jquery's, so there's probably some differences.
 
 */
 

	
 
import  * as Dom from './dom.js';
 
import  * as Guid from './guid.js';
 
import window from 'global/window';
 
import document from 'global/document';
 

	
 
/**
 
 * Add an event listener to element
 
 * It stores the handler function in a separate cache object
 
 * and adds a generic handler to the element's event,
 
 * along with a unique id (guid) to the element.
 
 *
 
 * @param  {Element|Object}   elem Element or object to bind listeners to
 
 * @param  {String|Array}   type Type of event to bind to.
 
 * @param  {Function} fn   Event listener.
 
 * @method on
 
 */
 
export function on(elem, type, fn){
 
  if (Array.isArray(type)) {
 
    return _handleMultipleEvents(on, elem, type, fn);
 
  }
 

	
 
  let data = Dom.getElData(elem);
 

	
 
  // We need a place to store all our handler data
 
  if (!data.handlers) data.handlers = {};
 

	
 
  if (!data.handlers[type]) data.handlers[type] = [];
 

	
 
  if (!fn.guid) fn.guid = Guid.newGUID();
 

	
 
  data.handlers[type].push(fn);
 

	
 
  if (!data.dispatcher) {
 
    data.disabled = false;
 

	
 
    data.dispatcher = function (event, hash){
 

	
 
      if (data.disabled) return;
 
      event = fixEvent(event);
 

	
 
      var handlers = data.handlers[event.type];
 

	
 
      if (handlers) {
 
        // Copy handlers so if handlers are added/removed during the process it doesn't throw everything off.
 
        var handlersCopy = handlers.slice(0);
 

	
 
        for (var m = 0, n = handlersCopy.length; m < n; m++) {
 
          if (event.isImmediatePropagationStopped()) {
 
            break;
 
          } else {
 
            handlersCopy[m].call(elem, event, hash);
 
          }
 
        }
 
      }
 
    };
 
  }
 

	
 
  if (data.handlers[type].length === 1) {
 
    if (elem.addEventListener) {
 
      elem.addEventListener(type, data.dispatcher, false);
 
    } else if (elem.attachEvent) {
 
      elem.attachEvent('on' + type, data.dispatcher);
 
    }
 
  }
 
}
 

	
 
/**
 
 * Removes event listeners from an element
 
 *
 
 * @param  {Element|Object}   elem Object to remove listeners from
 
 * @param  {String|Array=}   type Type of listener to remove. Don't include to remove all events from element.
 
 * @param  {Function} fn   Specific listener to remove. Don't include to remove listeners for an event type.
 
 * @method off
 
 */
 
export function off(elem, type, fn) {
 
  // Don't want to add a cache object through getElData if not needed
 
  if (!Dom.hasElData(elem)) return;
 

	
 
  let data = Dom.getElData(elem);
 

	
 
  // If no events exist, nothing to unbind
 
  if (!data.handlers) { return; }
 

	
 
  if (Array.isArray(type)) {
 
    return _handleMultipleEvents(off, elem, type, fn);
 
  }
 

	
 
  // Utility function
 
  var removeType = function(t){
 
     data.handlers[t] = [];
 
     _cleanUpEvents(elem,t);
 
  };
 

	
 
  // Are we removing all bound events?
 
  if (!type) {
 
    for (let t in data.handlers) removeType(t);
 
    return;
 
  }
 

	
 
  var handlers = data.handlers[type];
 

	
 
  // If no handlers exist, nothing to unbind
 
  if (!handlers) return;
 

	
 
  // If no listener was provided, remove all listeners for type
 
  if (!fn) {
 
    removeType(type);
 
    return;
 
  }
 

	
 
  // We're only removing a single handler
 
  if (fn.guid) {
 
    for (let n = 0; n < handlers.length; n++) {
 
      if (handlers[n].guid === fn.guid) {
 
        handlers.splice(n--, 1);
 
      }
 
    }
 
  }
 

	
 
  _cleanUpEvents(elem, type);
 
}
 

	
 
/**
 
 * Trigger an event for an element
 
 *
 
 * @param  {Element|Object}      elem  Element to trigger an event on
 
 * @param  {Event|Object|String} event A string (the type) or an event object with a type attribute
 
 * @param  {Object} [hash] data hash to pass along with the event
 
 * @return {Boolean=} Returned only if default was prevented
 
 * @method trigger
 
 */
 
export function trigger(elem, event, hash) {
 
  // Fetches element data and a reference to the parent (for bubbling).
 
  // Don't want to add a data object to cache for every parent,
 
  // so checking hasElData first.
 
  var elemData = (Dom.hasElData(elem)) ? Dom.getElData(elem) : {};
 
  var parent = elem.parentNode || elem.ownerDocument;
 
      // type = event.type || event,
 
      // handler;
 

	
 
  // If an event name was passed as a string, creates an event out of it
 
  if (typeof event === 'string') {
 
    event = { type:event, target:elem };
 
  }
 
  // Normalizes the event properties.
 
  event = fixEvent(event);
 

	
 
  // If the passed element has a dispatcher, executes the established handlers.
 
  if (elemData.dispatcher) {
 
    elemData.dispatcher.call(elem, event, hash);
 
  }
 

	
 
  // Unless explicitly stopped or the event does not bubble (e.g. media events)
 
    // recursively calls this function to bubble the event up the DOM.
 
    if (parent && !event.isPropagationStopped() && event.bubbles === true) {
 
      trigger.call(null, parent, event, hash);
 

	
 
  // If at the top of the DOM, triggers the default action unless disabled.
 
  } else if (!parent && !event.defaultPrevented) {
 
    var targetData = Dom.getElData(event.target);
 

	
 
    // Checks if the target has a default action for this event.
 
    if (event.target[event.type]) {
 
      // Temporarily disables event dispatching on the target as we have already executed the handler.
 
      targetData.disabled = true;
 
      // Executes the default action.
 
      if (typeof event.target[event.type] === 'function') {
 
        event.target[event.type]();
 
      }
 
      // Re-enables event dispatching.
 
      targetData.disabled = false;
 
    }
 
  }
 

	
 
  // Inform the triggerer if the default was prevented by returning false
 
  return !event.defaultPrevented;
 
}
 

	
 
/**
 
 * Trigger a listener only once for an event
 
 *
 
 * @param  {Element|Object}   elem Element or object to
 
 * @param  {String|Array}   type Name/type of event
 
 * @param  {Function} fn Event handler function
 
 * @method one
 
 */
 
export function one(elem, type, fn) {
 
  if (Array.isArray(type)) {
 
    return _handleMultipleEvents(one, elem, type, fn);
 
  }
 
  var func = function(){
 
    off(elem, type, func);
 
    fn.apply(this, arguments);
 
  };
 
  // copy the guid to the new function so it can removed using the original function's ID
 
  func.guid = fn.guid = fn.guid || Guid.newGUID();
 
  on(elem, type, func);
 
}
 

	
 
/**
 
 * Fix a native event to have standard property values
 
 *
 
 * @param  {Object} event Event object to fix
 
 * @return {Object}
 
 * @private
 
 * @method fixEvent
 
 */
 
export function fixEvent(event) {
 

	
 
  function returnTrue() { return true; }
 
  function returnFalse() { return false; }
 

	
 
  // Test if fixing up is needed
 
  // Used to check if !event.stopPropagation instead of isPropagationStopped
 
  // But native events return true for stopPropagation, but don't have
 
  // other expected methods like isPropagationStopped. Seems to be a problem
 
  // with the Javascript Ninja code. So we're just overriding all events now.
 
  if (!event || !event.isPropagationStopped) {
 
    var old = event || window.event;
 

	
 
    event = {};
 
    // Clone the old object so that we can modify the values event = {};
 
    // IE8 Doesn't like when you mess with native event properties
 
    // Firefox returns false for event.hasOwnProperty('type') and other props
 
    //  which makes copying more difficult.
 
    // TODO: Probably best to create a whitelist of event props
 
    for (var key in old) {
 
      // Safari 6.0.3 warns you if you try to copy deprecated layerX/Y
 
      // Chrome warns you if you try to copy deprecated keyboardEvent.keyLocation
 
      // and webkitMovementX/Y
 
      if (key !== 'layerX' && key !== 'layerY' && key !== 'keyLocation' &&
 
          key !== 'webkitMovementX' && key !== 'webkitMovementY') {
 
        // Chrome 32+ warns if you try to copy deprecated returnValue, but
 
        // we still want to if preventDefault isn't supported (IE8).
 
        if (!(key === 'returnValue' && old.preventDefault)) {
 
          event[key] = old[key];
 
        }
 
      }
 
    }
 

	
 
    // The event occurred on this element
 
    if (!event.target) {
 
      event.target = event.srcElement || document;
 
    }
 

	
 
    // Handle which other element the event is related to
 
    if (!event.relatedTarget) {
 
      event.relatedTarget = event.fromElement === event.target ?
 
        event.toElement :
 
        event.fromElement;
 
    }
 

	
 
    // Stop the default browser action
 
    event.preventDefault = function () {
 
      if (old.preventDefault) {
 
        old.preventDefault();
 
      }
 
      event.returnValue = false;
 
      old.returnValue = false;
 
      event.defaultPrevented = true;
 
    };
 

	
 
    event.defaultPrevented = false;
 

	
 
    // Stop the event from bubbling
 
    event.stopPropagation = function () {
 
      if (old.stopPropagation) {
 
        old.stopPropagation();
 
      }
 
      event.cancelBubble = true;
 
      old.cancelBubble = true;
 
      event.isPropagationStopped = returnTrue;
 
    };
 

	
 
    event.isPropagationStopped = returnFalse;
 

	
 
    // Stop the event from bubbling and executing other handlers
 
    event.stopImmediatePropagation = function () {
 
      if (old.stopImmediatePropagation) {
 
        old.stopImmediatePropagation();
 
      }
 
      event.isImmediatePropagationStopped = returnTrue;
 
      event.stopPropagation();
 
    };
 

	
 
    event.isImmediatePropagationStopped = returnFalse;
 

	
 
    // Handle mouse position
 
    if (event.clientX != null) {
 
      var doc = document.documentElement, body = document.body;
 

	
 
      event.pageX = event.clientX +
 
        (doc && doc.scrollLeft || body && body.scrollLeft || 0) -
 
        (doc && doc.clientLeft || body && body.clientLeft || 0);
 
      event.pageY = event.clientY +
 
        (doc && doc.scrollTop || body && body.scrollTop || 0) -
 
        (doc && doc.clientTop || body && body.clientTop || 0);
 
    }
 

	
 
    // Handle key presses
 
    event.which = event.charCode || event.keyCode;
 

	
 
    // Fix button for mouse clicks:
 
    // 0 == left; 1 == middle; 2 == right
 
    if (event.button != null) {
 
      event.button = (event.button & 1 ? 0 :
 
        (event.button & 4 ? 1 :
 
          (event.button & 2 ? 2 : 0)));
 
    }
 
  }
 

	
 
  // Returns fixed-up instance
 
  return event;
 
}
 

	
 
/**
 
 * Clean up the listener cache and dispatchers
 
*
 
 * @param  {Element|Object} elem Element to clean up
 
 * @param  {String} type Type of event to clean up
 
 * @private
 
 * @method _cleanUpEvents
 
 */
 
function _cleanUpEvents(elem, type) {
 
  var data = Dom.getElData(elem);
 

	
 
  // Remove the events of a particular type if there are none left
 
  if (data.handlers[type].length === 0) {
 
    delete data.handlers[type];
 
    // data.handlers[type] = null;
 
    // Setting to null was causing an error with data.handlers
 

	
 
    // Remove the meta-handler from the element
 
    if (elem.removeEventListener) {
 
      elem.removeEventListener(type, data.dispatcher, false);
 
    } else if (elem.detachEvent) {
 
      elem.detachEvent('on' + type, data.dispatcher);
 
    }
 
  }
 

	
 
  // Remove the events object if there are no types left
 
  if (Object.getOwnPropertyNames(data.handlers).length <= 0) {
 
    delete data.handlers;
 
    delete data.dispatcher;
 
    delete data.disabled;
 
  }
 

	
 
  // Finally remove the element data if there is no data left
 
  if (Object.getOwnPropertyNames(data).length === 0) {
 
    Dom.removeElData(elem);
 
  }
 
}
 

	
 
/**
 
 * Loops through an array of event types and calls the requested method for each type.
 
 *
 
 * @param  {Function} fn   The event method we want to use.
 
 * @param  {Element|Object} elem Element or object to bind listeners to
 
 * @param  {String}   type Type of event to bind to.
 
 * @param  {Function} callback   Event listener.
 
 * @private
 
 * @function _handleMultipleEvents
 
 */
 
function _handleMultipleEvents(fn, elem, types, callback) {
 
  types.forEach(function(type) {
 
    //Call the event method for each one of the types
 
    fn(elem, type, callback);
 
  });
 
}
ennstatus/static/js/video.js/src/js/utils/fn.js
Show inline comments
 
new file 100644
 
/**
 
 * @file fn.js
 
 */
 
import { newGUID } from './guid.js';
 

	
 
/**
 
 * Bind (a.k.a proxy or Context). A simple method for changing the context of a function
 
 * It also stores a unique id on the function so it can be easily removed from events
 
 *
 
 * @param  {*}   context The object to bind as scope
 
 * @param  {Function} fn      The function to be bound to a scope
 
 * @param  {Number=}   uid     An optional unique ID for the function to be set
 
 * @return {Function}
 
 * @private
 
 * @method bind
 
 */
 
export const bind = function(context, fn, uid) {
 
  // Make sure the function has a unique ID
 
  if (!fn.guid) { fn.guid = newGUID(); }
 

	
 
  // Create the new function that changes the context
 
  let ret = function() {
 
    return fn.apply(context, arguments);
 
  };
 

	
 
  // Allow for the ability to individualize this function
 
  // Needed in the case where multiple objects might share the same prototype
 
  // IF both items add an event listener with the same function, then you try to remove just one
 
  // it will remove both because they both have the same guid.
 
  // when using this, you need to use the bind method when you remove the listener as well.
 
  // currently used in text tracks
 
  ret.guid = (uid) ? uid + '_' + fn.guid : fn.guid;
 

	
 
  return ret;
 
};
ennstatus/static/js/video.js/src/js/utils/format-time.js
Show inline comments
 
new file 100644
 
/**
 
 * @file format-time.js
 
 *
 
 * Format seconds as a time string, H:MM:SS or M:SS
 
 * Supplying a guide (in seconds) will force a number of leading zeros
 
 * to cover the length of the guide
 
 *
 
 * @param  {Number} seconds Number of seconds to be turned into a string
 
 * @param  {Number} guide   Number (in seconds) to model the string after
 
 * @return {String}         Time formatted as H:MM:SS or M:SS
 
 * @private
 
 * @function formatTime
 
 */
 
function formatTime(seconds, guide=seconds) {
 
  let s = Math.floor(seconds % 60);
 
  let m = Math.floor(seconds / 60 % 60);
 
  let h = Math.floor(seconds / 3600);
 
  const gm = Math.floor(guide / 60 % 60);
 
  const gh = Math.floor(guide / 3600);
 

	
 
  // handle invalid times
 
  if (isNaN(seconds) || seconds === Infinity) {
 
    // '-' is false for all relational operators (e.g. <, >=) so this setting
 
    // will add the minimum number of fields specified by the guide
 
    h = m = s = '-';
 
  }
 

	
 
  // Check if we need to show hours
 
  h = (h > 0 || gh > 0) ? h + ':' : '';
 

	
 
  // If hours are showing, we may need to add a leading zero.
 
  // Always show at least one digit of minutes.
 
  m = (((h || gm >= 10) && m < 10) ? '0' + m : m) + ':';
 

	
 
  // Check if leading zero is need for seconds
 
  s = (s < 10) ? '0' + s : s;
 

	
 
  return h + m + s;
 
}
 

	
 
export default formatTime;
ennstatus/static/js/video.js/src/js/utils/guid.js
Show inline comments
 
new file 100644
 
/**
 
 * @file guid.js
 
 *
 
 * Unique ID for an element or function
 
 * @type {Number}
 
 * @private
 
 */
 
let _guid = 1;
 

	
 
/**
 
 * Get the next unique ID
 
 *
 
 * @return {String} 
 
 * @function newGUID
 
 */
 
export function newGUID() {
 
  return _guid++;
 
}
ennstatus/static/js/video.js/src/js/utils/log.js
Show inline comments
 
new file 100644
 
/**
 
 * @file log.js
 
 */
 
import window from 'global/window';
 

	
 
/**
 
 * Log plain debug messages
 
 */
 
const log = function(){
 
  _logType(null, arguments);
 
};
 

	
 
/**
 
 * Keep a history of log messages
 
 * @type {Array}
 
 */
 
log.history = [];
 

	
 
/**
 
 * Log error messages
 
 */
 
log.error = function(){
 
  _logType('error', arguments);
 
};
 

	
 
/**
 
 * Log warning messages
 
 */
 
log.warn = function(){
 
  _logType('warn', arguments);
 
};
 

	
 
/**
 
 * Log messages to the console and history based on the type of message
 
 *
 
 * @param  {String} type The type of message, or `null` for `log`
 
 * @param  {Object} args The args to be passed to the log
 
 * @private
 
 * @method _logType
 
 */
 
function _logType(type, args){
 
  // convert args to an array to get array functions
 
  let argsArray = Array.prototype.slice.call(args);
 
  // if there's no console then don't try to output messages
 
  // they will still be stored in log.history
 
  // Was setting these once outside of this function, but containing them
 
  // in the function makes it easier to test cases where console doesn't exist
 
  let noop = function(){};
 

	
 
  let console = window['console'] || {
 
    'log': noop,
 
    'warn': noop,
 
    'error': noop
 
  };
 

	
 
  if (type) {
 
    // add the type to the front of the message
 
    argsArray.unshift(type.toUpperCase()+':');
 
  } else {
 
    // default to log with no prefix
 
    type = 'log';
 
  }
 

	
 
  // add to history
 
  log.history.push(argsArray);
 

	
 
  // add console prefix after adding to history
 
  argsArray.unshift('VIDEOJS:');
 

	
 
  // call appropriate log function
 
  if (console[type].apply) {
 
    console[type].apply(console, argsArray);
 
  } else {
 
    // ie8 doesn't allow error.apply, but it will just join() the array anyway
 
    console[type](argsArray.join(' '));
 
  }
 
}
 

	
 
export default log;
ennstatus/static/js/video.js/src/js/utils/merge-options.js
Show inline comments
 
new file 100644
 
/**
 
 * @file merge-options.js
 
 */
 
import merge from 'lodash-compat/object/merge';
 

	
 
function isPlain(obj) {
 
  return !!obj
 
    && typeof obj === 'object'
 
    && obj.toString() === '[object Object]'
 
    && obj.constructor === Object;
 
}
 

	
 
/**
 
 * Merge customizer. video.js simply overwrites non-simple objects
 
 * (like arrays) instead of attempting to overlay them.
 
 * @see https://lodash.com/docs#merge
 
 */
 
const customizer = function(destination, source) {
 
  // If we're not working with a plain object, copy the value as is
 
  // If source is an array, for instance, it will replace destination
 
  if (!isPlain(source)) {
 
    return source;
 
  }
 

	
 
  // If the new value is a plain object but the first object value is not
 
  // we need to create a new object for the first object to merge with.
 
  // This makes it consistent with how merge() works by default
 
  // and also protects from later changes the to first object affecting
 
  // the second object's values.
 
  if (!isPlain(destination)) {
 
    return mergeOptions(source);
 
  }
 
};
 

	
 
/**
 
 * Merge one or more options objects, recursively merging **only**
 
 * plain object properties.  Previously `deepMerge`.
 
 *
 
 * @param  {...Object} source One or more objects to merge
 
 * @returns {Object}          a new object that is the union of all
 
 * provided objects
 
 * @function mergeOptions
 
 */
 
export default function mergeOptions() {
 
  // contruct the call dynamically to handle the variable number of
 
  // objects to merge
 
  let args = Array.prototype.slice.call(arguments);
 

	
 
  // unshift an empty object into the front of the call as the target
 
  // of the merge
 
  args.unshift({});
 

	
 
  // customize conflict resolution to match our historical merge behavior
 
  args.push(customizer);
 

	
 
  merge.apply(null, args);
 

	
 
  // return the mutated result object
 
  return args[0];
 
}
ennstatus/static/js/video.js/src/js/utils/stylesheet.js
Show inline comments
 
new file 100644
 
import document from 'global/document';
 

	
 
export let createStyleElement = function(className) {
 
  let style = document.createElement('style');
 
  style.className = className;
 

	
 
  return style;
 
};
 

	
 
export let setTextContent = function(el, content) {
 
  if (el.styleSheet) {
 
    el.styleSheet.cssText = content;
 
  } else {
 
    el.textContent = content;
 
  }
 
};
ennstatus/static/js/video.js/src/js/utils/time-ranges.js
Show inline comments
 
new file 100644
 
import log from './log.js';
 

	
 
/**
 
 * @file time-ranges.js
 
 *
 
 * Should create a fake TimeRange object
 
 * Mimics an HTML5 time range instance, which has functions that
 
 * return the start and end times for a range
 
 * TimeRanges are returned by the buffered() method
 
 *
 
 * @param  {(Number|Array)} Start of a single range or an array of ranges
 
 * @param  {Number} End of a single range
 
 * @private
 
 * @method createTimeRanges
 
 */
 
export function createTimeRanges(start, end){
 
  if (Array.isArray(start)) {
 
    return createTimeRangesObj(start);
 
  } else if (start === undefined || end === undefined) {
 
    return createTimeRangesObj();
 
  }
 
  return createTimeRangesObj([[start, end]]);
 
}
 

	
 
export { createTimeRanges as createTimeRange };
 

	
 
function createTimeRangesObj(ranges){
 
  if (ranges === undefined || ranges.length === 0) {
 
    return {
 
      length: 0,
 
      start: function() {
 
        throw new Error('This TimeRanges object is empty');
 
      },
 
      end: function() {
 
        throw new Error('This TimeRanges object is empty');
 
      }
 
    };
 
  }
 
  return {
 
    length: ranges.length,
 
    start: getRange.bind(null, 'start', 0, ranges),
 
    end: getRange.bind(null, 'end', 1, ranges)
 
  };
 
}
 

	
 
function getRange(fnName, valueIndex, ranges, rangeIndex){
 
  if (rangeIndex === undefined) {
 
    log.warn(`DEPRECATED: Function '${fnName}' on 'TimeRanges' called without an index argument.`);
 
    rangeIndex = 0;
 
  }
 
  rangeCheck(fnName, rangeIndex, ranges.length - 1);
 
  return ranges[rangeIndex][valueIndex];
 
}
 

	
 
function rangeCheck(fnName, index, maxIndex){
 
  if (index < 0 || index > maxIndex) {
 
    throw new Error(`Failed to execute '${fnName}' on 'TimeRanges': The index provided (${index}) is greater than or equal to the maximum bound (${maxIndex}).`);
 
  }
 
}
ennstatus/static/js/video.js/src/js/utils/to-title-case.js
Show inline comments
 
new file 100644
 
/**
 
 * @file to-title-case.js
 
 *
 
 * Uppercase the first letter of a string
 
 *
 
 * @param  {String} string String to be uppercased
 
 * @return {String}
 
 * @private
 
 * @method toTitleCase
 
 */
 
function toTitleCase(string){
 
  return string.charAt(0).toUpperCase() + string.slice(1);
 
}
 

	
 
export default toTitleCase;
ennstatus/static/js/video.js/src/js/utils/url.js
Show inline comments
 
new file 100644
 
/**
 
 * @file url.js
 
 */
 
import document from 'global/document';
 
import window from 'global/window';
 

	
 
/**
 
 * Resolve and parse the elements of a URL
 
 *
 
 * @param  {String} url The url to parse
 
 * @return {Object}     An object of url details
 
 * @method parseUrl
 
 */
 
export const parseUrl = function(url) {
 
  const props = ['protocol', 'hostname', 'port', 'pathname', 'search', 'hash', 'host'];
 

	
 
  // add the url to an anchor and let the browser parse the URL
 
  let a = document.createElement('a');
 
  a.href = url;
 

	
 
  // IE8 (and 9?) Fix
 
  // ie8 doesn't parse the URL correctly until the anchor is actually
 
  // added to the body, and an innerHTML is needed to trigger the parsing
 
  let addToBody = (a.host === '' && a.protocol !== 'file:');
 
  let div;
 
  if (addToBody) {
 
    div = document.createElement('div');
 
    div.innerHTML = `<a href="${url}"></a>`;
 
    a = div.firstChild;
 
    // prevent the div from affecting layout
 
    div.setAttribute('style', 'display:none; position:absolute;');
 
    document.body.appendChild(div);
 
  }
 

	
 
  // Copy the specific URL properties to a new object
 
  // This is also needed for IE8 because the anchor loses its
 
  // properties when it's removed from the dom
 
  let details = {};
 
  for (var i = 0; i < props.length; i++) {
 
    details[props[i]] = a[props[i]];
 
  }
 

	
 
  // IE9 adds the port to the host property unlike everyone else. If
 
  // a port identifier is added for standard ports, strip it.
 
  if (details.protocol === 'http:') {
 
    details.host = details.host.replace(/:80$/, '');
 
  }
 
  if (details.protocol === 'https:') {
 
    details.host = details.host.replace(/:443$/, '');
 
  }
 

	
 
  if (addToBody) {
 
    document.body.removeChild(div);
 
  }
 

	
 
  return details;
 
};
 

	
 
/**
 
 * Get absolute version of relative URL. Used to tell flash correct URL.
 
 * http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue
 
 *
 
 * @param  {String} url URL to make absolute
 
 * @return {String}     Absolute URL
 
 * @private
 
 * @method getAbsoluteURL
 
 */
 
export const getAbsoluteURL = function(url){
 
  // Check if absolute URL
 
  if (!url.match(/^https?:\/\//)) {
 
    // Convert to absolute URL. Flash hosted off-site needs an absolute URL.
 
    let div = document.createElement('div');
 
    div.innerHTML = `<a href="${url}">x</a>`;
 
    url = div.firstChild.href;
 
  }
 

	
 
  return url;
 
};
 

	
 
/**
 
 * Returns the extension of the passed file name. It will return an empty string if you pass an invalid path
 
 *
 
 * @param {String}    path    The fileName path like '/path/to/file.mp4'
 
 * @returns {String}          The extension in lower case or an empty string if no extension could be found.
 
 * @method getFileExtension
 
 */
 
export const getFileExtension = function(path) {
 
  if(typeof path === 'string'){
 
    let splitPathRe = /^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/\?]+)))(?:[\/]*|[\?].*)$/i;
 
    let pathParts = splitPathRe.exec(path);
 

	
 
    if (pathParts) {
 
      return pathParts.pop().toLowerCase();
 
    }
 
  }
 

	
 
  return '';
 
};
 

	
 
/**
 
 * Returns whether the url passed is a cross domain request or not.
 
 *
 
 * @param {String} url The url to check
 
 * @return {Boolean}   Whether it is a cross domain request or not
 
 * @method isCrossOrigin
 
 */
 
export const isCrossOrigin = function(url) {
 
  let urlInfo = parseUrl(url);
 
  let winLoc = window.location;
 

	
 
  // IE8 protocol relative urls will return ':' for protocol
 
  let srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol;
 

	
 
  // Check if url is for another domain/origin
 
  // IE8 doesn't know location.origin, so we won't rely on it here
 
  let crossOrigin = (srcProtocol + urlInfo.host) !== (winLoc.protocol + winLoc.host);
 

	
 
  return crossOrigin;
 
};
ennstatus/static/js/video.js/src/js/video.js
Show inline comments
 
new file 100644
 
/**
 
 * @file video.js
 
 */
 
import document from 'global/document';
 
import * as setup from './setup';
 
import * as stylesheet from './utils/stylesheet.js';
 
import Component from './component';
 
import EventTarget from './event-target';
 
import * as Events from './utils/events.js';
 
import Player from './player';
 
import plugin from './plugins.js';
 
import mergeOptions from '../../src/js/utils/merge-options.js';
 
import * as Fn from './utils/fn.js';
 
import TextTrack from './tracks/text-track.js';
 

	
 
import assign from 'object.assign';
 
import { createTimeRanges } from './utils/time-ranges.js';
 
import formatTime from './utils/format-time.js';
 
import log from './utils/log.js';
 
import * as Dom from './utils/dom.js';
 
import * as browser from './utils/browser.js';
 
import * as Url from './utils/url.js';
 
import extendFn from './extend.js';
 
import merge from 'lodash-compat/object/merge';
 
import createDeprecationProxy from './utils/create-deprecation-proxy.js';
 
import xhr from 'xhr';
 

	
 
// Include the built-in techs
 
import Html5 from './tech/html5.js';
 
import Flash from './tech/flash.js';
 

	
 
// HTML5 Element Shim for IE8
 
if (typeof HTMLVideoElement === 'undefined') {
 
  document.createElement('video');
 
  document.createElement('audio');
 
  document.createElement('track');
 
}
 

	
 
/**
 
 * Doubles as the main function for users to create a player instance and also
 
 * the main library object.
 
 * The `videojs` function can be used to initialize or retrieve a player.
 
 * ```js
 
 *     var myPlayer = videojs('my_video_id');
 
 * ```
 
 *
 
 * @param  {String|Element} id      Video element or video element ID
 
 * @param  {Object=} options        Optional options object for config/settings
 
 * @param  {Function=} ready        Optional ready callback
 
 * @return {Player}                 A player instance
 
 * @mixes videojs
 
 * @method videojs
 
 */
 
var videojs = function(id, options, ready){
 
  var tag; // Element of ID
 

	
 
  // Allow for element or ID to be passed in
 
  // String ID
 
  if (typeof id === 'string') {
 

	
 
    // Adjust for jQuery ID syntax
 
    if (id.indexOf('#') === 0) {
 
      id = id.slice(1);
 
    }
 

	
 
    // If a player instance has already been created for this ID return it.
 
    if (videojs.getPlayers()[id]) {
 

	
 
      // If options or ready funtion are passed, warn
 
      if (options) {
 
        log.warn(`Player "${id}" is already initialised. Options will not be applied.`);
 
      }
 

	
 
      if (ready) {
 
        videojs.getPlayers()[id].ready(ready);
 
      }
 

	
 
      return videojs.getPlayers()[id];
 

	
 
    // Otherwise get element for ID
 
    } else {
 
      tag = Dom.getEl(id);
 
    }
 

	
 
  // ID is a media element
 
  } else {
 
    tag = id;
 
  }
 

	
 
  // Check for a useable element
 
  if (!tag || !tag.nodeName) { // re: nodeName, could be a box div also
 
    throw new TypeError('The element or ID supplied is not valid. (videojs)'); // Returns
 
  }
 

	
 
  // Element may have a player attr referring to an already created player instance.
 
  // If not, set up a new player and return the instance.
 
  return tag['player'] || new Player(tag, options, ready);
 
};
 

	
 
// Add default styles
 
let style = document.querySelector('.vjs-styles-defaults');
 
if (!style) {
 
  style = stylesheet.createStyleElement('vjs-styles-defaults');
 
  let head = document.querySelector('head');
 
  head.insertBefore(style, head.firstChild);
 
  stylesheet.setTextContent(style, `
 
    .video-js {
 
      width: 300px;
 
      height: 150px;
 
    }
 

	
 
    .vjs-fluid {
 
      padding-top: 56.25%
 
    }
 
  `);
 
}
 

	
 
// Run Auto-load players
 
// You have to wait at least once in case this script is loaded after your video in the DOM (weird behavior only with minified version)
 
setup.autoSetupTimeout(1, videojs);
 

	
 
/*
 
 * Current software version (semver)
 
 *
 
 * @type {String}
 
 */
 
videojs.VERSION = '__VERSION__';
 

	
 
/**
 
 * The global options object. These are the settings that take effect
 
 * if no overrides are specified when the player is created.
 
 *
 
 * ```js
 
 *     videojs.options.autoplay = true
 
 *     // -> all players will autoplay by default
 
 * ```
 
 *
 
 * @type {Object}
 
 */
 
videojs.options = Player.prototype.options_;
 

	
 
/**
 
 * Get an object with the currently created players, keyed by player ID
 
 *
 
 * @return {Object} The created players
 
 * @mixes videojs
 
 * @method getPlayers
 
 */
 
videojs.getPlayers = function() {
 
  return Player.players;
 
};
 

	
 
/**
 
 * For backward compatibility, expose players object.
 
 *
 
 * @deprecated
 
 * @memberOf videojs
 
 * @property {Object|Proxy} players
 
 */
 
videojs.players = createDeprecationProxy(Player.players, {
 
  get: 'Access to videojs.players is deprecated; use videojs.getPlayers instead',
 
  set: 'Modification of videojs.players is deprecated'
 
});
 

	
 
/**
 
 * Get a component class object by name
 
 * ```js
 
 *     var VjsButton = videojs.getComponent('Button');
 
 *     // Create a new instance of the component
 
 *     var myButton = new VjsButton(myPlayer);
 
 * ```
 
 *
 
 * @return {Component} Component identified by name
 
 * @mixes videojs
 
 * @method getComponent
 
 */
 
videojs.getComponent = Component.getComponent;
 

	
 
/**
 
 * Register a component so it can referred to by name
 
 * Used when adding to other
 
 * components, either through addChild
 
 * `component.addChild('myComponent')`
 
 * or through default children options
 
 * `{ children: ['myComponent'] }`.
 
 * ```js
 
 *     // Get a component to subclass
 
 *     var VjsButton = videojs.getComponent('Button');
 
 *     // Subclass the component (see 'extend' doc for more info)
 
 *     var MySpecialButton = videojs.extend(VjsButton, {});
 
 *     // Register the new component
 
 *     VjsButton.registerComponent('MySepcialButton', MySepcialButton);
 
 *     // (optionally) add the new component as a default player child
 
 *     myPlayer.addChild('MySepcialButton');
 
 * ```
 
 * NOTE: You could also just initialize the component before adding.
 
 * `component.addChild(new MyComponent());`
 
 *
 
 * @param {String} The class name of the component
 
 * @param {Component} The component class
 
 * @return {Component} The newly registered component
 
 * @mixes videojs
 
 * @method registerComponent
 
 */
 
videojs.registerComponent = Component.registerComponent;
 

	
 
/**
 
 * A suite of browser and device tests
 
 *
 
 * @type {Object}
 
 * @private
 
 */
 
videojs.browser = browser;
 

	
 
/**
 
 * Whether or not the browser supports touch events. Included for backward
 
 * compatibility with 4.x, but deprecated. Use `videojs.browser.TOUCH_ENABLED`
 
 * instead going forward.
 
 *
 
 * @deprecated
 
 * @type {Boolean}
 
 */
 
videojs.TOUCH_ENABLED = browser.TOUCH_ENABLED;
 

	
 
/**
 
 * Subclass an existing class
 
 * Mimics ES6 subclassing with the `extend` keyword
 
 * ```js
 
 *     // Create a basic javascript 'class'
 
 *     function MyClass(name){
 
 *       // Set a property at initialization
 
 *       this.myName = name;
 
 *     }
 
 *     // Create an instance method
 
 *     MyClass.prototype.sayMyName = function(){
 
 *       alert(this.myName);
 
 *     };
 
 *     // Subclass the exisitng class and change the name
 
 *     // when initializing
 
 *     var MySubClass = videojs.extend(MyClass, {
 
 *       constructor: function(name) {
 
 *         // Call the super class constructor for the subclass
 
 *         MyClass.call(this, name)
 
 *       }
 
 *     });
 
 *     // Create an instance of the new sub class
 
 *     var myInstance = new MySubClass('John');
 
 *     myInstance.sayMyName(); // -> should alert "John"
 
 * ```
 
 *
 
 * @param {Function} The Class to subclass
 
 * @param {Object} An object including instace methods for the new class
 
 *                   Optionally including a `constructor` function
 
 * @return {Function} The newly created subclass
 
 * @mixes videojs
 
 * @method extend
 
 */
 
videojs.extend = extendFn;
 

	
 
/**
 
 * Merge two options objects recursively
 
 * Performs a deep merge like lodash.merge but **only merges plain objects**
 
 * (not arrays, elements, anything else)
 
 * Other values will be copied directly from the second object.
 
 * ```js
 
 *     var defaultOptions = {
 
 *       foo: true,
 
 *       bar: {
 
 *         a: true,
 
 *         b: [1,2,3]
 
 *       }
 
 *     };
 
 *     var newOptions = {
 
 *       foo: false,
 
 *       bar: {
 
 *         b: [4,5,6]
 
 *       }
 
 *     };
 
 *     var result = videojs.mergeOptions(defaultOptions, newOptions);
 
 *     // result.foo = false;
 
 *     // result.bar.a = true;
 
 *     // result.bar.b = [4,5,6];
 
 * ```
 
 *
 
 * @param {Object} The options object whose values will be overriden
 
 * @param {Object} The options object with values to override the first
 
 * @param {Object} Any number of additional options objects
 
 *
 
 * @return {Object} a new object with the merged values
 
 * @mixes videojs
 
 * @method mergeOptions
 
 */
 
videojs.mergeOptions = mergeOptions;
 

	
 
/**
 
 * Change the context (this) of a function
 
 *
 
 *     videojs.bind(newContext, function(){
 
 *       this === newContext
 
 *     });
 
 *
 
 * NOTE: as of v5.0 we require an ES5 shim, so you should use the native
 
 * `function(){}.bind(newContext);` instead of this.
 
 *
 
 * @param  {*}        context The object to bind as scope
 
 * @param  {Function} fn      The function to be bound to a scope
 
 * @param  {Number=}  uid     An optional unique ID for the function to be set
 
 * @return {Function}
 
 */
 
videojs.bind = Fn.bind;
 

	
 
/**
 
 * Create a Video.js player plugin
 
 * Plugins are only initialized when options for the plugin are included
 
 * in the player options, or the plugin function on the player instance is
 
 * called.
 
 * **See the plugin guide in the docs for a more detailed example**
 
 * ```js
 
 *     // Make a plugin that alerts when the player plays
 
 *     videojs.plugin('myPlugin', function(myPluginOptions) {
 
 *       myPluginOptions = myPluginOptions || {};
 
 *
 
 *       var player = this;
 
 *       var alertText = myPluginOptions.text || 'Player is playing!'
 
 *
 
 *       player.on('play', function(){
 
 *         alert(alertText);
 
 *       });
 
 *     });
 
 *     // USAGE EXAMPLES
 
 *     // EXAMPLE 1: New player with plugin options, call plugin immediately
 
 *     var player1 = videojs('idOne', {
 
 *       myPlugin: {
 
 *         text: 'Custom text!'
 
 *       }
 
 *     });
 
 *     // Click play
 
 *     // --> Should alert 'Custom text!'
 
 *     // EXAMPLE 3: New player, initialize plugin later
 
 *     var player3 = videojs('idThree');
 
 *     // Click play
 
 *     // --> NO ALERT
 
 *     // Click pause
 
 *     // Initialize plugin using the plugin function on the player instance
 
 *     player3.myPlugin({
 
 *       text: 'Plugin added later!'
 
 *     });
 
 *     // Click play
 
 *     // --> Should alert 'Plugin added later!'
 
 * ```
 
 *
 
 * @param {String} The plugin name
 
 * @param {Function} The plugin function that will be called with options
 
 * @mixes videojs
 
 * @method plugin
 
 */
 
videojs.plugin = plugin;
 

	
 
/**
 
 * Adding languages so that they're available to all players.
 
 * ```js
 
 *     videojs.addLanguage('es', { 'Hello': 'Hola' });
 
 * ```
 
 *
 
 * @param  {String} code The language code or dictionary property
 
 * @param  {Object} data The data values to be translated
 
 * @return {Object} The resulting language dictionary object
 
 * @mixes videojs
 
 * @method addLanguage
 
 */
 
videojs.addLanguage = function(code, data){
 
  code = ('' + code).toLowerCase();
 
  return merge(videojs.options.languages, { [code]: data })[code];
 
};
 

	
 
/**
 
 * Log debug messages.
 
 *
 
 * @param {...Object} messages One or more messages to log
 
 */
 
videojs.log = log;
 

	
 
/**
 
 * Creates an emulated TimeRange object.
 
 *
 
 * @param  {Number|Array} start Start time in seconds or an array of ranges
 
 * @param  {Number} end   End time in seconds
 
 * @return {Object}       Fake TimeRange object
 
 * @method createTimeRange
 
 */
 
videojs.createTimeRange = videojs.createTimeRanges = createTimeRanges;
 

	
 
/**
 
 * Format seconds as a time string, H:MM:SS or M:SS
 
 * Supplying a guide (in seconds) will force a number of leading zeros
 
 * to cover the length of the guide
 
 *
 
 * @param  {Number} seconds Number of seconds to be turned into a string
 
 * @param  {Number} guide   Number (in seconds) to model the string after
 
 * @return {String}         Time formatted as H:MM:SS or M:SS
 
 * @method formatTime
 
 */
 
videojs.formatTime = formatTime;
 

	
 
/**
 
 * Resolve and parse the elements of a URL
 
 *
 
 * @param  {String} url The url to parse
 
 * @return {Object}     An object of url details
 
 * @method parseUrl
 
 */
 
videojs.parseUrl = Url.parseUrl;
 

	
 
/**
 
 * Returns whether the url passed is a cross domain request or not.
 
 *
 
 * @param {String} url The url to check
 
 * @return {Boolean}   Whether it is a cross domain request or not
 
 * @method isCrossOrigin
 
 */
 
videojs.isCrossOrigin = Url.isCrossOrigin;
 

	
 
/**
 
 * Event target class.
 
 *
 
 * @type {Function}
 
 */
 
videojs.EventTarget = EventTarget;
 

	
 
/**
 
 * Add an event listener to element
 
 * It stores the handler function in a separate cache object
 
 * and adds a generic handler to the element's event,
 
 * along with a unique id (guid) to the element.
 
 *
 
 * @param  {Element|Object}   elem Element or object to bind listeners to
 
 * @param  {String|Array}   type Type of event to bind to.
 
 * @param  {Function} fn   Event listener.
 
 * @method on
 
 */
 
videojs.on = Events.on;
 

	
 
/**
 
 * Trigger a listener only once for an event
 
 *
 
 * @param  {Element|Object}   elem Element or object to
 
 * @param  {String|Array}   type Name/type of event
 
 * @param  {Function} fn Event handler function
 
 * @method one
 
 */
 
videojs.one = Events.one;
 

	
 
/**
 
 * Removes event listeners from an element
 
 *
 
 * @param  {Element|Object}   elem Object to remove listeners from
 
 * @param  {String|Array=}   type Type of listener to remove. Don't include to remove all events from element.
 
 * @param  {Function} fn   Specific listener to remove. Don't include to remove listeners for an event type.
 
 * @method off
 
 */
 
videojs.off = Events.off;
 

	
 
/**
 
 * Trigger an event for an element
 
 *
 
 * @param  {Element|Object}      elem  Element to trigger an event on
 
 * @param  {Event|Object|String} event A string (the type) or an event object with a type attribute
 
 * @param  {Object} [hash] data hash to pass along with the event
 
 * @return {Boolean=} Returned only if default was prevented
 
 * @method trigger
 
 */
 
videojs.trigger = Events.trigger;
 

	
 
/**
 
 * A cross-browser XMLHttpRequest wrapper. Here's a simple example:
 
 *
 
 *     videojs.xhr({
 
 *       body: someJSONString,
 
 *       uri: "/foo",
 
 *       headers: {
 
 *         "Content-Type": "application/json"
 
 *       }
 
 *     }, function (err, resp, body) {
 
 *       // check resp.statusCode
 
 *     });
 
 *
 
 * Check out the [full
 
 * documentation](https://github.com/Raynos/xhr/blob/v2.1.0/README.md)
 
 * for more options.
 
 *
 
 * @param {Object} options settings for the request.
 
 * @return {XMLHttpRequest|XDomainRequest} the request object.
 
 * @see https://github.com/Raynos/xhr
 
 */
 
videojs.xhr = xhr;
 

	
 
/**
 
 * TextTrack class
 
 *
 
 * @type {Function}
 
 */
 
videojs.TextTrack = TextTrack;
 

	
 
// REMOVING: We probably should add this to the migration plugin
 
// // Expose but deprecate the window[componentName] method for accessing components
 
// Object.getOwnPropertyNames(Component.components).forEach(function(name){
 
//   let component = Component.components[name];
 
//
 
//   // A deprecation warning as the constuctor
 
//   module.exports[name] = function(player, options, ready){
 
//     log.warn('Using videojs.'+name+' to access the '+name+' component has been deprecated. Please use videojs.getComponent("componentName")');
 
//
 
//     return new Component(player, options, ready);
 
//   };
 
//
 
//   // Allow the prototype and class methods to be accessible still this way
 
//   // Though anything that attempts to override class methods will no longer work
 
//   assign(module.exports[name], component);
 
// });
 

	
 
/*
 
 * Custom Universal Module Definition (UMD)
 
 *
 
 * Video.js will never be a non-browser lib so we can simplify UMD a bunch and
 
 * still support requirejs and browserify. This also needs to be closure
 
 * compiler compatible, so string keys are used.
 
 */
 
if (typeof define === 'function' && define['amd']) {
 
  define('videojs', [], function(){ return videojs; });
 

	
 
// checking that module is an object too because of umdjs/umd#35
 
} else if (typeof exports === 'object' && typeof module === 'object') {
 
  module['exports'] = videojs;
 
}
 

	
 
export default videojs;
ennstatus/static/videos/subtitles/Tor_animation.ar.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:00.660 --> 00:00:03.200
 
.لقد إعتدنا للغاية علي استخدام الإنترنت
 
 
2
 
00:00:03.520 --> 00:00:06.660
 
:نشر معلومات باستمرار عن أنفسنا وحياتنا الخاصة
 
 
3
 
00:00:07.020 --> 00:00:09.920
 
،الطعام الذي نأكله، الاشخاص الذين نقابلهم
 
 
4
 
00:00:10.060 --> 00:00:12.600
 
.الأماكن التي نذهب إليها، والاشياء التي نقرأ
 
 
5
 
00:00:13.220 --> 00:00:15.540
 
.دعوني أشرح ما الذي أقصده بشكل مختلف
 
 
6
 
00:00:16.120 --> 00:00:18.740
 
،في هذه اللحظة
 
،إذا حاول شخص ما البحث عنك
 
 
7
 
00:00:19.000 --> 00:00:22.740
 
،سيعلم هويتك، ومكان إقامتك
 
ونظام التشغيل الذي تستخدمه
 
 
8
 
00:00:23.180 --> 00:00:26.280
 
،والمواقع التي تزورها
 
.والمتصفح الذي تستخدمه
 
 
9
 
00:00:26.700 --> 00:00:29.000
 
وكثير من البيانات عنك وعن حياتك
 
 
10
 
00:00:29.200 --> 00:00:31.500
 
،التي ربما لم تقصد مشاركتها مع الغرباء
 
 
11
 
00:00:31.700 --> 00:00:34.000
 
.الذين يمكنهم استخدام بياناتك لإستغلالك
 
 
12
 
00:00:34.500 --> 00:00:37.000
 
!ولكن ليس إذا إستخدمت تور
 
 
13
 
00:00:37.740 --> 00:00:40.800
 
.متصفح تور يحمي خصوصيتنا وهويتنا علي الإنترنت
 
 
14
 
00:00:41.000 --> 00:00:44.800
 
.يحمي تور إتصالك بالإنترنت بثلاث طبقات من التشفير
 
 
15
 
00:00:45.000 --> 00:00:49.300
 
ثم يمرر إتصالك من خلال ثلاث خوادم
 
،يديرها متطوعين حول العالم
 
 
16
 
00:00:49.500 --> 00:00:53.980
 
.مما يسمح لنا بالتواصل علي الإنترنت بشكل مجهول
 
 
17
 
00:00:54.900 --> 00:00:56.640
 
تور أيضاً يحمي بياناتنا
 
 
18
 
00:00:56.740 --> 00:01:02.600
 
ضد مراقبة الشركات والجهات الحكومية
 
.ومراقبة الجمهور
 
 
19
 
00:01:02.800 --> 00:01:07.480
 
.ربما تعيش في بلد قمعي يحاول السيطرة علي الإنترنت ومراقبته
 
 
20
 
00:01:07.840 --> 00:01:13.000
 
.أو ربما لا تريد أن تستفيد الشركات الكبري من بياناتك الشخصية
 
 
21
 
00:01:13.800 --> 00:01:16.500
 
تور يجعل كل مستخدم يشبه الآخر
 
 
22
 
00:01:16.700 --> 00:01:20.800
 
.مما يجعل الجهة المراقبة يخطلت عليها الأمر لأنك مجهول
 
 
23
 
00:01:21.900 --> 00:01:25.700
 
،ولذلك كلما زاد عدد مستخدمي تور، كلما أصبح أقوي
 
 
24
 
00:01:25.800 --> 00:01:29.800
 
.لأن من السهل الإختباء في حشد من الناس يشبهون بعضهم البعض
 
 
25
 
00:01:30.000 --> 00:01:32.500
 
يمكنك تجاوز الرقابة دون الشعور بالقلق
 
 
26
 
00:01:32.700 --> 00:01:36.100
 
.من ان يري الرقيب ماذا تفعله علي الإنترنت
 
 
27
 
00:01:36.300 --> 00:01:39.200
 
،لن يتم تتبعك بالإعلانات في كل مكان لشهور
 
 
28
 
00:01:39.400 --> 00:01:43.300
 
.منذ اليوم الأول الذي زرت فيه صفحة المنتج
 
 
29
 
00:01:43.800 --> 00:01:46.300
 
إذا استخدمت تور، لن تتعرف المواقع علي هويتك
 
 
30
 
00:01:46.500 --> 00:01:48.500
 
،والمكان الذي تزورها منه
 
 
31
 
00:01:48.700 --> 00:01:51.320
 
.إلا إذا سجلت دخولك وكشفت عن هويتك
 
 
32
 
00:01:53.200 --> 00:01:55.500
 
،إذا حملت واستخدمت تور
 
 
33
 
00:01:55.700 --> 00:01:58.440
 
يمكنك حماية الاشخاص الذين يحتاجون إخفاء هويتهم
 
 
34
 
00:01:58.840 --> 00:02:03.500
 
.مثل، النشطاء، والصحفيون، والمدونون
 
 
35
 
00:02:04.000 --> 00:02:09.000
 
!حمل تور واستخدمه! أو شغل خادم
 
 
36
 
00:02:12.400 --> 00:02:15.200
 
ترجمة شريف علاء
 
ennstatus/static/videos/subtitles/Tor_animation.ca.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:00.660 --> 00:00:02.780
 
Ens hem acostumat molt a internet.
 
 
2
 
00:00:03.120 --> 00:00:07.700
 
Estem compartint informació constantment
 
sobre nosaltres i la nostra vida privada:
 
 
3
 
00:00:08.000 --> 00:00:09.960
 
el menjar que mengem, la gent que coneixem,
 
 
4
 
00:00:10.180 --> 00:00:12.480
 
els llocs on anem i les coses que llegim.
 
 
5
 
00:00:13.280 --> 00:00:14.640
 
Deixa que m'expliqui millor.
 
 
6
 
00:00:14.920 --> 00:00:17.740
 
En aquest precís moment, 
 
si algú intenta localitzar-vos,
 
 
7
 
00:00:18.060 --> 00:00:22.480
 
veurà la vostra identitat real, 
 
la localització precisa, el sistema operatiu,
 
 
8
 
00:00:22.800 --> 00:00:26.500
 
tots els llocs web que heu visitat, 
 
el navegador que useu per navegar per internet,
 
 
9
 
00:00:26.700 --> 00:00:29.140
 
i molta més informació
 
sobre vosaltres i la vostra vida.
 
 
10
 
00:00:29.200 --> 00:00:31.500
 
la qual probablement no teníeu intenció
 
de compartir amb desconeguts,
 
 
11
 
00:00:31.700 --> 00:00:34.000
 
que podrien fer servir fàcilment aquesta informació
 
per abusar de vosaltres.
 
 
12
 
00:00:34.500 --> 00:00:37.000
 
Però això no passa si esteu fent servir Tor!
 
 
13
 
00:00:37.140 --> 00:00:40.840
 
El navegador Tor protegeix la nostra privadesa
 
i la nostra identitat a Internet.
 
 
14
 
00:00:41.560 --> 00:00:44.760
 
Tor assegura la teva connexió
 
amb tres capes d'encriptatge.
 
 
15
 
00:00:44.940 --> 00:00:49.760
 
i la passa per tres servidors duts a terme
 
voluntàriament a tot el món,
 
 
16
 
00:00:50.280 --> 00:00:53.520
 
que ens permeten comunicar-nos
 
de manera anònima per Internet.
 
 
17
 
00:00:56.560 --> 00:00:58.280
 
Tor també protegeix la nostra informació
 
 
18
 
00:00:58.400 --> 00:01:01.900
 
dels objectius del govern o les grans empreses
 
i la vigilància massiva.
 
 
19
 
00:01:02.880 --> 00:01:07.340
 
Potser viviu en un país repressiu
 
que intenta controlar i vigilar Internet.
 
 
20
 
00:01:07.900 --> 00:01:11.800
 
O potser no voleu que les grans empreses
 
s'aprofitin de la vostra informació personal.
 
 
21
 
00:01:12.880 --> 00:01:15.640
 
Tot fa que tots els seus usuaris
 
siguin iguals
 
 
22
 
00:01:15.920 --> 00:01:18.800
 
cosa que confon l'observador
 
i us fa anònims.
 
 
23
 
00:01:19.500 --> 00:01:22.980
 
Per tant, quanta més gent faci servir la xarxa Tor
 
més forta es farà
 
 
24
 
00:01:23.140 --> 00:01:27.800
 
ja que és més fàcil amagar-se en una multitud
 
de gent que és idèntica.
 
 
25
 
00:01:28.700 --> 00:01:31.240
 
Podeu sortejar la censura
 
sense preocupar-vos que
 
 
26
 
00:01:31.400 --> 00:01:34.100
 
el censor sàpigue el que feu
 
a internet.
 
 
27
 
00:01:36.540 --> 00:01:39.440
 
Els anuncis no us seguiran
 
allà on aneu durant mesos,
 
 
28
 
00:01:39.640 --> 00:01:41.300
 
començant per quan vau fer
 
clic per primer cop en un producte.
 
 
29
 
00:01:43.880 --> 00:01:47.380
 
Fent servir Tor, els llocs que visiteu
 
no sabran ni qui sou,
 
 
30
 
00:01:47.540 --> 00:01:49.760
 
ni de quina part del món
 
els esteu visitant
 
 
31
 
00:01:49.920 --> 00:01:51.920
 
a no ser que us identifiqueu i els ho digueu.
 
 
32
 
00:01:54.200 --> 00:01:55.840
 
Baixant i usant Tor
 
 
33
 
00:01:56.200 --> 00:01:58.560
 
podeu protegir la gent
 
que necessita anonimat.
 
 
34
 
00:01:58.880 --> 00:02:01.640
 
com els activistes, periodistes i bloggers.
 
 
35
 
00:02:02.000 --> 00:02:07.000
 
Baixa i utilitza Tor! O executa un relé!
 
ennstatus/static/videos/subtitles/Tor_animation.de.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:02.000 --> 00:00:04.500
 
Das Internet ist schon längst
 
Teil unseres Alltags geworden.
 
 
2
 
00:00:04.700 --> 00:00:07.700
 
Wir teilen ständig Dinge über uns
 
und unser Privatleben:
 
 
3
 
00:00:08.000 --> 00:00:11.000
 
was wir essen,
 
Leute, die wir treffen,
 
 
4
 
00:00:11.200 --> 00:00:14.200
 
Orte, die wir besuchen,
 
und was wir lesen.
 
 
5
 
00:00:14.500 --> 00:00:16.400
 
Lass es mich genauer erklären.
 
 
6
 
00:00:16.600 --> 00:00:19.600
 
In diesem Moment, wenn jemand versucht
 
etwas über dich herauszufinden,
 
 
7
 
00:00:19.800 --> 00:00:23.200
 
sieht er wer du bist, wo du bist,
 
erkennt dein Betriebssystem,
 
 
8
 
00:00:23.400 --> 00:00:26.500
 
die Webseiten die du besucht hast
 
und den Browser den du dafür benutzt hast,
 
 
9
 
00:00:26.700 --> 00:00:29.000
 
und so viel mehr Informationen über dich,
 
 
10
 
00:00:29.200 --> 00:00:31.500
 
die du vermutlich nicht
 
mit jemandem teilen wolltest,
 
 
11
 
00:00:31.700 --> 00:00:34.000
 
der deine Daten für seine Zwecke ausnutzt.
 
 
12
 
00:00:34.500 --> 00:00:37.000
 
Das passiert nicht, wenn du Tor benutzt!
 
 
13
 
00:00:37.200 --> 00:00:40.800
 
Der Tor Browser schützt
 
deine Privatsphäre im Netz.
 
 
14
 
00:00:41.000 --> 00:00:44.800
 
Tor schützt deine Internetverbindung
 
durch drei Verschlüsselungsschichten
 
 
15
 
00:00:45.000 --> 00:00:47.000
 
und lenkt sie über drei Server,
 
 
16
 
00:00:47.200 --> 00:00:49.300
 
die von Freiwilligen
 
auf der ganzen Welt betrieben werden.
 
 
17
 
00:00:49.500 --> 00:00:54.500
 
Das ermöglicht dir dich
 
im Internet anonym zu bewegen.
 
 
18
 
00:00:55.000 --> 00:00:57.400
 
Tor schützt dich außerdem
 
 
19
 
00:00:57.600 --> 00:01:02.600
 
vor Massenüberwachung
 
durch Konzerne und Regierungen.
 
 
20
 
00:01:02.800 --> 00:01:05.200
 
Vielleicht lebst du
 
in einem autoritären Land,
 
 
21
 
00:01:05.400 --> 00:01:07.800
 
das versucht das Internet
 
zu kontrollieren und zu überwachen.
 
 
22
 
00:01:08.000 --> 00:01:10.400
 
Oder vielleicht willst du einfach nicht,
 
dass große Unternehmen
 
 
23
 
00:01:10.600 --> 00:01:13.000
 
deine persönlichen Informationen
 
zu ihrem Vorteil nutzen können.
 
 
24
 
00:01:13.800 --> 00:01:16.500
 
Tor lässt alle Benutzer gleich aussehen.
 
 
25
 
00:01:16.700 --> 00:01:20.800
 
Das verwirrt den Beobachter
 
und macht dich anonym.
 
 
26
 
00:01:21.900 --> 00:01:25.700
 
Je mehr Leute das Tor-Netzwerk benutzen,
 
desto stärker wird es.
 
 
27
 
00:01:25.800 --> 00:01:29.800
 
Es ist leichter sich in einer Menschenmenge
 
zu verstecken, wenn alle gleich aussehen.
 
 
28
 
00:01:30.000 --> 00:01:32.500
 
Du kannst außerdem Zensurmaßnahmen umgehen
 
ohne dich darum zu sorgen,
 
 
29
 
00:01:32.700 --> 00:01:36.100
 
dass der Zensor weiß
 
was du im Internet machst.
 
 
30
 
00:01:36.300 --> 00:01:39.200
 
Werbung wird dich nicht mehr
 
monatelang verfolgen,
 
 
31
 
00:01:39.400 --> 00:01:43.300
 
nur weil du einmal
 
auf ein Produkt geklickt hast.
 
 
32
 
00:01:43.800 --> 00:01:46.300
 
Wenn du Tor benutzt
 
wissen die Webseiten nicht wer du bist
 
 
33
 
00:01:46.500 --> 00:01:48.500
 
und aus welchem Teil der Welt
 
du auf sie zugreifst,
 
 
34
 
00:01:48.700 --> 00:01:50.700
 
es sei denn du loggst dich ein
 
und sagst es ihnen.
 
 
35
 
00:01:53.200 --> 00:01:55.500
 
Wenn du Tor herunterlädst und benutzt
 
 
36
 
00:01:55.700 --> 00:01:58.000
 
kannst du Leute beschützen,
 
die Anonymität brauchen
 
 
37
 
00:01:58.200 --> 00:02:03.500
 
wie zum Beispiel Aktivisten,
 
Journalisten und Blogger.
 
 
38
 
00:02:04.000 --> 00:02:07.000
 
Installiere Tor und benutze es!
 
 
39
 
00:02:07.200 --> 00:02:10.000
 
Oder betreibe einen Relay!
 
 
40
 
00:02:12.400 --> 00:02:15.200
 
Übersetzung von Karsten Loesing
 
ennstatus/static/videos/subtitles/Tor_animation.en.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:00.660 --> 00:00:02.780
 
We've gotten very used to the Internet.
 
 
2
 
00:00:03.120 --> 00:00:07.700
 
We are constantly sharing information
 
about ourselves and our private lives:
 
 
3
 
00:00:08.000 --> 00:00:09.960
 
food we eat, people we meet,
 
 
4
 
00:00:10.180 --> 00:00:12.480
 
places we go, and the stuff we read.
 
 
5
 
00:00:13.280 --> 00:00:14.640
 
Let me explain it better.
 
 
6
 
00:00:14.920 --> 00:00:17.740
 
Right at this moment,
 
if someone attempts to look you up,
 
 
7
 
00:00:18.060 --> 00:00:22.480
 
they'll see your real identity,
 
precise location, operating system,
 
 
8
 
00:00:22.800 --> 00:00:26.500
 
all the sites you've visited,
 
the browser you use to surf the web,
 
 
9
 
00:00:26.700 --> 00:00:29.140
 
and so much more information
 
about you and your life
 
 
10
 
00:00:29.200 --> 00:00:31.500
 
which you probably didn't mean
 
to share with unknown strangers,
 
 
11
 
00:00:31.700 --> 00:00:34.000
 
who could easily use this data
 
to exploit you.
 
 
12
 
00:00:34.500 --> 00:00:37.000
 
But not if you're using Tor!
 
 
13
 
00:00:37.140 --> 00:00:40.840
 
Tor Browser protects our privacy
 
and identity on the Internet.
 
 
14
 
00:00:41.560 --> 00:00:44.760
 
Tor secures your connection
 
with three layers of encryption
 
 
15
 
00:00:44.940 --> 00:00:49.760
 
and passes it through three voluntarily
 
operated servers around the world,
 
 
16
 
00:00:50.280 --> 00:00:53.520
 
which enables us to communicate
 
anonymously over the Internet.
 
 
17
 
00:00:56.560 --> 00:00:58.280
 
Tor also protects our data
 
 
18
 
00:00:58.400 --> 00:01:01.900
 
against corporate or government targeted
 
and mass surveillance.
 
 
19
 
00:01:02.880 --> 00:01:07.340
 
Perhaps you live in a repressive country
 
which tries to control and surveil the Internet.
 
 
20
 
00:01:07.900 --> 00:01:11.800
 
Or perhaps you don't want big corporations
 
taking advantage of your personal information.
 
 
21
 
00:01:12.880 --> 00:01:15.640
 
Tor makes all of its users
 
to look the same
 
 
22
 
00:01:15.920 --> 00:01:18.800
 
which confuses the observer
 
and makes you anonymous.
 
 
23
 
00:01:19.500 --> 00:01:22.980
 
So, the more people use the Tor network,
 
the stronger it gets
 
 
24
 
00:01:23.140 --> 00:01:27.800
 
as it's easier to hide in a crowd
 
of people who look exactly the same.
 
 
25
 
00:01:28.700 --> 00:01:31.240
 
You can bypass the censorship
 
without being worried about
 
 
26
 
00:01:31.400 --> 00:01:34.100
 
the censor knowing what you do
 
on the Internet.
 
 
27
 
00:01:36.540 --> 00:01:39.440
 
The ads won't follow you
 
everywhere for months,
 
 
28
 
00:01:39.640 --> 00:01:41.300
 
starting when you first
 
clicked on a product.
 
 
29
 
00:01:43.880 --> 00:01:47.380
 
By using Tor, the sites you visit
 
won't even know who you are,
 
 
30
 
00:01:47.540 --> 00:01:49.760
 
from what part of the world
 
you're visiting them,
 
 
31
 
00:01:49.920 --> 00:01:51.920
 
unless you login and tell them so.
 
 
32
 
00:01:54.200 --> 00:01:55.840
 
By downloading and using Tor,
 
 
33
 
00:01:56.200 --> 00:01:58.560
 
you can protect the people
 
who need anonymity,
 
 
34
 
00:01:58.880 --> 00:02:01.640
 
like activists, journalists and bloggers.
 
 
35
 
00:02:02.000 --> 00:02:07.000
 
Download and use Tor! Or run a relay!
 
ennstatus/static/videos/subtitles/Tor_animation.es.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:02.000 --> 00:00:04.500
 
Nos hemos habituado mucho a Internet,
 
 
2
 
00:00:04.700 --> 00:00:07.700
 
y constantemente compartimos información sobre nosotros y nuestra vida privada:
 
 
3
 
00:00:08.000 --> 00:00:11.000
 
qué comemos,
 
a quién vemos,
 
 
4
 
00:00:11.200 --> 00:00:14.200
 
a dónde vamos,
 
y qué leemos.
 
 
5
 
00:00:14.500 --> 00:00:16.400
 
Déjame explicarlo mejor.
 
 
6
 
00:00:16.600 --> 00:00:19.600
 
Ahora mismo, si alguien quiere averiguar cosas sobre ti,
 
 
7
 
00:00:19.800 --> 00:00:23.200
 
vería tu identidad real, tu localización exacta, tu Sistema Operativo,
 
 
8
 
00:00:23.400 --> 00:00:26.500
 
todas las páginas que has visitado, y el navegador que utilizas para la web,
 
 
9
 
00:00:26.700 --> 00:00:29.000
 
y mucha más información acerca de ti
 
 
10
 
00:00:29.200 --> 00:00:31.500
 
que tú probablemente no querías
 
 
11
 
00:00:31.700 --> 00:00:34.000
 
compartir con extraños, que pueden usarla para perjudicarte.
 
 
12
 
00:00:34.500 --> 00:00:37.000
 
¡Pero no si utilizas Tor!
 
 
13
 
00:00:37.200 --> 00:00:40.800
 
Tor Browser proteje tu privacidad e identidad en Internet.
 
 
14
 
00:00:41.000 --> 00:00:44.800
 
Tor asegura tu conexión con tres capas de cifrado,
 
 
15
 
00:00:45.000 --> 00:00:49.300
 
y la dirige a través de tres servidores administrados por voluntarios alrededor del planeta,
 
 
16
 
00:00:49.500 --> 00:00:54.500
 
lo que nos permite comunicarnos anónimamente a través de Internet.
 
 
17
 
00:00:55.000 --> 00:00:57.400
 
Tor además protege nuestros datos
 
 
18
 
00:00:57.600 --> 00:01:02.600
 
contra la vigilancia masiva de gobiernos o empresas.
 
 
19
 
00:01:02.800 --> 00:01:07.800
 
Quizás vives en un país represivo que intenta controlar y vigilar Internet.
 
 
20
 
00:01:08.000 --> 00:01:13.000
 
O quizás simplemente no quieres que las grandes compañías se aprovechen de tu información personal.
 
 
21
 
00:01:13.800 --> 00:01:16.500
 
Tor hace que todos sus usuarios parezcan iguales,
 
 
22
 
00:01:16.700 --> 00:01:20.800
 
lo que confunde al observador y a ti te hace anónimo.
 
 
23
 
00:01:21.900 --> 00:01:25.700
 
Así, cuanta más gente utilice la red Tor,
 
ésta se hace más fuerte,
 
 
24
 
00:01:25.800 --> 00:01:29.800
 
ya que es más sencillo ocultarse en una multitud de personas que parecen exactamente iguales.
 
 
25
 
00:01:30.000 --> 00:01:32.500
 
Sí, puedes evitar la censura
 
 
26
 
00:01:32.700 --> 00:01:36.100
 
sin preocuparte de que el censor sepa qué haces en Internet.
 
 
27
 
00:01:36.300 --> 00:01:39.200
 
Los anuncios no te perseguirán
 
 
28
 
00:01:39.400 --> 00:01:43.300
 
durante meses a partir de la primera vez que hiciste click en un producto.
 
 
29
 
00:01:43.800 --> 00:01:46.300
 
Al utilizar Tor, los sitios que visites ni siquiera sabrán quién eres
 
 
30
 
00:01:46.500 --> 00:01:48.500
 
ni desde qué parte del mundo los visitas
 
 
31
 
00:01:48.700 --> 00:01:50.700
 
a menos que te identifiques y se lo digas.
 
 
32
 
00:01:53.200 --> 00:01:55.500
 
Descargando y utilizando Tor,
 
 
33
 
00:01:55.700 --> 00:01:58.000
 
ayudas a proteger a las personas que necesitan anonimato,
 
 
34
 
00:01:58.200 --> 00:02:03.500
 
por ejemplo, activistas, periodistas y blogueros.
 
 
35
 
00:02:04.000 --> 00:02:09.000
 
¡Descarga y usa Tor! ¡O ayuda con un servidor!
 
ennstatus/static/videos/subtitles/Tor_animation.eu.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:02.000 --> 00:00:04.500
 
Erabat ohitu gara Internet erabiltzera.
 
 
2
 
00:00:04.700 --> 00:00:07.700
 
Gure bizitzako informazio pribatua
 
sareratzen dugu etengabe:
 
 
3
 
00:00:08.000 --> 00:00:11.000
 
zer jaten dugun,
 
nor bisitatzen dugun,
 
 
4
 
00:00:11.200 --> 00:00:14.200
 
nora goazen
 
eta zer irakurtzen dugun.
 
 
5
 
00:00:14.500 --> 00:00:16.400
 
Utzidazu hobeto azaltzen.
 
 
6
 
00:00:16.600 --> 00:00:19.600
 
Oraintxe bertan,
 
aztertu nahi bazindute,
 
 
7
 
00:00:19.800 --> 00:00:23.200
 
zure benetako nortasuna,
 
kokapen zehatza, sistema eragilea,
 
 
8
 
00:00:23.400 --> 00:00:26.500
 
ikusitako webgune oro,
 
sarean erabilitako nabigatzailea,
 
 
9
 
00:00:26.700 --> 00:00:29.000
 
eta askoz informazio gehiago ikus dezakete
 
zutaz eta zeure bizitzaz
 
 
10
 
00:00:29.200 --> 00:00:31.500
 
ziur aski ezezagunekin
 
banatu nahi ez duzuna,
 
 
11
 
00:00:31.700 --> 00:00:34.000
 
erraztazunez zu kaltetzeko
 
erabil dezaketen horiekin.
 
 
12
 
00:00:34.500 --> 00:00:37.000
 
Baina ez Tor erabiltzen baduzu!
 
 
13
 
00:00:37.200 --> 00:00:40.800
 
Tor Browser-ek zure pribatutasuna
 
eta nortasuna babesten ditu Interneten.
 
 
14
 
00:00:41.000 --> 00:00:44.800
 
Tor-ek zure konexioa babesten du
 
hiru zifraketa-geruza erabiliz
 
 
15
 
00:00:45.000 --> 00:00:49.300
 
eta munduan zehar bolondreski kudeatutako
 
hiru zerbitzari desberdinetatik bideratzen du,
 
 
16
 
00:00:49.500 --> 00:00:54.500
 
Interneten zehar anonimoki
 
komunikatzea ahalbidetuz.
 
 
17
 
00:00:55.000 --> 00:00:57.400
 
Tor-ek gainera gure datuak babesten ditu
 
 
18
 
00:00:57.600 --> 00:01:02.600
 
gobernu zein enpresen espioitza selektibo eta masibotik.
 
 
19
 
00:01:02.800 --> 00:01:07.800
 
Baliteke zu, Internet kontrolatzen eta zelatatzen duen herrialde errepresibo baten bizitzea.
 
 
20
 
00:01:08.000 --> 00:01:13.000
 
Edo beharbada ez duzu nahi konpainia handiak zure informazio pertsonalaz baliatzea.
 
 
21
 
00:01:13.800 --> 00:01:16.500
 
Tor-ek, bere erabiltzaile guztiak
 
berdintsu egiten ditu
 
 
22
 
00:01:16.700 --> 00:01:20.800
 
zelataria nahasiz eta zu anonimo bihurtuz.
 
 
23
 
00:01:21.900 --> 00:01:25.700
 
Hortaz, zenbat eta jende gehiagok Tor sarea erabili, orduan eta indartsuago bilakatuko da,
 
 
24
 
00:01:25.800 --> 00:01:29.800
 
ezkutatzea errazago bait da itxura berbera daukan jendetzaren barnean.
 
 
25
 
00:01:30.000 --> 00:01:32.500
 
Zentsura saihestu dezakezu
 
Interneten egiten duzunaz
 
 
26
 
00:01:32.700 --> 00:01:36.100
 
zelatariak jakin dezakenari buruz
 
kezkatu beharrik gabe
 
 
27
 
00:01:36.300 --> 00:01:39.200
 
Iragarkiek jada ez dizute
 
hilabeteetako jarraipenik egingo
 
 
28
 
00:01:39.400 --> 00:01:43.300
 
zoazen leku guztietara
 
produktu bat lehen aldiz klikatu ostean.
 
 
29
 
00:01:43.800 --> 00:01:46.300
 
Tor erabiliz, bisitatzen dituzun guneek
 
ez dute jakingo nor zaren
 
 
30
 
00:01:46.500 --> 00:01:48.500
 
ezta munduko zein lekutik
 
bisitatzen dituzun,
 
 
31
 
00:01:48.700 --> 00:01:50.700
 
identifikatu eta zuk zeuk esan ezean.
 
 
32
 
00:01:53.200 --> 00:01:55.500
 
Tor jaitsi eta erabiliz,
 
 
33
 
00:01:55.700 --> 00:01:58.000
 
anonimotasuna behar duten pertsonak babestuko dituzu,
 
 
34
 
00:01:58.200 --> 00:02:03.500
 
esate baterako: Aktibistak, kazetariak eta blogariak.
 
 
35
 
00:02:04.000 --> 00:02:09.000
 
Jaitsi eta erabili Tor! Edo jarri martxan Tor errepikagailua!
 
 
36
 
00:02:12.400 --> 00:02:15.200
 
Hack.in#badakigu -k Itzulita
 
ennstatus/static/videos/subtitles/Tor_animation.fa.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:01.720 --> 00:00:03.720
 
اینروزا بدجوری به اینترنت عادت کردیم
 
 
2
 
00:00:04.260 --> 00:00:07.240
 
همه ش داریم اطلاعات مون رو تو اینترنت به اشتراک میذاریم
 
 
3
 
00:00:07.580 --> 00:00:09.580
 
غذاهایی که می‌خوریم، آدم‌هایی که می‌بینیم
 
 
4
 
00:00:10.380 --> 00:00:11.360
 
جاهایی که میریم
 
 
5
 
00:00:11.974 --> 00:00:13.234
 
چیزایی که میخونیم
 
 
6
 
00:00:13.580 --> 00:00:15.260
 
بذارین بهتر توضیح بدم
 
 
7
 
00:00:15.600 --> 00:00:18.720
 
همین لحظه اگه کسی بخواد اطلاعات شما رو نگاه کنه
 
 
8
 
00:00:18.720 --> 00:00:20.520
 
میتونه بفهمه شما کی هستید
 
 
9
 
00:00:21.040 --> 00:00:23.940
 
از چه سیستم عامل و مرورگری استفاده میکنید
 
 
10
 
00:00:24.280 --> 00:00:25.820
 
چه سایت‌هایی رو می‌بینید
 
 
11
 
00:00:26.020 --> 00:00:29.120
 
و دقیقن از کجا دارید همین ویدیو رو تماشا میکنید
 
 
12
 
00:00:29.620 --> 00:00:31.340
 
به علاوه یه عالمه اطلاعات دیگه
 
 
13
 
00:00:31.540 --> 00:00:33.100
 
که شاید دوست نداشته باشید کسی بدونه
 
 
14
 
00:00:33.540 --> 00:00:36.380
 
مگر اینکه از تور استفاده کنید
 
 
15
 
00:00:37.340 --> 00:00:41.120
 
تور از حریم خصوصی ما تو دنیای اینترنت حفاظت میکنه
 
 
16
 
00:00:41.300 --> 00:00:44.240
 
اطلاعاتتون رو تو سه لایه رمزگذاری میکنه و
 
 
17
 
00:00:44.240 --> 00:00:48.180
 
هربار به سه سرور تو جاهای مختلف دنیا میفرسته
 
 
18
 
00:00:48.180 --> 00:00:52.340
 
این سرورها رو اعضای شبکه تور داوطلبانه اداره میکنند
 
 
19
 
00:00:52.740 --> 00:00:56.260
 
اینطوری ما میتونیم تو اینترنت به صورت ناشناس فعالیت کنیم
 
 
20
 
00:00:56.460 --> 00:01:01.900
 
ضمنن تور اطلاعات ما رو از نظارت افراد و شرکت‌ها و دولت‌ها هم حفظ میکنه
 
 
21
 
00:01:02.560 --> 00:01:05.000
 
مثلن شاید شما تو کشوری هستید که حکومتش سرکوب گره
 
 
22
 
00:01:05.000 --> 00:01:07.280
 
و میخواد اینترنت و کنترل و نظارت کنه
 
 
23
 
00:01:08.540 --> 00:01:12.960
 
یا نمی‌خواهید شرکت‌های بزرگ تجاری از اطلاعاتتون سواستفاده کنند
 
 
24
 
00:01:13.300 --> 00:01:15.834
 
کاربرای شبکه تور، همه شبیه همن
 
 
25
 
00:01:16.334 --> 00:01:20.454
 
در نتیجه ناظرای اینترنت گیج میشن و کاربرا ناشناس می‌مونن
 
 
26
 
00:01:20.820 --> 00:01:25.120
 
برای همین هرچی کاربرای تور بیشتر بشن، شبکه امن‌تر میشه
 
 
27
 
00:01:25.520 --> 00:01:29.600
 
چون تو یه جمعیتی که همه شبیه همن، راحت تر میشه قایم شد
 
 
28
 
00:01:29.980 --> 00:01:31.980
 
وقتی از تور استفاده میکنید
 
 
29
 
00:01:32.340 --> 00:01:36.400
 
میتونید بدون اینکه نگران نظارت باشین از فیلترا رد بشین
 
 
30
 
00:01:36.440 --> 00:01:38.440
 
و به هر سایتی که دوست دارین سر بزنید
 
 
31
 
00:01:38.860 --> 00:01:40.720
 
دیگه تا روی یه چیزی کلیک کنید
 
 
32
 
00:01:40.800 --> 00:01:42.760
 
تبلیغش تا ماه‌ها دنبالتون نمیاد
 
 
33
 
00:01:43.340 --> 00:01:45.840
 
با تور دیگه حتا معلوم نیست کی هستید
 
 
34
 
00:01:45.980 --> 00:01:48.280
 
و از کجای دنیا به اینترنت وصل شدین
 
 
35
 
00:01:48.340 --> 00:01:50.600
 
مگر اینکه خودتون بخواین بگین (مثلن با ورود به سایتی که شمارو میشناسه)
 
 
36
 
00:01:50.940 --> 00:01:53.200
 
ضمنن با دانلود و استفاده از تور
 
 
37
 
00:01:53.360 --> 00:01:56.940
 
میتونید از کسایی که میخواهند تو اینترنت ناشناس بمونن حمایت کنید
 
 
38
 
00:01:57.320 --> 00:02:01.640
 
مثلن فعال‌های سیاسی-اجتماعی، روزنامه نگارها، وبلاگ نویس‌ها، ...
 
 
39
 
00:02:02.140 --> 00:02:04.840
 
از تور استفاده کنید
 
 
40
 
00:02:05.040 --> 00:02:07.940
 
یا داوطلب شید و یه سرور رو اداره کنید
 
ennstatus/static/videos/subtitles/Tor_animation.fi.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:00.660 --> 00:00:02.780
 
Olemme tottuneet käyttämään Internetiä.
 
 
2
 
00:00:03.120 --> 00:00:07.700
 
Jaamme koko ajan tietoa
 
itsestämme ja elämästämme:
 
 
3
 
00:00:08.000 --> 00:00:09.960
 
aterioistamme, tuttavistamme,
 
 
4
 
00:00:10.180 --> 00:00:12.480
 
matkoistamme ja lukutottumuksistamme.
 
 
5
 
00:00:13.280 --> 00:00:14.640
 
Selitän tarkemmin.
 
 
6
 
00:00:14.920 --> 00:00:17.740
 
Jos joku yrittää juuri nyt
 
selvittää kuka olet,
 
 
7
 
00:00:18.060 --> 00:00:22.480
 
he tietävät pian henkilöllisyytesi,
 
sijaintisi, käyttöjärjestelmäsi,
 
 
8
 
00:00:22.800 --> 00:00:26.500
 
kaikki sivustot, joilla olet vieraillut,
 
käyttämäsi selaimen
 
 
9
 
00:00:26.700 --> 00:00:29.140
 
ja lisäksi paljon muuta tietoa
 
sinusta ja elämästäsi,
 
 
10
 
00:00:29.200 --> 00:00:31.500
 
jota et luultavasti halunnut
 
jakaa tuntemattomien kanssa,
 
 
11
 
00:00:31.700 --> 00:00:34.000
 
jotka voivat helposti käyttää tietojasi
 
sinua vastaan.
 
 
12
 
00:00:34.500 --> 00:00:37.000
 
Se ei ole mahdollista,
 
jos käytät Tor-selainta.
 
 
13
 
00:00:37.140 --> 00:00:40.840
 
Tor-selain suojelee yksityisyyttäsi
 
ja henkilöllisyyttäsi Internetissä.
 
 
14
 
00:00:41.560 --> 00:00:44.760
 
Tor varmistaa yhteytesi
 
kolminkertaisella salauksella
 
 
15
 
00:00:44.940 --> 00:00:49.760
 
ja välittää sen kolmen eri puolilla maailmaa
 
sijaitsevan vapaaehtoisen palvelimen kautta,
 
 
16
 
00:00:50.280 --> 00:00:53.520
 
mikä mahdollistaa anonyymin
 
kommunikoinnin Internetissä.
 
 
17
 
00:00:56.560 --> 00:00:58.280
 
Tor myös suojelee tietojasi
 
 
18
 
00:00:58.400 --> 00:01:01.900
 
yritysmaailmalta, viranomaisilta
 
ja massaurkinnalta.
 
 
19
 
00:01:02.880 --> 00:01:07.340
 
Voi olla, että asut maassa,
 
joka yrittää tarkkailla ja hallita verkkoa.
 
 
20
 
00:01:07.900 --> 00:01:11.800
 
Tai ehkä et halua suuryritysten
 
käyttävän hyväksi henkilökohtaisia tietojasi.
 
 
21
 
00:01:12.880 --> 00:01:15.640
 
Tor tekee kaikista käyttäjistään samannäköisiä,
 
 
22
 
00:01:15.920 --> 00:01:18.800
 
mikä hämmentää tarkkailijoita
 
ja tekee kaikista anonyymejä.
 
 
23
 
00:01:19.500 --> 00:01:22.980
 
Eli mitä useampi henkilö käyttää Tor-verkkoa,
 
sitä vahvempi verkko on,
 
 
24
 
00:01:23.140 --> 00:01:27.800
 
koska on helpompi piiloutua väkijoukkoon,
 
jossa kaikki näyttävät samalta.
 
 
25
 
00:01:28.700 --> 00:01:31.240
 
Voit ohittaa sensuurin ilman,
 
että sinun tarvitsee välittää sensorista
 
 
26
 
00:01:31.400 --> 00:01:34.100
 
tai siitä, että hän tietää
 
mitä teet Internetissä.
 
 
27
 
00:01:36.540 --> 00:01:39.440
 
Mainokset eivät seuraa
 
sinua kuukausikaupalla,
 
 
28
 
00:01:39.640 --> 00:01:41.300
 
jos klikkaat jotain tuotetta.
 
 
29
 
00:01:43.880 --> 00:01:47.380
 
Käyttämällä Toria, sivustot
 
eivät edes tiedä kuka olet
 
 
30
 
00:01:47.540 --> 00:01:49.760
 
tai mistä päin maailmaa
 
päädyit heidän sivuilleen,
 
 
31
 
00:01:49.920 --> 00:01:51.920
 
paitsi jos kirjaudut ja kerrot heille.
 
 
32
 
00:01:54.200 --> 00:01:55.840
 
Lataamalla ja käyttämällä Tor-selainta
 
 
33
 
00:01:56.200 --> 00:01:58.560
 
voit myös suojella ihmisiä,
 
jotka tarvitsevat anonymiteettiä.
 
 
34
 
00:01:58.880 --> 00:02:01.640
 
Kuten aktivisteja, toimittajia ja bloggaajia.
 
 
35
 
00:02:02.000 --> 00:02:07.000
 
Lataa Tor ja käytä sitä! Tai ylläpidä Tor-solmua!
 
 
36
 
00:02:12.400 --> 00:02:15.200
 
Kääntäjä Tommi Kakko
 
ennstatus/static/videos/subtitles/Tor_animation.fr.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:01.520 --> 00:00:03.620
 
Nous nous sommes habitués à l'internet
 
 
2
 
00:00:03.900 --> 00:00:07.700
 
et sommes en permanence en train de partager
 
des informations personnelles :
 
 
3
 
00:00:08.000 --> 00:00:11.000
 
notre alimentation, nos rencontres,
 
 
4
 
00:00:11.200 --> 00:00:12.740
 
nos déplacements et nos lectures.
 
 
5
 
00:00:13.060 --> 00:00:14.400
 
Je vous explique :
 
 
6
 
00:00:14.960 --> 00:00:17.660
 
si quelqu'un tente de s'informer sur vous,
 
 
7
 
00:00:18.180 --> 00:00:22.660
 
il pourrait connaitre votre identité, votre localisation, votre navigateur,
 
 
8
 
00:00:23.260 --> 00:00:25.120
 
tous les sites que vous consultez,
 
 
9
 
00:00:25.380 --> 00:00:28.600
 
et tant d'autres informations personnelles que vous ne souhaitez
 
 
10
 
00:00:28.920 --> 00:00:30.500
 
partager avec des inconnus
 
 
11
 
00:00:30.620 --> 00:00:32.920
 
qui pourraient les utiliser à votre insu.
 
 
12
 
00:00:33.340 --> 00:00:35.840
 
À moins que vous n'utilisiez Tor !
 
 
13
 
00:00:37.000 --> 00:00:40.780
 
Tor Browser protège votre vie privée et votre identité sur internet.
 
 
14
 
00:00:41.000 --> 00:00:44.800
 
Tor sécurise votre connexion avec trois couches de chiffrement
 
 
15
 
00:00:45.000 --> 00:00:50.280
 
et les fait passer au travers de trois serveurs gérés par une communauté de bénévoles
 
 
16
 
00:00:50.740 --> 00:00:54.500
 
ce qui permet de communiquer anonymement sur l'internet.
 
 
17
 
00:00:55.000 --> 00:00:58.720
 
Tor protège aussi contre la surveillance de masse
 
 
18
 
00:00:59.040 --> 00:01:02.600
 
de la part d'entreprises ou de gouvernements.
 
 
19
 
00:01:02.800 --> 00:01:07.800
 
Peut-être vivez vous dans un pays répressif qui tente de contrôler et de surveiller l'internet.
 
 
20
 
00:01:08.380 --> 00:01:13.300
 
Peut-être ne voulez vous pas que des entreprises profitent de vos informations personnelles.
 
 
21
 
00:01:14.180 --> 00:01:18.080
 
Tor rend tous ses utilisateurs en apparence identiques,
 
 
22
 
00:01:18.460 --> 00:01:22.220
 
ce qui embrouille l'observateur et vous rend anonyme.
 
 
23
 
00:01:22.640 --> 00:01:28.500
 
Plus le nombre d'utilisateurs du réseau Tor est important,
 
plus il est efficace.
 
 
24
 
00:01:29.600 --> 00:01:32.500
 
Ainsi vous pouvez contourner la censure
 
 
25
 
00:01:32.700 --> 00:01:36.100
 
sans craindre que le censeur ne sache ce que vous faites sur l'internet.
 
 
26
 
00:01:37.180 --> 00:01:39.760
 
Les publicités ne vous suivront plus
 
 
27
 
00:01:40.080 --> 00:01:42.680
 
pendant des mois après avoir cliqué sur un produit.
 
 
28
 
00:01:43.460 --> 00:01:46.300
 
En utilisant Tor...
 
les sites que vous consulterez
 
 
29
 
00:01:46.500 --> 00:01:48.500
 
ne sauront plus qui vous êtes
 
 
30
 
00:01:48.700 --> 00:01:50.700
 
ni de quelle région du monde vous venez
 
 
31
 
00:01:52.140 --> 00:01:54.760
 
En téléchargeant et utilisant Tor
 
 
32
 
00:01:55.040 --> 00:01:57.840
 
vous protégerez les gens qui ont besoin d'être anonymes,
 
 
33
 
00:01:58.200 --> 00:02:02.320
 
tels que les activistes, journalistes et blogueurs.
 
 
34
 
00:02:02.500 --> 00:02:04.680
 
Téléchargez et utilisez Tor !
 
 
35
 
00:02:05.520 --> 00:02:08.320
 
Ou bien faites fonctionner un relais !
 
 
36
 
00:02:12.400 --> 00:02:15.200
 
Traduction de Nicolas Vigier
 
ennstatus/static/videos/subtitles/Tor_animation.id.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:00.660 --> 00:00:02.780
 
Kita sudah terbiasa dengan internet
 
 
2
 
00:00:03.120 --> 00:00:07.700
 
Kita selalu membagi informasi
 
mengenai kita dan kehidupan pribadi kita:
 
 
3
 
00:00:08.000 --> 00:00:09.960
 
makanan yg kita makan, orang2 yang kita temui,
 
 
4
 
00:00:10.180 --> 00:00:12.480
 
tempat kita berada, dan sesuatu yang kita baca.
 
 
5
 
00:00:13.280 --> 00:00:14.640
 
Akan saya jelaskan lebih lanjut.
 
 
6
 
00:00:14.920 --> 00:00:17.740
 
Pada saat ini,
 
jika seseorang mencoba untuk mencari anda,
 
 
7
 
00:00:18.060 --> 00:00:22.480
 
mereka akan melihat identitas asli anda,
 
lokasi, system operasi,
 
 
8
 
00:00:22.800 --> 00:00:26.500
 
semua halaman web yang sudah anda kunjungi,
 
applikasi yang anda pakai untuk menjelajahi internet,
 
 
9
 
00:00:26.700 --> 00:00:29.140
 
dan begitu banyak informasi
 
mengenai anda dan hidup anda
 
 
10
 
00:00:29.200 --> 00:00:31.500
 
yang mungkin anda tidak bermaksud
 
untuk dibagi ke orang asing,
 
 
11
 
00:00:31.700 --> 00:00:34.000
 
yang bisa dengan mudah menggunakan data2 itu
 
untuk memanfaatkan anda
 
 
12
 
00:00:34.500 --> 00:00:37.000
 
Tapi tidak bila anda menggunakan Tor!
 
 
13
 
00:00:37.140 --> 00:00:40.840
 
Tor Browser melindungi rahasia
 
dan identitas kita di internet.
 
 
14
 
00:00:41.560 --> 00:00:44.760
 
Tor mengamankan koneksi anda
 
dengan 3 lapis pengamanan
 
 
15
 
00:00:44.940 --> 00:00:49.760
 
dan melewatkannya melalui 3
 
server yang beroperasi bebas di seluruh dunia
 
 
16
 
00:00:50.280 --> 00:00:53.520
 
yang mana membantu kita untuk berkomunikasi
 
tanpa menunjukkan identitas kita di internet.
 
 
17
 
00:00:56.560 --> 00:00:58.280
 
Tor juga melindungi data kita
 
 
18
 
00:00:58.400 --> 00:01:01.900
 
dari intaian perusahaan besar atau pemerintah
 
dan pengawasan massa.
 
 
19
 
00:01:02.880 --> 00:01:07.340
 
Mungkin anda hidup di negara yg terkekang
 
yg mencoba untuk mengontrol dan mengawasi internet.
 
 
20
 
00:01:07.900 --> 00:01:11.800
 
Atau mungkin anda tidak menginginkan perusahaan besar
 
mengambil keuntungan dari informasi pribadi anda.
 
 
21
 
00:01:12.880 --> 00:01:15.640
 
Tor membuat semua penggunanya
 
terlihat sama
 
 
22
 
00:01:15.920 --> 00:01:18.800
 
yang akan membuat bingung pengawas
 
and membuat anda tidak terlihat.
 
 
23
 
00:01:19.500 --> 00:01:22.980
 
Jadi, lebih banyak orang yg memakai jaringan Tor,
 
akan membuat jaringannya lebih kuat
 
 
24
 
00:01:23.140 --> 00:01:27.800
 
dan akan membuat lebih mudah untuk bersembunyi di kerumunan
 
pengguna yang tampak sama persis.
 
 
25
 
00:01:28.700 --> 00:01:31.240
 
Anda dapat melewati sensor
 
tanpa harus kuatir mengenai
 
 
26
 
00:01:31.400 --> 00:01:34.100
 
sensornya akan mengetahui apa yang anda lakukan
 
di internet.
 
 
27
 
00:01:36.540 --> 00:01:39.440
 
Iklan-iklannya tidak akan mengikuti anda
 
kemana-mana selama berbulan-bulan,
 
 
28
 
00:01:39.640 --> 00:01:41.300
 
mulai dari pertama anda
 
menekan gambar suatu barang.
 
 
29
 
00:01:43.880 --> 00:01:47.380
 
Dengan menggunakan Tor, situs-situs yang anda kunjungi
 
tidak akan tahu mengenai anda,
 
 
30
 
00:01:47.540 --> 00:01:49.760
 
dari bagian dunia mana anda mengunjungi situs mereka.
 
 
31
 
00:01:49.920 --> 00:01:51.920
 
kecuali anda memasukkan user dan password anda.
 
 
32
 
00:01:54.200 --> 00:01:55.840
 
Dengan mengunduh dan menggunakan Tor,
 
 
33
 
00:01:56.200 --> 00:01:58.560
 
anda dapat melindungi orang-orang
 
yang memerlukan privasi,
 
 
34
 
00:01:58.880 --> 00:02:01.640
 
seperti aktivists, journalists dan blogger.
 
 
35
 
00:02:02.000 --> 00:02:07.000
 
Unduh dan gunakan Tor! Atau gunakan relaynya!
 
ennstatus/static/videos/subtitles/Tor_animation.it.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:00.660 --> 00:00:02.780
 
Facciamo un uso intenso di Internet
 
 
2
 
00:00:03.120 --> 00:00:07.700
 
Condividiamo constantemente informazioni
 
riguardo noi stessi e le nostre vite private:
 
 
3
 
00:00:08.000 --> 00:00:09.960
 
il cibo che mangiamo, le persone che incontriamo,
 
 
4
 
00:00:10.180 --> 00:00:12.480
 
i posti dove andiamo, quello che leggiamo.
 
 
5
 
00:00:13.280 --> 00:00:14.640
 
Permettimi di spiegare meglio.
 
 
6
 
00:00:14.920 --> 00:00:17.740
 
Proprio in questo momento,
 
se qualcuno tenta di controllarti,
 
 
7
 
00:00:18.060 --> 00:00:22.480
 
vedrà la tua vera identità
 
la tua posizione effettiva, il sistema operativo che usi,
 
 
8
 
00:00:22.800 --> 00:00:26.500
 
tutti i siti che hai visitato,
 
il browser che usi per navigare,
 
 
9
 
00:00:26.700 --> 00:00:29.140
 
e tante altre informazioni
 
riguardo te e la tua vita,
 
 
10
 
00:00:29.200 --> 00:00:31.500
 
le quali probabilmente non intendi
 
condividere con persone sconosciute,
 
 
11
 
00:00:31.700 --> 00:00:34.000
 
le quali possono facilmente utilizzare questi dati,
 
per sfruttarti.
 
 
12
 
00:00:34.500 --> 00:00:37.000
 
Ma non se usi Tor!
 
 
13
 
00:00:37.140 --> 00:00:40.840
 
Tor Browser protegge la tua privacy
 
e la tua identità all'interno di Internet.
 
 
14
 
00:00:41.560 --> 00:00:44.760
 
Tor mette in sicurezza la tua connessione
 
con tre livelli di criptazione
 
 
15
 
00:00:44.940 --> 00:00:49.760
 
passando attraverso tre server
 
volontariamente operativi in giro per il mondo,
 
 
16
 
00:00:50.280 --> 00:00:53.520
 
i quali ci abilitano a comunicare
 
anonimamente in Internet.
 
 
17
 
00:00:56.560 --> 00:00:58.280
 
Tor inoltre protegge i nostri dati
 
 
18
 
00:00:58.400 --> 00:01:01.900
 
contro determinati enti o governi
 
e sorveglianza di massa.
 
 
19
 
00:01:02.880 --> 00:01:07.340
 
Forse vivi  in un paese repressivo
 
il quale prova a controllare e sorvegliare Internet.
 
 
20
 
00:01:07.900 --> 00:01:11.800
 
O forse non vuoi che grandi aziende
 
prendano le tue informazioni personali a loro vantaggio.
 
 
21
 
00:01:12.880 --> 00:01:15.640
 
Tor fa in modo che tutti i suoi utenti
 
appaiano uguali
 
 
22
 
00:01:15.920 --> 00:01:18.800
 
confondendo l'osservatore
 
e rendendoti anonimo.
 
 
23
 
00:01:19.500 --> 00:01:22.980
 
Per cui, più persone utilizzano la rete Tor,
 
più forte diventa quest'ultima
 
 
24
 
00:01:23.140 --> 00:01:27.800
 
così come è semplice nascondersi in un gruppo
 
di persone che sembrano esattamente le stesse.
 
 
25
 
00:01:28.700 --> 00:01:31.240
 
Puoi aggirare la censura
 
senza alcuna preoccupazione
 
 
26
 
00:01:31.400 --> 00:01:34.100
 
riguardo ciò che il censore sa dei tuoi
 
movimenti su internet.
 
 
27
 
00:01:36.540 --> 00:01:39.440
 
Le pubblicità non ti seguiranno
 
ovunque per mesi,
 
 
28
 
00:01:39.640 --> 00:01:41.300
 
quando clicchi per la prima volta
 
su un prodotto.
 
 
29
 
00:01:43.880 --> 00:01:47.380
 
Usando Tor, i siti che tu visiti
 
non sapranno nemmeno chi tu sia,
 
 
30
 
00:01:47.540 --> 00:01:49.760
 
da quale parte del mondo
 
li stai visitando,
 
 
31
 
00:01:49.920 --> 00:01:51.920
 
a meno che tu non lo dica a loro facendo il login.
 
 
32
 
00:01:54.200 --> 00:01:55.840
 
Scaricando ed utilizzando Tor,
 
 
33
 
00:01:56.200 --> 00:01:58.560
 
tu puoi proteggere le persone
 
che hanno bisogno di anonimato,
 
 
34
 
00:01:58.880 --> 00:02:01.640
 
come attivisti, giornalisti e blogger.
 
 
35
 
00:02:02.000 --> 00:02:07.000
 
Scarica e utilizza Tor! O installa un relay!
 
 
36
 
00:02:12.400 --> 00:02:15.200
 
Traduzione a cura di Antoci Rosario
 
ennstatus/static/videos/subtitles/Tor_animation.lv.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:00.660 --> 00:00:02.780
 
Mēs esam ļoti pieraduši pie interneta.
 
 
2
 
00:00:03.120 --> 00:00:07.700
 
Mēs nepārtraukti dalāmies ar informāciju
 
par sevi un savu privāto dzīvi:
 
 
3
 
00:00:08.000 --> 00:00:09.960
 
ēdienu, ko ēdam, cilvēkiem, kurus satiekam,
 
 
4
 
00:00:10.180 --> 00:00:12.480
 
vietām, uz kurām dodamies, un arī to, ko lasām.
 
 
5
 
00:00:13.280 --> 00:00:14.640
 
Ļaujiet man paskaidrot labāk.
 
 
6
 
00:00:14.920 --> 00:00:17.740
 
Tieši šobrīd,
 
ja kāds centīsies Jūs atrast,
 
 
7
 
00:00:18.060 --> 00:00:22.480
 
šī persona noskaidros Jūsu patiesu identitāti,
 
precīzu atrašanās vietu, operētājsistēmu,
 
 
8
 
00:00:22.800 --> 00:00:26.500
 
visas Jūsu apmeklētās tīmekļa vietnes,
 
tīmekļa pārlūkošanai izmantoto pārlūku,
 
 
9
 
00:00:26.700 --> 00:00:29.140
 
un tik daudz vairāk informācijas
 
par Jums un Jūsu dzīvi
 
 
10
 
00:00:29.200 --> 00:00:31.500
 
cik, ticami, Jūs nebijāt domājis
 
kopīgot ar nezināmiem svešiniekiem,
 
 
11
 
00:00:31.700 --> 00:00:34.000
 
kas var viegli izmantot šos datus
 
pret Jums.
 
 
12
 
00:00:34.500 --> 00:00:37.000
 
Taču ne tad, ja izmantojat Tor!
 
 
13
 
00:00:37.140 --> 00:00:40.840
 
Tor pārlūks aizsargā mūsu privātumu
 
 un identitāti internetā.
 
 
14
 
00:00:41.560 --> 00:00:44.760
 
Tor nodrošina jūsu savienojumu
 
ar trīs dažādiem šifriem
 
 
15
 
00:00:44.940 --> 00:00:49.760
 
un izlaiž cauri trīs brīvprātīgi
 
strādājošiem serveriem pasaulē,
 
 
16
 
00:00:50.280 --> 00:00:53.520
 
kas atļauj mums komunicēt
 
internetā anonīmi.
 
 
17
 
00:00:56.560 --> 00:00:58.280
 
Tor arī aizsargā mūsu datus
 
 
18
 
00:00:58.400 --> 00:01:01.900
 
pret korporatīvo vai valdības mērķēto
 
un masu uzraudzību.
 
 
19
 
00:01:02.880 --> 00:01:07.340
 
Iespējams, jūs dzīvojat represīvā valstī,
 
kas cenšas konrolēt un uzraudzīt internetu.
 
 
20
 
00:01:07.900 --> 00:01:11.800
 
Vai arī iespējams, ka jūs nevēlaties, lai lielas korporācijas
 
gūtu labumu no jūsu personīgās informācijas.
 
 
21
 
00:01:12.880 --> 00:01:15.640
 
Tor padara visus tā lietotājus
 
izskatīties vienādiem,
 
 
22
 
00:01:15.920 --> 00:01:18.800
 
kas apmulsina novērotāju
 
un padara Jūs anonīmus.
 
 
23
 
00:01:19.500 --> 00:01:22.980
 
Tātad, jo vairāk cilvēku lieto Tor tīklu,
 
jo stiprāks tas kļūst
 
 
24
 
00:01:23.140 --> 00:01:27.800
 
un ir vieglāk paslēpties pūlī,
 
kur visi cilvēki izskatās pilnīgi vienādi.
 
 
25
 
00:01:28.700 --> 00:01:31.240
 
Jūs variet izvairīties no cenzūras
 
bez uztraukšanās par
 
 
26
 
00:01:31.400 --> 00:01:34.100
 
cenzora zināšanu, ko Jūs darāt
 
internetā.
 
 
27
 
00:01:36.540 --> 00:01:39.440
 
Reklāmas Jums visur nesekos
 
mēnešiem ilgi,
 
 
28
 
00:01:39.640 --> 00:01:41.300
 
sākot no brīža, kad Jūs pirmoreiz 
 
uzklikšķinājāt uz produktu.
 
 
29
 
00:01:43.880 --> 00:01:47.380
 
Lietojot Tor, mājaslapas, kuras Jūs apmeklējat
 
pat nezina, kas Jūs esat,
 
 
30
 
00:01:47.540 --> 00:01:49.760
 
no kuras pasaules daļas
 
Jūs to apmeklējat,
 
 
31
 
00:01:49.920 --> 00:01:51.920
 
ja vien Jūs nepierakstīsities un par to nepastāstīsiet.
 
 
32
 
00:01:54.200 --> 00:01:55.840
 
Lejupielādējot un lietojot Tor,
 
 
33
 
00:01:56.200 --> 00:01:58.560
 
Jūs varat aizsargāt cilvēkus,
 
kuriem anonimitāte ir nepieciešama,
 
 
34
 
00:01:58.880 --> 00:02:01.640
 
kā piemēram, žurnālistus un blogerus.
 
 
35
 
00:02:02.000 --> 00:02:07.000
 
Lejuplādējiet un izmantojiet Tor! Vai darbiniet retranslatoru!
 
ennstatus/static/videos/subtitles/Tor_animation.pl.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:00.660 --> 00:00:02.780
 
Przyzwyczailiśmy się do internetu.
 
 
2
 
00:00:03.120 --> 00:00:06.000
 
Stale dzielimy się informacjami o naszym życiu prywatnym:
 
 
3
 
00:00:06.300 --> 00:00:08.260
 
o tym co jemy, z kim się spotykamy,
 
 
4
 
00:00:11.280 --> 00:00:12.640
 
Pozwólcie, że wyjaśnię.
 
 
5
 
00:00:13.620 --> 00:00:15.740
 
Właśnie w tym momencie,
 
ktoś próbuje Cię podejrzeć,
 
 
6
 
00:00:15.860 --> 00:00:20.480
 
zobaczy Twoją prawdziwą tożsamość,
 
dokładną lokalizację i system operacyjny,
 
 
7
 
00:00:20.600 --> 00:00:24.500
 
wszystkie strony, które odwiedziłeś,
 
przeglądarkę której używasz,
 
 
8
 
00:00:24.600 --> 00:00:27.340
 
i o wiele więcej informacji
 
o Tobie i Twoim życiu,
 
 
9
 
00:00:27.420 --> 00:00:29.500
 
których wolałbyś nie
 
dzielić z nieznajomymi osobami,
 
 
10
 
00:00:29.650 --> 00:00:34.000
 
które mogą użyć tych danych,
 
aby Cię skrzywdzić, albo na nich zarobić.
 
 
11
 
00:00:34.500 --> 00:00:37.220
 
Ale nie jeśli używasz Tor!
 
 
12
 
00:00:37.700 --> 00:00:41.800
 
Tor Browser chroni Twoją prywatność
 
i tożsamość w Internecie.
 
 
13
 
00:00:42.560 --> 00:00:44.760
 
Tor zabezpiecza Twoje połączenie
 
poprzez trzy warstwy szyfrowania
 
 
14
 
00:00:44.940 --> 00:00:49.760
 
i przesyła je przez trzy serwery
 
udostępnione przez wolontariuszy na całym świecie.
 
 
15
 
00:00:50.280 --> 00:00:53.520
 
W ten sposób możemy komunikować się
 
anonimowo przez Internet.
 
 
16
 
00:00:56.560 --> 00:00:58.280
 
Tor chroni również nasze dane
 
 
17
 
00:00:58.400 --> 00:01:01.900
 
przed korporacjami lub rządem
 
i masową inwigilacją.
 
 
18
 
00:01:02.880 --> 00:01:07.340
 
Być może żyjesz w represjonowanym kraju,
 
który próbuje kontrolować i nadzorować Internet.
 
 
19
 
00:01:07.900 --> 00:01:11.800
 
Albo nie chcesz, aby wielkie korporacje
 
wykorzystywały Twoje osobiste dane.
 
 
20
 
00:01:12.880 --> 00:01:15.640
 
Tor sprawia, że wszyscy jego użytkownicy
 
wyglądają tak samo
 
 
21
 
00:01:15.920 --> 00:01:18.800
 
co myli obserwatora
 
i daje Ci anonimowość.
 
 
22
 
00:01:19.500 --> 00:01:22.980
 
A więc, im więcej osób używa sieci Tor,
 
tym silniejsza się ona staje
 
 
23
 
00:01:23.140 --> 00:01:27.800
 
jako, że łatwiej jest się ukryć w tłumie
 
ludzi, którzy wyglądają dokładnie tak samo.
 
 
24
 
00:01:28.700 --> 00:01:31.240
 
Możesz ominąć cenzurę
 
bez obaw o to, że
 
 
25
 
00:01:31.400 --> 00:01:34.100
 
cenzorzy zobaczą co robisz
 
w Internecie.
 
 
26
 
00:01:36.540 --> 00:01:39.440
 
Reklamy nie będą Cię prześladować
 
przez cały czas,
 
 
27
 
00:01:39.500 --> 00:01:41.300
 
odkąd po raz pierwszy
 
w nie kliknąłeś.
 
 
28
 
00:01:42.880 --> 00:01:47.380
 
Używając Tor, strony, które odwiedzasz
 
nie będą wiedziały kim jesteś,
 
 
29
 
00:01:47.540 --> 00:01:49.760
 
a nawet z jakiej części świata
 
je odwiedzasz,
 
 
30
 
00:01:49.920 --> 00:01:51.920
 
o ile nie zalogujesz się i im tego nie powiesz.
 
 
31
 
00:01:54.200 --> 00:01:55.840
 
Ściągając i używając Tor,
 
 
32
 
00:01:56.200 --> 00:01:58.560
 
możesz ochronić ludzi,
 
którzy potrzebują anonimowości,
 
 
33
 
00:01:58.880 --> 00:02:01.640
 
jak aktywiści, dziennikarze i blogerzy.
 
 
34
 
00:02:02.000 --> 00:02:07.000
 
Pobierz i używaj Tor, lub uruchom własny przekaźnik pod tym adresem.
 
 
35
 
00:02:14.400 --> 00:02:17.200
 
Tłumaczone przez Hoek i Nati, edycja: missq.
 
ennstatus/static/videos/subtitles/Tor_animation.pt.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:00.660 --> 00:00:02.780
 
Habituámo-nos à Internet.
 
 
2
 
00:00:03.120 --> 00:00:07.700
 
Passamos o tempo a partilhar informação
 
sobre nós mesmos e as nossas vidas:
 
 
3
 
00:00:08.000 --> 00:00:09.960
 
o que comemos, quem conhecemos,
 
 
4
 
00:00:10.180 --> 00:00:12.480
 
onde vamos, e o que lemos.
 
 
5
 
00:00:13.280 --> 00:00:14.640
 
Deixem-me explicar melhor.
 
 
6
 
00:00:14.920 --> 00:00:17.740
 
Se neste preciso momento alguém
 
tentar investigar a tua ligação,
 
 
7
 
00:00:18.060 --> 00:00:22.480
 
vão ver a tua identidade real,
 
a tua localização, sistema operativo,
 
 
8
 
00:00:22.800 --> 00:00:26.500
 
todos os sites que visitaste,
 
o browser que usas,
 
 
9
 
00:00:26.700 --> 00:00:29.140
 
e muita mais informação
 
sobre ti e a tua vida
 
 
10
 
00:00:29.200 --> 00:00:31.500
 
do que alguma vez pensaste partilhar
 
com pessoas desconhecidas,
 
 
11
 
00:00:31.700 --> 00:00:34.000
 
que podem tentar usar essa informação
 
para te explorar.
 
 
12
 
00:00:34.500 --> 00:00:37.000
 
Mas não se usares o Tor!
 
 
13
 
00:00:37.140 --> 00:00:40.840
 
O Tor Browser protege a tua
 
identidade e privacidade online.
 
 
14
 
00:00:41.560 --> 00:00:44.760
 
O Tor protege a tua ligação com
 
três niveís de encriptação
 
 
15
 
00:00:44.940 --> 00:00:49.760
 
e passa-a por três servidores voluntários
 
em todo o mundo,
 
 
16
 
00:00:50.280 --> 00:00:53.520
 
o que te pemite comunicar anonimamente
 
através da internet.
 
 
17
 
00:00:56.560 --> 00:00:58.280
 
O Tor também protege os teus dados
 
 
18
 
00:00:58.400 --> 00:01:01.900
 
contra empresas e governos que praticam
 
espionagem em massa na internet.
 
 
19
 
00:01:02.880 --> 00:01:07.340
 
Talvez vivas num país ditatorial
 
que tenta controlar e vigiar a Internet.
 
 
20
 
00:01:07.900 --> 00:01:11.800
 
Ou talvez não queiras que as grandes empresas
 
tirem partido da tua informação pessoal.
 
 
21
 
00:01:12.880 --> 00:01:15.640
 
O Tor faz com que todos os seus utilizadores
 
pareçam ser iguais
 
 
22
 
00:01:15.920 --> 00:01:18.800
 
o que confunde quem te observa
 
e te torna anónimo.
 
 
23
 
00:01:19.500 --> 00:01:22.980
 
Assim, quantas mais pessoas usam a rede Tor,
 
mais forte ela se torna
 
 
24
 
00:01:23.140 --> 00:01:27.800
 
pois é mais fácil esconder-se
 
numa multidão de pessoas iguais.
 
 
25
 
00:01:28.700 --> 00:01:31.240
 
Podes ultrapassar a censura
 
 
26
 
00:01:31.400 --> 00:01:34.100
 
sem te preocupares se quem te observa
 
sabe o que fazes na internet.
 
 
27
 
00:01:36.540 --> 00:01:39.440
 
A publicidade não te vai seguir
 
durante meses,
 
 
28
 
00:01:39.640 --> 00:01:41.300
 
assim que clicas num produto
 
pela primeira vez.
 
 
29
 
00:01:43.880 --> 00:01:47.380
 
Ao usares o Tor, os sites que visitas
 
não vão saber quem és,
 
 
30
 
00:01:47.540 --> 00:01:49.760
 
em que parte do mundo estás,
 
 
31
 
00:01:49.920 --> 00:01:51.920
 
a não ser que te registas
 
e lhes digas isso tu mesmo.
 
 
32
 
00:01:54.200 --> 00:01:55.840
 
Ao usarem o Tor,
 
 
33
 
00:01:56.200 --> 00:01:58.560
 
pessoas que precisam de anonimato
 
podem proteger-se,
 
 
34
 
00:01:58.880 --> 00:02:01.640
 
como activistas, jornalistas e bloggers.
 
 
35
 
00:02:02.000 --> 00:02:07.000
 
Faz download e usa Tor!
 
Ou providencia um servidor voluntário!
 
 
36
 
00:02:12.400 --> 00:02:15.200
 
Traduzido por “Sir Anthony Dorian Gray”
 
ennstatus/static/videos/subtitles/Tor_animation.ru.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:00.000 --> 00:00:03.010
 
Мы сильно привыкли к интернету.
 
 
2
 
00:00:03.010 --> 00:00:07.750
 
Всё время делимся информацией
 
о себе и нашей личной жизни.
 
 
3
 
00:00:07.750 --> 00:00:09.520
 
что едим, с кем встречаемся,
 
 
4
 
00:00:09.520 --> 00:00:12.800
 
куда ходим, что читаем.
 
 
5
 
00:00:12.805 --> 00:00:14.525
 
Объясняю точнее.
 
 
6
 
00:00:14.525 --> 00:00:18.525
 
Прямо сейчас, если кто-то
 
попробует найти вас,
 
 
7
 
00:00:18.525 --> 00:00:21.345
 
он опознает вас, где вы и
 
вашу операционную систему,
 
 
8
 
00:00:21.345 --> 00:00:24.465
 
на каких сайтах были,
 
каким браузером пользуетесь,
 
 
9
 
00:00:24.465 --> 00:00:27.745
 
и ещё уйму информации о вас и вашей жизни,
 
 
10
 
00:00:27.745 --> 00:00:31.075
 
чем вы вряд ли хотели бы
 
поделится с незнакомцами,
 
 
11
 
00:00:31.075 --> 00:00:34.405
 
ведь они могут скомпрометировать вас.
 
 
12
 
00:00:34.695 --> 00:00:36.915
 
Но ТОР предотвратит это!
 
 
13
 
00:00:36.915 --> 00:00:41.845
 
Браузер ТОРа защищает конфиденциальность
 
и нашу личность в интернете.
 
 
14
 
00:00:41.845 --> 00:00:45.725
 
ТОР обеспечивает трёхслойную кодировку
 
 
15
 
00:00:45.725 --> 00:00:49.725
 
пропуская сигнал через три добровольно
 
работающих сервера по всему свету,
 
 
16
 
00:00:49.725 --> 00:00:53.725
 
что позволяет нам общаться
 
анонимно по интернету.
 
 
17
 
00:00:55.056 --> 00:00:59.056
 
ТОР также охраняет нашу информацию
 
 
18
 
00:00:59.056 --> 00:01:02.946
 
от любых форм надзора, будь то
 
корпоративного или правительственного.
 
 
19
 
00:01:02.946 --> 00:01:06.568
 
Предположим вы живёте при репрессивном
 
строе, где интернет перлюстрируется.
 
 
20
 
00:01:06.568 --> 00:01:10.190
 
Или вы не хотите, чтобы какая-то корпорация
 
 
21
 
00:01:10.190 --> 00:01:13.812
 
воспользовалась вашими личными данными.
 
 
22
 
00:01:13.939 --> 00:01:17.939
 
Благодаря ТОРу все
 
пользователи выглядят одинаково
 
 
23
 
00:01:17.939 --> 00:01:21.939
 
это сбивает постороннего с толку
 
и гарантирует вашу анонимность.
 
 
24
 
00:01:21.939 --> 00:01:25.939
 
Чем больше людей используют ТОР,
 
тем мощнее он становится
 
 
25
 
00:01:25.939 --> 00:01:28.909
 
ведь куда проще скрыться в толпе,
 
где все выглядят одинаково.
 
 
26
 
00:01:30.039 --> 00:01:34.039
 
Вы можете обойти цензуру,
 
не беспокоясь о том,
 
 
27
 
00:01:34.039 --> 00:01:37.159
 
знает ли цензор, что вы делаете
 
в интернете.
 
 
28
 
00:01:37.159 --> 00:01:41.159
 
реклама не станет вашим “хвостом”
 
на долгие месяцы
 
 
29
 
00:01:41.159 --> 00:01:44.069
 
потому что вы однажды щёлкнули на товар.
 
 
30
 
00:01:44.069 --> 00:01:48.069
 
При режиме ТОР сайты, которые вы посещаете
 
не будут даже знать, кто вы,
 
 
31
 
00:01:48.069 --> 00:01:50.429
 
из какой вы страны,
 
 
32
 
00:01:50.429 --> 00:01:54.429
 
разве что вы сами делаете вход в систему
 
и оповещаете о себе.
 
 
33
 
00:01:54.429 --> 00:01:57.029
 
Загрузив и используя ТОР,
 
 
34
 
00:01:57.029 --> 00:02:01.079
 
вы защитите тех, кто
 
нуждается в анонимности,
 
 
35
 
00:02:01.079 --> 00:02:05.079
 
скажем, активистов,
 
журналистов и блоггеров.
 
 
36
 
00:02:05.079 --> 00:02:11.059
 
Загрузите и пользуйтесь ТОРом!
 
Или запустите ретрансляторы!
 
 
37
 
00:02:12.400 --> 00:02:15.200
 
Перевод Дирана Мегребляна
 
ennstatus/static/videos/subtitles/Tor_animation.sq.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:00.660 --> 00:00:02.780
 
Ne jemi mësuar shumë me internetin
 
 
2
 
00:00:03.120 --> 00:00:07.700
 
Ne jemi në menyrë konstante duke shkëmbyer informacion
 
për veten tonë dhe jetën tonë private:
 
 
3
 
00:00:08.000 --> 00:00:09.960
 
ushqimin që hamë, njerëzit që takojmë,
 
 
4
 
00:00:10.180 --> 00:00:12.480
 
vendet që vizitojmë, dhe gjërat që lexojmë.
 
 
5
 
00:00:13.280 --> 00:00:14.640
 
Më lejoni ta shpjegoj më mirë.
 
 
6
 
00:00:14.920 --> 00:00:17.740
 
Tani, në këtë moment,
 
nëse dikush tenton të ju shikojë,
 
 
7
 
00:00:18.060 --> 00:00:22.480
 
do munnd të shohin identitetin tuaj të vërtetë,
 
vendodhjen e saktë, sistemin operativ,
 
 
8
 
00:00:22.800 --> 00:00:26.500
 
të gjitha faqet që ju keni vizituar,
 
shfletuesit që ju përdorni për të shfletuar në web,
 
 
9
 
00:00:26.700 --> 00:00:29.140
 
dhe shumë më shumë informacion
 
për ju dhe jetën tuaj
 
 
10
 
00:00:29.200 --> 00:00:31.500
 
të cilën ju ndoshta nuk do donit
 
ta ndanit me të huajt e të panjohur,
 
 
11
 
00:00:31.700 --> 00:00:34.000
 
të cilët lehtësisht mund ti përdorin këto të dhëna
 
për të të shfrytëzuar ty.
 
 
12
 
00:00:34.500 --> 00:00:37.000
 
Por jo, në qoftë se ju jeni duke përdorur Tor!
 
 
13
 
00:00:37.140 --> 00:00:40.840
 
Tor Browser mbron privatësinë tonë
 
dhe identitetin në internet.
 
 
14
 
00:00:41.560 --> 00:00:44.760
 
Tor siguron lidhjen tuaj
 
me tri shtresa enkriptimi
 
 
15
 
00:00:44.940 --> 00:00:49.760
 
dhe kalon nëpërmjet tre serverat
 
shfrytëzimi në mbarë botën, vullnetarisht,
 
 
16
 
00:00:50.280 --> 00:00:53.520
 
të cilat na mundësojnë që të komunikojmë
 
në mënyre anonime në Internet.
 
 
17
 
00:00:56.560 --> 00:00:58.280
 
Tor gjithashtu mbron të dhënat tona
 
 
18
 
00:00:58.400 --> 00:01:01.900
 
kundër korporatave apo shënjestërave qeveritare
 
dhe mbikqyrjes në masë.
 
 
19
 
00:01:02.880 --> 00:01:07.340
 
Ndoshta ju jetoni në një vend "shtypës"
 
i cili përpiqet të kontrollojë dhe survejojë internetin.
 
 
20
 
00:01:07.900 --> 00:01:11.800
 
Ndoshta ju nuk doni që korporatat e mëdha
 
të përfitojnë nga të dhënat tuaja personale.
 
 
21
 
00:01:12.880 --> 00:01:15.640
 
Tor bën të gjithë përdoruesit e tij
 
të duken njëlloj
 
 
22
 
00:01:15.920 --> 00:01:18.800
 
që të ngatërrojnë vëzhguesit
 
dhe të ju bëjë juve anonim.
 
 
23
 
00:01:19.500 --> 00:01:22.980
 
Pra, sa më shumë njerëz të përdorin rrjetin Tor,
 
aq më i fortë bëhet ai,
 
 
24
 
00:01:23.140 --> 00:01:27.800
 
është më e lehtë të fshihesh në një turmë
 
njerëzish që të duken të njëjtë.
 
 
25
 
00:01:28.700 --> 00:01:31.240
 
Ju mund të anashkaloni censurën
 
pa qenë u shqetësuar për
 
 
26
 
00:01:31.400 --> 00:01:34.100
 
censorët, duke ditur atë që ju bëni
 
në internet.
 
 
27
 
00:01:36.540 --> 00:01:39.440
 
Reklamat nuk do të ju ndjekin
 
kudo për muaj me rradhë,
 
 
28
 
00:01:39.640 --> 00:01:41.300
 
duke filluar, kur ju
 
klikoni në një produkt për herë të parë.
 
 
29
 
00:01:43.880 --> 00:01:47.380
 
Duke përdorur Tor, faqet që vizitoni
 
as nuk do e dinë se kush jeni ju,
 
 
30
 
00:01:47.540 --> 00:01:49.760
 
nga cila pjesë e botës
 
ju jeni duke i vizituar,
 
 
31
 
00:01:49.920 --> 00:01:51.920
 
nëse nuk logoheni dhe u tregoni indentitetin.
 
 
32
 
00:01:54.200 --> 00:01:55.840
 
Duke shkarkuar dhe përdorur Tor,
 
 
33
 
00:01:56.200 --> 00:01:58.560
 
ju mbroni njerëzit
 
të cilët duan anonimitetin,
 
 
34
 
00:01:58.880 --> 00:02:01.640
 
si aktivistët, gazetarët dhe blogerët.
 
 
35
 
00:02:02.000 --> 00:02:07.000
 
Shkarkoni dhe përdorni Tor! Ose ofro një shërbim vullnetar.
 
 
36
 
00:02:12.400 --> 00:02:15.200
 
Përkthimi nga Greta Doçi
 
ennstatus/static/videos/subtitles/Tor_animation.sv.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:00.660 --> 00:00:02.780
 
Vi har blivit väldigt vana med internet.
 
 
2
 
00:00:03.120 --> 00:00:07.700
 
Vi delar ständigt med oss information
 
om oss själva och våra privatliv.
 
 
3
 
00:00:08.000 --> 00:00:09.960
 
Vilken mat vi äter, vilka vi träffar,
 
 
4
 
00:00:10.180 --> 00:00:12.480
 
platser vi besöker och vad vi läser.
 
 
5
 
00:00:13.280 --> 00:00:14.640
 
Låt mig förklara lite utförligare.
 
 
6
 
00:00:14.920 --> 00:00:17.740
 
Just nu, om någon försöker kolla dig
 
 
7
 
00:00:18.060 --> 00:00:22.480
 
så kommer de hitta din identitet,
 
din exakta position, ditt operativsystem,
 
 
8
 
00:00:22.800 --> 00:00:26.500
 
alla sajter du besökt,
 
vilken webbläsare du använder
 
 
9
 
00:00:26.700 --> 00:00:29.140
 
och mycket mer information
 
om dig och ditt liv
 
 
10
 
00:00:29.200 --> 00:00:31.500
 
som du antagligen inte hade tänkt
 
dela med okända främlingar
 
 
11
 
00:00:31.700 --> 00:00:34.000
 
som enkelt kan använda detta
 
för att utnyttja dig.
 
 
12
 
00:00:34.500 --> 00:00:37.000
 
Men inte om du använder Tor!
 
 
13
 
00:00:37.140 --> 00:00:40.840
 
Tor-webbläsaren skyddar ditt privatliv
 
och din identitet på internet.
 
 
14
 
00:00:41.560 --> 00:00:44.760
 
Tor säkrar din kommunikation
 
med tre lager kryptering
 
 
15
 
00:00:44.940 --> 00:00:49.760
 
och skickar den genom tre frivilligt
 
skötta servrar runt om i världen
 
 
16
 
00:00:50.280 --> 00:00:53.520
 
som gör det möjligt att kommunicera
 
anonymt på internet.
 
 
17
 
00:00:56.560 --> 00:00:58.280
 
Tor skyddar också dina uppgifter
 
 
18
 
00:00:58.400 --> 00:01:01.900
 
från företag eller myndigheter
 
och från massövervakning.
 
 
19
 
00:01:02.880 --> 00:01:07.340
 
Kanske bor du i en repressiv stat som
 
försöker kontrollera och övervaka internet
 
 
20
 
00:01:07.900 --> 00:01:11.800
 
eller så vill du inte att stora företag
 
ska utnyttja dina personuppgifter.
 
 
21
 
00:01:12.880 --> 00:01:15.640
 
Tor gör så att alla dess användare
 
ser likadana ut
 
 
22
 
00:01:15.920 --> 00:01:18.800
 
vilket förvirrar övervakaren
 
och gör dig anonym.
 
 
23
 
00:01:19.500 --> 00:01:22.980
 
Ju fler som använder Tor-nätverket
 
desto starkare blir det
 
 
24
 
00:01:23.140 --> 00:01:27.800
 
eftersom det är enklare att gömma sig
 
i en grupp där alla ser exakt likadana ut.
 
 
25
 
00:01:28.700 --> 00:01:31.240
 
Du kan komma runt censuren
 
utan att oroa dig för
 
 
26
 
00:01:31.400 --> 00:01:34.100
 
att övervakaren vet vad du gör
 
på internet.
 
 
27
 
00:01:36.540 --> 00:01:39.440
 
Annonser kommer inte
 
förfölja dig i flera månader
 
 
28
 
00:01:39.640 --> 00:01:41.300
 
efter att du har klickat
 
på en produkt.
 
 
29
 
00:01:43.880 --> 00:01:47.380
 
Om du använder Tor kommer inte ens
 
sajterna du besöker veta vem du är
 
 
30
 
00:01:47.540 --> 00:01:49.760
 
och från vilken del av världen
 
du kommer
 
 
31
 
00:01:49.920 --> 00:01:51.920
 
om du inte loggar in och berättar det.
 
 
32
 
00:01:54.200 --> 00:01:55.840
 
Genom att ladda ner och använda Tor
 
 
33
 
00:01:56.200 --> 00:01:58.560
 
kan du skydda de personer
 
som behöver vara anonyma
 
 
34
 
00:01:58.880 --> 00:02:01.640
 
som aktivister, journalister och bloggare.
 
 
35
 
00:02:02.000 --> 00:02:07.000
 
Ladda ner och använd Tor!
 
Eller starta ett relä!
 
ennstatus/static/videos/subtitles/Tor_animation.tl-PH.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:00.660 --> 00:00:02.780
 
Sobrang nasanay na tayo sa Internet
 
 
2
 
00:00:03.120 --> 00:00:07.700
 
Palagi tayong namamahagi ng tungkol sa atin at pati na rin sa ating pribadong buhay:
 
 
3
 
00:00:08.000 --> 00:00:09.960
 
mga kinakain natin, mga taong kasalamuha natin,
 
 
4
 
00:00:10.180 --> 00:00:12.480
 
mga lugar na pinupuntahan natin, at mga binabasa natin.
 
 
5
 
00:00:13.280 --> 00:00:14.640
 
Hayaan mo akong ipaliwanag ito sa iyo ng mas mabuti.
 
 
6
 
00:00:14.920 --> 00:00:17.740
 
Sa mismong oras na ito,
 
kapag mayroong sinuman na magtangkang tignan kung sino ka sa Internet,
 
 
7
 
00:00:18.060 --> 00:00:22.480
 
malalaman nila kung sino ka talaga,
 
kung nasaan ka mismo, operating system,
 
 
8
 
00:00:22.800 --> 00:00:26.500
 
lahat ng website na binisita mo,
 
ang browser na ginagamit mo para mag surf sa web,
 
 
9
 
00:00:26.700 --> 00:00:29.140
 
at kung ano-ano pa tungkol sa iyo at sobra-sobra pa tungkol sa iyo.
 
 
10
 
00:00:29.200 --> 00:00:31.500
 
na hindi mo naman talagang sadyang ibahagi sa mga taong hindi mo kilala
 
 
11
 
00:00:31.700 --> 00:00:34.000
 
- na maaring gamitin ang impormasyon mo na kanila'y pakikinabangan.
 
 
12
 
00:00:34.500 --> 00:00:37.000
 
Pero lahat ng iyon ay maiiwasan sa pamamagitan ng Tor!
 
 
13
 
00:00:37.140 --> 00:00:40.840
 
Pinoprotektahan ng Tor Browser ang ating palihim (privacy) at pagkakakilanlan (identity) sa Internet.
 
 
14
 
00:00:41.560 --> 00:00:44.760
 
Pinapatibay at sinisigurado ng Tor ang iyong koneksyon sa pamamagitan ng tatlong patong ng encryption
 
 
15
 
00:00:44.940 --> 00:00:49.760
 
at idinadaan ito sa tatlong kinusang-loob na mga servers sa iba't-ibang sulok ng mundo,
 
 
16
 
00:00:50.280 --> 00:00:53.520
 
para magkaroon tayong nang paliham na komunikasyon sa Internet.
 
 
17
 
00:00:56.560 --> 00:00:58.280
 
Pinoprotektahan din ng Tor ang ating mga data
 
 
18
 
00:00:58.400 --> 00:01:01.900
 
laban sa patamaang-gobyerno (government-targeted) o patamaang-korporasyon (corporate-targeted) at pang-masang pamamahala (mass surveillance).
 
 
19
 
00:01:02.880 --> 00:01:07.340
 
Baka nakatira ka sa isang bansa na strikto sa kalayaan na sinusubukang kontrolin at imahala (surveil) ang Internet.
 
 
20
 
00:01:07.900 --> 00:01:11.800
 
O kaya nama'y ayaw mong pakinabangan ng malalaking korporasyon ang iyong personal na impormasyon.
 
 
21
 
00:01:12.880 --> 00:01:15.640
 
Ginagawa ng Tor na magkakamukha ang mga gumagamit nito
 
 
22
 
00:01:15.920 --> 00:01:18.800
 
na nililito ang sinumang namamahala o nanonood, at sa pamamagitan nito ikaw ay nagiging anonimo o hindi nakikilala.
 
 
23
 
00:01:19.500 --> 00:01:22.980
 
Kaya, kapag mas maraming taong gumagamit ng Tor network, mas lumalakas ito
 
 
24
 
00:01:23.140 --> 00:01:27.800
 
sapagkat mas madaling magtago sa pangkat o grupo ng tao na magkakamukha.
 
 
25
 
00:01:28.700 --> 00:01:31.240
 
Maaring mong iwasan o sikutan ang pagsensura ng hindi pagaalala
 
 
26
 
00:01:31.400 --> 00:01:34.100
 
tungkol sa pagaalam ng sensura kung ano ang ginagawa mo sa Internet.
 
 
27
 
00:01:36.540 --> 00:01:39.440
 
Hindi ka susundan ng mga ads kahit saan ng ilang buwan,
 
 
28
 
00:01:39.640 --> 00:01:41.300
 
simula nung una kang pumindot sa isang produkto.
 
 
29
 
00:01:43.880 --> 00:01:47.380
 
Sa pagamit ng Tor, hindi ka man lang malaman ng mga sites na binisita mo kung sino ka,
 
 
30
 
00:01:47.540 --> 00:01:49.760
 
kung saang parte ng mundo mo sila binisita,
 
 
31
 
00:01:49.920 --> 00:01:51.920
 
kung hindi ka mag lologin at magkukusang magsabi.
 
 
32
 
00:01:54.200 --> 00:01:55.840
 
Sa pag-download at paggamit ng Tor,
 
 
33
 
00:01:56.200 --> 00:01:58.560
 
maproprotektahan mo din ang pagiging anonimo ng mga nangangailangang tao,
 
 
34
 
00:01:58.880 --> 00:02:01.640
 
tulad ng activists, journalists at bloggers.
 
 
35
 
00:02:02.000 --> 00:02:07.000
 
Kaya'y i-download mo na ang Tor at gamitin! O kaya'y magpatakbo ng relay!
 
 
36
 
00:02:12.400 --> 00:02:15.200
 
Isinalin (translated) ni Gary David Ruiz dela Rosa
 
ennstatus/static/videos/subtitles/Tor_animation.zh-CN.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:02.000 --> 00:00:04.500
 
互联网已是日常生活的一部分
 
 
2
 
00:00:04.700 --> 00:00:07.700
 
我们经常在网上分享有关自己的信息
 
 
3
 
00:00:08.000 --> 00:00:11.000
 
在哪里享受美食,遇到了哪些人
 
 
4
 
00:00:11.200 --> 00:00:14.200
 
去过的地方,还有正在阅读的书籍
 
 
5
 
00:00:14.500 --> 00:00:16.400
 
换句话说
 
 
6
 
00:00:16.600 --> 00:00:19.600
 
此次此刻,有人想要查询你的信息
 
 
7
 
00:00:19.800 --> 00:00:23.200
 
他们可以发现你的真实身份、具体位置、你用的操作系统
 
 
8
 
00:00:23.400 --> 00:00:26.500
 
你打开过的网站,还有看网页用了哪个浏览器
 
 
9
 
00:00:26.700 --> 00:00:29.000
 
他们可以找到大量关于你的信息,但你可能没有意识到
 
 
10
 
00:00:29.200 --> 00:00:31.500
 
自己在与陌生人分享这些数据,这些人很容易
 
 
11
 
00:00:31.700 --> 00:00:34.000
 
利用你的个人信息,对你造成影响或伤害
 
 
12
 
00:00:34.500 --> 00:00:37.000
 
不过,Tor 可以让你避免这些担忧!
 
 
13
 
00:00:37.200 --> 00:00:40.800
 
Tor 浏览器保护你的在线隐私和身份
 
 
14
 
00:00:41.000 --> 00:00:44.800
 
通过三层加密, Tor 确保你的连接安全
 
 
15
 
00:00:45.000 --> 00:00:49.300
 
Tor 网络由世界各地的自愿者搭建的节点组成
 
通过三个这样的节点访问互联网
 
 
16
 
00:00:49.500 --> 00:00:54.500
 
确保我们能够自由地在线沟通,并保持匿名
 
 
17
 
00:00:55.000 --> 00:00:57.400
 
另外,面对企业或政府定向监视和大众监控
 
 
18
 
00:00:57.600 --> 00:01:02.600
 
Tor 同样可以保护我们的在线隐私
 
 
19
 
00:01:02.800 --> 00:01:07.800
 
或许你所在的国家试图监控互联网
 
 
20
 
00:01:08.000 --> 00:01:13.000
 
或许你不想那些大公司利用你的个人信息
 
 
21
 
00:01:13.800 --> 00:01:16.500
 
使用 Tor 可以让每个用户看起来一模一样
 
 
22
 
00:01:16.700 --> 00:01:20.800
 
如果网站和服务器无法区分你和其他人
 
那么你就是匿名的
 
 
23
 
00:01:21.900 --> 00:01:25.700
 
所以,更多人使用 Tor
 
进行区分就更难,你就更能够保持匿名
 
 
24
 
00:01:25.800 --> 00:01:29.800
 
因为,如果大家看起来都一样
 
就无法把你从人群中找出来
 
 
25
 
00:01:30.000 --> 00:01:32.500
 
你可以绕过网络封锁和审查
 
 
26
 
00:01:32.700 --> 00:01:36.100
 
同时无需担心审查人员
 
知道你在网络做了什么
 
 
27
 
00:01:36.300 --> 00:01:39.200
 
也不用担心点击一个链接后
 
 
28
 
00:01:39.400 --> 00:01:43.300
 
几个月都会看到类似的广告
 
 
29
 
00:01:43.800 --> 00:01:46.300
 
使用 Tor 浏览器
 
 
30
 
00:01:46.500 --> 00:01:48.500
 
网站就无法知道你是谁,你在地球的哪个角落
 
 
31
 
00:01:48.700 --> 00:01:50.700
 
当然,除非你登录网站并透露这些信息
 
 
32
 
00:01:53.200 --> 00:01:55.500
 
使用 Tor 浏览器
 
 
33
 
00:01:55.700 --> 00:01:58.000
 
保护那些需要匿名的人
 
 
34
 
00:01:58.200 --> 00:02:03.500
 
比如,异议人士,行动者,记者和博客作者
 
 
35
 
00:02:04.000 --> 00:02:09.000
 
马上下载,开始用 Tor!
 
另外,你也可以搭建 Tor 中继节点!
 
ennstatus/static/videos/subtitles/Tor_animation.zh-HK.vtt
Show inline comments
 
new file 100644
 
WEBVTT
 
 
1
 
00:00:00.660 --> 00:00:02.780
 
我哋已經非常習慣有互聯網
 
 
2
 
00:00:03.120 --> 00:00:07.700
 
我哋不停分享一啲關於我哋自己同埋個人生活嘅資訊
 
 
3
 
00:00:08.000 --> 00:00:09.960
 
我哋食嘅嘢,我哋見到嘅人
 
 
4
 
00:00:10.180 --> 00:00:12.480
 
我哋去嘅地方,我哋讀緊嘅書
 
 
5
 
00:00:13.280 --> 00:00:14.640
 
等我解釋長細啲啦
 
 
6
 
00:00:14.920 --> 00:00:17.740
 
就喺呢個時候,
 
如果有人上網嘗試追蹤你
 
 
7
 
00:00:18.060 --> 00:00:22.480
 
佢哋可以見到你真正嘅身份,
 
準確嘅位置同你部電腦嘅作業系統
 
 
8
 
00:00:22.800 --> 00:00:26.500
 
你上過嘅網站,你所用嘅瀏覽器
 
 
9
 
00:00:26.700 --> 00:00:29.140
 
同埋好多好多關於你同埋你生活嘅資料
 
 
10
 
00:00:29.200 --> 00:00:31.500
 
你本身都唔發覺同咗啲三唔識七嘅人分享
 
 
11
 
00:00:31.700 --> 00:00:34.000
 
佢哋可以好容易地利用呢啲資料
 
 
12
 
00:00:34.500 --> 00:00:37.000
 
不過如果你用Tor嘅話
 
 
13
 
00:00:37.140 --> 00:00:40.840
 
Tor保護您嘅個人私隱同埋您嘅身份
 
 
14
 
00:00:41.560 --> 00:00:44.760
 
Tor用三層加密嚟保護您嘅連線
 
 
15
 
00:00:44.940 --> 00:00:49.760
 
同埋經由三個世界各地義務營運嘅伺服器
 
 
16
 
00:00:50.280 --> 00:00:53.520
 
從而容許您喺互聯網上匿名地溝通
 
 
17
 
00:00:56.560 --> 00:00:58.280
 
Tor亦都保護您嘅資料
 
 
18
 
00:00:58.400 --> 00:01:01.900
 
遠離大公司或者政府嘅監控
 
 
19
 
00:01:02.880 --> 00:01:07.340
 
可能您住喺一個強權管治,嘗試控制同埋監視互聯網嘅國家
 
 
20
 
00:01:07.900 --> 00:01:11.800
 
或者您唔想大公司利用您嘅個人資訊
 
 
21
 
00:01:12.880 --> 00:01:15.640
 
Tor令到所有用戶望上去一模一樣
 
 
22
 
00:01:15.920 --> 00:01:18.800
 
從而令到睇嘅睇唔清,令到你變成匿名
 
 
23
 
00:01:19.500 --> 00:01:22.980
 
所以,愈多人用Tor,Tor就變得愈強
 
 
24
 
00:01:23.140 --> 00:01:27.800
 
因為可以更容易令一班人望落一模一樣
 
 
25
 
00:01:28.700 --> 00:01:31.240
 
同埋無拘無束地越過網絡審查
 
 
26
 
00:01:31.400 --> 00:01:34.100
 
而且審查者唔知您上網做咗啲乜
 
 
27
 
00:01:36.540 --> 00:01:39.440
 
一式一樣嘅廣告唔會跟住您幾個月
 
 
28
 
00:01:39.640 --> 00:01:41.300
 
因為您最初㩒咗落一個廣告度
 
 
29
 
00:01:43.880 --> 00:01:47.380
 
透過使用Tor,您上嘅網站唔會知道您係邊個
 
 
30
 
00:01:47.540 --> 00:01:49.760
 
唔會知你喺世界邊度上佢個網站
 
 
31
 
00:01:49.920 --> 00:01:51.920
 
除非您登入話畀佢知你係邊個
 
 
32
 
00:01:54.200 --> 00:01:55.840
 
透過下載同使用Tor,
 
 
33
 
00:01:56.200 --> 00:01:58.560
 
您可以保護一啲需要隱姓埋名嘅人
 
 
34
 
00:01:58.880 --> 00:02:01.640
 
例如活動家,記者同埋博客
 
 
35
 
00:02:02.000 --> 00:02:07.000
 
下載同埋用Tor,或者營運一個節點啦!
 
ennstatus/templates/root/index.html
Show inline comments
 
{% extends "base.html" %}
 

	
 
{% set title = "Index" %}
 

	
 
{% block styles %} 
 
  {{ super() }}
 
  <link rel="stylesheet" href="{{ url_for('static', filename='js/video.js/dist/video-js.min.css') }}">
 
{% endblock %}
 

	
 
{% block content %}
 
  <div class="col-md-4 text-center">
 
    <img class="img-rounded" alt="FVDE_Logo" src="{{ url_for('static', filename='images/logo/FVDE_logo_resize.png') }}"></img>
 
  </div>
 
  <div class="col-md-8">
 
    <div class="jumbotron">
 
      <h2>Frënn vun der Ënn A.S.B.L.</h2>
 
	    <p><em>Luxembourg based non-profit organization defending civil rights on the internet.</em></p>
 
      <p>We provide high-bandwidth Tor nodes all over the world to protect <strong>online privacy</strong>, <strong>anonymity</strong>, <strong>freedom of speech</strong> and fight <strong>censorship</strong>!
 
      </p>
 
      <h3><a href="{{ url_for('root.member') }}"><span class="label label-success">Become a Member</span></a> <a href="{{ url_for('donate.index') }}"><span class="label label-primary">Donate</span></a>
 
        <a class="pull-right" href="https://twitter.com/FrennVunDerEnn" target="blank"><span class="label label-info">@FrennVunDerEnn</span></a></h3>
 
@@ -25,29 +30,59 @@
 
        <footer>Georges, Teacher</footer>
 
      </p>
 
    </blockquote>
 
  </div>
 
  <div class="col-md-3">
 
    <blockquote>
 
      <a href="https://martianhumorist.me/" target="blank"><h2 class="text-center">You have something to hide!</h2></a>
 
      <footer>The Martian Humorist</footer>
 
    </blockquote>
 
  </div>
 
  <div class="col-md-6">
 
    <p>
 
      <video width="560" height="315" controls>
 
      <video id="tor-animation" width="560" height="315" controls preload="auto" class="video-js vjs-default-skin vjs-big-play-centered" data-setup="">
 
        <source src="{{ url_for('static', filename='videos/Tor_Animation.webm') }}" type='video/webm' />
 
        <source src="{{ url_for('static', filename='videos/Tor_Animation.mp4') }}" type='video/mp4' />
 

	
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.de.vtt', _external=True) }}" srclang="de" label="Deutsch">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.en.vtt', _external=True) }}" srclang="en" label="English">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.fr.vtt', _external=True) }}" srclang="fr" label="Français">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.ar.vtt', _external=True) }}" srclang="ar" label="العربية">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.ca.vtt', _external=True) }}" srclang="ca" label="Català">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.es.vtt', _external=True) }}" srclang="es" label="Español">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.eu.vtt', _external=True) }}" srclang="eu" label="Euskal">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.fa.vtt', _external=True) }}" srclang="fa" label="فارسی">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.fi.vtt', _external=True) }}" srclang="fi" label="Suomi">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.id.vtt', _external=True) }}" srclang="id" label="Indonesian">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.it.vtt', _external=True) }}" srclang="it" label="Italinao">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.lv.vtt', _external=True) }}" srclang="lv" label="Latvijā">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.pl.vtt', _external=True) }}" srclang="pl" label="Polskie">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.pt.vtt', _external=True) }}" srclang="pt" label="Português">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.ru.vtt', _external=True) }}" srclang="ru" label="русский">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.sq.vtt', _external=True) }}" srclang="sq" label="Shqiptar">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.sv.vtt', _external=True) }}" srclang="sv" label="Svenska">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.tl-PH.vtt', _external=True) }}" srclang="tl-PH" label="Fillipino">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.zh-CN.vtt', _external=True) }}" srclang="zh-CN" label="Chinese (China)">
 
        <track src="{{ url_for('static', filename='videos/subtitles/Tor_animation.zh-HK.vtt', _external=True) }}" srclang="zh-HK" label="Chinese (Hongkong)">
 
      </video>
 
    </p>
 
  </div>
 
  <div class="col-md-6">
 
      <p class=lead>
 
        <br>
 
        Tor is free software and an open network that helps you defend against network surveillance and preserve your personal freedom and privacy on the Internet.
 
      </p>
 
      <p>
 
        By bouncing your communications around a distributed network of relays run by volunteers all around the world, it prevents somebody watching your Internet connection from learning what sites you visit, and it prevents the sites you visit from learning your physical location.
 
      </p>
 
      <h2><a href="http://torproject.lu" target="blank"><span class="label label-info">Learn more about Tor</span></a></h2>
 
  </div>
 
{% endblock %}
 

	
 
{% block scripts %}
 
  {{ super() }}
 
  <script src="{{ url_for('static', filename='js/video.js/dist/video.min.js') }}"></script>
 
  <script>
 
    videojs.options.flash.swf = "{{ url_for('static', filename='js/video.js/dist/video-js.swf') }}"
 
  </script>
 
{% endblock %}
 

	
0 comments (0 inline, 0 general)