Explorar el Código

Update mediaelement

jmontoyaa hace 7 años
padre
commit
7dcddbe6ae
Se han modificado 91 ficheros con 16987 adiciones y 24696 borrados
  1. 6 6
      app/Resources/public/assets/mediaelement/.bower.json
  2. 73 24
      app/Resources/public/assets/mediaelement/README.md
  3. 1 1
      app/Resources/public/assets/mediaelement/bower.json
  4. 0 0
      app/Resources/public/assets/mediaelement/build/DO NOT CHANGE THESE FILES. USE -src- FOLDER.txt
  5. BIN
      app/Resources/public/assets/mediaelement/build/background.png
  6. BIN
      app/Resources/public/assets/mediaelement/build/bigplay.fw.png
  7. BIN
      app/Resources/public/assets/mediaelement/build/bigplay.png
  8. 0 14
      app/Resources/public/assets/mediaelement/build/bigplay.svg
  9. BIN
      app/Resources/public/assets/mediaelement/build/controls-ted.png
  10. BIN
      app/Resources/public/assets/mediaelement/build/controls-wmp-bg.png
  11. BIN
      app/Resources/public/assets/mediaelement/build/controls-wmp.png
  12. BIN
      app/Resources/public/assets/mediaelement/build/controls.fw.png
  13. BIN
      app/Resources/public/assets/mediaelement/build/controls.png
  14. 0 0
      app/Resources/public/assets/mediaelement/build/controls.svg
  15. BIN
      app/Resources/public/assets/mediaelement/build/flashmediaelement-cdn.swf
  16. BIN
      app/Resources/public/assets/mediaelement/build/flashmediaelement-debug.swf
  17. BIN
      app/Resources/public/assets/mediaelement/build/flashmediaelement.swf
  18. 0 9597
      app/Resources/public/assets/mediaelement/build/jquery.js
  19. BIN
      app/Resources/public/assets/mediaelement/build/jumpforward.png
  20. 89 0
      app/Resources/public/assets/mediaelement/build/lang/ca.js
  21. 90 0
      app/Resources/public/assets/mediaelement/build/lang/cs.js
  22. 90 0
      app/Resources/public/assets/mediaelement/build/lang/de.js
  23. 90 0
      app/Resources/public/assets/mediaelement/build/lang/es.js
  24. 90 0
      app/Resources/public/assets/mediaelement/build/lang/fa.js
  25. 91 0
      app/Resources/public/assets/mediaelement/build/lang/fr.js
  26. 87 0
      app/Resources/public/assets/mediaelement/build/lang/hr.js
  27. 90 0
      app/Resources/public/assets/mediaelement/build/lang/hu.js
  28. 90 0
      app/Resources/public/assets/mediaelement/build/lang/it.js
  29. 90 0
      app/Resources/public/assets/mediaelement/build/lang/ja.js
  30. 90 0
      app/Resources/public/assets/mediaelement/build/lang/ko.js
  31. 0 74
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-cs.js
  32. 0 74
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-de.js
  33. 0 74
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-en.js
  34. 0 74
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-es.js
  35. 0 75
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-fr.js
  36. 0 74
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-hu.js
  37. 0 74
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-it.js
  38. 0 74
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-ja.js
  39. 0 74
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-ko.js
  40. 0 75
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-nl.js
  41. 0 74
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-pl.js
  42. 0 74
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-pt-br.js
  43. 0 74
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-pt.js
  44. 0 74
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-ro.js
  45. 0 74
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-ru.js
  46. 0 74
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-sk.js
  47. 0 74
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-zh-cn.js
  48. 0 74
      app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-zh.js
  49. 91 0
      app/Resources/public/assets/mediaelement/build/lang/nl.js
  50. 90 0
      app/Resources/public/assets/mediaelement/build/lang/pl.js
  51. 92 0
      app/Resources/public/assets/mediaelement/build/lang/pt.js
  52. 90 0
      app/Resources/public/assets/mediaelement/build/lang/ro.js
  53. 90 0
      app/Resources/public/assets/mediaelement/build/lang/ru.js
  54. 90 0
      app/Resources/public/assets/mediaelement/build/lang/sk.js
  55. 89 0
      app/Resources/public/assets/mediaelement/build/lang/sv.js
  56. 89 0
      app/Resources/public/assets/mediaelement/build/lang/uk.js
  57. 90 0
      app/Resources/public/assets/mediaelement/build/lang/zh-cn.js
  58. 91 0
      app/Resources/public/assets/mediaelement/build/lang/zh.js
  59. BIN
      app/Resources/public/assets/mediaelement/build/loading.gif
  60. 7440 5840
      app/Resources/public/assets/mediaelement/build/mediaelement-and-player.js
  61. 0 12
      app/Resources/public/assets/mediaelement/build/mediaelement-and-player.min.js
  62. BIN
      app/Resources/public/assets/mediaelement/build/mediaelement-flash-audio-ogg.swf
  63. BIN
      app/Resources/public/assets/mediaelement/build/mediaelement-flash-audio.swf
  64. BIN
      app/Resources/public/assets/mediaelement/build/mediaelement-flash-video-hls.swf
  65. BIN
      app/Resources/public/assets/mediaelement/build/mediaelement-flash-video-mdash.swf
  66. BIN
      app/Resources/public/assets/mediaelement/build/mediaelement-flash-video.swf
  67. 3661 2254
      app/Resources/public/assets/mediaelement/build/mediaelement.js
  68. 4 7
      app/Resources/public/assets/mediaelement/build/mediaelement.min.js
  69. 771 0
      app/Resources/public/assets/mediaelement/build/mediaelementplayer-legacy.css
  70. 0 0
      app/Resources/public/assets/mediaelement/build/mediaelementplayer-legacy.min.css
  71. 614 850
      app/Resources/public/assets/mediaelement/build/mediaelementplayer.css
  72. 0 4213
      app/Resources/public/assets/mediaelement/build/mediaelementplayer.js
  73. 0 0
      app/Resources/public/assets/mediaelement/build/mediaelementplayer.min.css
  74. 0 12
      app/Resources/public/assets/mediaelement/build/mediaelementplayer.min.js
  75. BIN
      app/Resources/public/assets/mediaelement/build/mejs-controls.png
  76. 0 0
      app/Resources/public/assets/mediaelement/build/mejs-controls.svg
  77. 0 289
      app/Resources/public/assets/mediaelement/build/mejs-skins.css
  78. 393 0
      app/Resources/public/assets/mediaelement/build/renderers/dailymotion.js
  79. 11 0
      app/Resources/public/assets/mediaelement/build/renderers/dailymotion.min.js
  80. 347 0
      app/Resources/public/assets/mediaelement/build/renderers/facebook.js
  81. 11 0
      app/Resources/public/assets/mediaelement/build/renderers/facebook.min.js
  82. 306 0
      app/Resources/public/assets/mediaelement/build/renderers/soundcloud.js
  83. 11 0
      app/Resources/public/assets/mediaelement/build/renderers/soundcloud.min.js
  84. 374 0
      app/Resources/public/assets/mediaelement/build/renderers/twitch.js
  85. 11 0
      app/Resources/public/assets/mediaelement/build/renderers/twitch.min.js
  86. 405 0
      app/Resources/public/assets/mediaelement/build/renderers/vimeo.js
  87. 11 0
      app/Resources/public/assets/mediaelement/build/renderers/vimeo.min.js
  88. BIN
      app/Resources/public/assets/mediaelement/build/silverlightmediaelement.xap
  89. BIN
      app/Resources/public/assets/mediaelement/build/skipback.png
  90. 647 242
      app/Resources/public/assets/mediaelement/changelog.md
  91. 1 1
      bower.json

+ 6 - 6
app/Resources/public/assets/mediaelement/.bower.json

@@ -1,6 +1,6 @@
 {
   "name": "mediaelement",
-  "homepage": "https://github.com/herby/mediaelement",
+  "homepage": "https://github.com/mediaelement/mediaelement",
   "description": "HTML5 <video> and <audio> made easy.",
   "moduleType": [
     "globals"
@@ -23,14 +23,14 @@
     "./build/mediaelement-and-player.js",
     "./build/mediaelementplayer.css"
   ],
-  "version": "2.23.5",
-  "_release": "2.23.5",
+  "version": "4.2.5",
+  "_release": "4.2.5",
   "_resolution": {
     "type": "version",
-    "tag": "2.23.5",
-    "commit": "b78c8e9416b1ba9d8be3de9417fbb7eda95a6b59"
+    "tag": "4.2.5",
+    "commit": "71a4642fa25a8db2fb1f81f4171e2cd4fd64244c"
   },
   "_source": "https://github.com/johndyer/mediaelement.git",
-  "_target": "2.*",
+  "_target": "4.*",
   "_originalSource": "mediaelement"
 }

+ 73 - 24
app/Resources/public/assets/mediaelement/README.md

@@ -1,18 +1,24 @@
-# `MediaElement.js`: `<video>` and `<audio>` made easy. 
+# ![MediaElementJS](https://cloud.githubusercontent.com/assets/910829/22357262/e6cf32b4-e404-11e6-876b-59afa009f65c.png)
 
 One file. Any browser. Same UI.
 
 * Author: John Dyer [http://j.hn/](http://j.hn/)
 * Website: [http://mediaelementjs.com/](http://mediaelementjs.com/)
-* License: [MIT](http://johndyer.mit-license.org/)
+* License: [MIT](http://mediaelement.mit-license.org/)
 * Meaning: Use everywhere, keep copyright, it'd be swell if you'd link back here.
 * Thanks: my employer, [Dallas Theological Seminary](http://www.dts.edu/)
-* Contributors: [all contributors](https://github.com/johndyer/mediaelement/graphs/contributors)
+* Contributors: [all contributors](https://github.com/mediaelement/mediaelement/graphs/contributors)
+
+[![GitHub Version](https://img.shields.io/npm/v/mediaelement.svg)](https://github.com/mediaelement/mediaelement)
+[![Build Status](https://img.shields.io/travis/mediaelement/mediaelement.svg)](https://travis-ci.org/mediaelement/mediaelement)
+[![Coverage Status](https://img.shields.io/coveralls/mediaelement/mediaelement.svg)](https://coveralls.io/github/mediaelement/mediaelement)
+[![MIT License](https://img.shields.io/npm/l/mediaelement.svg)](https://mediaelement.mit-license.org/)
+[![CDNJS](https://img.shields.io/cdnjs/v/mediaelement.svg)](https://cdnjs.com/libraries/mediaelement)
 
 # Table of Contents
 
 * [Introduction](#intro)
-* [Browser and Device support](#browser-support)
+* [Migrating from `2.x` to `4.x` version](#migration)
 * [Installation and Usage](#installation)
 * [API and Configuration](#api)
 * [Guidelines for Contributors](#guidelines)
@@ -24,47 +30,90 @@ One file. Any browser. Same UI.
 
 _MediaElementPlayer: HTML5 `<video>` and `<audio>` player_
 
-A complete HTML/CSS audio/video player built on top `MediaElement.js` and `jQuery`. Many great HTML5 players have a completely separate Flash UI in fallback mode, but MediaElementPlayer.js uses the same HTML/CSS for all players.
+A complete HTML/CSS audio/video player built on top `MediaElement.js`. Many great HTML5 players have a completely separate Flash UI in fallback mode, but MediaElementPlayer.js uses the same HTML/CSS for all players.
+
+`MediaElement.js` is a set of custom Flash plugins that mimic the HTML5 MediaElement API for browsers that don't support HTML5 or don't support the media codecs you're using.
+Instead of using Flash as a _fallback_, Flash is used to make the browser seem HTML5 compliant and enable codecs like H.264 (via Flash) on all browsers.
+
+In general, `MediaElement.js` supports **IE11+, MS Edge, Chrome, Firefox, Safari, iOS 8+** and **Android 4.0+**.
+
+**It is strongly recommended to read the entire documentation and check the `demo` folder to get the most out of this package**. Visit [here](docs) to start.
+
+## * IMPORTANT CHANGES on `4.2.0` version
+
+As part of the continuous improvements the player, we have decided to drop completely support for IE9 and IE10, since market share of those browsers together is 0.4%, according to http://caniuse.com/usage-table.
+ 
+This change is for `MediaElement` and `MediaElement Plugins` repositories. 
+
+<a id="migration"></a>
+## * IMPORTANT: Migrating from `2.x` to `4.x` version
+
+**NOTE:** `3.x` version has jQuery in the code base, and `4.x` is framework-agnostic. So for either `3.x` or `4.x` versions, the following steps are valid, but it is highly recommended to upgrade to `4.x`.
+
+In order to successfully install `4.x` in an existing setup, you must consider the following guidelines:
+
+1. If your installation relies on the legacy player classes (i.e., `mejs-player`, `mejs-container`, etc.), you **must** set up the proper namespace. In `2.x`, the default namespace is `mejs-` but now is `mejs__`. In order to set up a new namespace (or the legacy one), use the `classPrefix` configuration, and make sure you use the `mediaelementplayer-legacy` stylesheet provided in the `/build/` folder.
+
+2. By default, `MediaElement` has bundled native renderers, such as HLS, M(PEG)-DASH and FLV, as well as YouTube and Flash shims. **If you want to use any other renderer, you MUST refer to the `build/renderers` folder and add as many as you want**. Check `demo/index.html` for a better reference.
 
-`MediaElement.js` is a set of custom Flash and Silverlight plugins that mimic the HTML5 MediaElement API for browsers that don't support HTML5 or don't support the media codecs you're using. 
-Instead of using Flash as a _fallback_, Flash is used to make the browser seem HTML5 compliant and enable codecs like H.264 (via Flash) and even WMV (via Silverlight) on all browsers.
+3. You **must** set up now the path for the Flash shims if they are not in the same folder as the JS files. To do this, set the path via the `pluginPath` configuration. In the same topic, if you need to support browsers with Javascript disabled, you **must** reference the correct Flash shim, since in `2.x` there was only a single Flash shim and in `3.x` it was split to target specific media types. Check the [Browsers with JavaScript disabled](docs/installation.md#disabled-javascript) section for more details.
 
-<a id="browser-support"></a>
-## Browser and Device support
+4. If you want to use Flash shims from a CDN, do the change related to `pluginPath` setting the CDN's URL, and also setting `shimScriptAccess` configuration as **`always`**.
 
-Format | Support
------- | -------
-**mp4** | Please visit http://caniuse.com/#feat=mpeg4 for comprehensive information
-**webm** | Please visit http://caniuse.com/#feat=webm for comprehensive information
-**mp3** | Please visit http://caniuse.com/#feat=mp3 for comprehensive information
-**m3u8** | Safari and iOS (native); all browsers that support **Flash** (version 10 or later)
-**rtmp/flv** | All browsers that support **Flash** (version 10 or later)
-**wmv/wma** | All browsers that support **Silverlight**
-**YouTube** | All browsers since it uses `iframe` tag
+5. If you need to force the Flash shim, the way to do it in `3.x` version is to use the `renderers` configuration and list them in an array.
+
+6. `pluginType` was removed to favor `rendererName`. If you rely on that element, just create conditionals based on the renderer ID (all listed [here](docs/usage.md#renderers-list)). For example:
+
+```javascript
+$('video, audio').mediaelementplayer({
+	// Configuration
+	success: function(media) {
+		var isNative = /html5|native/i.test(media.rendererName);
+
+		var isYoutube = ~media.rendererName.indexOf('youtube');
+
+		// etc.
+	}
+});
+```
 
 <a id="installation"></a>
 ## Installation and Usage
 
-The full documentation on how to install `MediaElement.js` is available at [Installation](installation.md).
+The full documentation on how to install `MediaElement.js` is available at [Installation](docs/installation.md).
+
+A brief guide on how to create and use instances of `MediaElement` available at [Usage](docs/usage.md).
 
-A brief guide on how to create and use instances of `MediaElement` available at [Usage](usage.md).
+Additional features can be found at https://github.com/mediaelement/mediaelement-plugins.
 
 <a id="api"></a>
 ## API and Configuration
-   
-`MediaElement.js` has many options that you can take advantage from. Visit [API and Configuration](api.md) for more details.
+
+`MediaElement.js` has many options that you can take advantage from. Visit [API and Configuration](docs/api.md) for more details.
+
+Also, a `Utilities/Features` guide is available for development. Visit [Utilities/Features](docs/utils.md) for more details.
 
 <a id="guidelines"></a>
 ## Guidelines for Contributors
 
-If you want to contribute to improve this package, please read [Guidelines](guidelines.md).
+If you want to contribute to improve this package, please read [Guidelines](docs/guidelines.md).
+
+**NOTE**: If you would like to contribute with translations, make sure that you also check https://github.com/mediaelement/mediaelement-plugins, and perform the
+translations for the files suffixed as `-i18n`.
+
+<a id="sources"></a>
+## Useful resources
+
+A compilation of useful articles can be found [here](docs/resources.md).
 
 <a id="changelog"></a>
 ## Change Log
 
-Changes available at [Change Log](changelog.md)
+Changes available at [Change Log](changelog.md).
 
 <a id="todo"></a>
 ## TODO list
 
+**IMPORTANT:** Before posting an issue, it is strongly encouraged to read the whole documentation since it covers the majority of scenarios exposed in prior issues.
+
 New features and pending bugs can be found at [TODO list](TODO.md).

+ 1 - 1
app/Resources/public/assets/mediaelement/bower.json

@@ -1,6 +1,6 @@
 {
   "name": "mediaelement",
-  "homepage": "https://github.com/herby/mediaelement",
+  "homepage": "https://github.com/mediaelement/mediaelement",
   "description": "HTML5 <video> and <audio> made easy.",
   "moduleType": [
     "globals"

+ 0 - 0
app/Resources/public/assets/mediaelement/build/DO NOT CHANGE THESE FILES. USE -src- FOLDER.txt


BIN
app/Resources/public/assets/mediaelement/build/background.png


BIN
app/Resources/public/assets/mediaelement/build/bigplay.fw.png


BIN
app/Resources/public/assets/mediaelement/build/bigplay.png


+ 0 - 14
app/Resources/public/assets/mediaelement/build/bigplay.svg

@@ -1,14 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<svg id="bigplay" viewBox="0 0 100 200" style="background-color:#ffffff00" version="1.1"
-	xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve"
-	x="0px" y="0px" width="100px" height="200px"
->
-	<g id="dark">
-		<path id="Polygon"  d="M 72.5 49.5 L 38.75 68.9856 L 38.75 30.0144 L 72.5 49.5 Z" fill="#ffffff" opacity="0.75" />
-		<path id="Ellipse" d="M 13 50.5 C 13 29.7891 29.7891 13 50.5 13 C 71.2109 13 88 29.7891 88 50.5 C 88 71.2109 71.2109 88 50.5 88 C 29.7891 88 13 71.2109 13 50.5 Z" stroke="#ffffff" stroke-width="5" fill="none" opacity="0.75"/>
-	</g>
-	<g id="light">
-		<path id="Polygon2"  d="M 72.5 149.5 L 38.75 168.9856 L 38.75 130.0144 L 72.5 149.5 Z" fill="#ffffff" opacity="1.0" />
-		<path id="Ellipse2" d="M 13 150.5 C 13 129.7891 29.7891 113 50.5 113 C 71.2109 113 88 129.7891 88 150.5 C 88 171.211 71.2109 188 50.5 188 C 29.7891 188 13 171.211 13 150.5 Z" stroke="#ffffff" stroke-width="5" fill="none" opacity="1.0"/>
-	</g>
-</svg>

BIN
app/Resources/public/assets/mediaelement/build/controls-ted.png


BIN
app/Resources/public/assets/mediaelement/build/controls-wmp-bg.png


BIN
app/Resources/public/assets/mediaelement/build/controls-wmp.png


BIN
app/Resources/public/assets/mediaelement/build/controls.fw.png


BIN
app/Resources/public/assets/mediaelement/build/controls.png


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
app/Resources/public/assets/mediaelement/build/controls.svg


BIN
app/Resources/public/assets/mediaelement/build/flashmediaelement-cdn.swf


BIN
app/Resources/public/assets/mediaelement/build/flashmediaelement-debug.swf


BIN
app/Resources/public/assets/mediaelement/build/flashmediaelement.swf


+ 0 - 9597
app/Resources/public/assets/mediaelement/build/jquery.js

@@ -1,9597 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.9.1
- * http://jquery.com/
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- *
- * Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2013-2-4
- */
-(function( window, undefined ) {
-
-// Can't do this because several apps including ASP.NET trace
-// the stack via arguments.caller.callee and Firefox dies if
-// you try to trace through "use strict" call chains. (#13335)
-// Support: Firefox 18+
-//"use strict";
-var
-	// The deferred used on DOM ready
-	readyList,
-
-	// A central reference to the root jQuery(document)
-	rootjQuery,
-
-	// Support: IE<9
-	// For `typeof node.method` instead of `node.method !== undefined`
-	core_strundefined = typeof undefined,
-
-	// Use the correct document accordingly with window argument (sandbox)
-	document = window.document,
-	location = window.location,
-
-	// Map over jQuery in case of overwrite
-	_jQuery = window.jQuery,
-
-	// Map over the $ in case of overwrite
-	_$ = window.$,
-
-	// [[Class]] -> type pairs
-	class2type = {},
-
-	// List of deleted data cache ids, so we can reuse them
-	core_deletedIds = [],
-
-	core_version = "1.9.1",
-
-	// Save a reference to some core methods
-	core_concat = core_deletedIds.concat,
-	core_push = core_deletedIds.push,
-	core_slice = core_deletedIds.slice,
-	core_indexOf = core_deletedIds.indexOf,
-	core_toString = class2type.toString,
-	core_hasOwn = class2type.hasOwnProperty,
-	core_trim = core_version.trim,
-
-	// Define a local copy of jQuery
-	jQuery = function( selector, context ) {
-		// The jQuery object is actually just the init constructor 'enhanced'
-		return new jQuery.fn.init( selector, context, rootjQuery );
-	},
-
-	// Used for matching numbers
-	core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
-
-	// Used for splitting on whitespace
-	core_rnotwhite = /\S+/g,
-
-	// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
-	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
-
-	// A simple way to check for HTML strings
-	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-	// Strict HTML recognition (#11290: must start with <)
-	rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,
-
-	// Match a standalone tag
-	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
-
-	// JSON RegExp
-	rvalidchars = /^[\],:{}\s]*$/,
-	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-	rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
-	rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
-
-	// Matches dashed string for camelizing
-	rmsPrefix = /^-ms-/,
-	rdashAlpha = /-([\da-z])/gi,
-
-	// Used by jQuery.camelCase as callback to replace()
-	fcamelCase = function( all, letter ) {
-		return letter.toUpperCase();
-	},
-
-	// The ready event handler
-	completed = function( event ) {
-
-		// readyState === "complete" is good enough for us to call the dom ready in oldIE
-		if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
-			detach();
-			jQuery.ready();
-		}
-	},
-	// Clean-up method for dom ready events
-	detach = function() {
-		if ( document.addEventListener ) {
-			document.removeEventListener( "DOMContentLoaded", completed, false );
-			window.removeEventListener( "load", completed, false );
-
-		} else {
-			document.detachEvent( "onreadystatechange", completed );
-			window.detachEvent( "onload", completed );
-		}
-	};
-
-jQuery.fn = jQuery.prototype = {
-	// The current version of jQuery being used
-	jquery: core_version,
-
-	constructor: jQuery,
-	init: function( selector, context, rootjQuery ) {
-		var match, elem;
-
-		// HANDLE: $(""), $(null), $(undefined), $(false)
-		if ( !selector ) {
-			return this;
-		}
-
-		// Handle HTML strings
-		if ( typeof selector === "string" ) {
-			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
-				// Assume that strings that start and end with <> are HTML and skip the regex check
-				match = [ null, selector, null ];
-
-			} else {
-				match = rquickExpr.exec( selector );
-			}
-
-			// Match html or make sure no context is specified for #id
-			if ( match && (match[1] || !context) ) {
-
-				// HANDLE: $(html) -> $(array)
-				if ( match[1] ) {
-					context = context instanceof jQuery ? context[0] : context;
-
-					// scripts is true for back-compat
-					jQuery.merge( this, jQuery.parseHTML(
-						match[1],
-						context && context.nodeType ? context.ownerDocument || context : document,
-						true
-					) );
-
-					// HANDLE: $(html, props)
-					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
-						for ( match in context ) {
-							// Properties of context are called as methods if possible
-							if ( jQuery.isFunction( this[ match ] ) ) {
-								this[ match ]( context[ match ] );
-
-							// ...and otherwise set as attributes
-							} else {
-								this.attr( match, context[ match ] );
-							}
-						}
-					}
-
-					return this;
-
-				// HANDLE: $(#id)
-				} else {
-					elem = document.getElementById( match[2] );
-
-					// Check parentNode to catch when Blackberry 4.6 returns
-					// nodes that are no longer in the document #6963
-					if ( elem && elem.parentNode ) {
-						// Handle the case where IE and Opera return items
-						// by name instead of ID
-						if ( elem.id !== match[2] ) {
-							return rootjQuery.find( selector );
-						}
-
-						// Otherwise, we inject the element directly into the jQuery object
-						this.length = 1;
-						this[0] = elem;
-					}
-
-					this.context = document;
-					this.selector = selector;
-					return this;
-				}
-
-			// HANDLE: $(expr, $(...))
-			} else if ( !context || context.jquery ) {
-				return ( context || rootjQuery ).find( selector );
-
-			// HANDLE: $(expr, context)
-			// (which is just equivalent to: $(context).find(expr)
-			} else {
-				return this.constructor( context ).find( selector );
-			}
-
-		// HANDLE: $(DOMElement)
-		} else if ( selector.nodeType ) {
-			this.context = this[0] = selector;
-			this.length = 1;
-			return this;
-
-		// HANDLE: $(function)
-		// Shortcut for document ready
-		} else if ( jQuery.isFunction( selector ) ) {
-			return rootjQuery.ready( selector );
-		}
-
-		if ( selector.selector !== undefined ) {
-			this.selector = selector.selector;
-			this.context = selector.context;
-		}
-
-		return jQuery.makeArray( selector, this );
-	},
-
-	// Start with an empty selector
-	selector: "",
-
-	// The default length of a jQuery object is 0
-	length: 0,
-
-	// The number of elements contained in the matched element set
-	size: function() {
-		return this.length;
-	},
-
-	toArray: function() {
-		return core_slice.call( this );
-	},
-
-	// Get the Nth element in the matched element set OR
-	// Get the whole matched element set as a clean array
-	get: function( num ) {
-		return num == null ?
-
-			// Return a 'clean' array
-			this.toArray() :
-
-			// Return just the object
-			( num < 0 ? this[ this.length + num ] : this[ num ] );
-	},
-
-	// Take an array of elements and push it onto the stack
-	// (returning the new matched element set)
-	pushStack: function( elems ) {
-
-		// Build a new jQuery matched element set
-		var ret = jQuery.merge( this.constructor(), elems );
-
-		// Add the old object onto the stack (as a reference)
-		ret.prevObject = this;
-		ret.context = this.context;
-
-		// Return the newly-formed element set
-		return ret;
-	},
-
-	// Execute a callback for every element in the matched set.
-	// (You can seed the arguments with an array of args, but this is
-	// only used internally.)
-	each: function( callback, args ) {
-		return jQuery.each( this, callback, args );
-	},
-
-	ready: function( fn ) {
-		// Add the callback
-		jQuery.ready.promise().done( fn );
-
-		return this;
-	},
-
-	slice: function() {
-		return this.pushStack( core_slice.apply( this, arguments ) );
-	},
-
-	first: function() {
-		return this.eq( 0 );
-	},
-
-	last: function() {
-		return this.eq( -1 );
-	},
-
-	eq: function( i ) {
-		var len = this.length,
-			j = +i + ( i < 0 ? len : 0 );
-		return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
-	},
-
-	map: function( callback ) {
-		return this.pushStack( jQuery.map(this, function( elem, i ) {
-			return callback.call( elem, i, elem );
-		}));
-	},
-
-	end: function() {
-		return this.prevObject || this.constructor(null);
-	},
-
-	// For internal use only.
-	// Behaves like an Array's method, not like a jQuery method.
-	push: core_push,
-	sort: [].sort,
-	splice: [].splice
-};
-
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
-jQuery.extend = jQuery.fn.extend = function() {
-	var src, copyIsArray, copy, name, options, clone,
-		target = arguments[0] || {},
-		i = 1,
-		length = arguments.length,
-		deep = false;
-
-	// Handle a deep copy situation
-	if ( typeof target === "boolean" ) {
-		deep = target;
-		target = arguments[1] || {};
-		// skip the boolean and the target
-		i = 2;
-	}
-
-	// Handle case when target is a string or something (possible in deep copy)
-	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
-		target = {};
-	}
-
-	// extend jQuery itself if only one argument is passed
-	if ( length === i ) {
-		target = this;
-		--i;
-	}
-
-	for ( ; i < length; i++ ) {
-		// Only deal with non-null/undefined values
-		if ( (options = arguments[ i ]) != null ) {
-			// Extend the base object
-			for ( name in options ) {
-				src = target[ name ];
-				copy = options[ name ];
-
-				// Prevent never-ending loop
-				if ( target === copy ) {
-					continue;
-				}
-
-				// Recurse if we're merging plain objects or arrays
-				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
-					if ( copyIsArray ) {
-						copyIsArray = false;
-						clone = src && jQuery.isArray(src) ? src : [];
-
-					} else {
-						clone = src && jQuery.isPlainObject(src) ? src : {};
-					}
-
-					// Never move original objects, clone them
-					target[ name ] = jQuery.extend( deep, clone, copy );
-
-				// Don't bring in undefined values
-				} else if ( copy !== undefined ) {
-					target[ name ] = copy;
-				}
-			}
-		}
-	}
-
-	// Return the modified object
-	return target;
-};
-
-jQuery.extend({
-	noConflict: function( deep ) {
-		if ( window.$ === jQuery ) {
-			window.$ = _$;
-		}
-
-		if ( deep && window.jQuery === jQuery ) {
-			window.jQuery = _jQuery;
-		}
-
-		return jQuery;
-	},
-
-	// Is the DOM ready to be used? Set to true once it occurs.
-	isReady: false,
-
-	// A counter to track how many items to wait for before
-	// the ready event fires. See #6781
-	readyWait: 1,
-
-	// Hold (or release) the ready event
-	holdReady: function( hold ) {
-		if ( hold ) {
-			jQuery.readyWait++;
-		} else {
-			jQuery.ready( true );
-		}
-	},
-
-	// Handle when the DOM is ready
-	ready: function( wait ) {
-
-		// Abort if there are pending holds or we're already ready
-		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
-			return;
-		}
-
-		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-		if ( !document.body ) {
-			return setTimeout( jQuery.ready );
-		}
-
-		// Remember that the DOM is ready
-		jQuery.isReady = true;
-
-		// If a normal DOM Ready event fired, decrement, and wait if need be
-		if ( wait !== true && --jQuery.readyWait > 0 ) {
-			return;
-		}
-
-		// If there are functions bound, to execute
-		readyList.resolveWith( document, [ jQuery ] );
-
-		// Trigger any bound ready events
-		if ( jQuery.fn.trigger ) {
-			jQuery( document ).trigger("ready").off("ready");
-		}
-	},
-
-	// See test/unit/core.js for details concerning isFunction.
-	// Since version 1.3, DOM methods and functions like alert
-	// aren't supported. They return false on IE (#2968).
-	isFunction: function( obj ) {
-		return jQuery.type(obj) === "function";
-	},
-
-	isArray: Array.isArray || function( obj ) {
-		return jQuery.type(obj) === "array";
-	},
-
-	isWindow: function( obj ) {
-		return obj != null && obj == obj.window;
-	},
-
-	isNumeric: function( obj ) {
-		return !isNaN( parseFloat(obj) ) && isFinite( obj );
-	},
-
-	type: function( obj ) {
-		if ( obj == null ) {
-			return String( obj );
-		}
-		return typeof obj === "object" || typeof obj === "function" ?
-			class2type[ core_toString.call(obj) ] || "object" :
-			typeof obj;
-	},
-
-	isPlainObject: function( obj ) {
-		// Must be an Object.
-		// Because of IE, we also have to check the presence of the constructor property.
-		// Make sure that DOM nodes and window objects don't pass through, as well
-		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
-			return false;
-		}
-
-		try {
-			// Not own constructor property must be Object
-			if ( obj.constructor &&
-				!core_hasOwn.call(obj, "constructor") &&
-				!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
-				return false;
-			}
-		} catch ( e ) {
-			// IE8,9 Will throw exceptions on certain host objects #9897
-			return false;
-		}
-
-		// Own properties are enumerated firstly, so to speed up,
-		// if last one is own, then all properties are own.
-
-		var key;
-		for ( key in obj ) {}
-
-		return key === undefined || core_hasOwn.call( obj, key );
-	},
-
-	isEmptyObject: function( obj ) {
-		var name;
-		for ( name in obj ) {
-			return false;
-		}
-		return true;
-	},
-
-	error: function( msg ) {
-		throw new Error( msg );
-	},
-
-	// data: string of html
-	// context (optional): If specified, the fragment will be created in this context, defaults to document
-	// keepScripts (optional): If true, will include scripts passed in the html string
-	parseHTML: function( data, context, keepScripts ) {
-		if ( !data || typeof data !== "string" ) {
-			return null;
-		}
-		if ( typeof context === "boolean" ) {
-			keepScripts = context;
-			context = false;
-		}
-		context = context || document;
-
-		var parsed = rsingleTag.exec( data ),
-			scripts = !keepScripts && [];
-
-		// Single tag
-		if ( parsed ) {
-			return [ context.createElement( parsed[1] ) ];
-		}
-
-		parsed = jQuery.buildFragment( [ data ], context, scripts );
-		if ( scripts ) {
-			jQuery( scripts ).remove();
-		}
-		return jQuery.merge( [], parsed.childNodes );
-	},
-
-	parseJSON: function( data ) {
-		// Attempt to parse using the native JSON parser first
-		if ( window.JSON && window.JSON.parse ) {
-			return window.JSON.parse( data );
-		}
-
-		if ( data === null ) {
-			return data;
-		}
-
-		if ( typeof data === "string" ) {
-
-			// Make sure leading/trailing whitespace is removed (IE can't handle it)
-			data = jQuery.trim( data );
-
-			if ( data ) {
-				// Make sure the incoming data is actual JSON
-				// Logic borrowed from http://json.org/json2.js
-				if ( rvalidchars.test( data.replace( rvalidescape, "@" )
-					.replace( rvalidtokens, "]" )
-					.replace( rvalidbraces, "")) ) {
-
-					return ( new Function( "return " + data ) )();
-				}
-			}
-		}
-
-		jQuery.error( "Invalid JSON: " + data );
-	},
-
-	// Cross-browser xml parsing
-	parseXML: function( data ) {
-		var xml, tmp;
-		if ( !data || typeof data !== "string" ) {
-			return null;
-		}
-		try {
-			if ( window.DOMParser ) { // Standard
-				tmp = new DOMParser();
-				xml = tmp.parseFromString( data , "text/xml" );
-			} else { // IE
-				xml = new ActiveXObject( "Microsoft.XMLDOM" );
-				xml.async = "false";
-				xml.loadXML( data );
-			}
-		} catch( e ) {
-			xml = undefined;
-		}
-		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
-			jQuery.error( "Invalid XML: " + data );
-		}
-		return xml;
-	},
-
-	noop: function() {},
-
-	// Evaluates a script in a global context
-	// Workarounds based on findings by Jim Driscoll
-	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
-	globalEval: function( data ) {
-		if ( data && jQuery.trim( data ) ) {
-			// We use execScript on Internet Explorer
-			// We use an anonymous function so that context is window
-			// rather than jQuery in Firefox
-			( window.execScript || function( data ) {
-				window[ "eval" ].call( window, data );
-			} )( data );
-		}
-	},
-
-	// Convert dashed to camelCase; used by the css and data modules
-	// Microsoft forgot to hump their vendor prefix (#9572)
-	camelCase: function( string ) {
-		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-	},
-
-	nodeName: function( elem, name ) {
-		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-	},
-
-	// args is for internal usage only
-	each: function( obj, callback, args ) {
-		var value,
-			i = 0,
-			length = obj.length,
-			isArray = isArraylike( obj );
-
-		if ( args ) {
-			if ( isArray ) {
-				for ( ; i < length; i++ ) {
-					value = callback.apply( obj[ i ], args );
-
-					if ( value === false ) {
-						break;
-					}
-				}
-			} else {
-				for ( i in obj ) {
-					value = callback.apply( obj[ i ], args );
-
-					if ( value === false ) {
-						break;
-					}
-				}
-			}
-
-		// A special, fast, case for the most common use of each
-		} else {
-			if ( isArray ) {
-				for ( ; i < length; i++ ) {
-					value = callback.call( obj[ i ], i, obj[ i ] );
-
-					if ( value === false ) {
-						break;
-					}
-				}
-			} else {
-				for ( i in obj ) {
-					value = callback.call( obj[ i ], i, obj[ i ] );
-
-					if ( value === false ) {
-						break;
-					}
-				}
-			}
-		}
-
-		return obj;
-	},
-
-	// Use native String.trim function wherever possible
-	trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
-		function( text ) {
-			return text == null ?
-				"" :
-				core_trim.call( text );
-		} :
-
-		// Otherwise use our own trimming functionality
-		function( text ) {
-			return text == null ?
-				"" :
-				( text + "" ).replace( rtrim, "" );
-		},
-
-	// results is for internal usage only
-	makeArray: function( arr, results ) {
-		var ret = results || [];
-
-		if ( arr != null ) {
-			if ( isArraylike( Object(arr) ) ) {
-				jQuery.merge( ret,
-					typeof arr === "string" ?
-					[ arr ] : arr
-				);
-			} else {
-				core_push.call( ret, arr );
-			}
-		}
-
-		return ret;
-	},
-
-	inArray: function( elem, arr, i ) {
-		var len;
-
-		if ( arr ) {
-			if ( core_indexOf ) {
-				return core_indexOf.call( arr, elem, i );
-			}
-
-			len = arr.length;
-			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-
-			for ( ; i < len; i++ ) {
-				// Skip accessing in sparse arrays
-				if ( i in arr && arr[ i ] === elem ) {
-					return i;
-				}
-			}
-		}
-
-		return -1;
-	},
-
-	merge: function( first, second ) {
-		var l = second.length,
-			i = first.length,
-			j = 0;
-
-		if ( typeof l === "number" ) {
-			for ( ; j < l; j++ ) {
-				first[ i++ ] = second[ j ];
-			}
-		} else {
-			while ( second[j] !== undefined ) {
-				first[ i++ ] = second[ j++ ];
-			}
-		}
-
-		first.length = i;
-
-		return first;
-	},
-
-	grep: function( elems, callback, inv ) {
-		var retVal,
-			ret = [],
-			i = 0,
-			length = elems.length;
-		inv = !!inv;
-
-		// Go through the array, only saving the items
-		// that pass the validator function
-		for ( ; i < length; i++ ) {
-			retVal = !!callback( elems[ i ], i );
-			if ( inv !== retVal ) {
-				ret.push( elems[ i ] );
-			}
-		}
-
-		return ret;
-	},
-
-	// arg is for internal usage only
-	map: function( elems, callback, arg ) {
-		var value,
-			i = 0,
-			length = elems.length,
-			isArray = isArraylike( elems ),
-			ret = [];
-
-		// Go through the array, translating each of the items to their
-		if ( isArray ) {
-			for ( ; i < length; i++ ) {
-				value = callback( elems[ i ], i, arg );
-
-				if ( value != null ) {
-					ret[ ret.length ] = value;
-				}
-			}
-
-		// Go through every key on the object,
-		} else {
-			for ( i in elems ) {
-				value = callback( elems[ i ], i, arg );
-
-				if ( value != null ) {
-					ret[ ret.length ] = value;
-				}
-			}
-		}
-
-		// Flatten any nested arrays
-		return core_concat.apply( [], ret );
-	},
-
-	// A global GUID counter for objects
-	guid: 1,
-
-	// Bind a function to a context, optionally partially applying any
-	// arguments.
-	proxy: function( fn, context ) {
-		var args, proxy, tmp;
-
-		if ( typeof context === "string" ) {
-			tmp = fn[ context ];
-			context = fn;
-			fn = tmp;
-		}
-
-		// Quick check to determine if target is callable, in the spec
-		// this throws a TypeError, but we will just return undefined.
-		if ( !jQuery.isFunction( fn ) ) {
-			return undefined;
-		}
-
-		// Simulated bind
-		args = core_slice.call( arguments, 2 );
-		proxy = function() {
-			return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
-		};
-
-		// Set the guid of unique handler to the same of original handler, so it can be removed
-		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-
-		return proxy;
-	},
-
-	// Multifunctional method to get and set values of a collection
-	// The value/s can optionally be executed if it's a function
-	access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
-		var i = 0,
-			length = elems.length,
-			bulk = key == null;
-
-		// Sets many values
-		if ( jQuery.type( key ) === "object" ) {
-			chainable = true;
-			for ( i in key ) {
-				jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
-			}
-
-		// Sets one value
-		} else if ( value !== undefined ) {
-			chainable = true;
-
-			if ( !jQuery.isFunction( value ) ) {
-				raw = true;
-			}
-
-			if ( bulk ) {
-				// Bulk operations run against the entire set
-				if ( raw ) {
-					fn.call( elems, value );
-					fn = null;
-
-				// ...except when executing function values
-				} else {
-					bulk = fn;
-					fn = function( elem, key, value ) {
-						return bulk.call( jQuery( elem ), value );
-					};
-				}
-			}
-
-			if ( fn ) {
-				for ( ; i < length; i++ ) {
-					fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
-				}
-			}
-		}
-
-		return chainable ?
-			elems :
-
-			// Gets
-			bulk ?
-				fn.call( elems ) :
-				length ? fn( elems[0], key ) : emptyGet;
-	},
-
-	now: function() {
-		return ( new Date() ).getTime();
-	}
-});
-
-jQuery.ready.promise = function( obj ) {
-	if ( !readyList ) {
-
-		readyList = jQuery.Deferred();
-
-		// Catch cases where $(document).ready() is called after the browser event has already occurred.
-		// we once tried to use readyState "interactive" here, but it caused issues like the one
-		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
-		if ( document.readyState === "complete" ) {
-			// Handle it asynchronously to allow scripts the opportunity to delay ready
-			setTimeout( jQuery.ready );
-
-		// Standards-based browsers support DOMContentLoaded
-		} else if ( document.addEventListener ) {
-			// Use the handy event callback
-			document.addEventListener( "DOMContentLoaded", completed, false );
-
-			// A fallback to window.onload, that will always work
-			window.addEventListener( "load", completed, false );
-
-		// If IE event model is used
-		} else {
-			// Ensure firing before onload, maybe late but safe also for iframes
-			document.attachEvent( "onreadystatechange", completed );
-
-			// A fallback to window.onload, that will always work
-			window.attachEvent( "onload", completed );
-
-			// If IE and not a frame
-			// continually check to see if the document is ready
-			var top = false;
-
-			try {
-				top = window.frameElement == null && document.documentElement;
-			} catch(e) {}
-
-			if ( top && top.doScroll ) {
-				(function doScrollCheck() {
-					if ( !jQuery.isReady ) {
-
-						try {
-							// Use the trick by Diego Perini
-							// http://javascript.nwbox.com/IEContentLoaded/
-							top.doScroll("left");
-						} catch(e) {
-							return setTimeout( doScrollCheck, 50 );
-						}
-
-						// detach all dom ready events
-						detach();
-
-						// and execute any waiting functions
-						jQuery.ready();
-					}
-				})();
-			}
-		}
-	}
-	return readyList.promise( obj );
-};
-
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
-	class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
-
-function isArraylike( obj ) {
-	var length = obj.length,
-		type = jQuery.type( obj );
-
-	if ( jQuery.isWindow( obj ) ) {
-		return false;
-	}
-
-	if ( obj.nodeType === 1 && length ) {
-		return true;
-	}
-
-	return type === "array" || type !== "function" &&
-		( length === 0 ||
-		typeof length === "number" && length > 0 && ( length - 1 ) in obj );
-}
-
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-// String to Object options format cache
-var optionsCache = {};
-
-// Convert String-formatted options into Object-formatted ones and store in cache
-function createOptions( options ) {
-	var object = optionsCache[ options ] = {};
-	jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
-		object[ flag ] = true;
-	});
-	return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- *	options: an optional list of space-separated options that will change how
- *			the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- *	once:			will ensure the callback list can only be fired once (like a Deferred)
- *
- *	memory:			will keep track of previous values and will call any callback added
- *					after the list has been fired right away with the latest "memorized"
- *					values (like a Deferred)
- *
- *	unique:			will ensure a callback can only be added once (no duplicate in the list)
- *
- *	stopOnFalse:	interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
-	// Convert options from String-formatted to Object-formatted if needed
-	// (we check in cache first)
-	options = typeof options === "string" ?
-		( optionsCache[ options ] || createOptions( options ) ) :
-		jQuery.extend( {}, options );
-
-	var // Flag to know if list is currently firing
-		firing,
-		// Last fire value (for non-forgettable lists)
-		memory,
-		// Flag to know if list was already fired
-		fired,
-		// End of the loop when firing
-		firingLength,
-		// Index of currently firing callback (modified by remove if needed)
-		firingIndex,
-		// First callback to fire (used internally by add and fireWith)
-		firingStart,
-		// Actual callback list
-		list = [],
-		// Stack of fire calls for repeatable lists
-		stack = !options.once && [],
-		// Fire callbacks
-		fire = function( data ) {
-			memory = options.memory && data;
-			fired = true;
-			firingIndex = firingStart || 0;
-			firingStart = 0;
-			firingLength = list.length;
-			firing = true;
-			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
-				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
-					memory = false; // To prevent further calls using add
-					break;
-				}
-			}
-			firing = false;
-			if ( list ) {
-				if ( stack ) {
-					if ( stack.length ) {
-						fire( stack.shift() );
-					}
-				} else if ( memory ) {
-					list = [];
-				} else {
-					self.disable();
-				}
-			}
-		},
-		// Actual Callbacks object
-		self = {
-			// Add a callback or a collection of callbacks to the list
-			add: function() {
-				if ( list ) {
-					// First, we save the current length
-					var start = list.length;
-					(function add( args ) {
-						jQuery.each( args, function( _, arg ) {
-							var type = jQuery.type( arg );
-							if ( type === "function" ) {
-								if ( !options.unique || !self.has( arg ) ) {
-									list.push( arg );
-								}
-							} else if ( arg && arg.length && type !== "string" ) {
-								// Inspect recursively
-								add( arg );
-							}
-						});
-					})( arguments );
-					// Do we need to add the callbacks to the
-					// current firing batch?
-					if ( firing ) {
-						firingLength = list.length;
-					// With memory, if we're not firing then
-					// we should call right away
-					} else if ( memory ) {
-						firingStart = start;
-						fire( memory );
-					}
-				}
-				return this;
-			},
-			// Remove a callback from the list
-			remove: function() {
-				if ( list ) {
-					jQuery.each( arguments, function( _, arg ) {
-						var index;
-						while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
-							list.splice( index, 1 );
-							// Handle firing indexes
-							if ( firing ) {
-								if ( index <= firingLength ) {
-									firingLength--;
-								}
-								if ( index <= firingIndex ) {
-									firingIndex--;
-								}
-							}
-						}
-					});
-				}
-				return this;
-			},
-			// Check if a given callback is in the list.
-			// If no argument is given, return whether or not list has callbacks attached.
-			has: function( fn ) {
-				return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
-			},
-			// Remove all callbacks from the list
-			empty: function() {
-				list = [];
-				return this;
-			},
-			// Have the list do nothing anymore
-			disable: function() {
-				list = stack = memory = undefined;
-				return this;
-			},
-			// Is it disabled?
-			disabled: function() {
-				return !list;
-			},
-			// Lock the list in its current state
-			lock: function() {
-				stack = undefined;
-				if ( !memory ) {
-					self.disable();
-				}
-				return this;
-			},
-			// Is it locked?
-			locked: function() {
-				return !stack;
-			},
-			// Call all callbacks with the given context and arguments
-			fireWith: function( context, args ) {
-				args = args || [];
-				args = [ context, args.slice ? args.slice() : args ];
-				if ( list && ( !fired || stack ) ) {
-					if ( firing ) {
-						stack.push( args );
-					} else {
-						fire( args );
-					}
-				}
-				return this;
-			},
-			// Call all the callbacks with the given arguments
-			fire: function() {
-				self.fireWith( this, arguments );
-				return this;
-			},
-			// To know if the callbacks have already been called at least once
-			fired: function() {
-				return !!fired;
-			}
-		};
-
-	return self;
-};
-jQuery.extend({
-
-	Deferred: function( func ) {
-		var tuples = [
-				// action, add listener, listener list, final state
-				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
-				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
-				[ "notify", "progress", jQuery.Callbacks("memory") ]
-			],
-			state = "pending",
-			promise = {
-				state: function() {
-					return state;
-				},
-				always: function() {
-					deferred.done( arguments ).fail( arguments );
-					return this;
-				},
-				then: function( /* fnDone, fnFail, fnProgress */ ) {
-					var fns = arguments;
-					return jQuery.Deferred(function( newDefer ) {
-						jQuery.each( tuples, function( i, tuple ) {
-							var action = tuple[ 0 ],
-								fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
-							// deferred[ done | fail | progress ] for forwarding actions to newDefer
-							deferred[ tuple[1] ](function() {
-								var returned = fn && fn.apply( this, arguments );
-								if ( returned && jQuery.isFunction( returned.promise ) ) {
-									returned.promise()
-										.done( newDefer.resolve )
-										.fail( newDefer.reject )
-										.progress( newDefer.notify );
-								} else {
-									newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
-								}
-							});
-						});
-						fns = null;
-					}).promise();
-				},
-				// Get a promise for this deferred
-				// If obj is provided, the promise aspect is added to the object
-				promise: function( obj ) {
-					return obj != null ? jQuery.extend( obj, promise ) : promise;
-				}
-			},
-			deferred = {};
-
-		// Keep pipe for back-compat
-		promise.pipe = promise.then;
-
-		// Add list-specific methods
-		jQuery.each( tuples, function( i, tuple ) {
-			var list = tuple[ 2 ],
-				stateString = tuple[ 3 ];
-
-			// promise[ done | fail | progress ] = list.add
-			promise[ tuple[1] ] = list.add;
-
-			// Handle state
-			if ( stateString ) {
-				list.add(function() {
-					// state = [ resolved | rejected ]
-					state = stateString;
-
-				// [ reject_list | resolve_list ].disable; progress_list.lock
-				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
-			}
-
-			// deferred[ resolve | reject | notify ]
-			deferred[ tuple[0] ] = function() {
-				deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
-				return this;
-			};
-			deferred[ tuple[0] + "With" ] = list.fireWith;
-		});
-
-		// Make the deferred a promise
-		promise.promise( deferred );
-
-		// Call given func if any
-		if ( func ) {
-			func.call( deferred, deferred );
-		}
-
-		// All done!
-		return deferred;
-	},
-
-	// Deferred helper
-	when: function( subordinate /* , ..., subordinateN */ ) {
-		var i = 0,
-			resolveValues = core_slice.call( arguments ),
-			length = resolveValues.length,
-
-			// the count of uncompleted subordinates
-			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
-
-			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
-			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
-
-			// Update function for both resolve and progress values
-			updateFunc = function( i, contexts, values ) {
-				return function( value ) {
-					contexts[ i ] = this;
-					values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
-					if( values === progressValues ) {
-						deferred.notifyWith( contexts, values );
-					} else if ( !( --remaining ) ) {
-						deferred.resolveWith( contexts, values );
-					}
-				};
-			},
-
-			progressValues, progressContexts, resolveContexts;
-
-		// add listeners to Deferred subordinates; treat others as resolved
-		if ( length > 1 ) {
-			progressValues = new Array( length );
-			progressContexts = new Array( length );
-			resolveContexts = new Array( length );
-			for ( ; i < length; i++ ) {
-				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
-					resolveValues[ i ].promise()
-						.done( updateFunc( i, resolveContexts, resolveValues ) )
-						.fail( deferred.reject )
-						.progress( updateFunc( i, progressContexts, progressValues ) );
-				} else {
-					--remaining;
-				}
-			}
-		}
-
-		// if we're not waiting on anything, resolve the master
-		if ( !remaining ) {
-			deferred.resolveWith( resolveContexts, resolveValues );
-		}
-
-		return deferred.promise();
-	}
-});
-jQuery.support = (function() {
-
-	var support, all, a,
-		input, select, fragment,
-		opt, eventName, isSupported, i,
-		div = document.createElement("div");
-
-	// Setup
-	div.setAttribute( "className", "t" );
-	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
-
-	// Support tests won't run in some limited or non-browser environments
-	all = div.getElementsByTagName("*");
-	a = div.getElementsByTagName("a")[ 0 ];
-	if ( !all || !a || !all.length ) {
-		return {};
-	}
-
-	// First batch of tests
-	select = document.createElement("select");
-	opt = select.appendChild( document.createElement("option") );
-	input = div.getElementsByTagName("input")[ 0 ];
-
-	a.style.cssText = "top:1px;float:left;opacity:.5";
-	support = {
-		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
-		getSetAttribute: div.className !== "t",
-
-		// IE strips leading whitespace when .innerHTML is used
-		leadingWhitespace: div.firstChild.nodeType === 3,
-
-		// Make sure that tbody elements aren't automatically inserted
-		// IE will insert them into empty tables
-		tbody: !div.getElementsByTagName("tbody").length,
-
-		// Make sure that link elements get serialized correctly by innerHTML
-		// This requires a wrapper element in IE
-		htmlSerialize: !!div.getElementsByTagName("link").length,
-
-		// Get the style information from getAttribute
-		// (IE uses .cssText instead)
-		style: /top/.test( a.getAttribute("style") ),
-
-		// Make sure that URLs aren't manipulated
-		// (IE normalizes it by default)
-		hrefNormalized: a.getAttribute("href") === "/a",
-
-		// Make sure that element opacity exists
-		// (IE uses filter instead)
-		// Use a regex to work around a WebKit issue. See #5145
-		opacity: /^0.5/.test( a.style.opacity ),
-
-		// Verify style float existence
-		// (IE uses styleFloat instead of cssFloat)
-		cssFloat: !!a.style.cssFloat,
-
-		// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
-		checkOn: !!input.value,
-
-		// Make sure that a selected-by-default option has a working selected property.
-		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
-		optSelected: opt.selected,
-
-		// Tests for enctype support on a form (#6743)
-		enctype: !!document.createElement("form").enctype,
-
-		// Makes sure cloning an html5 element does not cause problems
-		// Where outerHTML is undefined, this still works
-		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
-
-		// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
-		boxModel: document.compatMode === "CSS1Compat",
-
-		// Will be defined later
-		deleteExpando: true,
-		noCloneEvent: true,
-		inlineBlockNeedsLayout: false,
-		shrinkWrapBlocks: false,
-		reliableMarginRight: true,
-		boxSizingReliable: true,
-		pixelPosition: false
-	};
-
-	// Make sure checked status is properly cloned
-	input.checked = true;
-	support.noCloneChecked = input.cloneNode( true ).checked;
-
-	// Make sure that the options inside disabled selects aren't marked as disabled
-	// (WebKit marks them as disabled)
-	select.disabled = true;
-	support.optDisabled = !opt.disabled;
-
-	// Support: IE<9
-	try {
-		delete div.test;
-	} catch( e ) {
-		support.deleteExpando = false;
-	}
-
-	// Check if we can trust getAttribute("value")
-	input = document.createElement("input");
-	input.setAttribute( "value", "" );
-	support.input = input.getAttribute( "value" ) === "";
-
-	// Check if an input maintains its value after becoming a radio
-	input.value = "t";
-	input.setAttribute( "type", "radio" );
-	support.radioValue = input.value === "t";
-
-	// #11217 - WebKit loses check when the name is after the checked attribute
-	input.setAttribute( "checked", "t" );
-	input.setAttribute( "name", "t" );
-
-	fragment = document.createDocumentFragment();
-	fragment.appendChild( input );
-
-	// Check if a disconnected checkbox will retain its checked
-	// value of true after appended to the DOM (IE6/7)
-	support.appendChecked = input.checked;
-
-	// WebKit doesn't clone checked state correctly in fragments
-	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
-	// Support: IE<9
-	// Opera does not clone events (and typeof div.attachEvent === undefined).
-	// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
-	if ( div.attachEvent ) {
-		div.attachEvent( "onclick", function() {
-			support.noCloneEvent = false;
-		});
-
-		div.cloneNode( true ).click();
-	}
-
-	// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
-	// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP), test/csp.php
-	for ( i in { submit: true, change: true, focusin: true }) {
-		div.setAttribute( eventName = "on" + i, "t" );
-
-		support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
-	}
-
-	div.style.backgroundClip = "content-box";
-	div.cloneNode( true ).style.backgroundClip = "";
-	support.clearCloneStyle = div.style.backgroundClip === "content-box";
-
-	// Run tests that need a body at doc ready
-	jQuery(function() {
-		var container, marginDiv, tds,
-			divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
-			body = document.getElementsByTagName("body")[0];
-
-		if ( !body ) {
-			// Return for frameset docs that don't have a body
-			return;
-		}
-
-		container = document.createElement("div");
-		container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
-
-		body.appendChild( container ).appendChild( div );
-
-		// Support: IE8
-		// Check if table cells still have offsetWidth/Height when they are set
-		// to display:none and there are still other visible table cells in a
-		// table row; if so, offsetWidth/Height are not reliable for use when
-		// determining if an element has been hidden directly using
-		// display:none (it is still safe to use offsets if a parent element is
-		// hidden; don safety goggles and see bug #4512 for more information).
-		div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
-		tds = div.getElementsByTagName("td");
-		tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
-		isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
-		tds[ 0 ].style.display = "";
-		tds[ 1 ].style.display = "none";
-
-		// Support: IE8
-		// Check if empty table cells still have offsetWidth/Height
-		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
-
-		// Check box-sizing and margin behavior
-		div.innerHTML = "";
-		div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
-		support.boxSizing = ( div.offsetWidth === 4 );
-		support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
-
-		// Use window.getComputedStyle because jsdom on node.js will break without it.
-		if ( window.getComputedStyle ) {
-			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
-			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
-
-			// Check if div with explicit width and no margin-right incorrectly
-			// gets computed margin-right based on width of container. (#3333)
-			// Fails in WebKit before Feb 2011 nightlies
-			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-			marginDiv = div.appendChild( document.createElement("div") );
-			marginDiv.style.cssText = div.style.cssText = divReset;
-			marginDiv.style.marginRight = marginDiv.style.width = "0";
-			div.style.width = "1px";
-
-			support.reliableMarginRight =
-				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
-		}
-
-		if ( typeof div.style.zoom !== core_strundefined ) {
-			// Support: IE<8
-			// Check if natively block-level elements act like inline-block
-			// elements when setting their display to 'inline' and giving
-			// them layout
-			div.innerHTML = "";
-			div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
-			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
-
-			// Support: IE6
-			// Check if elements with layout shrink-wrap their children
-			div.style.display = "block";
-			div.innerHTML = "<div></div>";
-			div.firstChild.style.width = "5px";
-			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
-
-			if ( support.inlineBlockNeedsLayout ) {
-				// Prevent IE 6 from affecting layout for positioned elements #11048
-				// Prevent IE from shrinking the body in IE 7 mode #12869
-				// Support: IE<8
-				body.style.zoom = 1;
-			}
-		}
-
-		body.removeChild( container );
-
-		// Null elements to avoid leaks in IE
-		container = div = tds = marginDiv = null;
-	});
-
-	// Null elements to avoid leaks in IE
-	all = select = fragment = opt = a = input = null;
-
-	return support;
-})();
-
-var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
-	rmultiDash = /([A-Z])/g;
-
-function internalData( elem, name, data, pvt /* Internal Use Only */ ){
-	if ( !jQuery.acceptData( elem ) ) {
-		return;
-	}
-
-	var thisCache, ret,
-		internalKey = jQuery.expando,
-		getByName = typeof name === "string",
-
-		// We have to handle DOM nodes and JS objects differently because IE6-7
-		// can't GC object references properly across the DOM-JS boundary
-		isNode = elem.nodeType,
-
-		// Only DOM nodes need the global jQuery cache; JS object data is
-		// attached directly to the object so GC can occur automatically
-		cache = isNode ? jQuery.cache : elem,
-
-		// Only defining an ID for JS objects if its cache already exists allows
-		// the code to shortcut on the same path as a DOM node with no cache
-		id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
-
-	// Avoid doing any more work than we need to when trying to get data on an
-	// object that has no data at all
-	if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
-		return;
-	}
-
-	if ( !id ) {
-		// Only DOM nodes need a new unique ID for each element since their data
-		// ends up in the global cache
-		if ( isNode ) {
-			elem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++;
-		} else {
-			id = internalKey;
-		}
-	}
-
-	if ( !cache[ id ] ) {
-		cache[ id ] = {};
-
-		// Avoids exposing jQuery metadata on plain JS objects when the object
-		// is serialized using JSON.stringify
-		if ( !isNode ) {
-			cache[ id ].toJSON = jQuery.noop;
-		}
-	}
-
-	// An object can be passed to jQuery.data instead of a key/value pair; this gets
-	// shallow copied over onto the existing cache
-	if ( typeof name === "object" || typeof name === "function" ) {
-		if ( pvt ) {
-			cache[ id ] = jQuery.extend( cache[ id ], name );
-		} else {
-			cache[ id ].data = jQuery.extend( cache[ id ].data, name );
-		}
-	}
-
-	thisCache = cache[ id ];
-
-	// jQuery data() is stored in a separate object inside the object's internal data
-	// cache in order to avoid key collisions between internal data and user-defined
-	// data.
-	if ( !pvt ) {
-		if ( !thisCache.data ) {
-			thisCache.data = {};
-		}
-
-		thisCache = thisCache.data;
-	}
-
-	if ( data !== undefined ) {
-		thisCache[ jQuery.camelCase( name ) ] = data;
-	}
-
-	// Check for both converted-to-camel and non-converted data property names
-	// If a data property was specified
-	if ( getByName ) {
-
-		// First Try to find as-is property data
-		ret = thisCache[ name ];
-
-		// Test for null|undefined property data
-		if ( ret == null ) {
-
-			// Try to find the camelCased property
-			ret = thisCache[ jQuery.camelCase( name ) ];
-		}
-	} else {
-		ret = thisCache;
-	}
-
-	return ret;
-}
-
-function internalRemoveData( elem, name, pvt ) {
-	if ( !jQuery.acceptData( elem ) ) {
-		return;
-	}
-
-	var i, l, thisCache,
-		isNode = elem.nodeType,
-
-		// See jQuery.data for more information
-		cache = isNode ? jQuery.cache : elem,
-		id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-
-	// If there is already no cache entry for this object, there is no
-	// purpose in continuing
-	if ( !cache[ id ] ) {
-		return;
-	}
-
-	if ( name ) {
-
-		thisCache = pvt ? cache[ id ] : cache[ id ].data;
-
-		if ( thisCache ) {
-
-			// Support array or space separated string names for data keys
-			if ( !jQuery.isArray( name ) ) {
-
-				// try the string as a key before any manipulation
-				if ( name in thisCache ) {
-					name = [ name ];
-				} else {
-
-					// split the camel cased version by spaces unless a key with the spaces exists
-					name = jQuery.camelCase( name );
-					if ( name in thisCache ) {
-						name = [ name ];
-					} else {
-						name = name.split(" ");
-					}
-				}
-			} else {
-				// If "name" is an array of keys...
-				// When data is initially created, via ("key", "val") signature,
-				// keys will be converted to camelCase.
-				// Since there is no way to tell _how_ a key was added, remove
-				// both plain key and camelCase key. #12786
-				// This will only penalize the array argument path.
-				name = name.concat( jQuery.map( name, jQuery.camelCase ) );
-			}
-
-			for ( i = 0, l = name.length; i < l; i++ ) {
-				delete thisCache[ name[i] ];
-			}
-
-			// If there is no data left in the cache, we want to continue
-			// and let the cache object itself get destroyed
-			if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
-				return;
-			}
-		}
-	}
-
-	// See jQuery.data for more information
-	if ( !pvt ) {
-		delete cache[ id ].data;
-
-		// Don't destroy the parent cache unless the internal data object
-		// had been the only thing left in it
-		if ( !isEmptyDataObject( cache[ id ] ) ) {
-			return;
-		}
-	}
-
-	// Destroy the cache
-	if ( isNode ) {
-		jQuery.cleanData( [ elem ], true );
-
-	// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
-	} else if ( jQuery.support.deleteExpando || cache != cache.window ) {
-		delete cache[ id ];
-
-	// When all else fails, null
-	} else {
-		cache[ id ] = null;
-	}
-}
-
-jQuery.extend({
-	cache: {},
-
-	// Unique for each copy of jQuery on the page
-	// Non-digits removed to match rinlinejQuery
-	expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
-
-	// The following elements throw uncatchable exceptions if you
-	// attempt to add expando properties to them.
-	noData: {
-		"embed": true,
-		// Ban all objects except for Flash (which handle expandos)
-		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
-		"applet": true
-	},
-
-	hasData: function( elem ) {
-		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-		return !!elem && !isEmptyDataObject( elem );
-	},
-
-	data: function( elem, name, data ) {
-		return internalData( elem, name, data );
-	},
-
-	removeData: function( elem, name ) {
-		return internalRemoveData( elem, name );
-	},
-
-	// For internal use only.
-	_data: function( elem, name, data ) {
-		return internalData( elem, name, data, true );
-	},
-
-	_removeData: function( elem, name ) {
-		return internalRemoveData( elem, name, true );
-	},
-
-	// A method for determining if a DOM node can handle the data expando
-	acceptData: function( elem ) {
-		// Do not set data on non-element because it will not be cleared (#8335).
-		if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
-			return false;
-		}
-
-		var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
-
-		// nodes accept data unless otherwise specified; rejection can be conditional
-		return !noData || noData !== true && elem.getAttribute("classid") === noData;
-	}
-});
-
-jQuery.fn.extend({
-	data: function( key, value ) {
-		var attrs, name,
-			elem = this[0],
-			i = 0,
-			data = null;
-
-		// Gets all values
-		if ( key === undefined ) {
-			if ( this.length ) {
-				data = jQuery.data( elem );
-
-				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
-					attrs = elem.attributes;
-					for ( ; i < attrs.length; i++ ) {
-						name = attrs[i].name;
-
-						if ( !name.indexOf( "data-" ) ) {
-							name = jQuery.camelCase( name.slice(5) );
-
-							dataAttr( elem, name, data[ name ] );
-						}
-					}
-					jQuery._data( elem, "parsedAttrs", true );
-				}
-			}
-
-			return data;
-		}
-
-		// Sets multiple values
-		if ( typeof key === "object" ) {
-			return this.each(function() {
-				jQuery.data( this, key );
-			});
-		}
-
-		return jQuery.access( this, function( value ) {
-
-			if ( value === undefined ) {
-				// Try to fetch any internally stored data first
-				return elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
-			}
-
-			this.each(function() {
-				jQuery.data( this, key, value );
-			});
-		}, null, value, arguments.length > 1, null, true );
-	},
-
-	removeData: function( key ) {
-		return this.each(function() {
-			jQuery.removeData( this, key );
-		});
-	}
-});
-
-function dataAttr( elem, key, data ) {
-	// If nothing was found internally, try to fetch any
-	// data from the HTML5 data-* attribute
-	if ( data === undefined && elem.nodeType === 1 ) {
-
-		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-
-		data = elem.getAttribute( name );
-
-		if ( typeof data === "string" ) {
-			try {
-				data = data === "true" ? true :
-					data === "false" ? false :
-					data === "null" ? null :
-					// Only convert to a number if it doesn't change the string
-					+data + "" === data ? +data :
-					rbrace.test( data ) ? jQuery.parseJSON( data ) :
-						data;
-			} catch( e ) {}
-
-			// Make sure we set the data so it isn't changed later
-			jQuery.data( elem, key, data );
-
-		} else {
-			data = undefined;
-		}
-	}
-
-	return data;
-}
-
-// checks a cache object for emptiness
-function isEmptyDataObject( obj ) {
-	var name;
-	for ( name in obj ) {
-
-		// if the public data object is empty, the private is still empty
-		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
-			continue;
-		}
-		if ( name !== "toJSON" ) {
-			return false;
-		}
-	}
-
-	return true;
-}
-jQuery.extend({
-	queue: function( elem, type, data ) {
-		var queue;
-
-		if ( elem ) {
-			type = ( type || "fx" ) + "queue";
-			queue = jQuery._data( elem, type );
-
-			// Speed up dequeue by getting out quickly if this is just a lookup
-			if ( data ) {
-				if ( !queue || jQuery.isArray(data) ) {
-					queue = jQuery._data( elem, type, jQuery.makeArray(data) );
-				} else {
-					queue.push( data );
-				}
-			}
-			return queue || [];
-		}
-	},
-
-	dequeue: function( elem, type ) {
-		type = type || "fx";
-
-		var queue = jQuery.queue( elem, type ),
-			startLength = queue.length,
-			fn = queue.shift(),
-			hooks = jQuery._queueHooks( elem, type ),
-			next = function() {
-				jQuery.dequeue( elem, type );
-			};
-
-		// If the fx queue is dequeued, always remove the progress sentinel
-		if ( fn === "inprogress" ) {
-			fn = queue.shift();
-			startLength--;
-		}
-
-		hooks.cur = fn;
-		if ( fn ) {
-
-			// Add a progress sentinel to prevent the fx queue from being
-			// automatically dequeued
-			if ( type === "fx" ) {
-				queue.unshift( "inprogress" );
-			}
-
-			// clear up the last queue stop function
-			delete hooks.stop;
-			fn.call( elem, next, hooks );
-		}
-
-		if ( !startLength && hooks ) {
-			hooks.empty.fire();
-		}
-	},
-
-	// not intended for public consumption - generates a queueHooks object, or returns the current one
-	_queueHooks: function( elem, type ) {
-		var key = type + "queueHooks";
-		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
-			empty: jQuery.Callbacks("once memory").add(function() {
-				jQuery._removeData( elem, type + "queue" );
-				jQuery._removeData( elem, key );
-			})
-		});
-	}
-});
-
-jQuery.fn.extend({
-	queue: function( type, data ) {
-		var setter = 2;
-
-		if ( typeof type !== "string" ) {
-			data = type;
-			type = "fx";
-			setter--;
-		}
-
-		if ( arguments.length < setter ) {
-			return jQuery.queue( this[0], type );
-		}
-
-		return data === undefined ?
-			this :
-			this.each(function() {
-				var queue = jQuery.queue( this, type, data );
-
-				// ensure a hooks for this queue
-				jQuery._queueHooks( this, type );
-
-				if ( type === "fx" && queue[0] !== "inprogress" ) {
-					jQuery.dequeue( this, type );
-				}
-			});
-	},
-	dequeue: function( type ) {
-		return this.each(function() {
-			jQuery.dequeue( this, type );
-		});
-	},
-	// Based off of the plugin by Clint Helfers, with permission.
-	// http://blindsignals.com/index.php/2009/07/jquery-delay/
-	delay: function( time, type ) {
-		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
-		type = type || "fx";
-
-		return this.queue( type, function( next, hooks ) {
-			var timeout = setTimeout( next, time );
-			hooks.stop = function() {
-				clearTimeout( timeout );
-			};
-		});
-	},
-	clearQueue: function( type ) {
-		return this.queue( type || "fx", [] );
-	},
-	// Get a promise resolved when queues of a certain type
-	// are emptied (fx is the type by default)
-	promise: function( type, obj ) {
-		var tmp,
-			count = 1,
-			defer = jQuery.Deferred(),
-			elements = this,
-			i = this.length,
-			resolve = function() {
-				if ( !( --count ) ) {
-					defer.resolveWith( elements, [ elements ] );
-				}
-			};
-
-		if ( typeof type !== "string" ) {
-			obj = type;
-			type = undefined;
-		}
-		type = type || "fx";
-
-		while( i-- ) {
-			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
-			if ( tmp && tmp.empty ) {
-				count++;
-				tmp.empty.add( resolve );
-			}
-		}
-		resolve();
-		return defer.promise( obj );
-	}
-});
-var nodeHook, boolHook,
-	rclass = /[\t\r\n]/g,
-	rreturn = /\r/g,
-	rfocusable = /^(?:input|select|textarea|button|object)$/i,
-	rclickable = /^(?:a|area)$/i,
-	rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,
-	ruseDefault = /^(?:checked|selected)$/i,
-	getSetAttribute = jQuery.support.getSetAttribute,
-	getSetInput = jQuery.support.input;
-
-jQuery.fn.extend({
-	attr: function( name, value ) {
-		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
-	},
-
-	removeAttr: function( name ) {
-		return this.each(function() {
-			jQuery.removeAttr( this, name );
-		});
-	},
-
-	prop: function( name, value ) {
-		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
-	},
-
-	removeProp: function( name ) {
-		name = jQuery.propFix[ name ] || name;
-		return this.each(function() {
-			// try/catch handles cases where IE balks (such as removing a property on window)
-			try {
-				this[ name ] = undefined;
-				delete this[ name ];
-			} catch( e ) {}
-		});
-	},
-
-	addClass: function( value ) {
-		var classes, elem, cur, clazz, j,
-			i = 0,
-			len = this.length,
-			proceed = typeof value === "string" && value;
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each(function( j ) {
-				jQuery( this ).addClass( value.call( this, j, this.className ) );
-			});
-		}
-
-		if ( proceed ) {
-			// The disjunction here is for better compressibility (see removeClass)
-			classes = ( value || "" ).match( core_rnotwhite ) || [];
-
-			for ( ; i < len; i++ ) {
-				elem = this[ i ];
-				cur = elem.nodeType === 1 && ( elem.className ?
-					( " " + elem.className + " " ).replace( rclass, " " ) :
-					" "
-				);
-
-				if ( cur ) {
-					j = 0;
-					while ( (clazz = classes[j++]) ) {
-						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
-							cur += clazz + " ";
-						}
-					}
-					elem.className = jQuery.trim( cur );
-
-				}
-			}
-		}
-
-		return this;
-	},
-
-	removeClass: function( value ) {
-		var classes, elem, cur, clazz, j,
-			i = 0,
-			len = this.length,
-			proceed = arguments.length === 0 || typeof value === "string" && value;
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each(function( j ) {
-				jQuery( this ).removeClass( value.call( this, j, this.className ) );
-			});
-		}
-		if ( proceed ) {
-			classes = ( value || "" ).match( core_rnotwhite ) || [];
-
-			for ( ; i < len; i++ ) {
-				elem = this[ i ];
-				// This expression is here for better compressibility (see addClass)
-				cur = elem.nodeType === 1 && ( elem.className ?
-					( " " + elem.className + " " ).replace( rclass, " " ) :
-					""
-				);
-
-				if ( cur ) {
-					j = 0;
-					while ( (clazz = classes[j++]) ) {
-						// Remove *all* instances
-						while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
-							cur = cur.replace( " " + clazz + " ", " " );
-						}
-					}
-					elem.className = value ? jQuery.trim( cur ) : "";
-				}
-			}
-		}
-
-		return this;
-	},
-
-	toggleClass: function( value, stateVal ) {
-		var type = typeof value,
-			isBool = typeof stateVal === "boolean";
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each(function( i ) {
-				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
-			});
-		}
-
-		return this.each(function() {
-			if ( type === "string" ) {
-				// toggle individual class names
-				var className,
-					i = 0,
-					self = jQuery( this ),
-					state = stateVal,
-					classNames = value.match( core_rnotwhite ) || [];
-
-				while ( (className = classNames[ i++ ]) ) {
-					// check each className given, space separated list
-					state = isBool ? state : !self.hasClass( className );
-					self[ state ? "addClass" : "removeClass" ]( className );
-				}
-
-			// Toggle whole class name
-			} else if ( type === core_strundefined || type === "boolean" ) {
-				if ( this.className ) {
-					// store className if set
-					jQuery._data( this, "__className__", this.className );
-				}
-
-				// If the element has a class name or if we're passed "false",
-				// then remove the whole classname (if there was one, the above saved it).
-				// Otherwise bring back whatever was previously saved (if anything),
-				// falling back to the empty string if nothing was stored.
-				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
-			}
-		});
-	},
-
-	hasClass: function( selector ) {
-		var className = " " + selector + " ",
-			i = 0,
-			l = this.length;
-		for ( ; i < l; i++ ) {
-			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
-				return true;
-			}
-		}
-
-		return false;
-	},
-
-	val: function( value ) {
-		var ret, hooks, isFunction,
-			elem = this[0];
-
-		if ( !arguments.length ) {
-			if ( elem ) {
-				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
-				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
-					return ret;
-				}
-
-				ret = elem.value;
-
-				return typeof ret === "string" ?
-					// handle most common string cases
-					ret.replace(rreturn, "") :
-					// handle cases where value is null/undef or number
-					ret == null ? "" : ret;
-			}
-
-			return;
-		}
-
-		isFunction = jQuery.isFunction( value );
-
-		return this.each(function( i ) {
-			var val,
-				self = jQuery(this);
-
-			if ( this.nodeType !== 1 ) {
-				return;
-			}
-
-			if ( isFunction ) {
-				val = value.call( this, i, self.val() );
-			} else {
-				val = value;
-			}
-
-			// Treat null/undefined as ""; convert numbers to string
-			if ( val == null ) {
-				val = "";
-			} else if ( typeof val === "number" ) {
-				val += "";
-			} else if ( jQuery.isArray( val ) ) {
-				val = jQuery.map(val, function ( value ) {
-					return value == null ? "" : value + "";
-				});
-			}
-
-			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
-			// If set returns undefined, fall back to normal setting
-			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
-				this.value = val;
-			}
-		});
-	}
-});
-
-jQuery.extend({
-	valHooks: {
-		option: {
-			get: function( elem ) {
-				// attributes.value is undefined in Blackberry 4.7 but
-				// uses .value. See #6932
-				var val = elem.attributes.value;
-				return !val || val.specified ? elem.value : elem.text;
-			}
-		},
-		select: {
-			get: function( elem ) {
-				var value, option,
-					options = elem.options,
-					index = elem.selectedIndex,
-					one = elem.type === "select-one" || index < 0,
-					values = one ? null : [],
-					max = one ? index + 1 : options.length,
-					i = index < 0 ?
-						max :
-						one ? index : 0;
-
-				// Loop through all the selected options
-				for ( ; i < max; i++ ) {
-					option = options[ i ];
-
-					// oldIE doesn't update selected after form reset (#2551)
-					if ( ( option.selected || i === index ) &&
-							// Don't return options that are disabled or in a disabled optgroup
-							( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
-							( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
-
-						// Get the specific value for the option
-						value = jQuery( option ).val();
-
-						// We don't need an array for one selects
-						if ( one ) {
-							return value;
-						}
-
-						// Multi-Selects return an array
-						values.push( value );
-					}
-				}
-
-				return values;
-			},
-
-			set: function( elem, value ) {
-				var values = jQuery.makeArray( value );
-
-				jQuery(elem).find("option").each(function() {
-					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
-				});
-
-				if ( !values.length ) {
-					elem.selectedIndex = -1;
-				}
-				return values;
-			}
-		}
-	},
-
-	attr: function( elem, name, value ) {
-		var hooks, notxml, ret,
-			nType = elem.nodeType;
-
-		// don't get/set attributes on text, comment and attribute nodes
-		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-			return;
-		}
-
-		// Fallback to prop when attributes are not supported
-		if ( typeof elem.getAttribute === core_strundefined ) {
-			return jQuery.prop( elem, name, value );
-		}
-
-		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
-		// All attributes are lowercase
-		// Grab necessary hook if one is defined
-		if ( notxml ) {
-			name = name.toLowerCase();
-			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
-		}
-
-		if ( value !== undefined ) {
-
-			if ( value === null ) {
-				jQuery.removeAttr( elem, name );
-
-			} else if ( hooks && notxml && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
-				return ret;
-
-			} else {
-				elem.setAttribute( name, value + "" );
-				return value;
-			}
-
-		} else if ( hooks && notxml && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
-			return ret;
-
-		} else {
-
-			// In IE9+, Flash objects don't have .getAttribute (#12945)
-			// Support: IE9+
-			if ( typeof elem.getAttribute !== core_strundefined ) {
-				ret =  elem.getAttribute( name );
-			}
-
-			// Non-existent attributes return null, we normalize to undefined
-			return ret == null ?
-				undefined :
-				ret;
-		}
-	},
-
-	removeAttr: function( elem, value ) {
-		var name, propName,
-			i = 0,
-			attrNames = value && value.match( core_rnotwhite );
-
-		if ( attrNames && elem.nodeType === 1 ) {
-			while ( (name = attrNames[i++]) ) {
-				propName = jQuery.propFix[ name ] || name;
-
-				// Boolean attributes get special treatment (#10870)
-				if ( rboolean.test( name ) ) {
-					// Set corresponding property to false for boolean attributes
-					// Also clear defaultChecked/defaultSelected (if appropriate) for IE<8
-					if ( !getSetAttribute && ruseDefault.test( name ) ) {
-						elem[ jQuery.camelCase( "default-" + name ) ] =
-							elem[ propName ] = false;
-					} else {
-						elem[ propName ] = false;
-					}
-
-				// See #9699 for explanation of this approach (setting first, then removal)
-				} else {
-					jQuery.attr( elem, name, "" );
-				}
-
-				elem.removeAttribute( getSetAttribute ? name : propName );
-			}
-		}
-	},
-
-	attrHooks: {
-		type: {
-			set: function( elem, value ) {
-				if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
-					// Setting the type on a radio button after the value resets the value in IE6-9
-					// Reset value to default in case type is set after value during creation
-					var val = elem.value;
-					elem.setAttribute( "type", value );
-					if ( val ) {
-						elem.value = val;
-					}
-					return value;
-				}
-			}
-		}
-	},
-
-	propFix: {
-		tabindex: "tabIndex",
-		readonly: "readOnly",
-		"for": "htmlFor",
-		"class": "className",
-		maxlength: "maxLength",
-		cellspacing: "cellSpacing",
-		cellpadding: "cellPadding",
-		rowspan: "rowSpan",
-		colspan: "colSpan",
-		usemap: "useMap",
-		frameborder: "frameBorder",
-		contenteditable: "contentEditable"
-	},
-
-	prop: function( elem, name, value ) {
-		var ret, hooks, notxml,
-			nType = elem.nodeType;
-
-		// don't get/set properties on text, comment and attribute nodes
-		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-			return;
-		}
-
-		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
-		if ( notxml ) {
-			// Fix name and attach hooks
-			name = jQuery.propFix[ name ] || name;
-			hooks = jQuery.propHooks[ name ];
-		}
-
-		if ( value !== undefined ) {
-			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
-				return ret;
-
-			} else {
-				return ( elem[ name ] = value );
-			}
-
-		} else {
-			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
-				return ret;
-
-			} else {
-				return elem[ name ];
-			}
-		}
-	},
-
-	propHooks: {
-		tabIndex: {
-			get: function( elem ) {
-				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
-				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-				var attributeNode = elem.getAttributeNode("tabindex");
-
-				return attributeNode && attributeNode.specified ?
-					parseInt( attributeNode.value, 10 ) :
-					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
-						0 :
-						undefined;
-			}
-		}
-	}
-});
-
-// Hook for boolean attributes
-boolHook = {
-	get: function( elem, name ) {
-		var
-			// Use .prop to determine if this attribute is understood as boolean
-			prop = jQuery.prop( elem, name ),
-
-			// Fetch it accordingly
-			attr = typeof prop === "boolean" && elem.getAttribute( name ),
-			detail = typeof prop === "boolean" ?
-
-				getSetInput && getSetAttribute ?
-					attr != null :
-					// oldIE fabricates an empty string for missing boolean attributes
-					// and conflates checked/selected into attroperties
-					ruseDefault.test( name ) ?
-						elem[ jQuery.camelCase( "default-" + name ) ] :
-						!!attr :
-
-				// fetch an attribute node for properties not recognized as boolean
-				elem.getAttributeNode( name );
-
-		return detail && detail.value !== false ?
-			name.toLowerCase() :
-			undefined;
-	},
-	set: function( elem, value, name ) {
-		if ( value === false ) {
-			// Remove boolean attributes when set to false
-			jQuery.removeAttr( elem, name );
-		} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
-			// IE<8 needs the *property* name
-			elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
-
-		// Use defaultChecked and defaultSelected for oldIE
-		} else {
-			elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
-		}
-
-		return name;
-	}
-};
-
-// fix oldIE value attroperty
-if ( !getSetInput || !getSetAttribute ) {
-	jQuery.attrHooks.value = {
-		get: function( elem, name ) {
-			var ret = elem.getAttributeNode( name );
-			return jQuery.nodeName( elem, "input" ) ?
-
-				// Ignore the value *property* by using defaultValue
-				elem.defaultValue :
-
-				ret && ret.specified ? ret.value : undefined;
-		},
-		set: function( elem, value, name ) {
-			if ( jQuery.nodeName( elem, "input" ) ) {
-				// Does not return so that setAttribute is also used
-				elem.defaultValue = value;
-			} else {
-				// Use nodeHook if defined (#1954); otherwise setAttribute is fine
-				return nodeHook && nodeHook.set( elem, value, name );
-			}
-		}
-	};
-}
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
-
-	// Use this for any attribute in IE6/7
-	// This fixes almost every IE6/7 issue
-	nodeHook = jQuery.valHooks.button = {
-		get: function( elem, name ) {
-			var ret = elem.getAttributeNode( name );
-			return ret && ( name === "id" || name === "name" || name === "coords" ? ret.value !== "" : ret.specified ) ?
-				ret.value :
-				undefined;
-		},
-		set: function( elem, value, name ) {
-			// Set the existing or create a new attribute node
-			var ret = elem.getAttributeNode( name );
-			if ( !ret ) {
-				elem.setAttributeNode(
-					(ret = elem.ownerDocument.createAttribute( name ))
-				);
-			}
-
-			ret.value = value += "";
-
-			// Break association with cloned elements by also using setAttribute (#9646)
-			return name === "value" || value === elem.getAttribute( name ) ?
-				value :
-				undefined;
-		}
-	};
-
-	// Set contenteditable to false on removals(#10429)
-	// Setting to empty string throws an error as an invalid value
-	jQuery.attrHooks.contenteditable = {
-		get: nodeHook.get,
-		set: function( elem, value, name ) {
-			nodeHook.set( elem, value === "" ? false : value, name );
-		}
-	};
-
-	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
-	// This is for removals
-	jQuery.each([ "width", "height" ], function( i, name ) {
-		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-			set: function( elem, value ) {
-				if ( value === "" ) {
-					elem.setAttribute( name, "auto" );
-					return value;
-				}
-			}
-		});
-	});
-}
-
-
-// Some attributes require a special call on IE
-// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !jQuery.support.hrefNormalized ) {
-	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
-		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-			get: function( elem ) {
-				var ret = elem.getAttribute( name, 2 );
-				return ret == null ? undefined : ret;
-			}
-		});
-	});
-
-	// href/src property should get the full normalized URL (#10299/#12915)
-	jQuery.each([ "href", "src" ], function( i, name ) {
-		jQuery.propHooks[ name ] = {
-			get: function( elem ) {
-				return elem.getAttribute( name, 4 );
-			}
-		};
-	});
-}
-
-if ( !jQuery.support.style ) {
-	jQuery.attrHooks.style = {
-		get: function( elem ) {
-			// Return undefined in the case of empty string
-			// Note: IE uppercases css property names, but if we were to .toLowerCase()
-			// .cssText, that would destroy case senstitivity in URL's, like in "background"
-			return elem.style.cssText || undefined;
-		},
-		set: function( elem, value ) {
-			return ( elem.style.cssText = value + "" );
-		}
-	};
-}
-
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-if ( !jQuery.support.optSelected ) {
-	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
-		get: function( elem ) {
-			var parent = elem.parentNode;
-
-			if ( parent ) {
-				parent.selectedIndex;
-
-				// Make sure that it also works with optgroups, see #5701
-				if ( parent.parentNode ) {
-					parent.parentNode.selectedIndex;
-				}
-			}
-			return null;
-		}
-	});
-}
-
-// IE6/7 call enctype encoding
-if ( !jQuery.support.enctype ) {
-	jQuery.propFix.enctype = "encoding";
-}
-
-// Radios and checkboxes getter/setter
-if ( !jQuery.support.checkOn ) {
-	jQuery.each([ "radio", "checkbox" ], function() {
-		jQuery.valHooks[ this ] = {
-			get: function( elem ) {
-				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
-				return elem.getAttribute("value") === null ? "on" : elem.value;
-			}
-		};
-	});
-}
-jQuery.each([ "radio", "checkbox" ], function() {
-	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
-		set: function( elem, value ) {
-			if ( jQuery.isArray( value ) ) {
-				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
-			}
-		}
-	});
-});
-var rformElems = /^(?:input|select|textarea)$/i,
-	rkeyEvent = /^key/,
-	rmouseEvent = /^(?:mouse|contextmenu)|click/,
-	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
-	rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
-
-function returnTrue() {
-	return true;
-}
-
-function returnFalse() {
-	return false;
-}
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
-	global: {},
-
-	add: function( elem, types, handler, data, selector ) {
-		var tmp, events, t, handleObjIn,
-			special, eventHandle, handleObj,
-			handlers, type, namespaces, origType,
-			elemData = jQuery._data( elem );
-
-		// Don't attach events to noData or text/comment nodes (but allow plain objects)
-		if ( !elemData ) {
-			return;
-		}
-
-		// Caller can pass in an object of custom data in lieu of the handler
-		if ( handler.handler ) {
-			handleObjIn = handler;
-			handler = handleObjIn.handler;
-			selector = handleObjIn.selector;
-		}
-
-		// Make sure that the handler has a unique ID, used to find/remove it later
-		if ( !handler.guid ) {
-			handler.guid = jQuery.guid++;
-		}
-
-		// Init the element's event structure and main handler, if this is the first
-		if ( !(events = elemData.events) ) {
-			events = elemData.events = {};
-		}
-		if ( !(eventHandle = elemData.handle) ) {
-			eventHandle = elemData.handle = function( e ) {
-				// Discard the second event of a jQuery.event.trigger() and
-				// when an event is called after a page has unloaded
-				return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
-					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
-					undefined;
-			};
-			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
-			eventHandle.elem = elem;
-		}
-
-		// Handle multiple events separated by a space
-		// jQuery(...).bind("mouseover mouseout", fn);
-		types = ( types || "" ).match( core_rnotwhite ) || [""];
-		t = types.length;
-		while ( t-- ) {
-			tmp = rtypenamespace.exec( types[t] ) || [];
-			type = origType = tmp[1];
-			namespaces = ( tmp[2] || "" ).split( "." ).sort();
-
-			// If event changes its type, use the special event handlers for the changed type
-			special = jQuery.event.special[ type ] || {};
-
-			// If selector defined, determine special event api type, otherwise given type
-			type = ( selector ? special.delegateType : special.bindType ) || type;
-
-			// Update special based on newly reset type
-			special = jQuery.event.special[ type ] || {};
-
-			// handleObj is passed to all event handlers
-			handleObj = jQuery.extend({
-				type: type,
-				origType: origType,
-				data: data,
-				handler: handler,
-				guid: handler.guid,
-				selector: selector,
-				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
-				namespace: namespaces.join(".")
-			}, handleObjIn );
-
-			// Init the event handler queue if we're the first
-			if ( !(handlers = events[ type ]) ) {
-				handlers = events[ type ] = [];
-				handlers.delegateCount = 0;
-
-				// Only use addEventListener/attachEvent if the special events handler returns false
-				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-					// Bind the global event handler to the element
-					if ( elem.addEventListener ) {
-						elem.addEventListener( type, eventHandle, false );
-
-					} else if ( elem.attachEvent ) {
-						elem.attachEvent( "on" + type, eventHandle );
-					}
-				}
-			}
-
-			if ( special.add ) {
-				special.add.call( elem, handleObj );
-
-				if ( !handleObj.handler.guid ) {
-					handleObj.handler.guid = handler.guid;
-				}
-			}
-
-			// Add to the element's handler list, delegates in front
-			if ( selector ) {
-				handlers.splice( handlers.delegateCount++, 0, handleObj );
-			} else {
-				handlers.push( handleObj );
-			}
-
-			// Keep track of which events have ever been used, for event optimization
-			jQuery.event.global[ type ] = true;
-		}
-
-		// Nullify elem to prevent memory leaks in IE
-		elem = null;
-	},
-
-	// Detach an event or set of events from an element
-	remove: function( elem, types, handler, selector, mappedTypes ) {
-		var j, handleObj, tmp,
-			origCount, t, events,
-			special, handlers, type,
-			namespaces, origType,
-			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
-
-		if ( !elemData || !(events = elemData.events) ) {
-			return;
-		}
-
-		// Once for each type.namespace in types; type may be omitted
-		types = ( types || "" ).match( core_rnotwhite ) || [""];
-		t = types.length;
-		while ( t-- ) {
-			tmp = rtypenamespace.exec( types[t] ) || [];
-			type = origType = tmp[1];
-			namespaces = ( tmp[2] || "" ).split( "." ).sort();
-
-			// Unbind all events (on this namespace, if provided) for the element
-			if ( !type ) {
-				for ( type in events ) {
-					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
-				}
-				continue;
-			}
-
-			special = jQuery.event.special[ type ] || {};
-			type = ( selector ? special.delegateType : special.bindType ) || type;
-			handlers = events[ type ] || [];
-			tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
-
-			// Remove matching events
-			origCount = j = handlers.length;
-			while ( j-- ) {
-				handleObj = handlers[ j ];
-
-				if ( ( mappedTypes || origType === handleObj.origType ) &&
-					( !handler || handler.guid === handleObj.guid ) &&
-					( !tmp || tmp.test( handleObj.namespace ) ) &&
-					( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
-					handlers.splice( j, 1 );
-
-					if ( handleObj.selector ) {
-						handlers.delegateCount--;
-					}
-					if ( special.remove ) {
-						special.remove.call( elem, handleObj );
-					}
-				}
-			}
-
-			// Remove generic event handler if we removed something and no more handlers exist
-			// (avoids potential for endless recursion during removal of special event handlers)
-			if ( origCount && !handlers.length ) {
-				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-					jQuery.removeEvent( elem, type, elemData.handle );
-				}
-
-				delete events[ type ];
-			}
-		}
-
-		// Remove the expando if it's no longer used
-		if ( jQuery.isEmptyObject( events ) ) {
-			delete elemData.handle;
-
-			// removeData also checks for emptiness and clears the expando if empty
-			// so use it instead of delete
-			jQuery._removeData( elem, "events" );
-		}
-	},
-
-	trigger: function( event, data, elem, onlyHandlers ) {
-		var handle, ontype, cur,
-			bubbleType, special, tmp, i,
-			eventPath = [ elem || document ],
-			type = core_hasOwn.call( event, "type" ) ? event.type : event,
-			namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
-
-		cur = tmp = elem = elem || document;
-
-		// Don't do events on text and comment nodes
-		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
-			return;
-		}
-
-		// focus/blur morphs to focusin/out; ensure we're not firing them right now
-		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-			return;
-		}
-
-		if ( type.indexOf(".") >= 0 ) {
-			// Namespaced trigger; create a regexp to match event type in handle()
-			namespaces = type.split(".");
-			type = namespaces.shift();
-			namespaces.sort();
-		}
-		ontype = type.indexOf(":") < 0 && "on" + type;
-
-		// Caller can pass in a jQuery.Event object, Object, or just an event type string
-		event = event[ jQuery.expando ] ?
-			event :
-			new jQuery.Event( type, typeof event === "object" && event );
-
-		event.isTrigger = true;
-		event.namespace = namespaces.join(".");
-		event.namespace_re = event.namespace ?
-			new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
-			null;
-
-		// Clean up the event in case it is being reused
-		event.result = undefined;
-		if ( !event.target ) {
-			event.target = elem;
-		}
-
-		// Clone any incoming data and prepend the event, creating the handler arg list
-		data = data == null ?
-			[ event ] :
-			jQuery.makeArray( data, [ event ] );
-
-		// Allow special events to draw outside the lines
-		special = jQuery.event.special[ type ] || {};
-		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
-			return;
-		}
-
-		// Determine event propagation path in advance, per W3C events spec (#9951)
-		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
-			bubbleType = special.delegateType || type;
-			if ( !rfocusMorph.test( bubbleType + type ) ) {
-				cur = cur.parentNode;
-			}
-			for ( ; cur; cur = cur.parentNode ) {
-				eventPath.push( cur );
-				tmp = cur;
-			}
-
-			// Only add window if we got to document (e.g., not plain obj or detached DOM)
-			if ( tmp === (elem.ownerDocument || document) ) {
-				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
-			}
-		}
-
-		// Fire handlers on the event path
-		i = 0;
-		while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
-
-			event.type = i > 1 ?
-				bubbleType :
-				special.bindType || type;
-
-			// jQuery handler
-			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
-			if ( handle ) {
-				handle.apply( cur, data );
-			}
-
-			// Native handler
-			handle = ontype && cur[ ontype ];
-			if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
-				event.preventDefault();
-			}
-		}
-		event.type = type;
-
-		// If nobody prevented the default action, do it now
-		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
-			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
-				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
-
-				// Call a native DOM method on the target with the same name name as the event.
-				// Can't use an .isFunction() check here because IE6/7 fails that test.
-				// Don't do default actions on window, that's where global variables be (#6170)
-				if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
-
-					// Don't re-trigger an onFOO event when we call its FOO() method
-					tmp = elem[ ontype ];
-
-					if ( tmp ) {
-						elem[ ontype ] = null;
-					}
-
-					// Prevent re-triggering of the same event, since we already bubbled it above
-					jQuery.event.triggered = type;
-					try {
-						elem[ type ]();
-					} catch ( e ) {
-						// IE<9 dies on focus/blur to hidden element (#1486,#12518)
-						// only reproducible on winXP IE8 native, not IE9 in IE8 mode
-					}
-					jQuery.event.triggered = undefined;
-
-					if ( tmp ) {
-						elem[ ontype ] = tmp;
-					}
-				}
-			}
-		}
-
-		return event.result;
-	},
-
-	dispatch: function( event ) {
-
-		// Make a writable jQuery.Event from the native event object
-		event = jQuery.event.fix( event );
-
-		var i, ret, handleObj, matched, j,
-			handlerQueue = [],
-			args = core_slice.call( arguments ),
-			handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
-			special = jQuery.event.special[ event.type ] || {};
-
-		// Use the fix-ed jQuery.Event rather than the (read-only) native event
-		args[0] = event;
-		event.delegateTarget = this;
-
-		// Call the preDispatch hook for the mapped type, and let it bail if desired
-		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
-			return;
-		}
-
-		// Determine handlers
-		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
-
-		// Run delegates first; they may want to stop propagation beneath us
-		i = 0;
-		while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
-			event.currentTarget = matched.elem;
-
-			j = 0;
-			while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
-
-				// Triggered event must either 1) have no namespace, or
-				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
-				if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
-
-					event.handleObj = handleObj;
-					event.data = handleObj.data;
-
-					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
-							.apply( matched.elem, args );
-
-					if ( ret !== undefined ) {
-						if ( (event.result = ret) === false ) {
-							event.preventDefault();
-							event.stopPropagation();
-						}
-					}
-				}
-			}
-		}
-
-		// Call the postDispatch hook for the mapped type
-		if ( special.postDispatch ) {
-			special.postDispatch.call( this, event );
-		}
-
-		return event.result;
-	},
-
-	handlers: function( event, handlers ) {
-		var sel, handleObj, matches, i,
-			handlerQueue = [],
-			delegateCount = handlers.delegateCount,
-			cur = event.target;
-
-		// Find delegate handlers
-		// Black-hole SVG <use> instance trees (#13180)
-		// Avoid non-left-click bubbling in Firefox (#3861)
-		if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
-
-			for ( ; cur != this; cur = cur.parentNode || this ) {
-
-				// Don't check non-elements (#13208)
-				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
-				if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
-					matches = [];
-					for ( i = 0; i < delegateCount; i++ ) {
-						handleObj = handlers[ i ];
-
-						// Don't conflict with Object.prototype properties (#13203)
-						sel = handleObj.selector + " ";
-
-						if ( matches[ sel ] === undefined ) {
-							matches[ sel ] = handleObj.needsContext ?
-								jQuery( sel, this ).index( cur ) >= 0 :
-								jQuery.find( sel, this, null, [ cur ] ).length;
-						}
-						if ( matches[ sel ] ) {
-							matches.push( handleObj );
-						}
-					}
-					if ( matches.length ) {
-						handlerQueue.push({ elem: cur, handlers: matches });
-					}
-				}
-			}
-		}
-
-		// Add the remaining (directly-bound) handlers
-		if ( delegateCount < handlers.length ) {
-			handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
-		}
-
-		return handlerQueue;
-	},
-
-	fix: function( event ) {
-		if ( event[ jQuery.expando ] ) {
-			return event;
-		}
-
-		// Create a writable copy of the event object and normalize some properties
-		var i, prop, copy,
-			type = event.type,
-			originalEvent = event,
-			fixHook = this.fixHooks[ type ];
-
-		if ( !fixHook ) {
-			this.fixHooks[ type ] = fixHook =
-				rmouseEvent.test( type ) ? this.mouseHooks :
-				rkeyEvent.test( type ) ? this.keyHooks :
-				{};
-		}
-		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
-		event = new jQuery.Event( originalEvent );
-
-		i = copy.length;
-		while ( i-- ) {
-			prop = copy[ i ];
-			event[ prop ] = originalEvent[ prop ];
-		}
-
-		// Support: IE<9
-		// Fix target property (#1925)
-		if ( !event.target ) {
-			event.target = originalEvent.srcElement || document;
-		}
-
-		// Support: Chrome 23+, Safari?
-		// Target should not be a text node (#504, #13143)
-		if ( event.target.nodeType === 3 ) {
-			event.target = event.target.parentNode;
-		}
-
-		// Support: IE<9
-		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
-		event.metaKey = !!event.metaKey;
-
-		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
-	},
-
-	// Includes some event props shared by KeyEvent and MouseEvent
-	props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
-
-	fixHooks: {},
-
-	keyHooks: {
-		props: "char charCode key keyCode".split(" "),
-		filter: function( event, original ) {
-
-			// Add which for key events
-			if ( event.which == null ) {
-				event.which = original.charCode != null ? original.charCode : original.keyCode;
-			}
-
-			return event;
-		}
-	},
-
-	mouseHooks: {
-		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
-		filter: function( event, original ) {
-			var body, eventDoc, doc,
-				button = original.button,
-				fromElement = original.fromElement;
-
-			// Calculate pageX/Y if missing and clientX/Y available
-			if ( event.pageX == null && original.clientX != null ) {
-				eventDoc = event.target.ownerDocument || document;
-				doc = eventDoc.documentElement;
-				body = eventDoc.body;
-
-				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
-				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
-			}
-
-			// Add relatedTarget, if necessary
-			if ( !event.relatedTarget && fromElement ) {
-				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
-			}
-
-			// Add which for click: 1 === left; 2 === middle; 3 === right
-			// Note: button is not normalized, so don't use it
-			if ( !event.which && button !== undefined ) {
-				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
-			}
-
-			return event;
-		}
-	},
-
-	special: {
-		load: {
-			// Prevent triggered image.load events from bubbling to window.load
-			noBubble: true
-		},
-		click: {
-			// For checkbox, fire native event so checked state will be right
-			trigger: function() {
-				if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
-					this.click();
-					return false;
-				}
-			}
-		},
-		focus: {
-			// Fire native event if possible so blur/focus sequence is correct
-			trigger: function() {
-				if ( this !== document.activeElement && this.focus ) {
-					try {
-						this.focus();
-						return false;
-					} catch ( e ) {
-						// Support: IE<9
-						// If we error on focus to hidden element (#1486, #12518),
-						// let .trigger() run the handlers
-					}
-				}
-			},
-			delegateType: "focusin"
-		},
-		blur: {
-			trigger: function() {
-				if ( this === document.activeElement && this.blur ) {
-					this.blur();
-					return false;
-				}
-			},
-			delegateType: "focusout"
-		},
-
-		beforeunload: {
-			postDispatch: function( event ) {
-
-				// Even when returnValue equals to undefined Firefox will still show alert
-				if ( event.result !== undefined ) {
-					event.originalEvent.returnValue = event.result;
-				}
-			}
-		}
-	},
-
-	simulate: function( type, elem, event, bubble ) {
-		// Piggyback on a donor event to simulate a different one.
-		// Fake originalEvent to avoid donor's stopPropagation, but if the
-		// simulated event prevents default then we do the same on the donor.
-		var e = jQuery.extend(
-			new jQuery.Event(),
-			event,
-			{ type: type,
-				isSimulated: true,
-				originalEvent: {}
-			}
-		);
-		if ( bubble ) {
-			jQuery.event.trigger( e, null, elem );
-		} else {
-			jQuery.event.dispatch.call( elem, e );
-		}
-		if ( e.isDefaultPrevented() ) {
-			event.preventDefault();
-		}
-	}
-};
-
-jQuery.removeEvent = document.removeEventListener ?
-	function( elem, type, handle ) {
-		if ( elem.removeEventListener ) {
-			elem.removeEventListener( type, handle, false );
-		}
-	} :
-	function( elem, type, handle ) {
-		var name = "on" + type;
-
-		if ( elem.detachEvent ) {
-
-			// #8545, #7054, preventing memory leaks for custom events in IE6-8
-			// detachEvent needed property on element, by name of that event, to properly expose it to GC
-			if ( typeof elem[ name ] === core_strundefined ) {
-				elem[ name ] = null;
-			}
-
-			elem.detachEvent( name, handle );
-		}
-	};
-
-jQuery.Event = function( src, props ) {
-	// Allow instantiation without the 'new' keyword
-	if ( !(this instanceof jQuery.Event) ) {
-		return new jQuery.Event( src, props );
-	}
-
-	// Event object
-	if ( src && src.type ) {
-		this.originalEvent = src;
-		this.type = src.type;
-
-		// Events bubbling up the document may have been marked as prevented
-		// by a handler lower down the tree; reflect the correct value.
-		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
-			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
-
-	// Event type
-	} else {
-		this.type = src;
-	}
-
-	// Put explicitly provided properties onto the event object
-	if ( props ) {
-		jQuery.extend( this, props );
-	}
-
-	// Create a timestamp if incoming event doesn't have one
-	this.timeStamp = src && src.timeStamp || jQuery.now();
-
-	// Mark it as fixed
-	this[ jQuery.expando ] = true;
-};
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
-	isDefaultPrevented: returnFalse,
-	isPropagationStopped: returnFalse,
-	isImmediatePropagationStopped: returnFalse,
-
-	preventDefault: function() {
-		var e = this.originalEvent;
-
-		this.isDefaultPrevented = returnTrue;
-		if ( !e ) {
-			return;
-		}
-
-		// If preventDefault exists, run it on the original event
-		if ( e.preventDefault ) {
-			e.preventDefault();
-
-		// Support: IE
-		// Otherwise set the returnValue property of the original event to false
-		} else {
-			e.returnValue = false;
-		}
-	},
-	stopPropagation: function() {
-		var e = this.originalEvent;
-
-		this.isPropagationStopped = returnTrue;
-		if ( !e ) {
-			return;
-		}
-		// If stopPropagation exists, run it on the original event
-		if ( e.stopPropagation ) {
-			e.stopPropagation();
-		}
-
-		// Support: IE
-		// Set the cancelBubble property of the original event to true
-		e.cancelBubble = true;
-	},
-	stopImmediatePropagation: function() {
-		this.isImmediatePropagationStopped = returnTrue;
-		this.stopPropagation();
-	}
-};
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-jQuery.each({
-	mouseenter: "mouseover",
-	mouseleave: "mouseout"
-}, function( orig, fix ) {
-	jQuery.event.special[ orig ] = {
-		delegateType: fix,
-		bindType: fix,
-
-		handle: function( event ) {
-			var ret,
-				target = this,
-				related = event.relatedTarget,
-				handleObj = event.handleObj;
-
-			// For mousenter/leave call the handler if related is outside the target.
-			// NB: No relatedTarget if the mouse left/entered the browser window
-			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
-				event.type = handleObj.origType;
-				ret = handleObj.handler.apply( this, arguments );
-				event.type = fix;
-			}
-			return ret;
-		}
-	};
-});
-
-// IE submit delegation
-if ( !jQuery.support.submitBubbles ) {
-
-	jQuery.event.special.submit = {
-		setup: function() {
-			// Only need this for delegated form submit events
-			if ( jQuery.nodeName( this, "form" ) ) {
-				return false;
-			}
-
-			// Lazy-add a submit handler when a descendant form may potentially be submitted
-			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
-				// Node name check avoids a VML-related crash in IE (#9807)
-				var elem = e.target,
-					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
-				if ( form && !jQuery._data( form, "submitBubbles" ) ) {
-					jQuery.event.add( form, "submit._submit", function( event ) {
-						event._submit_bubble = true;
-					});
-					jQuery._data( form, "submitBubbles", true );
-				}
-			});
-			// return undefined since we don't need an event listener
-		},
-
-		postDispatch: function( event ) {
-			// If form was submitted by the user, bubble the event up the tree
-			if ( event._submit_bubble ) {
-				delete event._submit_bubble;
-				if ( this.parentNode && !event.isTrigger ) {
-					jQuery.event.simulate( "submit", this.parentNode, event, true );
-				}
-			}
-		},
-
-		teardown: function() {
-			// Only need this for delegated form submit events
-			if ( jQuery.nodeName( this, "form" ) ) {
-				return false;
-			}
-
-			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
-			jQuery.event.remove( this, "._submit" );
-		}
-	};
-}
-
-// IE change delegation and checkbox/radio fix
-if ( !jQuery.support.changeBubbles ) {
-
-	jQuery.event.special.change = {
-
-		setup: function() {
-
-			if ( rformElems.test( this.nodeName ) ) {
-				// IE doesn't fire change on a check/radio until blur; trigger it on click
-				// after a propertychange. Eat the blur-change in special.change.handle.
-				// This still fires onchange a second time for check/radio after blur.
-				if ( this.type === "checkbox" || this.type === "radio" ) {
-					jQuery.event.add( this, "propertychange._change", function( event ) {
-						if ( event.originalEvent.propertyName === "checked" ) {
-							this._just_changed = true;
-						}
-					});
-					jQuery.event.add( this, "click._change", function( event ) {
-						if ( this._just_changed && !event.isTrigger ) {
-							this._just_changed = false;
-						}
-						// Allow triggered, simulated change events (#11500)
-						jQuery.event.simulate( "change", this, event, true );
-					});
-				}
-				return false;
-			}
-			// Delegated event; lazy-add a change handler on descendant inputs
-			jQuery.event.add( this, "beforeactivate._change", function( e ) {
-				var elem = e.target;
-
-				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
-					jQuery.event.add( elem, "change._change", function( event ) {
-						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
-							jQuery.event.simulate( "change", this.parentNode, event, true );
-						}
-					});
-					jQuery._data( elem, "changeBubbles", true );
-				}
-			});
-		},
-
-		handle: function( event ) {
-			var elem = event.target;
-
-			// Swallow native change events from checkbox/radio, we already triggered them above
-			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
-				return event.handleObj.handler.apply( this, arguments );
-			}
-		},
-
-		teardown: function() {
-			jQuery.event.remove( this, "._change" );
-
-			return !rformElems.test( this.nodeName );
-		}
-	};
-}
-
-// Create "bubbling" focus and blur events
-if ( !jQuery.support.focusinBubbles ) {
-	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
-		// Attach a single capturing handler while someone wants focusin/focusout
-		var attaches = 0,
-			handler = function( event ) {
-				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
-			};
-
-		jQuery.event.special[ fix ] = {
-			setup: function() {
-				if ( attaches++ === 0 ) {
-					document.addEventListener( orig, handler, true );
-				}
-			},
-			teardown: function() {
-				if ( --attaches === 0 ) {
-					document.removeEventListener( orig, handler, true );
-				}
-			}
-		};
-	});
-}
-
-jQuery.fn.extend({
-
-	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
-		var type, origFn;
-
-		// Types can be a map of types/handlers
-		if ( typeof types === "object" ) {
-			// ( types-Object, selector, data )
-			if ( typeof selector !== "string" ) {
-				// ( types-Object, data )
-				data = data || selector;
-				selector = undefined;
-			}
-			for ( type in types ) {
-				this.on( type, selector, data, types[ type ], one );
-			}
-			return this;
-		}
-
-		if ( data == null && fn == null ) {
-			// ( types, fn )
-			fn = selector;
-			data = selector = undefined;
-		} else if ( fn == null ) {
-			if ( typeof selector === "string" ) {
-				// ( types, selector, fn )
-				fn = data;
-				data = undefined;
-			} else {
-				// ( types, data, fn )
-				fn = data;
-				data = selector;
-				selector = undefined;
-			}
-		}
-		if ( fn === false ) {
-			fn = returnFalse;
-		} else if ( !fn ) {
-			return this;
-		}
-
-		if ( one === 1 ) {
-			origFn = fn;
-			fn = function( event ) {
-				// Can use an empty set, since event contains the info
-				jQuery().off( event );
-				return origFn.apply( this, arguments );
-			};
-			// Use same guid so caller can remove using origFn
-			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-		}
-		return this.each( function() {
-			jQuery.event.add( this, types, fn, data, selector );
-		});
-	},
-	one: function( types, selector, data, fn ) {
-		return this.on( types, selector, data, fn, 1 );
-	},
-	off: function( types, selector, fn ) {
-		var handleObj, type;
-		if ( types && types.preventDefault && types.handleObj ) {
-			// ( event )  dispatched jQuery.Event
-			handleObj = types.handleObj;
-			jQuery( types.delegateTarget ).off(
-				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
-				handleObj.selector,
-				handleObj.handler
-			);
-			return this;
-		}
-		if ( typeof types === "object" ) {
-			// ( types-object [, selector] )
-			for ( type in types ) {
-				this.off( type, selector, types[ type ] );
-			}
-			return this;
-		}
-		if ( selector === false || typeof selector === "function" ) {
-			// ( types [, fn] )
-			fn = selector;
-			selector = undefined;
-		}
-		if ( fn === false ) {
-			fn = returnFalse;
-		}
-		return this.each(function() {
-			jQuery.event.remove( this, types, fn, selector );
-		});
-	},
-
-	bind: function( types, data, fn ) {
-		return this.on( types, null, data, fn );
-	},
-	unbind: function( types, fn ) {
-		return this.off( types, null, fn );
-	},
-
-	delegate: function( selector, types, data, fn ) {
-		return this.on( types, selector, data, fn );
-	},
-	undelegate: function( selector, types, fn ) {
-		// ( namespace ) or ( selector, types [, fn] )
-		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
-	},
-
-	trigger: function( type, data ) {
-		return this.each(function() {
-			jQuery.event.trigger( type, data, this );
-		});
-	},
-	triggerHandler: function( type, data ) {
-		var elem = this[0];
-		if ( elem ) {
-			return jQuery.event.trigger( type, data, elem, true );
-		}
-	}
-});
-/*!
- * Sizzle CSS Selector Engine
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license
- * http://sizzlejs.com/
- */
-(function( window, undefined ) {
-
-var i,
-	cachedruns,
-	Expr,
-	getText,
-	isXML,
-	compile,
-	hasDuplicate,
-	outermostContext,
-
-	// Local document vars
-	setDocument,
-	document,
-	docElem,
-	documentIsXML,
-	rbuggyQSA,
-	rbuggyMatches,
-	matches,
-	contains,
-	sortOrder,
-
-	// Instance-specific data
-	expando = "sizzle" + -(new Date()),
-	preferredDoc = window.document,
-	support = {},
-	dirruns = 0,
-	done = 0,
-	classCache = createCache(),
-	tokenCache = createCache(),
-	compilerCache = createCache(),
-
-	// General-purpose constants
-	strundefined = typeof undefined,
-	MAX_NEGATIVE = 1 << 31,
-
-	// Array methods
-	arr = [],
-	pop = arr.pop,
-	push = arr.push,
-	slice = arr.slice,
-	// Use a stripped-down indexOf if we can't use a native one
-	indexOf = arr.indexOf || function( elem ) {
-		var i = 0,
-			len = this.length;
-		for ( ; i < len; i++ ) {
-			if ( this[i] === elem ) {
-				return i;
-			}
-		}
-		return -1;
-	},
-
-
-	// Regular expressions
-
-	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
-	whitespace = "[\\x20\\t\\r\\n\\f]",
-	// http://www.w3.org/TR/css3-syntax/#characters
-	characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
-
-	// Loosely modeled on CSS identifier characters
-	// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
-	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
-	identifier = characterEncoding.replace( "w", "w#" ),
-
-	// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
-	operators = "([*^$|!~]?=)",
-	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
-		"*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
-
-	// Prefer arguments quoted,
-	//   then not containing pseudos/brackets,
-	//   then attribute selectors/non-parenthetical expressions,
-	//   then anything else
-	// These preferences are here to reduce the number of selectors
-	//   needing tokenize in the PSEUDO preFilter
-	pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
-
-	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
-	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-
-	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
-	rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
-	rpseudo = new RegExp( pseudos ),
-	ridentifier = new RegExp( "^" + identifier + "$" ),
-
-	matchExpr = {
-		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
-		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
-		"NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
-		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
-		"ATTR": new RegExp( "^" + attributes ),
-		"PSEUDO": new RegExp( "^" + pseudos ),
-		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
-			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
-			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
-		// For use in libraries implementing .is()
-		// We use this for POS matching in `select`
-		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
-			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
-	},
-
-	rsibling = /[\x20\t\r\n\f]*[+~]/,
-
-	rnative = /^[^{]+\{\s*\[native code/,
-
-	// Easily-parseable/retrievable ID or TAG or CLASS selectors
-	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
-
-	rinputs = /^(?:input|select|textarea|button)$/i,
-	rheader = /^h\d$/i,
-
-	rescape = /'|\\/g,
-	rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
-
-	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
-	runescape = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,
-	funescape = function( _, escaped ) {
-		var high = "0x" + escaped - 0x10000;
-		// NaN means non-codepoint
-		return high !== high ?
-			escaped :
-			// BMP codepoint
-			high < 0 ?
-				String.fromCharCode( high + 0x10000 ) :
-				// Supplemental Plane codepoint (surrogate pair)
-				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
-	};
-
-// Use a stripped-down slice if we can't use a native one
-try {
-	slice.call( preferredDoc.documentElement.childNodes, 0 )[0].nodeType;
-} catch ( e ) {
-	slice = function( i ) {
-		var elem,
-			results = [];
-		while ( (elem = this[i++]) ) {
-			results.push( elem );
-		}
-		return results;
-	};
-}
-
-/**
- * For feature detection
- * @param {Function} fn The function to test for native support
- */
-function isNative( fn ) {
-	return rnative.test( fn + "" );
-}
-
-/**
- * Create key-value caches of limited size
- * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
- *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
- *	deleting the oldest entry
- */
-function createCache() {
-	var cache,
-		keys = [];
-
-	return (cache = function( key, value ) {
-		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
-		if ( keys.push( key += " " ) > Expr.cacheLength ) {
-			// Only keep the most recent entries
-			delete cache[ keys.shift() ];
-		}
-		return (cache[ key ] = value);
-	});
-}
-
-/**
- * Mark a function for special use by Sizzle
- * @param {Function} fn The function to mark
- */
-function markFunction( fn ) {
-	fn[ expando ] = true;
-	return fn;
-}
-
-/**
- * Support testing using an element
- * @param {Function} fn Passed the created div and expects a boolean result
- */
-function assert( fn ) {
-	var div = document.createElement("div");
-
-	try {
-		return fn( div );
-	} catch (e) {
-		return false;
-	} finally {
-		// release memory in IE
-		div = null;
-	}
-}
-
-function Sizzle( selector, context, results, seed ) {
-	var match, elem, m, nodeType,
-		// QSA vars
-		i, groups, old, nid, newContext, newSelector;
-
-	if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
-		setDocument( context );
-	}
-
-	context = context || document;
-	results = results || [];
-
-	if ( !selector || typeof selector !== "string" ) {
-		return results;
-	}
-
-	if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
-		return [];
-	}
-
-	if ( !documentIsXML && !seed ) {
-
-		// Shortcuts
-		if ( (match = rquickExpr.exec( selector )) ) {
-			// Speed-up: Sizzle("#ID")
-			if ( (m = match[1]) ) {
-				if ( nodeType === 9 ) {
-					elem = context.getElementById( m );
-					// Check parentNode to catch when Blackberry 4.6 returns
-					// nodes that are no longer in the document #6963
-					if ( elem && elem.parentNode ) {
-						// Handle the case where IE, Opera, and Webkit return items
-						// by name instead of ID
-						if ( elem.id === m ) {
-							results.push( elem );
-							return results;
-						}
-					} else {
-						return results;
-					}
-				} else {
-					// Context is not a document
-					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
-						contains( context, elem ) && elem.id === m ) {
-						results.push( elem );
-						return results;
-					}
-				}
-
-			// Speed-up: Sizzle("TAG")
-			} else if ( match[2] ) {
-				push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
-				return results;
-
-			// Speed-up: Sizzle(".CLASS")
-			} else if ( (m = match[3]) && support.getByClassName && context.getElementsByClassName ) {
-				push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
-				return results;
-			}
-		}
-
-		// QSA path
-		if ( support.qsa && !rbuggyQSA.test(selector) ) {
-			old = true;
-			nid = expando;
-			newContext = context;
-			newSelector = nodeType === 9 && selector;
-
-			// qSA works strangely on Element-rooted queries
-			// We can work around this by specifying an extra ID on the root
-			// and working up from there (Thanks to Andrew Dupont for the technique)
-			// IE 8 doesn't work on object elements
-			if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
-				groups = tokenize( selector );
-
-				if ( (old = context.getAttribute("id")) ) {
-					nid = old.replace( rescape, "\\$&" );
-				} else {
-					context.setAttribute( "id", nid );
-				}
-				nid = "[id='" + nid + "'] ";
-
-				i = groups.length;
-				while ( i-- ) {
-					groups[i] = nid + toSelector( groups[i] );
-				}
-				newContext = rsibling.test( selector ) && context.parentNode || context;
-				newSelector = groups.join(",");
-			}
-
-			if ( newSelector ) {
-				try {
-					push.apply( results, slice.call( newContext.querySelectorAll(
-						newSelector
-					), 0 ) );
-					return results;
-				} catch(qsaError) {
-				} finally {
-					if ( !old ) {
-						context.removeAttribute("id");
-					}
-				}
-			}
-		}
-	}
-
-	// All others
-	return select( selector.replace( rtrim, "$1" ), context, results, seed );
-}
-
-/**
- * Detect xml
- * @param {Element|Object} elem An element or a document
- */
-isXML = Sizzle.isXML = function( elem ) {
-	// documentElement is verified for cases where it doesn't yet exist
-	// (such as loading iframes in IE - #4833)
-	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
-	return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-/**
- * Sets document-related variables once based on the current document
- * @param {Element|Object} [doc] An element or document object to use to set the document
- * @returns {Object} Returns the current document
- */
-setDocument = Sizzle.setDocument = function( node ) {
-	var doc = node ? node.ownerDocument || node : preferredDoc;
-
-	// If no document and documentElement is available, return
-	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
-		return document;
-	}
-
-	// Set our document
-	document = doc;
-	docElem = doc.documentElement;
-
-	// Support tests
-	documentIsXML = isXML( doc );
-
-	// Check if getElementsByTagName("*") returns only elements
-	support.tagNameNoComments = assert(function( div ) {
-		div.appendChild( doc.createComment("") );
-		return !div.getElementsByTagName("*").length;
-	});
-
-	// Check if attributes should be retrieved by attribute nodes
-	support.attributes = assert(function( div ) {
-		div.innerHTML = "<select></select>";
-		var type = typeof div.lastChild.getAttribute("multiple");
-		// IE8 returns a string for some attributes even when not present
-		return type !== "boolean" && type !== "string";
-	});
-
-	// Check if getElementsByClassName can be trusted
-	support.getByClassName = assert(function( div ) {
-		// Opera can't find a second classname (in 9.6)
-		div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
-		if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
-			return false;
-		}
-
-		// Safari 3.2 caches class attributes and doesn't catch changes
-		div.lastChild.className = "e";
-		return div.getElementsByClassName("e").length === 2;
-	});
-
-	// Check if getElementById returns elements by name
-	// Check if getElementsByName privileges form controls or returns elements by ID
-	support.getByName = assert(function( div ) {
-		// Inject content
-		div.id = expando + 0;
-		div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
-		docElem.insertBefore( div, docElem.firstChild );
-
-		// Test
-		var pass = doc.getElementsByName &&
-			// buggy browsers will return fewer than the correct 2
-			doc.getElementsByName( expando ).length === 2 +
-			// buggy browsers will return more than the correct 0
-			doc.getElementsByName( expando + 0 ).length;
-		support.getIdNotName = !doc.getElementById( expando );
-
-		// Cleanup
-		docElem.removeChild( div );
-
-		return pass;
-	});
-
-	// IE6/7 return modified attributes
-	Expr.attrHandle = assert(function( div ) {
-		div.innerHTML = "<a href='#'></a>";
-		return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
-			div.firstChild.getAttribute("href") === "#";
-	}) ?
-		{} :
-		{
-			"href": function( elem ) {
-				return elem.getAttribute( "href", 2 );
-			},
-			"type": function( elem ) {
-				return elem.getAttribute("type");
-			}
-		};
-
-	// ID find and filter
-	if ( support.getIdNotName ) {
-		Expr.find["ID"] = function( id, context ) {
-			if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
-				var m = context.getElementById( id );
-				// Check parentNode to catch when Blackberry 4.6 returns
-				// nodes that are no longer in the document #6963
-				return m && m.parentNode ? [m] : [];
-			}
-		};
-		Expr.filter["ID"] = function( id ) {
-			var attrId = id.replace( runescape, funescape );
-			return function( elem ) {
-				return elem.getAttribute("id") === attrId;
-			};
-		};
-	} else {
-		Expr.find["ID"] = function( id, context ) {
-			if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
-				var m = context.getElementById( id );
-
-				return m ?
-					m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
-						[m] :
-						undefined :
-					[];
-			}
-		};
-		Expr.filter["ID"] =  function( id ) {
-			var attrId = id.replace( runescape, funescape );
-			return function( elem ) {
-				var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
-				return node && node.value === attrId;
-			};
-		};
-	}
-
-	// Tag
-	Expr.find["TAG"] = support.tagNameNoComments ?
-		function( tag, context ) {
-			if ( typeof context.getElementsByTagName !== strundefined ) {
-				return context.getElementsByTagName( tag );
-			}
-		} :
-		function( tag, context ) {
-			var elem,
-				tmp = [],
-				i = 0,
-				results = context.getElementsByTagName( tag );
-
-			// Filter out possible comments
-			if ( tag === "*" ) {
-				while ( (elem = results[i++]) ) {
-					if ( elem.nodeType === 1 ) {
-						tmp.push( elem );
-					}
-				}
-
-				return tmp;
-			}
-			return results;
-		};
-
-	// Name
-	Expr.find["NAME"] = support.getByName && function( tag, context ) {
-		if ( typeof context.getElementsByName !== strundefined ) {
-			return context.getElementsByName( name );
-		}
-	};
-
-	// Class
-	Expr.find["CLASS"] = support.getByClassName && function( className, context ) {
-		if ( typeof context.getElementsByClassName !== strundefined && !documentIsXML ) {
-			return context.getElementsByClassName( className );
-		}
-	};
-
-	// QSA and matchesSelector support
-
-	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
-	rbuggyMatches = [];
-
-	// qSa(:focus) reports false when true (Chrome 21),
-	// no need to also add to buggyMatches since matches checks buggyQSA
-	// A support test would require too much code (would include document ready)
-	rbuggyQSA = [ ":focus" ];
-
-	if ( (support.qsa = isNative(doc.querySelectorAll)) ) {
-		// Build QSA regex
-		// Regex strategy adopted from Diego Perini
-		assert(function( div ) {
-			// Select is set to empty string on purpose
-			// This is to test IE's treatment of not explictly
-			// setting a boolean content attribute,
-			// since its presence should be enough
-			// http://bugs.jquery.com/ticket/12359
-			div.innerHTML = "<select><option selected=''></option></select>";
-
-			// IE8 - Some boolean attributes are not treated correctly
-			if ( !div.querySelectorAll("[selected]").length ) {
-				rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
-			}
-
-			// Webkit/Opera - :checked should return selected option elements
-			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-			// IE8 throws error here and will not see later tests
-			if ( !div.querySelectorAll(":checked").length ) {
-				rbuggyQSA.push(":checked");
-			}
-		});
-
-		assert(function( div ) {
-
-			// Opera 10-12/IE8 - ^= $= *= and empty values
-			// Should not select anything
-			div.innerHTML = "<input type='hidden' i=''/>";
-			if ( div.querySelectorAll("[i^='']").length ) {
-				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
-			}
-
-			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
-			// IE8 throws error here and will not see later tests
-			if ( !div.querySelectorAll(":enabled").length ) {
-				rbuggyQSA.push( ":enabled", ":disabled" );
-			}
-
-			// Opera 10-11 does not throw on post-comma invalid pseudos
-			div.querySelectorAll("*,:x");
-			rbuggyQSA.push(",.*:");
-		});
-	}
-
-	if ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||
-		docElem.mozMatchesSelector ||
-		docElem.webkitMatchesSelector ||
-		docElem.oMatchesSelector ||
-		docElem.msMatchesSelector) )) ) {
-
-		assert(function( div ) {
-			// Check to see if it's possible to do matchesSelector
-			// on a disconnected node (IE 9)
-			support.disconnectedMatch = matches.call( div, "div" );
-
-			// This should fail with an exception
-			// Gecko does not error, returns false instead
-			matches.call( div, "[s!='']:x" );
-			rbuggyMatches.push( "!=", pseudos );
-		});
-	}
-
-	rbuggyQSA = new RegExp( rbuggyQSA.join("|") );
-	rbuggyMatches = new RegExp( rbuggyMatches.join("|") );
-
-	// Element contains another
-	// Purposefully does not implement inclusive descendent
-	// As in, an element does not contain itself
-	contains = isNative(docElem.contains) || docElem.compareDocumentPosition ?
-		function( a, b ) {
-			var adown = a.nodeType === 9 ? a.documentElement : a,
-				bup = b && b.parentNode;
-			return a === bup || !!( bup && bup.nodeType === 1 && (
-				adown.contains ?
-					adown.contains( bup ) :
-					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
-			));
-		} :
-		function( a, b ) {
-			if ( b ) {
-				while ( (b = b.parentNode) ) {
-					if ( b === a ) {
-						return true;
-					}
-				}
-			}
-			return false;
-		};
-
-	// Document order sorting
-	sortOrder = docElem.compareDocumentPosition ?
-	function( a, b ) {
-		var compare;
-
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-		}
-
-		if ( (compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b )) ) {
-			if ( compare & 1 || a.parentNode && a.parentNode.nodeType === 11 ) {
-				if ( a === doc || contains( preferredDoc, a ) ) {
-					return -1;
-				}
-				if ( b === doc || contains( preferredDoc, b ) ) {
-					return 1;
-				}
-				return 0;
-			}
-			return compare & 4 ? -1 : 1;
-		}
-
-		return a.compareDocumentPosition ? -1 : 1;
-	} :
-	function( a, b ) {
-		var cur,
-			i = 0,
-			aup = a.parentNode,
-			bup = b.parentNode,
-			ap = [ a ],
-			bp = [ b ];
-
-		// Exit early if the nodes are identical
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-
-		// Parentless nodes are either documents or disconnected
-		} else if ( !aup || !bup ) {
-			return a === doc ? -1 :
-				b === doc ? 1 :
-				aup ? -1 :
-				bup ? 1 :
-				0;
-
-		// If the nodes are siblings, we can do a quick check
-		} else if ( aup === bup ) {
-			return siblingCheck( a, b );
-		}
-
-		// Otherwise we need full lists of their ancestors for comparison
-		cur = a;
-		while ( (cur = cur.parentNode) ) {
-			ap.unshift( cur );
-		}
-		cur = b;
-		while ( (cur = cur.parentNode) ) {
-			bp.unshift( cur );
-		}
-
-		// Walk down the tree looking for a discrepancy
-		while ( ap[i] === bp[i] ) {
-			i++;
-		}
-
-		return i ?
-			// Do a sibling check if the nodes have a common ancestor
-			siblingCheck( ap[i], bp[i] ) :
-
-			// Otherwise nodes in our document sort first
-			ap[i] === preferredDoc ? -1 :
-			bp[i] === preferredDoc ? 1 :
-			0;
-	};
-
-	// Always assume the presence of duplicates if sort doesn't
-	// pass them to our comparison function (as in Google Chrome).
-	hasDuplicate = false;
-	[0, 0].sort( sortOrder );
-	support.detectDuplicates = hasDuplicate;
-
-	return document;
-};
-
-Sizzle.matches = function( expr, elements ) {
-	return Sizzle( expr, null, null, elements );
-};
-
-Sizzle.matchesSelector = function( elem, expr ) {
-	// Set document vars if needed
-	if ( ( elem.ownerDocument || elem ) !== document ) {
-		setDocument( elem );
-	}
-
-	// Make sure that attribute selectors are quoted
-	expr = expr.replace( rattributeQuotes, "='$1']" );
-
-	// rbuggyQSA always contains :focus, so no need for an existence check
-	if ( support.matchesSelector && !documentIsXML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {
-		try {
-			var ret = matches.call( elem, expr );
-
-			// IE 9's matchesSelector returns false on disconnected nodes
-			if ( ret || support.disconnectedMatch ||
-					// As well, disconnected nodes are said to be in a document
-					// fragment in IE 9
-					elem.document && elem.document.nodeType !== 11 ) {
-				return ret;
-			}
-		} catch(e) {}
-	}
-
-	return Sizzle( expr, document, null, [elem] ).length > 0;
-};
-
-Sizzle.contains = function( context, elem ) {
-	// Set document vars if needed
-	if ( ( context.ownerDocument || context ) !== document ) {
-		setDocument( context );
-	}
-	return contains( context, elem );
-};
-
-Sizzle.attr = function( elem, name ) {
-	var val;
-
-	// Set document vars if needed
-	if ( ( elem.ownerDocument || elem ) !== document ) {
-		setDocument( elem );
-	}
-
-	if ( !documentIsXML ) {
-		name = name.toLowerCase();
-	}
-	if ( (val = Expr.attrHandle[ name ]) ) {
-		return val( elem );
-	}
-	if ( documentIsXML || support.attributes ) {
-		return elem.getAttribute( name );
-	}
-	return ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?
-		name :
-		val && val.specified ? val.value : null;
-};
-
-Sizzle.error = function( msg ) {
-	throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-// Document sorting and removing duplicates
-Sizzle.uniqueSort = function( results ) {
-	var elem,
-		duplicates = [],
-		i = 1,
-		j = 0;
-
-	// Unless we *know* we can detect duplicates, assume their presence
-	hasDuplicate = !support.detectDuplicates;
-	results.sort( sortOrder );
-
-	if ( hasDuplicate ) {
-		for ( ; (elem = results[i]); i++ ) {
-			if ( elem === results[ i - 1 ] ) {
-				j = duplicates.push( i );
-			}
-		}
-		while ( j-- ) {
-			results.splice( duplicates[ j ], 1 );
-		}
-	}
-
-	return results;
-};
-
-function siblingCheck( a, b ) {
-	var cur = b && a,
-		diff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );
-
-	// Use IE sourceIndex if available on both nodes
-	if ( diff ) {
-		return diff;
-	}
-
-	// Check if b follows a
-	if ( cur ) {
-		while ( (cur = cur.nextSibling) ) {
-			if ( cur === b ) {
-				return -1;
-			}
-		}
-	}
-
-	return a ? 1 : -1;
-}
-
-// Returns a function to use in pseudos for input types
-function createInputPseudo( type ) {
-	return function( elem ) {
-		var name = elem.nodeName.toLowerCase();
-		return name === "input" && elem.type === type;
-	};
-}
-
-// Returns a function to use in pseudos for buttons
-function createButtonPseudo( type ) {
-	return function( elem ) {
-		var name = elem.nodeName.toLowerCase();
-		return (name === "input" || name === "button") && elem.type === type;
-	};
-}
-
-// Returns a function to use in pseudos for positionals
-function createPositionalPseudo( fn ) {
-	return markFunction(function( argument ) {
-		argument = +argument;
-		return markFunction(function( seed, matches ) {
-			var j,
-				matchIndexes = fn( [], seed.length, argument ),
-				i = matchIndexes.length;
-
-			// Match elements found at the specified indexes
-			while ( i-- ) {
-				if ( seed[ (j = matchIndexes[i]) ] ) {
-					seed[j] = !(matches[j] = seed[j]);
-				}
-			}
-		});
-	});
-}
-
-/**
- * Utility function for retrieving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-getText = Sizzle.getText = function( elem ) {
-	var node,
-		ret = "",
-		i = 0,
-		nodeType = elem.nodeType;
-
-	if ( !nodeType ) {
-		// If no nodeType, this is expected to be an array
-		for ( ; (node = elem[i]); i++ ) {
-			// Do not traverse comment nodes
-			ret += getText( node );
-		}
-	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-		// Use textContent for elements
-		// innerText usage removed for consistency of new lines (see #11153)
-		if ( typeof elem.textContent === "string" ) {
-			return elem.textContent;
-		} else {
-			// Traverse its children
-			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-				ret += getText( elem );
-			}
-		}
-	} else if ( nodeType === 3 || nodeType === 4 ) {
-		return elem.nodeValue;
-	}
-	// Do not include comment or processing instruction nodes
-
-	return ret;
-};
-
-Expr = Sizzle.selectors = {
-
-	// Can be adjusted by the user
-	cacheLength: 50,
-
-	createPseudo: markFunction,
-
-	match: matchExpr,
-
-	find: {},
-
-	relative: {
-		">": { dir: "parentNode", first: true },
-		" ": { dir: "parentNode" },
-		"+": { dir: "previousSibling", first: true },
-		"~": { dir: "previousSibling" }
-	},
-
-	preFilter: {
-		"ATTR": function( match ) {
-			match[1] = match[1].replace( runescape, funescape );
-
-			// Move the given value to match[3] whether quoted or unquoted
-			match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
-
-			if ( match[2] === "~=" ) {
-				match[3] = " " + match[3] + " ";
-			}
-
-			return match.slice( 0, 4 );
-		},
-
-		"CHILD": function( match ) {
-			/* matches from matchExpr["CHILD"]
-				1 type (only|nth|...)
-				2 what (child|of-type)
-				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
-				4 xn-component of xn+y argument ([+-]?\d*n|)
-				5 sign of xn-component
-				6 x of xn-component
-				7 sign of y-component
-				8 y of y-component
-			*/
-			match[1] = match[1].toLowerCase();
-
-			if ( match[1].slice( 0, 3 ) === "nth" ) {
-				// nth-* requires argument
-				if ( !match[3] ) {
-					Sizzle.error( match[0] );
-				}
-
-				// numeric x and y parameters for Expr.filter.CHILD
-				// remember that false/true cast respectively to 0/1
-				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
-				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
-
-			// other types prohibit arguments
-			} else if ( match[3] ) {
-				Sizzle.error( match[0] );
-			}
-
-			return match;
-		},
-
-		"PSEUDO": function( match ) {
-			var excess,
-				unquoted = !match[5] && match[2];
-
-			if ( matchExpr["CHILD"].test( match[0] ) ) {
-				return null;
-			}
-
-			// Accept quoted arguments as-is
-			if ( match[4] ) {
-				match[2] = match[4];
-
-			// Strip excess characters from unquoted arguments
-			} else if ( unquoted && rpseudo.test( unquoted ) &&
-				// Get excess from tokenize (recursively)
-				(excess = tokenize( unquoted, true )) &&
-				// advance to the next closing parenthesis
-				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
-
-				// excess is a negative index
-				match[0] = match[0].slice( 0, excess );
-				match[2] = unquoted.slice( 0, excess );
-			}
-
-			// Return only captures needed by the pseudo filter method (type and argument)
-			return match.slice( 0, 3 );
-		}
-	},
-
-	filter: {
-
-		"TAG": function( nodeName ) {
-			if ( nodeName === "*" ) {
-				return function() { return true; };
-			}
-
-			nodeName = nodeName.replace( runescape, funescape ).toLowerCase();
-			return function( elem ) {
-				return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
-			};
-		},
-
-		"CLASS": function( className ) {
-			var pattern = classCache[ className + " " ];
-
-			return pattern ||
-				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
-				classCache( className, function( elem ) {
-					return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
-				});
-		},
-
-		"ATTR": function( name, operator, check ) {
-			return function( elem ) {
-				var result = Sizzle.attr( elem, name );
-
-				if ( result == null ) {
-					return operator === "!=";
-				}
-				if ( !operator ) {
-					return true;
-				}
-
-				result += "";
-
-				return operator === "=" ? result === check :
-					operator === "!=" ? result !== check :
-					operator === "^=" ? check && result.indexOf( check ) === 0 :
-					operator === "*=" ? check && result.indexOf( check ) > -1 :
-					operator === "$=" ? check && result.slice( -check.length ) === check :
-					operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
-					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
-					false;
-			};
-		},
-
-		"CHILD": function( type, what, argument, first, last ) {
-			var simple = type.slice( 0, 3 ) !== "nth",
-				forward = type.slice( -4 ) !== "last",
-				ofType = what === "of-type";
-
-			return first === 1 && last === 0 ?
-
-				// Shortcut for :nth-*(n)
-				function( elem ) {
-					return !!elem.parentNode;
-				} :
-
-				function( elem, context, xml ) {
-					var cache, outerCache, node, diff, nodeIndex, start,
-						dir = simple !== forward ? "nextSibling" : "previousSibling",
-						parent = elem.parentNode,
-						name = ofType && elem.nodeName.toLowerCase(),
-						useCache = !xml && !ofType;
-
-					if ( parent ) {
-
-						// :(first|last|only)-(child|of-type)
-						if ( simple ) {
-							while ( dir ) {
-								node = elem;
-								while ( (node = node[ dir ]) ) {
-									if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
-										return false;
-									}
-								}
-								// Reverse direction for :only-* (if we haven't yet done so)
-								start = dir = type === "only" && !start && "nextSibling";
-							}
-							return true;
-						}
-
-						start = [ forward ? parent.firstChild : parent.lastChild ];
-
-						// non-xml :nth-child(...) stores cache data on `parent`
-						if ( forward && useCache ) {
-							// Seek `elem` from a previously-cached index
-							outerCache = parent[ expando ] || (parent[ expando ] = {});
-							cache = outerCache[ type ] || [];
-							nodeIndex = cache[0] === dirruns && cache[1];
-							diff = cache[0] === dirruns && cache[2];
-							node = nodeIndex && parent.childNodes[ nodeIndex ];
-
-							while ( (node = ++nodeIndex && node && node[ dir ] ||
-
-								// Fallback to seeking `elem` from the start
-								(diff = nodeIndex = 0) || start.pop()) ) {
-
-								// When found, cache indexes on `parent` and break
-								if ( node.nodeType === 1 && ++diff && node === elem ) {
-									outerCache[ type ] = [ dirruns, nodeIndex, diff ];
-									break;
-								}
-							}
-
-						// Use previously-cached element index if available
-						} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
-							diff = cache[1];
-
-						// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
-						} else {
-							// Use the same loop as above to seek `elem` from the start
-							while ( (node = ++nodeIndex && node && node[ dir ] ||
-								(diff = nodeIndex = 0) || start.pop()) ) {
-
-								if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
-									// Cache the index of each encountered element
-									if ( useCache ) {
-										(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
-									}
-
-									if ( node === elem ) {
-										break;
-									}
-								}
-							}
-						}
-
-						// Incorporate the offset, then check against cycle size
-						diff -= last;
-						return diff === first || ( diff % first === 0 && diff / first >= 0 );
-					}
-				};
-		},
-
-		"PSEUDO": function( pseudo, argument ) {
-			// pseudo-class names are case-insensitive
-			// http://www.w3.org/TR/selectors/#pseudo-classes
-			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
-			// Remember that setFilters inherits from pseudos
-			var args,
-				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
-					Sizzle.error( "unsupported pseudo: " + pseudo );
-
-			// The user may use createPseudo to indicate that
-			// arguments are needed to create the filter function
-			// just as Sizzle does
-			if ( fn[ expando ] ) {
-				return fn( argument );
-			}
-
-			// But maintain support for old signatures
-			if ( fn.length > 1 ) {
-				args = [ pseudo, pseudo, "", argument ];
-				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
-					markFunction(function( seed, matches ) {
-						var idx,
-							matched = fn( seed, argument ),
-							i = matched.length;
-						while ( i-- ) {
-							idx = indexOf.call( seed, matched[i] );
-							seed[ idx ] = !( matches[ idx ] = matched[i] );
-						}
-					}) :
-					function( elem ) {
-						return fn( elem, 0, args );
-					};
-			}
-
-			return fn;
-		}
-	},
-
-	pseudos: {
-		// Potentially complex pseudos
-		"not": markFunction(function( selector ) {
-			// Trim the selector passed to compile
-			// to avoid treating leading and trailing
-			// spaces as combinators
-			var input = [],
-				results = [],
-				matcher = compile( selector.replace( rtrim, "$1" ) );
-
-			return matcher[ expando ] ?
-				markFunction(function( seed, matches, context, xml ) {
-					var elem,
-						unmatched = matcher( seed, null, xml, [] ),
-						i = seed.length;
-
-					// Match elements unmatched by `matcher`
-					while ( i-- ) {
-						if ( (elem = unmatched[i]) ) {
-							seed[i] = !(matches[i] = elem);
-						}
-					}
-				}) :
-				function( elem, context, xml ) {
-					input[0] = elem;
-					matcher( input, null, xml, results );
-					return !results.pop();
-				};
-		}),
-
-		"has": markFunction(function( selector ) {
-			return function( elem ) {
-				return Sizzle( selector, elem ).length > 0;
-			};
-		}),
-
-		"contains": markFunction(function( text ) {
-			return function( elem ) {
-				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
-			};
-		}),
-
-		// "Whether an element is represented by a :lang() selector
-		// is based solely on the element's language value
-		// being equal to the identifier C,
-		// or beginning with the identifier C immediately followed by "-".
-		// The matching of C against the element's language value is performed case-insensitively.
-		// The identifier C does not have to be a valid language name."
-		// http://www.w3.org/TR/selectors/#lang-pseudo
-		"lang": markFunction( function( lang ) {
-			// lang value must be a valid identifider
-			if ( !ridentifier.test(lang || "") ) {
-				Sizzle.error( "unsupported lang: " + lang );
-			}
-			lang = lang.replace( runescape, funescape ).toLowerCase();
-			return function( elem ) {
-				var elemLang;
-				do {
-					if ( (elemLang = documentIsXML ?
-						elem.getAttribute("xml:lang") || elem.getAttribute("lang") :
-						elem.lang) ) {
-
-						elemLang = elemLang.toLowerCase();
-						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
-					}
-				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
-				return false;
-			};
-		}),
-
-		// Miscellaneous
-		"target": function( elem ) {
-			var hash = window.location && window.location.hash;
-			return hash && hash.slice( 1 ) === elem.id;
-		},
-
-		"root": function( elem ) {
-			return elem === docElem;
-		},
-
-		"focus": function( elem ) {
-			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
-		},
-
-		// Boolean properties
-		"enabled": function( elem ) {
-			return elem.disabled === false;
-		},
-
-		"disabled": function( elem ) {
-			return elem.disabled === true;
-		},
-
-		"checked": function( elem ) {
-			// In CSS3, :checked should return both checked and selected elements
-			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-			var nodeName = elem.nodeName.toLowerCase();
-			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
-		},
-
-		"selected": function( elem ) {
-			// Accessing this property makes selected-by-default
-			// options in Safari work properly
-			if ( elem.parentNode ) {
-				elem.parentNode.selectedIndex;
-			}
-
-			return elem.selected === true;
-		},
-
-		// Contents
-		"empty": function( elem ) {
-			// http://www.w3.org/TR/selectors/#empty-pseudo
-			// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
-			//   not comment, processing instructions, or others
-			// Thanks to Diego Perini for the nodeName shortcut
-			//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
-			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-				if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
-					return false;
-				}
-			}
-			return true;
-		},
-
-		"parent": function( elem ) {
-			return !Expr.pseudos["empty"]( elem );
-		},
-
-		// Element/input types
-		"header": function( elem ) {
-			return rheader.test( elem.nodeName );
-		},
-
-		"input": function( elem ) {
-			return rinputs.test( elem.nodeName );
-		},
-
-		"button": function( elem ) {
-			var name = elem.nodeName.toLowerCase();
-			return name === "input" && elem.type === "button" || name === "button";
-		},
-
-		"text": function( elem ) {
-			var attr;
-			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
-			// use getAttribute instead to test this case
-			return elem.nodeName.toLowerCase() === "input" &&
-				elem.type === "text" &&
-				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
-		},
-
-		// Position-in-collection
-		"first": createPositionalPseudo(function() {
-			return [ 0 ];
-		}),
-
-		"last": createPositionalPseudo(function( matchIndexes, length ) {
-			return [ length - 1 ];
-		}),
-
-		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			return [ argument < 0 ? argument + length : argument ];
-		}),
-
-		"even": createPositionalPseudo(function( matchIndexes, length ) {
-			var i = 0;
-			for ( ; i < length; i += 2 ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"odd": createPositionalPseudo(function( matchIndexes, length ) {
-			var i = 1;
-			for ( ; i < length; i += 2 ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			var i = argument < 0 ? argument + length : argument;
-			for ( ; --i >= 0; ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			var i = argument < 0 ? argument + length : argument;
-			for ( ; ++i < length; ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		})
-	}
-};
-
-// Add button/input type pseudos
-for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
-	Expr.pseudos[ i ] = createInputPseudo( i );
-}
-for ( i in { submit: true, reset: true } ) {
-	Expr.pseudos[ i ] = createButtonPseudo( i );
-}
-
-function tokenize( selector, parseOnly ) {
-	var matched, match, tokens, type,
-		soFar, groups, preFilters,
-		cached = tokenCache[ selector + " " ];
-
-	if ( cached ) {
-		return parseOnly ? 0 : cached.slice( 0 );
-	}
-
-	soFar = selector;
-	groups = [];
-	preFilters = Expr.preFilter;
-
-	while ( soFar ) {
-
-		// Comma and first run
-		if ( !matched || (match = rcomma.exec( soFar )) ) {
-			if ( match ) {
-				// Don't consume trailing commas as valid
-				soFar = soFar.slice( match[0].length ) || soFar;
-			}
-			groups.push( tokens = [] );
-		}
-
-		matched = false;
-
-		// Combinators
-		if ( (match = rcombinators.exec( soFar )) ) {
-			matched = match.shift();
-			tokens.push( {
-				value: matched,
-				// Cast descendant combinators to space
-				type: match[0].replace( rtrim, " " )
-			} );
-			soFar = soFar.slice( matched.length );
-		}
-
-		// Filters
-		for ( type in Expr.filter ) {
-			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
-				(match = preFilters[ type ]( match ))) ) {
-				matched = match.shift();
-				tokens.push( {
-					value: matched,
-					type: type,
-					matches: match
-				} );
-				soFar = soFar.slice( matched.length );
-			}
-		}
-
-		if ( !matched ) {
-			break;
-		}
-	}
-
-	// Return the length of the invalid excess
-	// if we're just parsing
-	// Otherwise, throw an error or return tokens
-	return parseOnly ?
-		soFar.length :
-		soFar ?
-			Sizzle.error( selector ) :
-			// Cache the tokens
-			tokenCache( selector, groups ).slice( 0 );
-}
-
-function toSelector( tokens ) {
-	var i = 0,
-		len = tokens.length,
-		selector = "";
-	for ( ; i < len; i++ ) {
-		selector += tokens[i].value;
-	}
-	return selector;
-}
-
-function addCombinator( matcher, combinator, base ) {
-	var dir = combinator.dir,
-		checkNonElements = base && dir === "parentNode",
-		doneName = done++;
-
-	return combinator.first ?
-		// Check against closest ancestor/preceding element
-		function( elem, context, xml ) {
-			while ( (elem = elem[ dir ]) ) {
-				if ( elem.nodeType === 1 || checkNonElements ) {
-					return matcher( elem, context, xml );
-				}
-			}
-		} :
-
-		// Check against all ancestor/preceding elements
-		function( elem, context, xml ) {
-			var data, cache, outerCache,
-				dirkey = dirruns + " " + doneName;
-
-			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
-			if ( xml ) {
-				while ( (elem = elem[ dir ]) ) {
-					if ( elem.nodeType === 1 || checkNonElements ) {
-						if ( matcher( elem, context, xml ) ) {
-							return true;
-						}
-					}
-				}
-			} else {
-				while ( (elem = elem[ dir ]) ) {
-					if ( elem.nodeType === 1 || checkNonElements ) {
-						outerCache = elem[ expando ] || (elem[ expando ] = {});
-						if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
-							if ( (data = cache[1]) === true || data === cachedruns ) {
-								return data === true;
-							}
-						} else {
-							cache = outerCache[ dir ] = [ dirkey ];
-							cache[1] = matcher( elem, context, xml ) || cachedruns;
-							if ( cache[1] === true ) {
-								return true;
-							}
-						}
-					}
-				}
-			}
-		};
-}
-
-function elementMatcher( matchers ) {
-	return matchers.length > 1 ?
-		function( elem, context, xml ) {
-			var i = matchers.length;
-			while ( i-- ) {
-				if ( !matchers[i]( elem, context, xml ) ) {
-					return false;
-				}
-			}
-			return true;
-		} :
-		matchers[0];
-}
-
-function condense( unmatched, map, filter, context, xml ) {
-	var elem,
-		newUnmatched = [],
-		i = 0,
-		len = unmatched.length,
-		mapped = map != null;
-
-	for ( ; i < len; i++ ) {
-		if ( (elem = unmatched[i]) ) {
-			if ( !filter || filter( elem, context, xml ) ) {
-				newUnmatched.push( elem );
-				if ( mapped ) {
-					map.push( i );
-				}
-			}
-		}
-	}
-
-	return newUnmatched;
-}
-
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
-	if ( postFilter && !postFilter[ expando ] ) {
-		postFilter = setMatcher( postFilter );
-	}
-	if ( postFinder && !postFinder[ expando ] ) {
-		postFinder = setMatcher( postFinder, postSelector );
-	}
-	return markFunction(function( seed, results, context, xml ) {
-		var temp, i, elem,
-			preMap = [],
-			postMap = [],
-			preexisting = results.length,
-
-			// Get initial elements from seed or context
-			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
-
-			// Prefilter to get matcher input, preserving a map for seed-results synchronization
-			matcherIn = preFilter && ( seed || !selector ) ?
-				condense( elems, preMap, preFilter, context, xml ) :
-				elems,
-
-			matcherOut = matcher ?
-				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
-				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
-
-					// ...intermediate processing is necessary
-					[] :
-
-					// ...otherwise use results directly
-					results :
-				matcherIn;
-
-		// Find primary matches
-		if ( matcher ) {
-			matcher( matcherIn, matcherOut, context, xml );
-		}
-
-		// Apply postFilter
-		if ( postFilter ) {
-			temp = condense( matcherOut, postMap );
-			postFilter( temp, [], context, xml );
-
-			// Un-match failing elements by moving them back to matcherIn
-			i = temp.length;
-			while ( i-- ) {
-				if ( (elem = temp[i]) ) {
-					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
-				}
-			}
-		}
-
-		if ( seed ) {
-			if ( postFinder || preFilter ) {
-				if ( postFinder ) {
-					// Get the final matcherOut by condensing this intermediate into postFinder contexts
-					temp = [];
-					i = matcherOut.length;
-					while ( i-- ) {
-						if ( (elem = matcherOut[i]) ) {
-							// Restore matcherIn since elem is not yet a final match
-							temp.push( (matcherIn[i] = elem) );
-						}
-					}
-					postFinder( null, (matcherOut = []), temp, xml );
-				}
-
-				// Move matched elements from seed to results to keep them synchronized
-				i = matcherOut.length;
-				while ( i-- ) {
-					if ( (elem = matcherOut[i]) &&
-						(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
-
-						seed[temp] = !(results[temp] = elem);
-					}
-				}
-			}
-
-		// Add elements to results, through postFinder if defined
-		} else {
-			matcherOut = condense(
-				matcherOut === results ?
-					matcherOut.splice( preexisting, matcherOut.length ) :
-					matcherOut
-			);
-			if ( postFinder ) {
-				postFinder( null, results, matcherOut, xml );
-			} else {
-				push.apply( results, matcherOut );
-			}
-		}
-	});
-}
-
-function matcherFromTokens( tokens ) {
-	var checkContext, matcher, j,
-		len = tokens.length,
-		leadingRelative = Expr.relative[ tokens[0].type ],
-		implicitRelative = leadingRelative || Expr.relative[" "],
-		i = leadingRelative ? 1 : 0,
-
-		// The foundational matcher ensures that elements are reachable from top-level context(s)
-		matchContext = addCombinator( function( elem ) {
-			return elem === checkContext;
-		}, implicitRelative, true ),
-		matchAnyContext = addCombinator( function( elem ) {
-			return indexOf.call( checkContext, elem ) > -1;
-		}, implicitRelative, true ),
-		matchers = [ function( elem, context, xml ) {
-			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
-				(checkContext = context).nodeType ?
-					matchContext( elem, context, xml ) :
-					matchAnyContext( elem, context, xml ) );
-		} ];
-
-	for ( ; i < len; i++ ) {
-		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
-			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
-		} else {
-			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
-
-			// Return special upon seeing a positional matcher
-			if ( matcher[ expando ] ) {
-				// Find the next relative operator (if any) for proper handling
-				j = ++i;
-				for ( ; j < len; j++ ) {
-					if ( Expr.relative[ tokens[j].type ] ) {
-						break;
-					}
-				}
-				return setMatcher(
-					i > 1 && elementMatcher( matchers ),
-					i > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, "$1" ),
-					matcher,
-					i < j && matcherFromTokens( tokens.slice( i, j ) ),
-					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
-					j < len && toSelector( tokens )
-				);
-			}
-			matchers.push( matcher );
-		}
-	}
-
-	return elementMatcher( matchers );
-}
-
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
-	// A counter to specify which element is currently being matched
-	var matcherCachedRuns = 0,
-		bySet = setMatchers.length > 0,
-		byElement = elementMatchers.length > 0,
-		superMatcher = function( seed, context, xml, results, expandContext ) {
-			var elem, j, matcher,
-				setMatched = [],
-				matchedCount = 0,
-				i = "0",
-				unmatched = seed && [],
-				outermost = expandContext != null,
-				contextBackup = outermostContext,
-				// We must always have either seed elements or context
-				elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
-				// Use integer dirruns iff this is the outermost matcher
-				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
-
-			if ( outermost ) {
-				outermostContext = context !== document && context;
-				cachedruns = matcherCachedRuns;
-			}
-
-			// Add elements passing elementMatchers directly to results
-			// Keep `i` a string if there are no elements so `matchedCount` will be "00" below
-			for ( ; (elem = elems[i]) != null; i++ ) {
-				if ( byElement && elem ) {
-					j = 0;
-					while ( (matcher = elementMatchers[j++]) ) {
-						if ( matcher( elem, context, xml ) ) {
-							results.push( elem );
-							break;
-						}
-					}
-					if ( outermost ) {
-						dirruns = dirrunsUnique;
-						cachedruns = ++matcherCachedRuns;
-					}
-				}
-
-				// Track unmatched elements for set filters
-				if ( bySet ) {
-					// They will have gone through all possible matchers
-					if ( (elem = !matcher && elem) ) {
-						matchedCount--;
-					}
-
-					// Lengthen the array for every element, matched or not
-					if ( seed ) {
-						unmatched.push( elem );
-					}
-				}
-			}
-
-			// Apply set filters to unmatched elements
-			matchedCount += i;
-			if ( bySet && i !== matchedCount ) {
-				j = 0;
-				while ( (matcher = setMatchers[j++]) ) {
-					matcher( unmatched, setMatched, context, xml );
-				}
-
-				if ( seed ) {
-					// Reintegrate element matches to eliminate the need for sorting
-					if ( matchedCount > 0 ) {
-						while ( i-- ) {
-							if ( !(unmatched[i] || setMatched[i]) ) {
-								setMatched[i] = pop.call( results );
-							}
-						}
-					}
-
-					// Discard index placeholder values to get only actual matches
-					setMatched = condense( setMatched );
-				}
-
-				// Add matches to results
-				push.apply( results, setMatched );
-
-				// Seedless set matches succeeding multiple successful matchers stipulate sorting
-				if ( outermost && !seed && setMatched.length > 0 &&
-					( matchedCount + setMatchers.length ) > 1 ) {
-
-					Sizzle.uniqueSort( results );
-				}
-			}
-
-			// Override manipulation of globals by nested matchers
-			if ( outermost ) {
-				dirruns = dirrunsUnique;
-				outermostContext = contextBackup;
-			}
-
-			return unmatched;
-		};
-
-	return bySet ?
-		markFunction( superMatcher ) :
-		superMatcher;
-}
-
-compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
-	var i,
-		setMatchers = [],
-		elementMatchers = [],
-		cached = compilerCache[ selector + " " ];
-
-	if ( !cached ) {
-		// Generate a function of recursive functions that can be used to check each element
-		if ( !group ) {
-			group = tokenize( selector );
-		}
-		i = group.length;
-		while ( i-- ) {
-			cached = matcherFromTokens( group[i] );
-			if ( cached[ expando ] ) {
-				setMatchers.push( cached );
-			} else {
-				elementMatchers.push( cached );
-			}
-		}
-
-		// Cache the compiled function
-		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
-	}
-	return cached;
-};
-
-function multipleContexts( selector, contexts, results ) {
-	var i = 0,
-		len = contexts.length;
-	for ( ; i < len; i++ ) {
-		Sizzle( selector, contexts[i], results );
-	}
-	return results;
-}
-
-function select( selector, context, results, seed ) {
-	var i, tokens, token, type, find,
-		match = tokenize( selector );
-
-	if ( !seed ) {
-		// Try to minimize operations if there is only one group
-		if ( match.length === 1 ) {
-
-			// Take a shortcut and set the context if the root selector is an ID
-			tokens = match[0] = match[0].slice( 0 );
-			if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
-					context.nodeType === 9 && !documentIsXML &&
-					Expr.relative[ tokens[1].type ] ) {
-
-				context = Expr.find["ID"]( token.matches[0].replace( runescape, funescape ), context )[0];
-				if ( !context ) {
-					return results;
-				}
-
-				selector = selector.slice( tokens.shift().value.length );
-			}
-
-			// Fetch a seed set for right-to-left matching
-			i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
-			while ( i-- ) {
-				token = tokens[i];
-
-				// Abort if we hit a combinator
-				if ( Expr.relative[ (type = token.type) ] ) {
-					break;
-				}
-				if ( (find = Expr.find[ type ]) ) {
-					// Search, expanding context for leading sibling combinators
-					if ( (seed = find(
-						token.matches[0].replace( runescape, funescape ),
-						rsibling.test( tokens[0].type ) && context.parentNode || context
-					)) ) {
-
-						// If seed is empty or no tokens remain, we can return early
-						tokens.splice( i, 1 );
-						selector = seed.length && toSelector( tokens );
-						if ( !selector ) {
-							push.apply( results, slice.call( seed, 0 ) );
-							return results;
-						}
-
-						break;
-					}
-				}
-			}
-		}
-	}
-
-	// Compile and execute a filtering function
-	// Provide `match` to avoid retokenization if we modified the selector above
-	compile( selector, match )(
-		seed,
-		context,
-		documentIsXML,
-		results,
-		rsibling.test( selector )
-	);
-	return results;
-}
-
-// Deprecated
-Expr.pseudos["nth"] = Expr.pseudos["eq"];
-
-// Easy API for creating new setFilters
-function setFilters() {}
-Expr.filters = setFilters.prototype = Expr.pseudos;
-Expr.setFilters = new setFilters();
-
-// Initialize with the default document
-setDocument();
-
-// Override sizzle attribute retrieval
-Sizzle.attr = jQuery.attr;
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.pseudos;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-})( window );
-var runtil = /Until$/,
-	rparentsprev = /^(?:parents|prev(?:Until|All))/,
-	isSimple = /^.[^:#\[\.,]*$/,
-	rneedsContext = jQuery.expr.match.needsContext,
-	// methods guaranteed to produce a unique set when starting from a unique set
-	guaranteedUnique = {
-		children: true,
-		contents: true,
-		next: true,
-		prev: true
-	};
-
-jQuery.fn.extend({
-	find: function( selector ) {
-		var i, ret, self,
-			len = this.length;
-
-		if ( typeof selector !== "string" ) {
-			self = this;
-			return this.pushStack( jQuery( selector ).filter(function() {
-				for ( i = 0; i < len; i++ ) {
-					if ( jQuery.contains( self[ i ], this ) ) {
-						return true;
-					}
-				}
-			}) );
-		}
-
-		ret = [];
-		for ( i = 0; i < len; i++ ) {
-			jQuery.find( selector, this[ i ], ret );
-		}
-
-		// Needed because $( selector, context ) becomes $( context ).find( selector )
-		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
-		ret.selector = ( this.selector ? this.selector + " " : "" ) + selector;
-		return ret;
-	},
-
-	has: function( target ) {
-		var i,
-			targets = jQuery( target, this ),
-			len = targets.length;
-
-		return this.filter(function() {
-			for ( i = 0; i < len; i++ ) {
-				if ( jQuery.contains( this, targets[i] ) ) {
-					return true;
-				}
-			}
-		});
-	},
-
-	not: function( selector ) {
-		return this.pushStack( winnow(this, selector, false) );
-	},
-
-	filter: function( selector ) {
-		return this.pushStack( winnow(this, selector, true) );
-	},
-
-	is: function( selector ) {
-		return !!selector && (
-			typeof selector === "string" ?
-				// If this is a positional/relative selector, check membership in the returned set
-				// so $("p:first").is("p:last") won't return true for a doc with two "p".
-				rneedsContext.test( selector ) ?
-					jQuery( selector, this.context ).index( this[0] ) >= 0 :
-					jQuery.filter( selector, this ).length > 0 :
-				this.filter( selector ).length > 0 );
-	},
-
-	closest: function( selectors, context ) {
-		var cur,
-			i = 0,
-			l = this.length,
-			ret = [],
-			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
-				jQuery( selectors, context || this.context ) :
-				0;
-
-		for ( ; i < l; i++ ) {
-			cur = this[i];
-
-			while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
-				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
-					ret.push( cur );
-					break;
-				}
-				cur = cur.parentNode;
-			}
-		}
-
-		return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
-	},
-
-	// Determine the position of an element within
-	// the matched set of elements
-	index: function( elem ) {
-
-		// No argument, return index in parent
-		if ( !elem ) {
-			return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
-		}
-
-		// index in selector
-		if ( typeof elem === "string" ) {
-			return jQuery.inArray( this[0], jQuery( elem ) );
-		}
-
-		// Locate the position of the desired element
-		return jQuery.inArray(
-			// If it receives a jQuery object, the first element is used
-			elem.jquery ? elem[0] : elem, this );
-	},
-
-	add: function( selector, context ) {
-		var set = typeof selector === "string" ?
-				jQuery( selector, context ) :
-				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
-			all = jQuery.merge( this.get(), set );
-
-		return this.pushStack( jQuery.unique(all) );
-	},
-
-	addBack: function( selector ) {
-		return this.add( selector == null ?
-			this.prevObject : this.prevObject.filter(selector)
-		);
-	}
-});
-
-jQuery.fn.andSelf = jQuery.fn.addBack;
-
-function sibling( cur, dir ) {
-	do {
-		cur = cur[ dir ];
-	} while ( cur && cur.nodeType !== 1 );
-
-	return cur;
-}
-
-jQuery.each({
-	parent: function( elem ) {
-		var parent = elem.parentNode;
-		return parent && parent.nodeType !== 11 ? parent : null;
-	},
-	parents: function( elem ) {
-		return jQuery.dir( elem, "parentNode" );
-	},
-	parentsUntil: function( elem, i, until ) {
-		return jQuery.dir( elem, "parentNode", until );
-	},
-	next: function( elem ) {
-		return sibling( elem, "nextSibling" );
-	},
-	prev: function( elem ) {
-		return sibling( elem, "previousSibling" );
-	},
-	nextAll: function( elem ) {
-		return jQuery.dir( elem, "nextSibling" );
-	},
-	prevAll: function( elem ) {
-		return jQuery.dir( elem, "previousSibling" );
-	},
-	nextUntil: function( elem, i, until ) {
-		return jQuery.dir( elem, "nextSibling", until );
-	},
-	prevUntil: function( elem, i, until ) {
-		return jQuery.dir( elem, "previousSibling", until );
-	},
-	siblings: function( elem ) {
-		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
-	},
-	children: function( elem ) {
-		return jQuery.sibling( elem.firstChild );
-	},
-	contents: function( elem ) {
-		return jQuery.nodeName( elem, "iframe" ) ?
-			elem.contentDocument || elem.contentWindow.document :
-			jQuery.merge( [], elem.childNodes );
-	}
-}, function( name, fn ) {
-	jQuery.fn[ name ] = function( until, selector ) {
-		var ret = jQuery.map( this, fn, until );
-
-		if ( !runtil.test( name ) ) {
-			selector = until;
-		}
-
-		if ( selector && typeof selector === "string" ) {
-			ret = jQuery.filter( selector, ret );
-		}
-
-		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
-
-		if ( this.length > 1 && rparentsprev.test( name ) ) {
-			ret = ret.reverse();
-		}
-
-		return this.pushStack( ret );
-	};
-});
-
-jQuery.extend({
-	filter: function( expr, elems, not ) {
-		if ( not ) {
-			expr = ":not(" + expr + ")";
-		}
-
-		return elems.length === 1 ?
-			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
-			jQuery.find.matches(expr, elems);
-	},
-
-	dir: function( elem, dir, until ) {
-		var matched = [],
-			cur = elem[ dir ];
-
-		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
-			if ( cur.nodeType === 1 ) {
-				matched.push( cur );
-			}
-			cur = cur[dir];
-		}
-		return matched;
-	},
-
-	sibling: function( n, elem ) {
-		var r = [];
-
-		for ( ; n; n = n.nextSibling ) {
-			if ( n.nodeType === 1 && n !== elem ) {
-				r.push( n );
-			}
-		}
-
-		return r;
-	}
-});
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, keep ) {
-
-	// Can't pass null or undefined to indexOf in Firefox 4
-	// Set to 0 to skip string check
-	qualifier = qualifier || 0;
-
-	if ( jQuery.isFunction( qualifier ) ) {
-		return jQuery.grep(elements, function( elem, i ) {
-			var retVal = !!qualifier.call( elem, i, elem );
-			return retVal === keep;
-		});
-
-	} else if ( qualifier.nodeType ) {
-		return jQuery.grep(elements, function( elem ) {
-			return ( elem === qualifier ) === keep;
-		});
-
-	} else if ( typeof qualifier === "string" ) {
-		var filtered = jQuery.grep(elements, function( elem ) {
-			return elem.nodeType === 1;
-		});
-
-		if ( isSimple.test( qualifier ) ) {
-			return jQuery.filter(qualifier, filtered, !keep);
-		} else {
-			qualifier = jQuery.filter( qualifier, filtered );
-		}
-	}
-
-	return jQuery.grep(elements, function( elem ) {
-		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
-	});
-}
-function createSafeFragment( document ) {
-	var list = nodeNames.split( "|" ),
-		safeFrag = document.createDocumentFragment();
-
-	if ( safeFrag.createElement ) {
-		while ( list.length ) {
-			safeFrag.createElement(
-				list.pop()
-			);
-		}
-	}
-	return safeFrag;
-}
-
-var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
-		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
-	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
-	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
-	rleadingWhitespace = /^\s+/,
-	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
-	rtagName = /<([\w:]+)/,
-	rtbody = /<tbody/i,
-	rhtml = /<|&#?\w+;/,
-	rnoInnerhtml = /<(?:script|style|link)/i,
-	manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
-	// checked="checked" or checked
-	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-	rscriptType = /^$|\/(?:java|ecma)script/i,
-	rscriptTypeMasked = /^true\/(.*)/,
-	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
-
-	// We have to close these tags to support XHTML (#13200)
-	wrapMap = {
-		option: [ 1, "<select multiple='multiple'>", "</select>" ],
-		legend: [ 1, "<fieldset>", "</fieldset>" ],
-		area: [ 1, "<map>", "</map>" ],
-		param: [ 1, "<object>", "</object>" ],
-		thead: [ 1, "<table>", "</table>" ],
-		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
-		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-
-		// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
-		// unless wrapped in a div with non-breaking characters in front of it.
-		_default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
-	},
-	safeFragment = createSafeFragment( document ),
-	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
-
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-jQuery.fn.extend({
-	text: function( value ) {
-		return jQuery.access( this, function( value ) {
-			return value === undefined ?
-				jQuery.text( this ) :
-				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
-		}, null, value, arguments.length );
-	},
-
-	wrapAll: function( html ) {
-		if ( jQuery.isFunction( html ) ) {
-			return this.each(function(i) {
-				jQuery(this).wrapAll( html.call(this, i) );
-			});
-		}
-
-		if ( this[0] ) {
-			// The elements to wrap the target around
-			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
-
-			if ( this[0].parentNode ) {
-				wrap.insertBefore( this[0] );
-			}
-
-			wrap.map(function() {
-				var elem = this;
-
-				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
-					elem = elem.firstChild;
-				}
-
-				return elem;
-			}).append( this );
-		}
-
-		return this;
-	},
-
-	wrapInner: function( html ) {
-		if ( jQuery.isFunction( html ) ) {
-			return this.each(function(i) {
-				jQuery(this).wrapInner( html.call(this, i) );
-			});
-		}
-
-		return this.each(function() {
-			var self = jQuery( this ),
-				contents = self.contents();
-
-			if ( contents.length ) {
-				contents.wrapAll( html );
-
-			} else {
-				self.append( html );
-			}
-		});
-	},
-
-	wrap: function( html ) {
-		var isFunction = jQuery.isFunction( html );
-
-		return this.each(function(i) {
-			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
-		});
-	},
-
-	unwrap: function() {
-		return this.parent().each(function() {
-			if ( !jQuery.nodeName( this, "body" ) ) {
-				jQuery( this ).replaceWith( this.childNodes );
-			}
-		}).end();
-	},
-
-	append: function() {
-		return this.domManip(arguments, true, function( elem ) {
-			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-				this.appendChild( elem );
-			}
-		});
-	},
-
-	prepend: function() {
-		return this.domManip(arguments, true, function( elem ) {
-			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-				this.insertBefore( elem, this.firstChild );
-			}
-		});
-	},
-
-	before: function() {
-		return this.domManip( arguments, false, function( elem ) {
-			if ( this.parentNode ) {
-				this.parentNode.insertBefore( elem, this );
-			}
-		});
-	},
-
-	after: function() {
-		return this.domManip( arguments, false, function( elem ) {
-			if ( this.parentNode ) {
-				this.parentNode.insertBefore( elem, this.nextSibling );
-			}
-		});
-	},
-
-	// keepData is for internal use only--do not document
-	remove: function( selector, keepData ) {
-		var elem,
-			i = 0;
-
-		for ( ; (elem = this[i]) != null; i++ ) {
-			if ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) {
-				if ( !keepData && elem.nodeType === 1 ) {
-					jQuery.cleanData( getAll( elem ) );
-				}
-
-				if ( elem.parentNode ) {
-					if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
-						setGlobalEval( getAll( elem, "script" ) );
-					}
-					elem.parentNode.removeChild( elem );
-				}
-			}
-		}
-
-		return this;
-	},
-
-	empty: function() {
-		var elem,
-			i = 0;
-
-		for ( ; (elem = this[i]) != null; i++ ) {
-			// Remove element nodes and prevent memory leaks
-			if ( elem.nodeType === 1 ) {
-				jQuery.cleanData( getAll( elem, false ) );
-			}
-
-			// Remove any remaining nodes
-			while ( elem.firstChild ) {
-				elem.removeChild( elem.firstChild );
-			}
-
-			// If this is a select, ensure that it displays empty (#12336)
-			// Support: IE<9
-			if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
-				elem.options.length = 0;
-			}
-		}
-
-		return this;
-	},
-
-	clone: function( dataAndEvents, deepDataAndEvents ) {
-		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
-		return this.map( function () {
-			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-		});
-	},
-
-	html: function( value ) {
-		return jQuery.access( this, function( value ) {
-			var elem = this[0] || {},
-				i = 0,
-				l = this.length;
-
-			if ( value === undefined ) {
-				return elem.nodeType === 1 ?
-					elem.innerHTML.replace( rinlinejQuery, "" ) :
-					undefined;
-			}
-
-			// See if we can take a shortcut and just use innerHTML
-			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-				( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
-				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
-				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
-
-				value = value.replace( rxhtmlTag, "<$1></$2>" );
-
-				try {
-					for (; i < l; i++ ) {
-						// Remove element nodes and prevent memory leaks
-						elem = this[i] || {};
-						if ( elem.nodeType === 1 ) {
-							jQuery.cleanData( getAll( elem, false ) );
-							elem.innerHTML = value;
-						}
-					}
-
-					elem = 0;
-
-				// If using innerHTML throws an exception, use the fallback method
-				} catch(e) {}
-			}
-
-			if ( elem ) {
-				this.empty().append( value );
-			}
-		}, null, value, arguments.length );
-	},
-
-	replaceWith: function( value ) {
-		var isFunc = jQuery.isFunction( value );
-
-		// Make sure that the elements are removed from the DOM before they are inserted
-		// this can help fix replacing a parent with child elements
-		if ( !isFunc && typeof value !== "string" ) {
-			value = jQuery( value ).not( this ).detach();
-		}
-
-		return this.domManip( [ value ], true, function( elem ) {
-			var next = this.nextSibling,
-				parent = this.parentNode;
-
-			if ( parent ) {
-				jQuery( this ).remove();
-				parent.insertBefore( elem, next );
-			}
-		});
-	},
-
-	detach: function( selector ) {
-		return this.remove( selector, true );
-	},
-
-	domManip: function( args, table, callback ) {
-
-		// Flatten any nested arrays
-		args = core_concat.apply( [], args );
-
-		var first, node, hasScripts,
-			scripts, doc, fragment,
-			i = 0,
-			l = this.length,
-			set = this,
-			iNoClone = l - 1,
-			value = args[0],
-			isFunction = jQuery.isFunction( value );
-
-		// We can't cloneNode fragments that contain checked, in WebKit
-		if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
-			return this.each(function( index ) {
-				var self = set.eq( index );
-				if ( isFunction ) {
-					args[0] = value.call( this, index, table ? self.html() : undefined );
-				}
-				self.domManip( args, table, callback );
-			});
-		}
-
-		if ( l ) {
-			fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
-			first = fragment.firstChild;
-
-			if ( fragment.childNodes.length === 1 ) {
-				fragment = first;
-			}
-
-			if ( first ) {
-				table = table && jQuery.nodeName( first, "tr" );
-				scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
-				hasScripts = scripts.length;
-
-				// Use the original fragment for the last item instead of the first because it can end up
-				// being emptied incorrectly in certain situations (#8070).
-				for ( ; i < l; i++ ) {
-					node = fragment;
-
-					if ( i !== iNoClone ) {
-						node = jQuery.clone( node, true, true );
-
-						// Keep references to cloned scripts for later restoration
-						if ( hasScripts ) {
-							jQuery.merge( scripts, getAll( node, "script" ) );
-						}
-					}
-
-					callback.call(
-						table && jQuery.nodeName( this[i], "table" ) ?
-							findOrAppend( this[i], "tbody" ) :
-							this[i],
-						node,
-						i
-					);
-				}
-
-				if ( hasScripts ) {
-					doc = scripts[ scripts.length - 1 ].ownerDocument;
-
-					// Reenable scripts
-					jQuery.map( scripts, restoreScript );
-
-					// Evaluate executable scripts on first document insertion
-					for ( i = 0; i < hasScripts; i++ ) {
-						node = scripts[ i ];
-						if ( rscriptType.test( node.type || "" ) &&
-							!jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
-
-							if ( node.src ) {
-								// Hope ajax is available...
-								jQuery.ajax({
-									url: node.src,
-									type: "GET",
-									dataType: "script",
-									async: false,
-									global: false,
-									"throws": true
-								});
-							} else {
-								jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
-							}
-						}
-					}
-				}
-
-				// Fix #11809: Avoid leaking memory
-				fragment = first = null;
-			}
-		}
-
-		return this;
-	}
-});
-
-function findOrAppend( elem, tag ) {
-	return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
-}
-
-// Replace/restore the type attribute of script elements for safe DOM manipulation
-function disableScript( elem ) {
-	var attr = elem.getAttributeNode("type");
-	elem.type = ( attr && attr.specified ) + "/" + elem.type;
-	return elem;
-}
-function restoreScript( elem ) {
-	var match = rscriptTypeMasked.exec( elem.type );
-	if ( match ) {
-		elem.type = match[1];
-	} else {
-		elem.removeAttribute("type");
-	}
-	return elem;
-}
-
-// Mark scripts as having already been evaluated
-function setGlobalEval( elems, refElements ) {
-	var elem,
-		i = 0;
-	for ( ; (elem = elems[i]) != null; i++ ) {
-		jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
-	}
-}
-
-function cloneCopyEvent( src, dest ) {
-
-	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
-		return;
-	}
-
-	var type, i, l,
-		oldData = jQuery._data( src ),
-		curData = jQuery._data( dest, oldData ),
-		events = oldData.events;
-
-	if ( events ) {
-		delete curData.handle;
-		curData.events = {};
-
-		for ( type in events ) {
-			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-				jQuery.event.add( dest, type, events[ type ][ i ] );
-			}
-		}
-	}
-
-	// make the cloned public data object a copy from the original
-	if ( curData.data ) {
-		curData.data = jQuery.extend( {}, curData.data );
-	}
-}
-
-function fixCloneNodeIssues( src, dest ) {
-	var nodeName, e, data;
-
-	// We do not need to do anything for non-Elements
-	if ( dest.nodeType !== 1 ) {
-		return;
-	}
-
-	nodeName = dest.nodeName.toLowerCase();
-
-	// IE6-8 copies events bound via attachEvent when using cloneNode.
-	if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
-		data = jQuery._data( dest );
-
-		for ( e in data.events ) {
-			jQuery.removeEvent( dest, e, data.handle );
-		}
-
-		// Event data gets referenced instead of copied if the expando gets copied too
-		dest.removeAttribute( jQuery.expando );
-	}
-
-	// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
-	if ( nodeName === "script" && dest.text !== src.text ) {
-		disableScript( dest ).text = src.text;
-		restoreScript( dest );
-
-	// IE6-10 improperly clones children of object elements using classid.
-	// IE10 throws NoModificationAllowedError if parent is null, #12132.
-	} else if ( nodeName === "object" ) {
-		if ( dest.parentNode ) {
-			dest.outerHTML = src.outerHTML;
-		}
-
-		// This path appears unavoidable for IE9. When cloning an object
-		// element in IE9, the outerHTML strategy above is not sufficient.
-		// If the src has innerHTML and the destination does not,
-		// copy the src.innerHTML into the dest.innerHTML. #10324
-		if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
-			dest.innerHTML = src.innerHTML;
-		}
-
-	} else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
-		// IE6-8 fails to persist the checked state of a cloned checkbox
-		// or radio button. Worse, IE6-7 fail to give the cloned element
-		// a checked appearance if the defaultChecked value isn't also set
-
-		dest.defaultChecked = dest.checked = src.checked;
-
-		// IE6-7 get confused and end up setting the value of a cloned
-		// checkbox/radio button to an empty string instead of "on"
-		if ( dest.value !== src.value ) {
-			dest.value = src.value;
-		}
-
-	// IE6-8 fails to return the selected option to the default selected
-	// state when cloning options
-	} else if ( nodeName === "option" ) {
-		dest.defaultSelected = dest.selected = src.defaultSelected;
-
-	// IE6-8 fails to set the defaultValue to the correct value when
-	// cloning other types of input fields
-	} else if ( nodeName === "input" || nodeName === "textarea" ) {
-		dest.defaultValue = src.defaultValue;
-	}
-}
-
-jQuery.each({
-	appendTo: "append",
-	prependTo: "prepend",
-	insertBefore: "before",
-	insertAfter: "after",
-	replaceAll: "replaceWith"
-}, function( name, original ) {
-	jQuery.fn[ name ] = function( selector ) {
-		var elems,
-			i = 0,
-			ret = [],
-			insert = jQuery( selector ),
-			last = insert.length - 1;
-
-		for ( ; i <= last; i++ ) {
-			elems = i === last ? this : this.clone(true);
-			jQuery( insert[i] )[ original ]( elems );
-
-			// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
-			core_push.apply( ret, elems.get() );
-		}
-
-		return this.pushStack( ret );
-	};
-});
-
-function getAll( context, tag ) {
-	var elems, elem,
-		i = 0,
-		found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
-			typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
-			undefined;
-
-	if ( !found ) {
-		for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
-			if ( !tag || jQuery.nodeName( elem, tag ) ) {
-				found.push( elem );
-			} else {
-				jQuery.merge( found, getAll( elem, tag ) );
-			}
-		}
-	}
-
-	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
-		jQuery.merge( [ context ], found ) :
-		found;
-}
-
-// Used in buildFragment, fixes the defaultChecked property
-function fixDefaultChecked( elem ) {
-	if ( manipulation_rcheckableType.test( elem.type ) ) {
-		elem.defaultChecked = elem.checked;
-	}
-}
-
-jQuery.extend({
-	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-		var destElements, node, clone, i, srcElements,
-			inPage = jQuery.contains( elem.ownerDocument, elem );
-
-		if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
-			clone = elem.cloneNode( true );
-
-		// IE<=8 does not properly clone detached, unknown element nodes
-		} else {
-			fragmentDiv.innerHTML = elem.outerHTML;
-			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
-		}
-
-		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
-				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
-
-			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
-			destElements = getAll( clone );
-			srcElements = getAll( elem );
-
-			// Fix all IE cloning issues
-			for ( i = 0; (node = srcElements[i]) != null; ++i ) {
-				// Ensure that the destination node is not null; Fixes #9587
-				if ( destElements[i] ) {
-					fixCloneNodeIssues( node, destElements[i] );
-				}
-			}
-		}
-
-		// Copy the events from the original to the clone
-		if ( dataAndEvents ) {
-			if ( deepDataAndEvents ) {
-				srcElements = srcElements || getAll( elem );
-				destElements = destElements || getAll( clone );
-
-				for ( i = 0; (node = srcElements[i]) != null; i++ ) {
-					cloneCopyEvent( node, destElements[i] );
-				}
-			} else {
-				cloneCopyEvent( elem, clone );
-			}
-		}
-
-		// Preserve script evaluation history
-		destElements = getAll( clone, "script" );
-		if ( destElements.length > 0 ) {
-			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
-		}
-
-		destElements = srcElements = node = null;
-
-		// Return the cloned set
-		return clone;
-	},
-
-	buildFragment: function( elems, context, scripts, selection ) {
-		var j, elem, contains,
-			tmp, tag, tbody, wrap,
-			l = elems.length,
-
-			// Ensure a safe fragment
-			safe = createSafeFragment( context ),
-
-			nodes = [],
-			i = 0;
-
-		for ( ; i < l; i++ ) {
-			elem = elems[ i ];
-
-			if ( elem || elem === 0 ) {
-
-				// Add nodes directly
-				if ( jQuery.type( elem ) === "object" ) {
-					jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
-
-				// Convert non-html into a text node
-				} else if ( !rhtml.test( elem ) ) {
-					nodes.push( context.createTextNode( elem ) );
-
-				// Convert html into DOM nodes
-				} else {
-					tmp = tmp || safe.appendChild( context.createElement("div") );
-
-					// Deserialize a standard representation
-					tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
-					wrap = wrapMap[ tag ] || wrapMap._default;
-
-					tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
-
-					// Descend through wrappers to the right content
-					j = wrap[0];
-					while ( j-- ) {
-						tmp = tmp.lastChild;
-					}
-
-					// Manually add leading whitespace removed by IE
-					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
-						nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
-					}
-
-					// Remove IE's autoinserted <tbody> from table fragments
-					if ( !jQuery.support.tbody ) {
-
-						// String was a <table>, *may* have spurious <tbody>
-						elem = tag === "table" && !rtbody.test( elem ) ?
-							tmp.firstChild :
-
-							// String was a bare <thead> or <tfoot>
-							wrap[1] === "<table>" && !rtbody.test( elem ) ?
-								tmp :
-								0;
-
-						j = elem && elem.childNodes.length;
-						while ( j-- ) {
-							if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
-								elem.removeChild( tbody );
-							}
-						}
-					}
-
-					jQuery.merge( nodes, tmp.childNodes );
-
-					// Fix #12392 for WebKit and IE > 9
-					tmp.textContent = "";
-
-					// Fix #12392 for oldIE
-					while ( tmp.firstChild ) {
-						tmp.removeChild( tmp.firstChild );
-					}
-
-					// Remember the top-level container for proper cleanup
-					tmp = safe.lastChild;
-				}
-			}
-		}
-
-		// Fix #11356: Clear elements from fragment
-		if ( tmp ) {
-			safe.removeChild( tmp );
-		}
-
-		// Reset defaultChecked for any radios and checkboxes
-		// about to be appended to the DOM in IE 6/7 (#8060)
-		if ( !jQuery.support.appendChecked ) {
-			jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
-		}
-
-		i = 0;
-		while ( (elem = nodes[ i++ ]) ) {
-
-			// #4087 - If origin and destination elements are the same, and this is
-			// that element, do not do anything
-			if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
-				continue;
-			}
-
-			contains = jQuery.contains( elem.ownerDocument, elem );
-
-			// Append to fragment
-			tmp = getAll( safe.appendChild( elem ), "script" );
-
-			// Preserve script evaluation history
-			if ( contains ) {
-				setGlobalEval( tmp );
-			}
-
-			// Capture executables
-			if ( scripts ) {
-				j = 0;
-				while ( (elem = tmp[ j++ ]) ) {
-					if ( rscriptType.test( elem.type || "" ) ) {
-						scripts.push( elem );
-					}
-				}
-			}
-		}
-
-		tmp = null;
-
-		return safe;
-	},
-
-	cleanData: function( elems, /* internal */ acceptData ) {
-		var elem, type, id, data,
-			i = 0,
-			internalKey = jQuery.expando,
-			cache = jQuery.cache,
-			deleteExpando = jQuery.support.deleteExpando,
-			special = jQuery.event.special;
-
-		for ( ; (elem = elems[i]) != null; i++ ) {
-
-			if ( acceptData || jQuery.acceptData( elem ) ) {
-
-				id = elem[ internalKey ];
-				data = id && cache[ id ];
-
-				if ( data ) {
-					if ( data.events ) {
-						for ( type in data.events ) {
-							if ( special[ type ] ) {
-								jQuery.event.remove( elem, type );
-
-							// This is a shortcut to avoid jQuery.event.remove's overhead
-							} else {
-								jQuery.removeEvent( elem, type, data.handle );
-							}
-						}
-					}
-
-					// Remove cache only if it was not already removed by jQuery.event.remove
-					if ( cache[ id ] ) {
-
-						delete cache[ id ];
-
-						// IE does not allow us to delete expando properties from nodes,
-						// nor does it have a removeAttribute function on Document nodes;
-						// we must handle all of these cases
-						if ( deleteExpando ) {
-							delete elem[ internalKey ];
-
-						} else if ( typeof elem.removeAttribute !== core_strundefined ) {
-							elem.removeAttribute( internalKey );
-
-						} else {
-							elem[ internalKey ] = null;
-						}
-
-						core_deletedIds.push( id );
-					}
-				}
-			}
-		}
-	}
-});
-var iframe, getStyles, curCSS,
-	ralpha = /alpha\([^)]*\)/i,
-	ropacity = /opacity\s*=\s*([^)]*)/,
-	rposition = /^(top|right|bottom|left)$/,
-	// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
-	// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
-	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
-	rmargin = /^margin/,
-	rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
-	rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
-	rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
-	elemdisplay = { BODY: "block" },
-
-	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-	cssNormalTransform = {
-		letterSpacing: 0,
-		fontWeight: 400
-	},
-
-	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
-	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
-
-// return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( style, name ) {
-
-	// shortcut for names that are not vendor prefixed
-	if ( name in style ) {
-		return name;
-	}
-
-	// check for vendor prefixed names
-	var capName = name.charAt(0).toUpperCase() + name.slice(1),
-		origName = name,
-		i = cssPrefixes.length;
-
-	while ( i-- ) {
-		name = cssPrefixes[ i ] + capName;
-		if ( name in style ) {
-			return name;
-		}
-	}
-
-	return origName;
-}
-
-function isHidden( elem, el ) {
-	// isHidden might be called from jQuery#filter function;
-	// in that case, element will be second argument
-	elem = el || elem;
-	return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
-}
-
-function showHide( elements, show ) {
-	var display, elem, hidden,
-		values = [],
-		index = 0,
-		length = elements.length;
-
-	for ( ; index < length; index++ ) {
-		elem = elements[ index ];
-		if ( !elem.style ) {
-			continue;
-		}
-
-		values[ index ] = jQuery._data( elem, "olddisplay" );
-		display = elem.style.display;
-		if ( show ) {
-			// Reset the inline display of this element to learn if it is
-			// being hidden by cascaded rules or not
-			if ( !values[ index ] && display === "none" ) {
-				elem.style.display = "";
-			}
-
-			// Set elements which have been overridden with display: none
-			// in a stylesheet to whatever the default browser style is
-			// for such an element
-			if ( elem.style.display === "" && isHidden( elem ) ) {
-				values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
-			}
-		} else {
-
-			if ( !values[ index ] ) {
-				hidden = isHidden( elem );
-
-				if ( display && display !== "none" || !hidden ) {
-					jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
-				}
-			}
-		}
-	}
-
-	// Set the display of most of the elements in a second loop
-	// to avoid the constant reflow
-	for ( index = 0; index < length; index++ ) {
-		elem = elements[ index ];
-		if ( !elem.style ) {
-			continue;
-		}
-		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
-			elem.style.display = show ? values[ index ] || "" : "none";
-		}
-	}
-
-	return elements;
-}
-
-jQuery.fn.extend({
-	css: function( name, value ) {
-		return jQuery.access( this, function( elem, name, value ) {
-			var len, styles,
-				map = {},
-				i = 0;
-
-			if ( jQuery.isArray( name ) ) {
-				styles = getStyles( elem );
-				len = name.length;
-
-				for ( ; i < len; i++ ) {
-					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
-				}
-
-				return map;
-			}
-
-			return value !== undefined ?
-				jQuery.style( elem, name, value ) :
-				jQuery.css( elem, name );
-		}, name, value, arguments.length > 1 );
-	},
-	show: function() {
-		return showHide( this, true );
-	},
-	hide: function() {
-		return showHide( this );
-	},
-	toggle: function( state ) {
-		var bool = typeof state === "boolean";
-
-		return this.each(function() {
-			if ( bool ? state : isHidden( this ) ) {
-				jQuery( this ).show();
-			} else {
-				jQuery( this ).hide();
-			}
-		});
-	}
-});
-
-jQuery.extend({
-	// Add in style property hooks for overriding the default
-	// behavior of getting and setting a style property
-	cssHooks: {
-		opacity: {
-			get: function( elem, computed ) {
-				if ( computed ) {
-					// We should always get a number back from opacity
-					var ret = curCSS( elem, "opacity" );
-					return ret === "" ? "1" : ret;
-				}
-			}
-		}
-	},
-
-	// Exclude the following css properties to add px
-	cssNumber: {
-		"columnCount": true,
-		"fillOpacity": true,
-		"fontWeight": true,
-		"lineHeight": true,
-		"opacity": true,
-		"orphans": true,
-		"widows": true,
-		"zIndex": true,
-		"zoom": true
-	},
-
-	// Add in properties whose names you wish to fix before
-	// setting or getting the value
-	cssProps: {
-		// normalize float css property
-		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
-	},
-
-	// Get and set the style property on a DOM Node
-	style: function( elem, name, value, extra ) {
-		// Don't set styles on text and comment nodes
-		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
-			return;
-		}
-
-		// Make sure that we're working with the right name
-		var ret, type, hooks,
-			origName = jQuery.camelCase( name ),
-			style = elem.style;
-
-		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
-
-		// gets hook for the prefixed version
-		// followed by the unprefixed version
-		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-		// Check if we're setting a value
-		if ( value !== undefined ) {
-			type = typeof value;
-
-			// convert relative number strings (+= or -=) to relative numbers. #7345
-			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
-				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
-				// Fixes bug #9237
-				type = "number";
-			}
-
-			// Make sure that NaN and null values aren't set. See: #7116
-			if ( value == null || type === "number" && isNaN( value ) ) {
-				return;
-			}
-
-			// If a number was passed in, add 'px' to the (except for certain CSS properties)
-			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
-				value += "px";
-			}
-
-			// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
-			// but it would mean to define eight (for every problematic property) identical functions
-			if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
-				style[ name ] = "inherit";
-			}
-
-			// If a hook was provided, use that value, otherwise just set the specified value
-			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
-
-				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
-				// Fixes bug #5509
-				try {
-					style[ name ] = value;
-				} catch(e) {}
-			}
-
-		} else {
-			// If a hook was provided get the non-computed value from there
-			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
-				return ret;
-			}
-
-			// Otherwise just get the value from the style object
-			return style[ name ];
-		}
-	},
-
-	css: function( elem, name, extra, styles ) {
-		var num, val, hooks,
-			origName = jQuery.camelCase( name );
-
-		// Make sure that we're working with the right name
-		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
-
-		// gets hook for the prefixed version
-		// followed by the unprefixed version
-		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-		// If a hook was provided get the computed value from there
-		if ( hooks && "get" in hooks ) {
-			val = hooks.get( elem, true, extra );
-		}
-
-		// Otherwise, if a way to get the computed value exists, use that
-		if ( val === undefined ) {
-			val = curCSS( elem, name, styles );
-		}
-
-		//convert "normal" to computed value
-		if ( val === "normal" && name in cssNormalTransform ) {
-			val = cssNormalTransform[ name ];
-		}
-
-		// Return, converting to number if forced or a qualifier was provided and val looks numeric
-		if ( extra === "" || extra ) {
-			num = parseFloat( val );
-			return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
-		}
-		return val;
-	},
-
-	// A method for quickly swapping in/out CSS properties to get correct calculations
-	swap: function( elem, options, callback, args ) {
-		var ret, name,
-			old = {};
-
-		// Remember the old values, and insert the new ones
-		for ( name in options ) {
-			old[ name ] = elem.style[ name ];
-			elem.style[ name ] = options[ name ];
-		}
-
-		ret = callback.apply( elem, args || [] );
-
-		// Revert the old values
-		for ( name in options ) {
-			elem.style[ name ] = old[ name ];
-		}
-
-		return ret;
-	}
-});
-
-// NOTE: we've included the "window" in window.getComputedStyle
-// because jsdom on node.js will break without it.
-if ( window.getComputedStyle ) {
-	getStyles = function( elem ) {
-		return window.getComputedStyle( elem, null );
-	};
-
-	curCSS = function( elem, name, _computed ) {
-		var width, minWidth, maxWidth,
-			computed = _computed || getStyles( elem ),
-
-			// getPropertyValue is only needed for .css('filter') in IE9, see #12537
-			ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
-			style = elem.style;
-
-		if ( computed ) {
-
-			if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
-				ret = jQuery.style( elem, name );
-			}
-
-			// A tribute to the "awesome hack by Dean Edwards"
-			// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
-			// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
-			// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
-			if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
-
-				// Remember the original values
-				width = style.width;
-				minWidth = style.minWidth;
-				maxWidth = style.maxWidth;
-
-				// Put in the new values to get a computed value out
-				style.minWidth = style.maxWidth = style.width = ret;
-				ret = computed.width;
-
-				// Revert the changed values
-				style.width = width;
-				style.minWidth = minWidth;
-				style.maxWidth = maxWidth;
-			}
-		}
-
-		return ret;
-	};
-} else if ( document.documentElement.currentStyle ) {
-	getStyles = function( elem ) {
-		return elem.currentStyle;
-	};
-
-	curCSS = function( elem, name, _computed ) {
-		var left, rs, rsLeft,
-			computed = _computed || getStyles( elem ),
-			ret = computed ? computed[ name ] : undefined,
-			style = elem.style;
-
-		// Avoid setting ret to empty string here
-		// so we don't default to auto
-		if ( ret == null && style && style[ name ] ) {
-			ret = style[ name ];
-		}
-
-		// From the awesome hack by Dean Edwards
-		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
-		// If we're not dealing with a regular pixel number
-		// but a number that has a weird ending, we need to convert it to pixels
-		// but not position css attributes, as those are proportional to the parent element instead
-		// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
-		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
-
-			// Remember the original values
-			left = style.left;
-			rs = elem.runtimeStyle;
-			rsLeft = rs && rs.left;
-
-			// Put in the new values to get a computed value out
-			if ( rsLeft ) {
-				rs.left = elem.currentStyle.left;
-			}
-			style.left = name === "fontSize" ? "1em" : ret;
-			ret = style.pixelLeft + "px";
-
-			// Revert the changed values
-			style.left = left;
-			if ( rsLeft ) {
-				rs.left = rsLeft;
-			}
-		}
-
-		return ret === "" ? "auto" : ret;
-	};
-}
-
-function setPositiveNumber( elem, value, subtract ) {
-	var matches = rnumsplit.exec( value );
-	return matches ?
-		// Guard against undefined "subtract", e.g., when used as in cssHooks
-		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
-		value;
-}
-
-function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
-	var i = extra === ( isBorderBox ? "border" : "content" ) ?
-		// If we already have the right measurement, avoid augmentation
-		4 :
-		// Otherwise initialize for horizontal or vertical properties
-		name === "width" ? 1 : 0,
-
-		val = 0;
-
-	for ( ; i < 4; i += 2 ) {
-		// both box models exclude margin, so add it if we want it
-		if ( extra === "margin" ) {
-			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
-		}
-
-		if ( isBorderBox ) {
-			// border-box includes padding, so remove it if we want content
-			if ( extra === "content" ) {
-				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-			}
-
-			// at this point, extra isn't border nor margin, so remove border
-			if ( extra !== "margin" ) {
-				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-			}
-		} else {
-			// at this point, extra isn't content, so add padding
-			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-
-			// at this point, extra isn't content nor padding, so add border
-			if ( extra !== "padding" ) {
-				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-			}
-		}
-	}
-
-	return val;
-}
-
-function getWidthOrHeight( elem, name, extra ) {
-
-	// Start with offset property, which is equivalent to the border-box value
-	var valueIsBorderBox = true,
-		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
-		styles = getStyles( elem ),
-		isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
-
-	// some non-html elements return undefined for offsetWidth, so check for null/undefined
-	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
-	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
-	if ( val <= 0 || val == null ) {
-		// Fall back to computed then uncomputed css if necessary
-		val = curCSS( elem, name, styles );
-		if ( val < 0 || val == null ) {
-			val = elem.style[ name ];
-		}
-
-		// Computed unit is not pixels. Stop here and return.
-		if ( rnumnonpx.test(val) ) {
-			return val;
-		}
-
-		// we need the check for style in case a browser which returns unreliable values
-		// for getComputedStyle silently falls back to the reliable elem.style
-		valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
-
-		// Normalize "", auto, and prepare for extra
-		val = parseFloat( val ) || 0;
-	}
-
-	// use the active box-sizing model to add/subtract irrelevant styles
-	return ( val +
-		augmentWidthOrHeight(
-			elem,
-			name,
-			extra || ( isBorderBox ? "border" : "content" ),
-			valueIsBorderBox,
-			styles
-		)
-	) + "px";
-}
-
-// Try to determine the default display value of an element
-function css_defaultDisplay( nodeName ) {
-	var doc = document,
-		display = elemdisplay[ nodeName ];
-
-	if ( !display ) {
-		display = actualDisplay( nodeName, doc );
-
-		// If the simple way fails, read from inside an iframe
-		if ( display === "none" || !display ) {
-			// Use the already-created iframe if possible
-			iframe = ( iframe ||
-				jQuery("<iframe frameborder='0' width='0' height='0'/>")
-				.css( "cssText", "display:block !important" )
-			).appendTo( doc.documentElement );
-
-			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
-			doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
-			doc.write("<!doctype html><html><body>");
-			doc.close();
-
-			display = actualDisplay( nodeName, doc );
-			iframe.detach();
-		}
-
-		// Store the correct default display
-		elemdisplay[ nodeName ] = display;
-	}
-
-	return display;
-}
-
-// Called ONLY from within css_defaultDisplay
-function actualDisplay( name, doc ) {
-	var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
-		display = jQuery.css( elem[0], "display" );
-	elem.remove();
-	return display;
-}
-
-jQuery.each([ "height", "width" ], function( i, name ) {
-	jQuery.cssHooks[ name ] = {
-		get: function( elem, computed, extra ) {
-			if ( computed ) {
-				// certain elements can have dimension info if we invisibly show them
-				// however, it must have a current display style that would benefit from this
-				return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
-					jQuery.swap( elem, cssShow, function() {
-						return getWidthOrHeight( elem, name, extra );
-					}) :
-					getWidthOrHeight( elem, name, extra );
-			}
-		},
-
-		set: function( elem, value, extra ) {
-			var styles = extra && getStyles( elem );
-			return setPositiveNumber( elem, value, extra ?
-				augmentWidthOrHeight(
-					elem,
-					name,
-					extra,
-					jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
-					styles
-				) : 0
-			);
-		}
-	};
-});
-
-if ( !jQuery.support.opacity ) {
-	jQuery.cssHooks.opacity = {
-		get: function( elem, computed ) {
-			// IE uses filters for opacity
-			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
-				( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
-				computed ? "1" : "";
-		},
-
-		set: function( elem, value ) {
-			var style = elem.style,
-				currentStyle = elem.currentStyle,
-				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
-				filter = currentStyle && currentStyle.filter || style.filter || "";
-
-			// IE has trouble with opacity if it does not have layout
-			// Force it by setting the zoom level
-			style.zoom = 1;
-
-			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
-			// if value === "", then remove inline opacity #12685
-			if ( ( value >= 1 || value === "" ) &&
-					jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
-					style.removeAttribute ) {
-
-				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
-				// if "filter:" is present at all, clearType is disabled, we want to avoid this
-				// style.removeAttribute is IE Only, but so apparently is this code path...
-				style.removeAttribute( "filter" );
-
-				// if there is no filter style applied in a css rule or unset inline opacity, we are done
-				if ( value === "" || currentStyle && !currentStyle.filter ) {
-					return;
-				}
-			}
-
-			// otherwise, set new filter values
-			style.filter = ralpha.test( filter ) ?
-				filter.replace( ralpha, opacity ) :
-				filter + " " + opacity;
-		}
-	};
-}
-
-// These hooks cannot be added until DOM ready because the support test
-// for it is not run until after DOM ready
-jQuery(function() {
-	if ( !jQuery.support.reliableMarginRight ) {
-		jQuery.cssHooks.marginRight = {
-			get: function( elem, computed ) {
-				if ( computed ) {
-					// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-					// Work around by temporarily setting element display to inline-block
-					return jQuery.swap( elem, { "display": "inline-block" },
-						curCSS, [ elem, "marginRight" ] );
-				}
-			}
-		};
-	}
-
-	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-	// getComputedStyle returns percent when specified for top/left/bottom/right
-	// rather than make the css module depend on the offset module, we just check for it here
-	if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
-		jQuery.each( [ "top", "left" ], function( i, prop ) {
-			jQuery.cssHooks[ prop ] = {
-				get: function( elem, computed ) {
-					if ( computed ) {
-						computed = curCSS( elem, prop );
-						// if curCSS returns percentage, fallback to offset
-						return rnumnonpx.test( computed ) ?
-							jQuery( elem ).position()[ prop ] + "px" :
-							computed;
-					}
-				}
-			};
-		});
-	}
-
-});
-
-if ( jQuery.expr && jQuery.expr.filters ) {
-	jQuery.expr.filters.hidden = function( elem ) {
-		// Support: Opera <= 12.12
-		// Opera reports offsetWidths and offsetHeights less than zero on some elements
-		return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
-			(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
-	};
-
-	jQuery.expr.filters.visible = function( elem ) {
-		return !jQuery.expr.filters.hidden( elem );
-	};
-}
-
-// These hooks are used by animate to expand properties
-jQuery.each({
-	margin: "",
-	padding: "",
-	border: "Width"
-}, function( prefix, suffix ) {
-	jQuery.cssHooks[ prefix + suffix ] = {
-		expand: function( value ) {
-			var i = 0,
-				expanded = {},
-
-				// assumes a single number if not a string
-				parts = typeof value === "string" ? value.split(" ") : [ value ];
-
-			for ( ; i < 4; i++ ) {
-				expanded[ prefix + cssExpand[ i ] + suffix ] =
-					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
-			}
-
-			return expanded;
-		}
-	};
-
-	if ( !rmargin.test( prefix ) ) {
-		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
-	}
-});
-var r20 = /%20/g,
-	rbracket = /\[\]$/,
-	rCRLF = /\r?\n/g,
-	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
-	rsubmittable = /^(?:input|select|textarea|keygen)/i;
-
-jQuery.fn.extend({
-	serialize: function() {
-		return jQuery.param( this.serializeArray() );
-	},
-	serializeArray: function() {
-		return this.map(function(){
-			// Can add propHook for "elements" to filter or add form elements
-			var elements = jQuery.prop( this, "elements" );
-			return elements ? jQuery.makeArray( elements ) : this;
-		})
-		.filter(function(){
-			var type = this.type;
-			// Use .is(":disabled") so that fieldset[disabled] works
-			return this.name && !jQuery( this ).is( ":disabled" ) &&
-				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
-				( this.checked || !manipulation_rcheckableType.test( type ) );
-		})
-		.map(function( i, elem ){
-			var val = jQuery( this ).val();
-
-			return val == null ?
-				null :
-				jQuery.isArray( val ) ?
-					jQuery.map( val, function( val ){
-						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-					}) :
-					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-		}).get();
-	}
-});
-
-//Serialize an array of form elements or a set of
-//key/values into a query string
-jQuery.param = function( a, traditional ) {
-	var prefix,
-		s = [],
-		add = function( key, value ) {
-			// If value is a function, invoke it and return its value
-			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
-			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
-		};
-
-	// Set traditional to true for jQuery <= 1.3.2 behavior.
-	if ( traditional === undefined ) {
-		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
-	}
-
-	// If an array was passed in, assume that it is an array of form elements.
-	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-		// Serialize the form elements
-		jQuery.each( a, function() {
-			add( this.name, this.value );
-		});
-
-	} else {
-		// If traditional, encode the "old" way (the way 1.3.2 or older
-		// did it), otherwise encode params recursively.
-		for ( prefix in a ) {
-			buildParams( prefix, a[ prefix ], traditional, add );
-		}
-	}
-
-	// Return the resulting serialization
-	return s.join( "&" ).replace( r20, "+" );
-};
-
-function buildParams( prefix, obj, traditional, add ) {
-	var name;
-
-	if ( jQuery.isArray( obj ) ) {
-		// Serialize array item.
-		jQuery.each( obj, function( i, v ) {
-			if ( traditional || rbracket.test( prefix ) ) {
-				// Treat each array item as a scalar.
-				add( prefix, v );
-
-			} else {
-				// Item is non-scalar (array or object), encode its numeric index.
-				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
-			}
-		});
-
-	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
-		// Serialize object item.
-		for ( name in obj ) {
-			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-		}
-
-	} else {
-		// Serialize scalar item.
-		add( prefix, obj );
-	}
-}
-jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
-	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
-
-	// Handle event binding
-	jQuery.fn[ name ] = function( data, fn ) {
-		return arguments.length > 0 ?
-			this.on( name, null, data, fn ) :
-			this.trigger( name );
-	};
-});
-
-jQuery.fn.hover = function( fnOver, fnOut ) {
-	return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-};
-var
-	// Document location
-	ajaxLocParts,
-	ajaxLocation,
-	ajax_nonce = jQuery.now(),
-
-	ajax_rquery = /\?/,
-	rhash = /#.*$/,
-	rts = /([?&])_=[^&]*/,
-	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
-	// #7653, #8125, #8152: local protocol detection
-	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
-	rnoContent = /^(?:GET|HEAD)$/,
-	rprotocol = /^\/\//,
-	rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
-
-	// Keep a copy of the old load method
-	_load = jQuery.fn.load,
-
-	/* Prefilters
-	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
-	 * 2) These are called:
-	 *    - BEFORE asking for a transport
-	 *    - AFTER param serialization (s.data is a string if s.processData is true)
-	 * 3) key is the dataType
-	 * 4) the catchall symbol "*" can be used
-	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
-	 */
-	prefilters = {},
-
-	/* Transports bindings
-	 * 1) key is the dataType
-	 * 2) the catchall symbol "*" can be used
-	 * 3) selection will start with transport dataType and THEN go to "*" if needed
-	 */
-	transports = {},
-
-	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-	allTypes = "*/".concat("*");
-
-// #8138, IE may throw an exception when accessing
-// a field from window.location if document.domain has been set
-try {
-	ajaxLocation = location.href;
-} catch( e ) {
-	// Use the href attribute of an A element
-	// since IE will modify it given document.location
-	ajaxLocation = document.createElement( "a" );
-	ajaxLocation.href = "";
-	ajaxLocation = ajaxLocation.href;
-}
-
-// Segment location into parts
-ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
-
-	// dataTypeExpression is optional and defaults to "*"
-	return function( dataTypeExpression, func ) {
-
-		if ( typeof dataTypeExpression !== "string" ) {
-			func = dataTypeExpression;
-			dataTypeExpression = "*";
-		}
-
-		var dataType,
-			i = 0,
-			dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
-
-		if ( jQuery.isFunction( func ) ) {
-			// For each dataType in the dataTypeExpression
-			while ( (dataType = dataTypes[i++]) ) {
-				// Prepend if requested
-				if ( dataType[0] === "+" ) {
-					dataType = dataType.slice( 1 ) || "*";
-					(structure[ dataType ] = structure[ dataType ] || []).unshift( func );
-
-				// Otherwise append
-				} else {
-					(structure[ dataType ] = structure[ dataType ] || []).push( func );
-				}
-			}
-		}
-	};
-}
-
-// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
-
-	var inspected = {},
-		seekingTransport = ( structure === transports );
-
-	function inspect( dataType ) {
-		var selected;
-		inspected[ dataType ] = true;
-		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
-			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
-			if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
-				options.dataTypes.unshift( dataTypeOrTransport );
-				inspect( dataTypeOrTransport );
-				return false;
-			} else if ( seekingTransport ) {
-				return !( selected = dataTypeOrTransport );
-			}
-		});
-		return selected;
-	}
-
-	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
-}
-
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-function ajaxExtend( target, src ) {
-	var deep, key,
-		flatOptions = jQuery.ajaxSettings.flatOptions || {};
-
-	for ( key in src ) {
-		if ( src[ key ] !== undefined ) {
-			( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
-		}
-	}
-	if ( deep ) {
-		jQuery.extend( true, target, deep );
-	}
-
-	return target;
-}
-
-jQuery.fn.load = function( url, params, callback ) {
-	if ( typeof url !== "string" && _load ) {
-		return _load.apply( this, arguments );
-	}
-
-	var selector, response, type,
-		self = this,
-		off = url.indexOf(" ");
-
-	if ( off >= 0 ) {
-		selector = url.slice( off, url.length );
-		url = url.slice( 0, off );
-	}
-
-	// If it's a function
-	if ( jQuery.isFunction( params ) ) {
-
-		// We assume that it's the callback
-		callback = params;
-		params = undefined;
-
-	// Otherwise, build a param string
-	} else if ( params && typeof params === "object" ) {
-		type = "POST";
-	}
-
-	// If we have elements to modify, make the request
-	if ( self.length > 0 ) {
-		jQuery.ajax({
-			url: url,
-
-			// if "type" variable is undefined, then "GET" method will be used
-			type: type,
-			dataType: "html",
-			data: params
-		}).done(function( responseText ) {
-
-			// Save response for use in complete callback
-			response = arguments;
-
-			self.html( selector ?
-
-				// If a selector was specified, locate the right elements in a dummy div
-				// Exclude scripts to avoid IE 'Permission Denied' errors
-				jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
-
-				// Otherwise use the full result
-				responseText );
-
-		}).complete( callback && function( jqXHR, status ) {
-			self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
-		});
-	}
-
-	return this;
-};
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
-	jQuery.fn[ type ] = function( fn ){
-		return this.on( type, fn );
-	};
-});
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
-	jQuery[ method ] = function( url, data, callback, type ) {
-		// shift arguments if data argument was omitted
-		if ( jQuery.isFunction( data ) ) {
-			type = type || callback;
-			callback = data;
-			data = undefined;
-		}
-
-		return jQuery.ajax({
-			url: url,
-			type: method,
-			dataType: type,
-			data: data,
-			success: callback
-		});
-	};
-});
-
-jQuery.extend({
-
-	// Counter for holding the number of active queries
-	active: 0,
-
-	// Last-Modified header cache for next request
-	lastModified: {},
-	etag: {},
-
-	ajaxSettings: {
-		url: ajaxLocation,
-		type: "GET",
-		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
-		global: true,
-		processData: true,
-		async: true,
-		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
-		/*
-		timeout: 0,
-		data: null,
-		dataType: null,
-		username: null,
-		password: null,
-		cache: null,
-		throws: false,
-		traditional: false,
-		headers: {},
-		*/
-
-		accepts: {
-			"*": allTypes,
-			text: "text/plain",
-			html: "text/html",
-			xml: "application/xml, text/xml",
-			json: "application/json, text/javascript"
-		},
-
-		contents: {
-			xml: /xml/,
-			html: /html/,
-			json: /json/
-		},
-
-		responseFields: {
-			xml: "responseXML",
-			text: "responseText"
-		},
-
-		// Data converters
-		// Keys separate source (or catchall "*") and destination types with a single space
-		converters: {
-
-			// Convert anything to text
-			"* text": window.String,
-
-			// Text to html (true = no transformation)
-			"text html": true,
-
-			// Evaluate text as a json expression
-			"text json": jQuery.parseJSON,
-
-			// Parse text as xml
-			"text xml": jQuery.parseXML
-		},
-
-		// For options that shouldn't be deep extended:
-		// you can add your own custom options here if
-		// and when you create one that shouldn't be
-		// deep extended (see ajaxExtend)
-		flatOptions: {
-			url: true,
-			context: true
-		}
-	},
-
-	// Creates a full fledged settings object into target
-	// with both ajaxSettings and settings fields.
-	// If target is omitted, writes into ajaxSettings.
-	ajaxSetup: function( target, settings ) {
-		return settings ?
-
-			// Building a settings object
-			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
-
-			// Extending ajaxSettings
-			ajaxExtend( jQuery.ajaxSettings, target );
-	},
-
-	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
-	ajaxTransport: addToPrefiltersOrTransports( transports ),
-
-	// Main method
-	ajax: function( url, options ) {
-
-		// If url is an object, simulate pre-1.5 signature
-		if ( typeof url === "object" ) {
-			options = url;
-			url = undefined;
-		}
-
-		// Force options to be an object
-		options = options || {};
-
-		var // Cross-domain detection vars
-			parts,
-			// Loop variable
-			i,
-			// URL without anti-cache param
-			cacheURL,
-			// Response headers as string
-			responseHeadersString,
-			// timeout handle
-			timeoutTimer,
-
-			// To know if global events are to be dispatched
-			fireGlobals,
-
-			transport,
-			// Response headers
-			responseHeaders,
-			// Create the final options object
-			s = jQuery.ajaxSetup( {}, options ),
-			// Callbacks context
-			callbackContext = s.context || s,
-			// Context for global events is callbackContext if it is a DOM node or jQuery collection
-			globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
-				jQuery( callbackContext ) :
-				jQuery.event,
-			// Deferreds
-			deferred = jQuery.Deferred(),
-			completeDeferred = jQuery.Callbacks("once memory"),
-			// Status-dependent callbacks
-			statusCode = s.statusCode || {},
-			// Headers (they are sent all at once)
-			requestHeaders = {},
-			requestHeadersNames = {},
-			// The jqXHR state
-			state = 0,
-			// Default abort message
-			strAbort = "canceled",
-			// Fake xhr
-			jqXHR = {
-				readyState: 0,
-
-				// Builds headers hashtable if needed
-				getResponseHeader: function( key ) {
-					var match;
-					if ( state === 2 ) {
-						if ( !responseHeaders ) {
-							responseHeaders = {};
-							while ( (match = rheaders.exec( responseHeadersString )) ) {
-								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
-							}
-						}
-						match = responseHeaders[ key.toLowerCase() ];
-					}
-					return match == null ? null : match;
-				},
-
-				// Raw string
-				getAllResponseHeaders: function() {
-					return state === 2 ? responseHeadersString : null;
-				},
-
-				// Caches the header
-				setRequestHeader: function( name, value ) {
-					var lname = name.toLowerCase();
-					if ( !state ) {
-						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
-						requestHeaders[ name ] = value;
-					}
-					return this;
-				},
-
-				// Overrides response content-type header
-				overrideMimeType: function( type ) {
-					if ( !state ) {
-						s.mimeType = type;
-					}
-					return this;
-				},
-
-				// Status-dependent callbacks
-				statusCode: function( map ) {
-					var code;
-					if ( map ) {
-						if ( state < 2 ) {
-							for ( code in map ) {
-								// Lazy-add the new callback in a way that preserves old ones
-								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
-							}
-						} else {
-							// Execute the appropriate callbacks
-							jqXHR.always( map[ jqXHR.status ] );
-						}
-					}
-					return this;
-				},
-
-				// Cancel the request
-				abort: function( statusText ) {
-					var finalText = statusText || strAbort;
-					if ( transport ) {
-						transport.abort( finalText );
-					}
-					done( 0, finalText );
-					return this;
-				}
-			};
-
-		// Attach deferreds
-		deferred.promise( jqXHR ).complete = completeDeferred.add;
-		jqXHR.success = jqXHR.done;
-		jqXHR.error = jqXHR.fail;
-
-		// Remove hash character (#7531: and string promotion)
-		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
-		// Handle falsy url in the settings object (#10093: consistency with old signature)
-		// We also use the url parameter if available
-		s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-
-		// Alias method option to type as per ticket #12004
-		s.type = options.method || options.type || s.method || s.type;
-
-		// Extract dataTypes list
-		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
-
-		// A cross-domain request is in order when we have a protocol:host:port mismatch
-		if ( s.crossDomain == null ) {
-			parts = rurl.exec( s.url.toLowerCase() );
-			s.crossDomain = !!( parts &&
-				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
-					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
-						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
-			);
-		}
-
-		// Convert data if not already a string
-		if ( s.data && s.processData && typeof s.data !== "string" ) {
-			s.data = jQuery.param( s.data, s.traditional );
-		}
-
-		// Apply prefilters
-		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
-		// If request was aborted inside a prefilter, stop there
-		if ( state === 2 ) {
-			return jqXHR;
-		}
-
-		// We can fire global events as of now if asked to
-		fireGlobals = s.global;
-
-		// Watch for a new set of requests
-		if ( fireGlobals && jQuery.active++ === 0 ) {
-			jQuery.event.trigger("ajaxStart");
-		}
-
-		// Uppercase the type
-		s.type = s.type.toUpperCase();
-
-		// Determine if request has content
-		s.hasContent = !rnoContent.test( s.type );
-
-		// Save the URL in case we're toying with the If-Modified-Since
-		// and/or If-None-Match header later on
-		cacheURL = s.url;
-
-		// More options handling for requests with no content
-		if ( !s.hasContent ) {
-
-			// If data is available, append data to url
-			if ( s.data ) {
-				cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
-				// #9682: remove data so that it's not used in an eventual retry
-				delete s.data;
-			}
-
-			// Add anti-cache in url if needed
-			if ( s.cache === false ) {
-				s.url = rts.test( cacheURL ) ?
-
-					// If there is already a '_' parameter, set its value
-					cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
-
-					// Otherwise add one to the end
-					cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
-			}
-		}
-
-		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-		if ( s.ifModified ) {
-			if ( jQuery.lastModified[ cacheURL ] ) {
-				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
-			}
-			if ( jQuery.etag[ cacheURL ] ) {
-				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
-			}
-		}
-
-		// Set the correct header, if data is being sent
-		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
-			jqXHR.setRequestHeader( "Content-Type", s.contentType );
-		}
-
-		// Set the Accepts header for the server, depending on the dataType
-		jqXHR.setRequestHeader(
-			"Accept",
-			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
-				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
-				s.accepts[ "*" ]
-		);
-
-		// Check for headers option
-		for ( i in s.headers ) {
-			jqXHR.setRequestHeader( i, s.headers[ i ] );
-		}
-
-		// Allow custom headers/mimetypes and early abort
-		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
-			// Abort if not done already and return
-			return jqXHR.abort();
-		}
-
-		// aborting is no longer a cancellation
-		strAbort = "abort";
-
-		// Install callbacks on deferreds
-		for ( i in { success: 1, error: 1, complete: 1 } ) {
-			jqXHR[ i ]( s[ i ] );
-		}
-
-		// Get transport
-		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
-		// If no transport, we auto-abort
-		if ( !transport ) {
-			done( -1, "No Transport" );
-		} else {
-			jqXHR.readyState = 1;
-
-			// Send global event
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
-			}
-			// Timeout
-			if ( s.async && s.timeout > 0 ) {
-				timeoutTimer = setTimeout(function() {
-					jqXHR.abort("timeout");
-				}, s.timeout );
-			}
-
-			try {
-				state = 1;
-				transport.send( requestHeaders, done );
-			} catch ( e ) {
-				// Propagate exception as error if not done
-				if ( state < 2 ) {
-					done( -1, e );
-				// Simply rethrow otherwise
-				} else {
-					throw e;
-				}
-			}
-		}
-
-		// Callback for when everything is done
-		function done( status, nativeStatusText, responses, headers ) {
-			var isSuccess, success, error, response, modified,
-				statusText = nativeStatusText;
-
-			// Called once
-			if ( state === 2 ) {
-				return;
-			}
-
-			// State is "done" now
-			state = 2;
-
-			// Clear timeout if it exists
-			if ( timeoutTimer ) {
-				clearTimeout( timeoutTimer );
-			}
-
-			// Dereference transport for early garbage collection
-			// (no matter how long the jqXHR object will be used)
-			transport = undefined;
-
-			// Cache response headers
-			responseHeadersString = headers || "";
-
-			// Set readyState
-			jqXHR.readyState = status > 0 ? 4 : 0;
-
-			// Get response data
-			if ( responses ) {
-				response = ajaxHandleResponses( s, jqXHR, responses );
-			}
-
-			// If successful, handle type chaining
-			if ( status >= 200 && status < 300 || status === 304 ) {
-
-				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-				if ( s.ifModified ) {
-					modified = jqXHR.getResponseHeader("Last-Modified");
-					if ( modified ) {
-						jQuery.lastModified[ cacheURL ] = modified;
-					}
-					modified = jqXHR.getResponseHeader("etag");
-					if ( modified ) {
-						jQuery.etag[ cacheURL ] = modified;
-					}
-				}
-
-				// if no content
-				if ( status === 204 ) {
-					isSuccess = true;
-					statusText = "nocontent";
-
-				// if not modified
-				} else if ( status === 304 ) {
-					isSuccess = true;
-					statusText = "notmodified";
-
-				// If we have data, let's convert it
-				} else {
-					isSuccess = ajaxConvert( s, response );
-					statusText = isSuccess.state;
-					success = isSuccess.data;
-					error = isSuccess.error;
-					isSuccess = !error;
-				}
-			} else {
-				// We extract error from statusText
-				// then normalize statusText and status for non-aborts
-				error = statusText;
-				if ( status || !statusText ) {
-					statusText = "error";
-					if ( status < 0 ) {
-						status = 0;
-					}
-				}
-			}
-
-			// Set data for the fake xhr object
-			jqXHR.status = status;
-			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
-
-			// Success/Error
-			if ( isSuccess ) {
-				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
-			} else {
-				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
-			}
-
-			// Status-dependent callbacks
-			jqXHR.statusCode( statusCode );
-			statusCode = undefined;
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
-					[ jqXHR, s, isSuccess ? success : error ] );
-			}
-
-			// Complete
-			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-				// Handle the global AJAX counter
-				if ( !( --jQuery.active ) ) {
-					jQuery.event.trigger("ajaxStop");
-				}
-			}
-		}
-
-		return jqXHR;
-	},
-
-	getScript: function( url, callback ) {
-		return jQuery.get( url, undefined, callback, "script" );
-	},
-
-	getJSON: function( url, data, callback ) {
-		return jQuery.get( url, data, callback, "json" );
-	}
-});
-
-/* Handles responses to an ajax request:
- * - sets all responseXXX fields accordingly
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
-	var firstDataType, ct, finalDataType, type,
-		contents = s.contents,
-		dataTypes = s.dataTypes,
-		responseFields = s.responseFields;
-
-	// Fill responseXXX fields
-	for ( type in responseFields ) {
-		if ( type in responses ) {
-			jqXHR[ responseFields[type] ] = responses[ type ];
-		}
-	}
-
-	// Remove auto dataType and get content-type in the process
-	while( dataTypes[ 0 ] === "*" ) {
-		dataTypes.shift();
-		if ( ct === undefined ) {
-			ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
-		}
-	}
-
-	// Check if we're dealing with a known content-type
-	if ( ct ) {
-		for ( type in contents ) {
-			if ( contents[ type ] && contents[ type ].test( ct ) ) {
-				dataTypes.unshift( type );
-				break;
-			}
-		}
-	}
-
-	// Check to see if we have a response for the expected dataType
-	if ( dataTypes[ 0 ] in responses ) {
-		finalDataType = dataTypes[ 0 ];
-	} else {
-		// Try convertible dataTypes
-		for ( type in responses ) {
-			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
-				finalDataType = type;
-				break;
-			}
-			if ( !firstDataType ) {
-				firstDataType = type;
-			}
-		}
-		// Or just use first one
-		finalDataType = finalDataType || firstDataType;
-	}
-
-	// If we found a dataType
-	// We add the dataType to the list if needed
-	// and return the corresponding response
-	if ( finalDataType ) {
-		if ( finalDataType !== dataTypes[ 0 ] ) {
-			dataTypes.unshift( finalDataType );
-		}
-		return responses[ finalDataType ];
-	}
-}
-
-// Chain conversions given the request and the original response
-function ajaxConvert( s, response ) {
-	var conv2, current, conv, tmp,
-		converters = {},
-		i = 0,
-		// Work with a copy of dataTypes in case we need to modify it for conversion
-		dataTypes = s.dataTypes.slice(),
-		prev = dataTypes[ 0 ];
-
-	// Apply the dataFilter if provided
-	if ( s.dataFilter ) {
-		response = s.dataFilter( response, s.dataType );
-	}
-
-	// Create converters map with lowercased keys
-	if ( dataTypes[ 1 ] ) {
-		for ( conv in s.converters ) {
-			converters[ conv.toLowerCase() ] = s.converters[ conv ];
-		}
-	}
-
-	// Convert to each sequential dataType, tolerating list modification
-	for ( ; (current = dataTypes[++i]); ) {
-
-		// There's only work to do if current dataType is non-auto
-		if ( current !== "*" ) {
-
-			// Convert response if prev dataType is non-auto and differs from current
-			if ( prev !== "*" && prev !== current ) {
-
-				// Seek a direct converter
-				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
-
-				// If none found, seek a pair
-				if ( !conv ) {
-					for ( conv2 in converters ) {
-
-						// If conv2 outputs current
-						tmp = conv2.split(" ");
-						if ( tmp[ 1 ] === current ) {
-
-							// If prev can be converted to accepted input
-							conv = converters[ prev + " " + tmp[ 0 ] ] ||
-								converters[ "* " + tmp[ 0 ] ];
-							if ( conv ) {
-								// Condense equivalence converters
-								if ( conv === true ) {
-									conv = converters[ conv2 ];
-
-								// Otherwise, insert the intermediate dataType
-								} else if ( converters[ conv2 ] !== true ) {
-									current = tmp[ 0 ];
-									dataTypes.splice( i--, 0, current );
-								}
-
-								break;
-							}
-						}
-					}
-				}
-
-				// Apply converter (if not an equivalence)
-				if ( conv !== true ) {
-
-					// Unless errors are allowed to bubble, catch and return them
-					if ( conv && s["throws"] ) {
-						response = conv( response );
-					} else {
-						try {
-							response = conv( response );
-						} catch ( e ) {
-							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
-						}
-					}
-				}
-			}
-
-			// Update prev for next iteration
-			prev = current;
-		}
-	}
-
-	return { state: "success", data: response };
-}
-// Install script dataType
-jQuery.ajaxSetup({
-	accepts: {
-		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
-	},
-	contents: {
-		script: /(?:java|ecma)script/
-	},
-	converters: {
-		"text script": function( text ) {
-			jQuery.globalEval( text );
-			return text;
-		}
-	}
-});
-
-// Handle cache's special case and global
-jQuery.ajaxPrefilter( "script", function( s ) {
-	if ( s.cache === undefined ) {
-		s.cache = false;
-	}
-	if ( s.crossDomain ) {
-		s.type = "GET";
-		s.global = false;
-	}
-});
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function(s) {
-
-	// This transport only deals with cross domain requests
-	if ( s.crossDomain ) {
-
-		var script,
-			head = document.head || jQuery("head")[0] || document.documentElement;
-
-		return {
-
-			send: function( _, callback ) {
-
-				script = document.createElement("script");
-
-				script.async = true;
-
-				if ( s.scriptCharset ) {
-					script.charset = s.scriptCharset;
-				}
-
-				script.src = s.url;
-
-				// Attach handlers for all browsers
-				script.onload = script.onreadystatechange = function( _, isAbort ) {
-
-					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
-
-						// Handle memory leak in IE
-						script.onload = script.onreadystatechange = null;
-
-						// Remove the script
-						if ( script.parentNode ) {
-							script.parentNode.removeChild( script );
-						}
-
-						// Dereference the script
-						script = null;
-
-						// Callback if not abort
-						if ( !isAbort ) {
-							callback( 200, "success" );
-						}
-					}
-				};
-
-				// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
-				// Use native DOM manipulation to avoid our domManip AJAX trickery
-				head.insertBefore( script, head.firstChild );
-			},
-
-			abort: function() {
-				if ( script ) {
-					script.onload( undefined, true );
-				}
-			}
-		};
-	}
-});
-var oldCallbacks = [],
-	rjsonp = /(=)\?(?=&|$)|\?\?/;
-
-// Default jsonp settings
-jQuery.ajaxSetup({
-	jsonp: "callback",
-	jsonpCallback: function() {
-		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
-		this[ callback ] = true;
-		return callback;
-	}
-});
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
-	var callbackName, overwritten, responseContainer,
-		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
-			"url" :
-			typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
-		);
-
-	// Handle iff the expected data type is "jsonp" or we have a parameter to set
-	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
-
-		// Get callback name, remembering preexisting value associated with it
-		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
-			s.jsonpCallback() :
-			s.jsonpCallback;
-
-		// Insert callback into url or form data
-		if ( jsonProp ) {
-			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
-		} else if ( s.jsonp !== false ) {
-			s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
-		}
-
-		// Use data converter to retrieve json after script execution
-		s.converters["script json"] = function() {
-			if ( !responseContainer ) {
-				jQuery.error( callbackName + " was not called" );
-			}
-			return responseContainer[ 0 ];
-		};
-
-		// force json dataType
-		s.dataTypes[ 0 ] = "json";
-
-		// Install callback
-		overwritten = window[ callbackName ];
-		window[ callbackName ] = function() {
-			responseContainer = arguments;
-		};
-
-		// Clean-up function (fires after converters)
-		jqXHR.always(function() {
-			// Restore preexisting value
-			window[ callbackName ] = overwritten;
-
-			// Save back as free
-			if ( s[ callbackName ] ) {
-				// make sure that re-using the options doesn't screw things around
-				s.jsonpCallback = originalSettings.jsonpCallback;
-
-				// save the callback name for future use
-				oldCallbacks.push( callbackName );
-			}
-
-			// Call if it was a function and we have a response
-			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
-				overwritten( responseContainer[ 0 ] );
-			}
-
-			responseContainer = overwritten = undefined;
-		});
-
-		// Delegate to script
-		return "script";
-	}
-});
-var xhrCallbacks, xhrSupported,
-	xhrId = 0,
-	// #5280: Internet Explorer will keep connections alive if we don't abort on unload
-	xhrOnUnloadAbort = window.ActiveXObject && function() {
-		// Abort all pending requests
-		var key;
-		for ( key in xhrCallbacks ) {
-			xhrCallbacks[ key ]( undefined, true );
-		}
-	};
-
-// Functions to create xhrs
-function createStandardXHR() {
-	try {
-		return new window.XMLHttpRequest();
-	} catch( e ) {}
-}
-
-function createActiveXHR() {
-	try {
-		return new window.ActiveXObject("Microsoft.XMLHTTP");
-	} catch( e ) {}
-}
-
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-jQuery.ajaxSettings.xhr = window.ActiveXObject ?
-	/* Microsoft failed to properly
-	 * implement the XMLHttpRequest in IE7 (can't request local files),
-	 * so we use the ActiveXObject when it is available
-	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
-	 * we need a fallback.
-	 */
-	function() {
-		return !this.isLocal && createStandardXHR() || createActiveXHR();
-	} :
-	// For all other browsers, use the standard XMLHttpRequest object
-	createStandardXHR;
-
-// Determine support properties
-xhrSupported = jQuery.ajaxSettings.xhr();
-jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
-xhrSupported = jQuery.support.ajax = !!xhrSupported;
-
-// Create transport if the browser can provide an xhr
-if ( xhrSupported ) {
-
-	jQuery.ajaxTransport(function( s ) {
-		// Cross domain only allowed if supported through XMLHttpRequest
-		if ( !s.crossDomain || jQuery.support.cors ) {
-
-			var callback;
-
-			return {
-				send: function( headers, complete ) {
-
-					// Get a new xhr
-					var handle, i,
-						xhr = s.xhr();
-
-					// Open the socket
-					// Passing null username, generates a login popup on Opera (#2865)
-					if ( s.username ) {
-						xhr.open( s.type, s.url, s.async, s.username, s.password );
-					} else {
-						xhr.open( s.type, s.url, s.async );
-					}
-
-					// Apply custom fields if provided
-					if ( s.xhrFields ) {
-						for ( i in s.xhrFields ) {
-							xhr[ i ] = s.xhrFields[ i ];
-						}
-					}
-
-					// Override mime type if needed
-					if ( s.mimeType && xhr.overrideMimeType ) {
-						xhr.overrideMimeType( s.mimeType );
-					}
-
-					// X-Requested-With header
-					// For cross-domain requests, seeing as conditions for a preflight are
-					// akin to a jigsaw puzzle, we simply never set it to be sure.
-					// (it can always be set on a per-request basis or even using ajaxSetup)
-					// For same-domain requests, won't change header if already provided.
-					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
-						headers["X-Requested-With"] = "XMLHttpRequest";
-					}
-
-					// Need an extra try/catch for cross domain requests in Firefox 3
-					try {
-						for ( i in headers ) {
-							xhr.setRequestHeader( i, headers[ i ] );
-						}
-					} catch( err ) {}
-
-					// Do send the request
-					// This may raise an exception which is actually
-					// handled in jQuery.ajax (so no try/catch here)
-					xhr.send( ( s.hasContent && s.data ) || null );
-
-					// Listener
-					callback = function( _, isAbort ) {
-						var status, responseHeaders, statusText, responses;
-
-						// Firefox throws exceptions when accessing properties
-						// of an xhr when a network error occurred
-						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
-						try {
-
-							// Was never called and is aborted or complete
-							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-
-								// Only called once
-								callback = undefined;
-
-								// Do not keep as active anymore
-								if ( handle ) {
-									xhr.onreadystatechange = jQuery.noop;
-									if ( xhrOnUnloadAbort ) {
-										delete xhrCallbacks[ handle ];
-									}
-								}
-
-								// If it's an abort
-								if ( isAbort ) {
-									// Abort it manually if needed
-									if ( xhr.readyState !== 4 ) {
-										xhr.abort();
-									}
-								} else {
-									responses = {};
-									status = xhr.status;
-									responseHeaders = xhr.getAllResponseHeaders();
-
-									// When requesting binary data, IE6-9 will throw an exception
-									// on any attempt to access responseText (#11426)
-									if ( typeof xhr.responseText === "string" ) {
-										responses.text = xhr.responseText;
-									}
-
-									// Firefox throws an exception when accessing
-									// statusText for faulty cross-domain requests
-									try {
-										statusText = xhr.statusText;
-									} catch( e ) {
-										// We normalize with Webkit giving an empty statusText
-										statusText = "";
-									}
-
-									// Filter status for non standard behaviors
-
-									// If the request is local and we have data: assume a success
-									// (success with no data won't get notified, that's the best we
-									// can do given current implementations)
-									if ( !status && s.isLocal && !s.crossDomain ) {
-										status = responses.text ? 200 : 404;
-									// IE - #1450: sometimes returns 1223 when it should be 204
-									} else if ( status === 1223 ) {
-										status = 204;
-									}
-								}
-							}
-						} catch( firefoxAccessException ) {
-							if ( !isAbort ) {
-								complete( -1, firefoxAccessException );
-							}
-						}
-
-						// Call complete if needed
-						if ( responses ) {
-							complete( status, statusText, responses, responseHeaders );
-						}
-					};
-
-					if ( !s.async ) {
-						// if we're in sync mode we fire the callback
-						callback();
-					} else if ( xhr.readyState === 4 ) {
-						// (IE6 & IE7) if it's in cache and has been
-						// retrieved directly we need to fire the callback
-						setTimeout( callback );
-					} else {
-						handle = ++xhrId;
-						if ( xhrOnUnloadAbort ) {
-							// Create the active xhrs callbacks list if needed
-							// and attach the unload handler
-							if ( !xhrCallbacks ) {
-								xhrCallbacks = {};
-								jQuery( window ).unload( xhrOnUnloadAbort );
-							}
-							// Add to list of active xhrs callbacks
-							xhrCallbacks[ handle ] = callback;
-						}
-						xhr.onreadystatechange = callback;
-					}
-				},
-
-				abort: function() {
-					if ( callback ) {
-						callback( undefined, true );
-					}
-				}
-			};
-		}
-	});
-}
-var fxNow, timerId,
-	rfxtypes = /^(?:toggle|show|hide)$/,
-	rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
-	rrun = /queueHooks$/,
-	animationPrefilters = [ defaultPrefilter ],
-	tweeners = {
-		"*": [function( prop, value ) {
-			var end, unit,
-				tween = this.createTween( prop, value ),
-				parts = rfxnum.exec( value ),
-				target = tween.cur(),
-				start = +target || 0,
-				scale = 1,
-				maxIterations = 20;
-
-			if ( parts ) {
-				end = +parts[2];
-				unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-
-				// We need to compute starting value
-				if ( unit !== "px" && start ) {
-					// Iteratively approximate from a nonzero starting point
-					// Prefer the current property, because this process will be trivial if it uses the same units
-					// Fallback to end or a simple constant
-					start = jQuery.css( tween.elem, prop, true ) || end || 1;
-
-					do {
-						// If previous iteration zeroed out, double until we get *something*
-						// Use a string for doubling factor so we don't accidentally see scale as unchanged below
-						scale = scale || ".5";
-
-						// Adjust and apply
-						start = start / scale;
-						jQuery.style( tween.elem, prop, start + unit );
-
-					// Update scale, tolerating zero or NaN from tween.cur()
-					// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
-					} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
-				}
-
-				tween.unit = unit;
-				tween.start = start;
-				// If a +=/-= token was provided, we're doing a relative animation
-				tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
-			}
-			return tween;
-		}]
-	};
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
-	setTimeout(function() {
-		fxNow = undefined;
-	});
-	return ( fxNow = jQuery.now() );
-}
-
-function createTweens( animation, props ) {
-	jQuery.each( props, function( prop, value ) {
-		var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
-			index = 0,
-			length = collection.length;
-		for ( ; index < length; index++ ) {
-			if ( collection[ index ].call( animation, prop, value ) ) {
-
-				// we're done with this property
-				return;
-			}
-		}
-	});
-}
-
-function Animation( elem, properties, options ) {
-	var result,
-		stopped,
-		index = 0,
-		length = animationPrefilters.length,
-		deferred = jQuery.Deferred().always( function() {
-			// don't match elem in the :animated selector
-			delete tick.elem;
-		}),
-		tick = function() {
-			if ( stopped ) {
-				return false;
-			}
-			var currentTime = fxNow || createFxNow(),
-				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-				// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
-				temp = remaining / animation.duration || 0,
-				percent = 1 - temp,
-				index = 0,
-				length = animation.tweens.length;
-
-			for ( ; index < length ; index++ ) {
-				animation.tweens[ index ].run( percent );
-			}
-
-			deferred.notifyWith( elem, [ animation, percent, remaining ]);
-
-			if ( percent < 1 && length ) {
-				return remaining;
-			} else {
-				deferred.resolveWith( elem, [ animation ] );
-				return false;
-			}
-		},
-		animation = deferred.promise({
-			elem: elem,
-			props: jQuery.extend( {}, properties ),
-			opts: jQuery.extend( true, { specialEasing: {} }, options ),
-			originalProperties: properties,
-			originalOptions: options,
-			startTime: fxNow || createFxNow(),
-			duration: options.duration,
-			tweens: [],
-			createTween: function( prop, end ) {
-				var tween = jQuery.Tween( elem, animation.opts, prop, end,
-						animation.opts.specialEasing[ prop ] || animation.opts.easing );
-				animation.tweens.push( tween );
-				return tween;
-			},
-			stop: function( gotoEnd ) {
-				var index = 0,
-					// if we are going to the end, we want to run all the tweens
-					// otherwise we skip this part
-					length = gotoEnd ? animation.tweens.length : 0;
-				if ( stopped ) {
-					return this;
-				}
-				stopped = true;
-				for ( ; index < length ; index++ ) {
-					animation.tweens[ index ].run( 1 );
-				}
-
-				// resolve when we played the last frame
-				// otherwise, reject
-				if ( gotoEnd ) {
-					deferred.resolveWith( elem, [ animation, gotoEnd ] );
-				} else {
-					deferred.rejectWith( elem, [ animation, gotoEnd ] );
-				}
-				return this;
-			}
-		}),
-		props = animation.props;
-
-	propFilter( props, animation.opts.specialEasing );
-
-	for ( ; index < length ; index++ ) {
-		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
-		if ( result ) {
-			return result;
-		}
-	}
-
-	createTweens( animation, props );
-
-	if ( jQuery.isFunction( animation.opts.start ) ) {
-		animation.opts.start.call( elem, animation );
-	}
-
-	jQuery.fx.timer(
-		jQuery.extend( tick, {
-			elem: elem,
-			anim: animation,
-			queue: animation.opts.queue
-		})
-	);
-
-	// attach callbacks from options
-	return animation.progress( animation.opts.progress )
-		.done( animation.opts.done, animation.opts.complete )
-		.fail( animation.opts.fail )
-		.always( animation.opts.always );
-}
-
-function propFilter( props, specialEasing ) {
-	var value, name, index, easing, hooks;
-
-	// camelCase, specialEasing and expand cssHook pass
-	for ( index in props ) {
-		name = jQuery.camelCase( index );
-		easing = specialEasing[ name ];
-		value = props[ index ];
-		if ( jQuery.isArray( value ) ) {
-			easing = value[ 1 ];
-			value = props[ index ] = value[ 0 ];
-		}
-
-		if ( index !== name ) {
-			props[ name ] = value;
-			delete props[ index ];
-		}
-
-		hooks = jQuery.cssHooks[ name ];
-		if ( hooks && "expand" in hooks ) {
-			value = hooks.expand( value );
-			delete props[ name ];
-
-			// not quite $.extend, this wont overwrite keys already present.
-			// also - reusing 'index' from above because we have the correct "name"
-			for ( index in value ) {
-				if ( !( index in props ) ) {
-					props[ index ] = value[ index ];
-					specialEasing[ index ] = easing;
-				}
-			}
-		} else {
-			specialEasing[ name ] = easing;
-		}
-	}
-}
-
-jQuery.Animation = jQuery.extend( Animation, {
-
-	tweener: function( props, callback ) {
-		if ( jQuery.isFunction( props ) ) {
-			callback = props;
-			props = [ "*" ];
-		} else {
-			props = props.split(" ");
-		}
-
-		var prop,
-			index = 0,
-			length = props.length;
-
-		for ( ; index < length ; index++ ) {
-			prop = props[ index ];
-			tweeners[ prop ] = tweeners[ prop ] || [];
-			tweeners[ prop ].unshift( callback );
-		}
-	},
-
-	prefilter: function( callback, prepend ) {
-		if ( prepend ) {
-			animationPrefilters.unshift( callback );
-		} else {
-			animationPrefilters.push( callback );
-		}
-	}
-});
-
-function defaultPrefilter( elem, props, opts ) {
-	/*jshint validthis:true */
-	var prop, index, length,
-		value, dataShow, toggle,
-		tween, hooks, oldfire,
-		anim = this,
-		style = elem.style,
-		orig = {},
-		handled = [],
-		hidden = elem.nodeType && isHidden( elem );
-
-	// handle queue: false promises
-	if ( !opts.queue ) {
-		hooks = jQuery._queueHooks( elem, "fx" );
-		if ( hooks.unqueued == null ) {
-			hooks.unqueued = 0;
-			oldfire = hooks.empty.fire;
-			hooks.empty.fire = function() {
-				if ( !hooks.unqueued ) {
-					oldfire();
-				}
-			};
-		}
-		hooks.unqueued++;
-
-		anim.always(function() {
-			// doing this makes sure that the complete handler will be called
-			// before this completes
-			anim.always(function() {
-				hooks.unqueued--;
-				if ( !jQuery.queue( elem, "fx" ).length ) {
-					hooks.empty.fire();
-				}
-			});
-		});
-	}
-
-	// height/width overflow pass
-	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
-		// Make sure that nothing sneaks out
-		// Record all 3 overflow attributes because IE does not
-		// change the overflow attribute when overflowX and
-		// overflowY are set to the same value
-		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-
-		// Set display property to inline-block for height/width
-		// animations on inline elements that are having width/height animated
-		if ( jQuery.css( elem, "display" ) === "inline" &&
-				jQuery.css( elem, "float" ) === "none" ) {
-
-			// inline-level elements accept inline-block;
-			// block-level elements need to be inline with layout
-			if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
-				style.display = "inline-block";
-
-			} else {
-				style.zoom = 1;
-			}
-		}
-	}
-
-	if ( opts.overflow ) {
-		style.overflow = "hidden";
-		if ( !jQuery.support.shrinkWrapBlocks ) {
-			anim.always(function() {
-				style.overflow = opts.overflow[ 0 ];
-				style.overflowX = opts.overflow[ 1 ];
-				style.overflowY = opts.overflow[ 2 ];
-			});
-		}
-	}
-
-
-	// show/hide pass
-	for ( index in props ) {
-		value = props[ index ];
-		if ( rfxtypes.exec( value ) ) {
-			delete props[ index ];
-			toggle = toggle || value === "toggle";
-			if ( value === ( hidden ? "hide" : "show" ) ) {
-				continue;
-			}
-			handled.push( index );
-		}
-	}
-
-	length = handled.length;
-	if ( length ) {
-		dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
-		if ( "hidden" in dataShow ) {
-			hidden = dataShow.hidden;
-		}
-
-		// store state if its toggle - enables .stop().toggle() to "reverse"
-		if ( toggle ) {
-			dataShow.hidden = !hidden;
-		}
-		if ( hidden ) {
-			jQuery( elem ).show();
-		} else {
-			anim.done(function() {
-				jQuery( elem ).hide();
-			});
-		}
-		anim.done(function() {
-			var prop;
-			jQuery._removeData( elem, "fxshow" );
-			for ( prop in orig ) {
-				jQuery.style( elem, prop, orig[ prop ] );
-			}
-		});
-		for ( index = 0 ; index < length ; index++ ) {
-			prop = handled[ index ];
-			tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
-			orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
-
-			if ( !( prop in dataShow ) ) {
-				dataShow[ prop ] = tween.start;
-				if ( hidden ) {
-					tween.end = tween.start;
-					tween.start = prop === "width" || prop === "height" ? 1 : 0;
-				}
-			}
-		}
-	}
-}
-
-function Tween( elem, options, prop, end, easing ) {
-	return new Tween.prototype.init( elem, options, prop, end, easing );
-}
-jQuery.Tween = Tween;
-
-Tween.prototype = {
-	constructor: Tween,
-	init: function( elem, options, prop, end, easing, unit ) {
-		this.elem = elem;
-		this.prop = prop;
-		this.easing = easing || "swing";
-		this.options = options;
-		this.start = this.now = this.cur();
-		this.end = end;
-		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-	},
-	cur: function() {
-		var hooks = Tween.propHooks[ this.prop ];
-
-		return hooks && hooks.get ?
-			hooks.get( this ) :
-			Tween.propHooks._default.get( this );
-	},
-	run: function( percent ) {
-		var eased,
-			hooks = Tween.propHooks[ this.prop ];
-
-		if ( this.options.duration ) {
-			this.pos = eased = jQuery.easing[ this.easing ](
-				percent, this.options.duration * percent, 0, 1, this.options.duration
-			);
-		} else {
-			this.pos = eased = percent;
-		}
-		this.now = ( this.end - this.start ) * eased + this.start;
-
-		if ( this.options.step ) {
-			this.options.step.call( this.elem, this.now, this );
-		}
-
-		if ( hooks && hooks.set ) {
-			hooks.set( this );
-		} else {
-			Tween.propHooks._default.set( this );
-		}
-		return this;
-	}
-};
-
-Tween.prototype.init.prototype = Tween.prototype;
-
-Tween.propHooks = {
-	_default: {
-		get: function( tween ) {
-			var result;
-
-			if ( tween.elem[ tween.prop ] != null &&
-				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
-				return tween.elem[ tween.prop ];
-			}
-
-			// passing an empty string as a 3rd parameter to .css will automatically
-			// attempt a parseFloat and fallback to a string if the parse fails
-			// so, simple values such as "10px" are parsed to Float.
-			// complex values such as "rotate(1rad)" are returned as is.
-			result = jQuery.css( tween.elem, tween.prop, "" );
-			// Empty strings, null, undefined and "auto" are converted to 0.
-			return !result || result === "auto" ? 0 : result;
-		},
-		set: function( tween ) {
-			// use step hook for back compat - use cssHook if its there - use .style if its
-			// available and use plain properties where available
-			if ( jQuery.fx.step[ tween.prop ] ) {
-				jQuery.fx.step[ tween.prop ]( tween );
-			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
-				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
-			} else {
-				tween.elem[ tween.prop ] = tween.now;
-			}
-		}
-	}
-};
-
-// Remove in 2.0 - this supports IE8's panic based approach
-// to setting things on disconnected nodes
-
-Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
-	set: function( tween ) {
-		if ( tween.elem.nodeType && tween.elem.parentNode ) {
-			tween.elem[ tween.prop ] = tween.now;
-		}
-	}
-};
-
-jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
-	var cssFn = jQuery.fn[ name ];
-	jQuery.fn[ name ] = function( speed, easing, callback ) {
-		return speed == null || typeof speed === "boolean" ?
-			cssFn.apply( this, arguments ) :
-			this.animate( genFx( name, true ), speed, easing, callback );
-	};
-});
-
-jQuery.fn.extend({
-	fadeTo: function( speed, to, easing, callback ) {
-
-		// show any hidden elements after setting opacity to 0
-		return this.filter( isHidden ).css( "opacity", 0 ).show()
-
-			// animate to the value specified
-			.end().animate({ opacity: to }, speed, easing, callback );
-	},
-	animate: function( prop, speed, easing, callback ) {
-		var empty = jQuery.isEmptyObject( prop ),
-			optall = jQuery.speed( speed, easing, callback ),
-			doAnimation = function() {
-				// Operate on a copy of prop so per-property easing won't be lost
-				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
-				doAnimation.finish = function() {
-					anim.stop( true );
-				};
-				// Empty animations, or finishing resolves immediately
-				if ( empty || jQuery._data( this, "finish" ) ) {
-					anim.stop( true );
-				}
-			};
-			doAnimation.finish = doAnimation;
-
-		return empty || optall.queue === false ?
-			this.each( doAnimation ) :
-			this.queue( optall.queue, doAnimation );
-	},
-	stop: function( type, clearQueue, gotoEnd ) {
-		var stopQueue = function( hooks ) {
-			var stop = hooks.stop;
-			delete hooks.stop;
-			stop( gotoEnd );
-		};
-
-		if ( typeof type !== "string" ) {
-			gotoEnd = clearQueue;
-			clearQueue = type;
-			type = undefined;
-		}
-		if ( clearQueue && type !== false ) {
-			this.queue( type || "fx", [] );
-		}
-
-		return this.each(function() {
-			var dequeue = true,
-				index = type != null && type + "queueHooks",
-				timers = jQuery.timers,
-				data = jQuery._data( this );
-
-			if ( index ) {
-				if ( data[ index ] && data[ index ].stop ) {
-					stopQueue( data[ index ] );
-				}
-			} else {
-				for ( index in data ) {
-					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
-						stopQueue( data[ index ] );
-					}
-				}
-			}
-
-			for ( index = timers.length; index--; ) {
-				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
-					timers[ index ].anim.stop( gotoEnd );
-					dequeue = false;
-					timers.splice( index, 1 );
-				}
-			}
-
-			// start the next in the queue if the last step wasn't forced
-			// timers currently will call their complete callbacks, which will dequeue
-			// but only if they were gotoEnd
-			if ( dequeue || !gotoEnd ) {
-				jQuery.dequeue( this, type );
-			}
-		});
-	},
-	finish: function( type ) {
-		if ( type !== false ) {
-			type = type || "fx";
-		}
-		return this.each(function() {
-			var index,
-				data = jQuery._data( this ),
-				queue = data[ type + "queue" ],
-				hooks = data[ type + "queueHooks" ],
-				timers = jQuery.timers,
-				length = queue ? queue.length : 0;
-
-			// enable finishing flag on private data
-			data.finish = true;
-
-			// empty the queue first
-			jQuery.queue( this, type, [] );
-
-			if ( hooks && hooks.cur && hooks.cur.finish ) {
-				hooks.cur.finish.call( this );
-			}
-
-			// look for any active animations, and finish them
-			for ( index = timers.length; index--; ) {
-				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
-					timers[ index ].anim.stop( true );
-					timers.splice( index, 1 );
-				}
-			}
-
-			// look for any animations in the old queue and finish them
-			for ( index = 0; index < length; index++ ) {
-				if ( queue[ index ] && queue[ index ].finish ) {
-					queue[ index ].finish.call( this );
-				}
-			}
-
-			// turn off finishing flag
-			delete data.finish;
-		});
-	}
-});
-
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
-	var which,
-		attrs = { height: type },
-		i = 0;
-
-	// if we include width, step value is 1 to do all cssExpand values,
-	// if we don't include width, step value is 2 to skip over Left and Right
-	includeWidth = includeWidth? 1 : 0;
-	for( ; i < 4 ; i += 2 - includeWidth ) {
-		which = cssExpand[ i ];
-		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
-	}
-
-	if ( includeWidth ) {
-		attrs.opacity = attrs.width = type;
-	}
-
-	return attrs;
-}
-
-// Generate shortcuts for custom animations
-jQuery.each({
-	slideDown: genFx("show"),
-	slideUp: genFx("hide"),
-	slideToggle: genFx("toggle"),
-	fadeIn: { opacity: "show" },
-	fadeOut: { opacity: "hide" },
-	fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
-	jQuery.fn[ name ] = function( speed, easing, callback ) {
-		return this.animate( props, speed, easing, callback );
-	};
-});
-
-jQuery.speed = function( speed, easing, fn ) {
-	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
-		complete: fn || !fn && easing ||
-			jQuery.isFunction( speed ) && speed,
-		duration: speed,
-		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
-	};
-
-	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
-		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
-
-	// normalize opt.queue - true/undefined/null -> "fx"
-	if ( opt.queue == null || opt.queue === true ) {
-		opt.queue = "fx";
-	}
-
-	// Queueing
-	opt.old = opt.complete;
-
-	opt.complete = function() {
-		if ( jQuery.isFunction( opt.old ) ) {
-			opt.old.call( this );
-		}
-
-		if ( opt.queue ) {
-			jQuery.dequeue( this, opt.queue );
-		}
-	};
-
-	return opt;
-};
-
-jQuery.easing = {
-	linear: function( p ) {
-		return p;
-	},
-	swing: function( p ) {
-		return 0.5 - Math.cos( p*Math.PI ) / 2;
-	}
-};
-
-jQuery.timers = [];
-jQuery.fx = Tween.prototype.init;
-jQuery.fx.tick = function() {
-	var timer,
-		timers = jQuery.timers,
-		i = 0;
-
-	fxNow = jQuery.now();
-
-	for ( ; i < timers.length; i++ ) {
-		timer = timers[ i ];
-		// Checks the timer has not already been removed
-		if ( !timer() && timers[ i ] === timer ) {
-			timers.splice( i--, 1 );
-		}
-	}
-
-	if ( !timers.length ) {
-		jQuery.fx.stop();
-	}
-	fxNow = undefined;
-};
-
-jQuery.fx.timer = function( timer ) {
-	if ( timer() && jQuery.timers.push( timer ) ) {
-		jQuery.fx.start();
-	}
-};
-
-jQuery.fx.interval = 13;
-
-jQuery.fx.start = function() {
-	if ( !timerId ) {
-		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
-	}
-};
-
-jQuery.fx.stop = function() {
-	clearInterval( timerId );
-	timerId = null;
-};
-
-jQuery.fx.speeds = {
-	slow: 600,
-	fast: 200,
-	// Default speed
-	_default: 400
-};
-
-// Back Compat <1.8 extension point
-jQuery.fx.step = {};
-
-if ( jQuery.expr && jQuery.expr.filters ) {
-	jQuery.expr.filters.animated = function( elem ) {
-		return jQuery.grep(jQuery.timers, function( fn ) {
-			return elem === fn.elem;
-		}).length;
-	};
-}
-jQuery.fn.offset = function( options ) {
-	if ( arguments.length ) {
-		return options === undefined ?
-			this :
-			this.each(function( i ) {
-				jQuery.offset.setOffset( this, options, i );
-			});
-	}
-
-	var docElem, win,
-		box = { top: 0, left: 0 },
-		elem = this[ 0 ],
-		doc = elem && elem.ownerDocument;
-
-	if ( !doc ) {
-		return;
-	}
-
-	docElem = doc.documentElement;
-
-	// Make sure it's not a disconnected DOM node
-	if ( !jQuery.contains( docElem, elem ) ) {
-		return box;
-	}
-
-	// If we don't have gBCR, just use 0,0 rather than error
-	// BlackBerry 5, iOS 3 (original iPhone)
-	if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
-		box = elem.getBoundingClientRect();
-	}
-	win = getWindow( doc );
-	return {
-		top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
-		left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
-	};
-};
-
-jQuery.offset = {
-
-	setOffset: function( elem, options, i ) {
-		var position = jQuery.css( elem, "position" );
-
-		// set position first, in-case top/left are set even on static elem
-		if ( position === "static" ) {
-			elem.style.position = "relative";
-		}
-
-		var curElem = jQuery( elem ),
-			curOffset = curElem.offset(),
-			curCSSTop = jQuery.css( elem, "top" ),
-			curCSSLeft = jQuery.css( elem, "left" ),
-			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
-			props = {}, curPosition = {}, curTop, curLeft;
-
-		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
-		if ( calculatePosition ) {
-			curPosition = curElem.position();
-			curTop = curPosition.top;
-			curLeft = curPosition.left;
-		} else {
-			curTop = parseFloat( curCSSTop ) || 0;
-			curLeft = parseFloat( curCSSLeft ) || 0;
-		}
-
-		if ( jQuery.isFunction( options ) ) {
-			options = options.call( elem, i, curOffset );
-		}
-
-		if ( options.top != null ) {
-			props.top = ( options.top - curOffset.top ) + curTop;
-		}
-		if ( options.left != null ) {
-			props.left = ( options.left - curOffset.left ) + curLeft;
-		}
-
-		if ( "using" in options ) {
-			options.using.call( elem, props );
-		} else {
-			curElem.css( props );
-		}
-	}
-};
-
-
-jQuery.fn.extend({
-
-	position: function() {
-		if ( !this[ 0 ] ) {
-			return;
-		}
-
-		var offsetParent, offset,
-			parentOffset = { top: 0, left: 0 },
-			elem = this[ 0 ];
-
-		// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
-		if ( jQuery.css( elem, "position" ) === "fixed" ) {
-			// we assume that getBoundingClientRect is available when computed position is fixed
-			offset = elem.getBoundingClientRect();
-		} else {
-			// Get *real* offsetParent
-			offsetParent = this.offsetParent();
-
-			// Get correct offsets
-			offset = this.offset();
-			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
-				parentOffset = offsetParent.offset();
-			}
-
-			// Add offsetParent borders
-			parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
-			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
-		}
-
-		// Subtract parent offsets and element margins
-		// note: when an element has margin: auto the offsetLeft and marginLeft
-		// are the same in Safari causing offset.left to incorrectly be 0
-		return {
-			top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
-			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
-		};
-	},
-
-	offsetParent: function() {
-		return this.map(function() {
-			var offsetParent = this.offsetParent || document.documentElement;
-			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
-				offsetParent = offsetParent.offsetParent;
-			}
-			return offsetParent || document.documentElement;
-		});
-	}
-});
-
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
-	var top = /Y/.test( prop );
-
-	jQuery.fn[ method ] = function( val ) {
-		return jQuery.access( this, function( elem, method, val ) {
-			var win = getWindow( elem );
-
-			if ( val === undefined ) {
-				return win ? (prop in win) ? win[ prop ] :
-					win.document.documentElement[ method ] :
-					elem[ method ];
-			}
-
-			if ( win ) {
-				win.scrollTo(
-					!top ? val : jQuery( win ).scrollLeft(),
-					top ? val : jQuery( win ).scrollTop()
-				);
-
-			} else {
-				elem[ method ] = val;
-			}
-		}, method, val, arguments.length, null );
-	};
-});
-
-function getWindow( elem ) {
-	return jQuery.isWindow( elem ) ?
-		elem :
-		elem.nodeType === 9 ?
-			elem.defaultView || elem.parentWindow :
-			false;
-}
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
-		// margin is only for outerHeight, outerWidth
-		jQuery.fn[ funcName ] = function( margin, value ) {
-			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
-				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-
-			return jQuery.access( this, function( elem, type, value ) {
-				var doc;
-
-				if ( jQuery.isWindow( elem ) ) {
-					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
-					// isn't a whole lot we can do. See pull request at this URL for discussion:
-					// https://github.com/jquery/jquery/pull/764
-					return elem.document.documentElement[ "client" + name ];
-				}
-
-				// Get document width or height
-				if ( elem.nodeType === 9 ) {
-					doc = elem.documentElement;
-
-					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
-					// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
-					return Math.max(
-						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
-						elem.body[ "offset" + name ], doc[ "offset" + name ],
-						doc[ "client" + name ]
-					);
-				}
-
-				return value === undefined ?
-					// Get width or height on the element, requesting but not forcing parseFloat
-					jQuery.css( elem, type, extra ) :
-
-					// Set width or height on the element
-					jQuery.style( elem, type, value, extra );
-			}, type, chainable ? margin : undefined, chainable, null );
-		};
-	});
-});
-// Limit scope pollution from any deprecated API
-// (function() {
-
-// })();
-// Expose jQuery to the global object
-window.jQuery = window.$ = jQuery;
-
-// Expose jQuery as an AMD module, but only for AMD loaders that
-// understand the issues with loading multiple versions of jQuery
-// in a page that all might call define(). The loader will indicate
-// they have special allowances for multiple jQuery versions by
-// specifying define.amd.jQuery = true. Register as a named module,
-// since jQuery can be concatenated with other files that may use define,
-// but not use a proper concatenation script that understands anonymous
-// AMD modules. A named AMD is safest and most robust way to register.
-// Lowercase jquery is used because AMD module names are derived from
-// file names, and jQuery is normally delivered in a lowercase file name.
-// Do this after creating the global so that if an AMD module wants to call
-// noConflict to hide this version of jQuery, it will work.
-if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
-	define( "jquery", [], function () { return jQuery; } );
-}
-
-})( window );

BIN
app/Resources/public/assets/mediaelement/build/jumpforward.png


+ 89 - 0
app/Resources/public/assets/mediaelement/build/lang/ca.js

@@ -0,0 +1,89 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * Catalan
+ *
+ * @author
+ * 	Tongro
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.ca === undefined) {
+		exports.ca = {
+			'mejs.plural-form': 1,			
+			'mejs.download-file': 'Descarregar arxiu',			
+			'mejs.install-flash': 'Esteu utilitzant un navegador que no tingui Flash Player activat o instal·lat. Activeu el vostre complement Flash Player o descarregueu la versió més recent de https://get.adobe.com/flashplayer/',			
+			'mejs.fullscreen': 'Pantalla completa',			
+			'mejs.play': 'Reproducció',
+			'mejs.pause': 'Pausa',			
+			'mejs.time-slider': 'Control lliscant de temps',
+			'mejs.time-help-text': 'Utilitzeu les tecles de fletxa esquerra / dreta per avançar un segon, fletxes amunt / avall per avançar deu segons.',
+			'mejs.live-broadcast' : 'Transmissió en directe',			
+			'mejs.volume-help-text': 'Utilitzeu les tecles de fletxa amunt / avall per augmentar o disminuir el volum.',
+			'mejs.unmute': 'Reactivar silenci',
+			'mejs.mute': 'Silenci',
+			'mejs.volume-slider': 'Control deslizador de volum',			
+			'mejs.video-player': 'Reproductor de vídeo',
+			'mejs.audio-player': 'Reproductor d\'àudio',			
+			'mejs.captions-subtitles': 'Llegendes/Subtítols',
+			'mejs.captions-chapters': 'Capítols',
+			'mejs.none': 'Ningú',
+			'mejs.afrikaans': 'Afrikaans',
+			'mejs.albanian': 'Albanès',
+			'mejs.arabic': 'Àrab',
+			'mejs.belarusian': 'Bielorús',
+			'mejs.bulgarian': 'Búlgar',
+			'mejs.catalan': 'Català',
+			'mejs.chinese': 'Xinès',
+			'mejs.chinese-simplified': 'Xinès (Simplificat)',
+			'mejs.chinese-traditional': 'Xinès (Tradicional)',
+			'mejs.croatian': 'Croat',
+			'mejs.czech': 'Txec',
+			'mejs.danish': 'Danès',
+			'mejs.dutch': 'Holandès',
+			'mejs.english': 'Anglès',
+			'mejs.estonian': 'Estonià',
+			'mejs.filipino': 'Filipí',
+			'mejs.finnish': 'Finlandès',
+			'mejs.french': 'Francès',
+			'mejs.galician': 'Gallec',
+			'mejs.german': 'Alemany',
+			'mejs.greek': 'Grec',
+			'mejs.haitian-creole': 'Crioll haitià',
+			'mejs.hebrew': 'Hebreu',
+			'mejs.hindi': 'Hindi',
+			'mejs.hungarian': 'Hongarès',
+			'mejs.icelandic': 'Islandès',
+			'mejs.indonesian': 'Indonesi',
+			'mejs.irish': 'Irlandès',
+			'mejs.italian': 'Italià',
+			'mejs.japanese': 'Japonès',
+			'mejs.korean': 'Coreà',
+			'mejs.latvian': 'Letó',
+			'mejs.lithuanian': 'Lituà',
+			'mejs.macedonian': 'Macedoni',
+			'mejs.malay': 'Malai',
+			'mejs.maltese': 'Maltès',
+			'mejs.norwegian': 'Noruec',
+			'mejs.persian': 'Persa',
+			'mejs.polish': 'Polonès',
+			'mejs.portuguese': 'Portuguès',
+			'mejs.romanian': 'Romanès',
+			'mejs.russian': 'Rus',
+			'mejs.serbian': 'Serbi',
+			'mejs.slovak': 'Eslovac',
+			'mejs.slovenian': 'Eslovè',
+			'mejs.spanish': 'Espanyol',
+			'mejs.swahili': 'Suahili',
+			'mejs.swedish': 'Suec',
+			'mejs.tagalog': 'Tagalog',
+			'mejs.thai': 'Thai',
+			'mejs.turkish': 'Turc',
+			'mejs.ukrainian': 'Ucraïnès',
+			'mejs.vietnamese': 'Vietnamita',
+			'mejs.welsh': 'Gal·lès',
+			'mejs.yiddish': 'Yiddish'
+		};
+	}
+})(mejs.i18n);

+ 90 - 0
app/Resources/public/assets/mediaelement/build/lang/cs.js

@@ -0,0 +1,90 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * Czech
+ *
+ * @author
+ *   Jalios (Twitter: @Jalios)
+ *   Sascha Greuel (Twitter: @SoftCreatR)
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.cs === undefined) {
+		exports.cs = {
+			'mejs.plural-form': 8,			
+			'mejs.download-file': 'Stáhnout soubor',			
+			'mejs.install-flash': 'Používáte prohlížeč, který nemá Flash Player povolen nebo nainstalován. Zapněte plugin Flash Player nebo stáhněte nejnovější verzi z adresy https://get.adobe.com/flashplayer/',			
+			'mejs.fullscreen': 'Celá obrazovka',			
+			'mejs.play': 'Přehrát',
+			'mejs.pause': 'Pozastavit',			
+			'mejs.time-slider': 'Posuvný běžec nastavení času',
+			'mejs.time-help-text': 'Použijte tlačítka se šipkami doleva / doprava pro posun o jednu vteřinu, tlačítka se šipkami nahoru / dolů pro posun o deset vteřin.',
+			'mejs.live-broadcast' : 'Živé vysílání',			
+			'mejs.volume-help-text': 'Použijte tlačítka se šipkami nahoru / dolů pro zesílení nebo zeslabení hlasitosti.',
+			'mejs.unmute': 'Zapnout zvuk',
+			'mejs.mute': 'Vypnout zvuk',
+			'mejs.volume-slider': 'Posuvný běžec nastavení hlasitosti',			
+			'mejs.video-player': 'Přehrávač videa',
+			'mejs.audio-player': 'Přehrávač hudby',			
+			'mejs.captions-subtitles': 'Titulky',
+			'mejs.captions-chapters': 'Kapitoly',
+			'mejs.none': 'Žádný',
+			'mejs.afrikaans': 'Afrikánština',
+			'mejs.albanian': 'Albánský',
+			'mejs.arabic': 'Arabština',
+			'mejs.belarusian': 'Běloruské',
+			'mejs.bulgarian': 'Bulharský',
+			'mejs.catalan': 'Katalánština',
+			'mejs.chinese': 'čínština',
+			'mejs.chinese-simplified': 'Zjednodušená čínština)',
+			'mejs.chinese-traditional': 'Čínština (tradiční)',
+			'mejs.croatian': 'Chorvatský',
+			'mejs.czech': 'čeština',
+			'mejs.danish': 'Dánština',
+			'mejs.dutch': 'Holandský',
+			'mejs.english': 'Angličtina',
+			'mejs.estonian': 'Estonština',
+			'mejs.filipino': 'Filipino',
+			'mejs.finnish': 'Finština',
+			'mejs.french': 'Francouzština',
+			'mejs.galician': 'Galicijština',
+			'mejs.german': 'Němec',
+			'mejs.greek': 'řecký',
+			'mejs.haitian-creole': 'Haitian kreolský',
+			'mejs.hebrew': 'Hebrejština',
+			'mejs.hindi': 'Hindština',
+			'mejs.hungarian': 'Maďarský',
+			'mejs.icelandic': 'Islandský',
+			'mejs.indonesian': 'Indonéština',
+			'mejs.irish': 'Irština',
+			'mejs.italian': 'Italština',
+			'mejs.japanese': 'Japonský',
+			'mejs.korean': 'Korejština',
+			'mejs.latvian': 'Lotyšský',
+			'mejs.lithuanian': 'Lithuanian',
+			'mejs.macedonian': 'Makedonština',
+			'mejs.malay': 'Malay',
+			'mejs.maltese': 'Maltština',
+			'mejs.norwegian': 'Norština',
+			'mejs.persian': 'Peršan',
+			'mejs.polish': 'Polština',
+			'mejs.portuguese': 'Portugalština',
+			'mejs.romanian': 'Rumunština',
+			'mejs.russian': 'Ruština',
+			'mejs.serbian': 'Srbština',
+			'mejs.slovak': 'Slovák',
+			'mejs.slovenian': 'Slovinský',
+			'mejs.spanish': 'španělština',
+			'mejs.swahili': 'Svahilský',
+			'mejs.swedish': 'švédský',
+			'mejs.tagalog': 'Tagalog',
+			'mejs.thai': 'Thajština',
+			'mejs.turkish': 'Turečtina',
+			'mejs.ukrainian': 'Ukrajinština',
+			'mejs.vietnamese': 'Vietnamština',
+			'mejs.welsh': 'Velština',
+			'mejs.yiddish': 'Jidiš'
+		};
+	}
+})(mejs.i18n);

+ 90 - 0
app/Resources/public/assets/mediaelement/build/lang/de.js

@@ -0,0 +1,90 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * German
+ *
+ * @author
+ *   Jalios (Twitter: @Jalios)
+ *   Sascha Greuel (Twitter: @SoftCreatR)
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.de === undefined) {
+		exports.de = {
+			'mejs.plural-form': 1,			
+			'mejs.download-file': 'Datei herunterladen',			
+			'mejs.install-flash': 'Ihr Browser unterstützt kein Flash. Bitte aktivieren Sie Flash bzw. laden Sie die aktuellste Flash-Version herunter unter https://get.adobe.com/flashplayer/',			
+			'mejs.fullscreen': 'Vollbild',			
+			'mejs.play': 'Abspielen',
+			'mejs.pause': 'Pause',			
+			'mejs.time-slider': 'Zeitschieberegler',
+			'mejs.time-help-text': 'Verwende die Pfeiltaste nach links/rechts, um eine Sekunde zu spulen, hoch/runter um zehn Sekunden zu spulen.',
+			'mejs.live-broadcast' : 'Live-Übertragung',			
+			'mejs.volume-help-text': 'Verwende die Pfeiltaste nach oben/nach unten um die Lautstärke zu erhöhen oder zu verringern.',
+			'mejs.unmute': 'Stummschaltung aufheben',
+			'mejs.mute': 'Stummschalten',
+			'mejs.volume-slider': 'Lautstärkeregler',			
+			'mejs.video-player': 'Video-Player',
+			'mejs.audio-player': 'Audio-Player',			
+			'mejs.captions-subtitles': 'Überschriften/Untertitel',
+			'mejs.captions-chapters': 'Kapitel',
+			'mejs.none': 'Keine',
+			'mejs.afrikaans': 'Afrikanisch',
+			'mejs.albanian': 'Albanisch',
+			'mejs.arabic': 'Arabisch',
+			'mejs.belarusian': 'Weißrussisch',
+			'mejs.bulgarian': 'Bulgarisch',
+			'mejs.catalan': 'Katalanisch',
+			'mejs.chinese': 'Chinesisch',
+			'mejs.chinese-simplified': 'Chinesisch (Vereinfacht)',
+			'mejs.chinese-traditional': 'Chinesisch (Traditionell)',
+			'mejs.croatian': 'Kroatisch',
+			'mejs.czech': 'Tschechisch',
+			'mejs.danish': 'Dänisch',
+			'mejs.dutch': 'Niederländisch',
+			'mejs.english': 'Englisch',
+			'mejs.estonian': 'Estnisch',
+			'mejs.filipino': 'Filipino',
+			'mejs.finnish': 'Finnisch',
+			'mejs.french': 'Französisch',
+			'mejs.galician': 'Galicisch',
+			'mejs.german': 'Deutsch',
+			'mejs.greek': 'Griechisch',
+			'mejs.haitian-creole': 'Haitianisch',
+			'mejs.hebrew': 'Hebräisch',
+			'mejs.hindi': 'Hindi',
+			'mejs.hungarian': 'Ungarisch',
+			'mejs.icelandic': 'Isländisch',
+			'mejs.indonesian': 'Indonesisch',
+			'mejs.irish': 'Irisch',
+			'mejs.italian': 'Italienisch',
+			'mejs.japanese': 'Japanisch',
+			'mejs.korean': 'Koreanisch',
+			'mejs.latvian': 'Lettisch',
+			'mejs.lithuanian': 'Litauisch',
+			'mejs.macedonian': 'Mazedonisch',
+			'mejs.malay': 'Malaysisch',
+			'mejs.maltese': 'Maltesisch',
+			'mejs.norwegian': 'Norwegisch',
+			'mejs.persian': 'Persisch',
+			'mejs.polish': 'Polnisch',
+			'mejs.portuguese': 'Portugiesisch',
+			'mejs.romanian': 'Rumänisch',
+			'mejs.russian': 'Russisch',
+			'mejs.serbian': 'Serbisch',
+			'mejs.slovak': 'Slovakisch',
+			'mejs.slovenian': 'Slovenisch',
+			'mejs.spanish': 'Spanisch',
+			'mejs.swahili': 'Swahili',
+			'mejs.swedish': 'Schwedisch',
+			'mejs.tagalog': 'Tagalog',
+			'mejs.thai': 'Thailändisch',
+			'mejs.turkish': 'Türkisch',
+			'mejs.ukrainian': 'Ukrainisch',
+			'mejs.vietnamese': 'Vietnamnesisch',
+			'mejs.welsh': 'Walisisch',
+			'mejs.yiddish': 'Jiddisch'
+		};
+	}
+})(mejs.i18n);

+ 90 - 0
app/Resources/public/assets/mediaelement/build/lang/es.js

@@ -0,0 +1,90 @@
+/*!
+ * This is a `i18n` language object.
+ *
+ * Spanish
+ *
+ * @author
+ *   Jalios (Twitter: @Jalios)
+ *   Sascha Greuel (Twitter: @SoftCreatR)
+ *   Rafael Miranda (GitHub: @rafa8626)
+ *
+ * @see core/i18n.js
+ */(function (exports) {
+	if (exports.es === undefined) {
+		exports.es = {
+			'mejs.plural-form': 1,			
+			'mejs.download-file': 'Descargar archivo',			
+			'mejs.install-flash': 'Esta usando un navegador que no tiene activado o instalado el reproductor de Flash. Por favor active el plugin del reproductor de Flash o descargue la versión más reciente en https://get.adobe.com/flashplayer/',			
+			'mejs.fullscreen': 'Pantalla completa',			
+			'mejs.play': 'Reproducción',
+			'mejs.pause': 'Pausa',			
+			'mejs.time-slider': 'Control deslizante de tiempo',
+			'mejs.time-help-text': 'Use las flechas Izquierda/Derecha para avanzar un segundo y las flechas Arriba/Abajo para avanzar diez segundos.',
+			'mejs.live-broadcast': 'Transmisión en Vivo',			
+			'mejs.volume-help-text': 'Use las flechas Arriba/Abajo para subir o bajar el volumen.',
+			'mejs.unmute': 'Reactivar silencio',
+			'mejs.mute': 'Silencio',
+			'mejs.volume-slider': 'Control deslizante de volumen',			
+			'mejs.video-player': 'Reproductor de video',
+			'mejs.audio-player': 'Reproductor de audio',			
+			'mejs.captions-subtitles': 'Leyendas/Subtítulos',
+			'mejs.captions-chapters': 'Capítulos',
+			'mejs.none': 'Ninguno',
+			'mejs.afrikaans': 'Afrikaans',
+			'mejs.albanian': 'Albano',
+			'mejs.arabic': 'Árabe',
+			'mejs.belarusian': 'Bielorruso',
+			'mejs.bulgarian': 'Búlgaro',
+			'mejs.catalan': 'Catalán',
+			'mejs.chinese': 'Chino',
+			'mejs.chinese-simplified': 'Chino (Simplificado)',
+			'mejs.chinese-traditional': 'Chino (Tradicional)',
+			'mejs.croatian': 'Croata',
+			'mejs.czech': 'Checo',
+			'mejs.danish': 'Danés',
+			'mejs.dutch': 'Holandés',
+			'mejs.english': 'Inglés',
+			'mejs.estonian': 'Estoniano',
+			'mejs.filipino': 'Filipino',
+			'mejs.finnish': 'Finlandés',
+			'mejs.french': 'Francés',
+			'mejs.galician': 'Gallego',
+			'mejs.german': 'Alemán',
+			'mejs.greek': 'Griego',
+			'mejs.haitian-creole': 'Haitiano Criollo',
+			'mejs.hebrew': 'Hebreo',
+			'mejs.hindi': 'Hindi',
+			'mejs.hungarian': 'Húngaro',
+			'mejs.icelandic': 'Islandés',
+			'mejs.indonesian': 'Indonesio',
+			'mejs.irish': 'Irlandés',
+			'mejs.italian': 'Italiano',
+			'mejs.japanese': 'Japonés',
+			'mejs.korean': 'Coreano',
+			'mejs.latvian': 'Letón',
+			'mejs.lithuanian': 'Lituano',
+			'mejs.macedonian': 'Macedonio',
+			'mejs.malay': 'Malayo',
+			'mejs.maltese': 'Maltés',
+			'mejs.norwegian': 'Noruego',
+			'mejs.persian': 'Persa',
+			'mejs.polish': 'Polaco',
+			'mejs.portuguese': 'Portugués',
+			'mejs.romanian': 'Rumano',
+			'mejs.russian': 'Ruso',
+			'mejs.serbian': 'Serbio',
+			'mejs.slovak': 'Eslovaco',
+			'mejs.slovenian': 'Eslovenio',
+			'mejs.spanish': 'Español',
+			'mejs.swahili': 'Swahili',
+			'mejs.swedish': 'Suizo',
+			'mejs.tagalog': 'Tagalog',
+			'mejs.thai': 'Tailandés',
+			'mejs.turkish': 'Turco',
+			'mejs.ukrainian': 'Ucraniano',
+			'mejs.vietnamese': 'Vietnamita',
+			'mejs.welsh': 'Galés',
+			'mejs.yiddish': 'Yiddish'
+		};
+	}
+})(mejs.i18n);

+ 90 - 0
app/Resources/public/assets/mediaelement/build/lang/fa.js

@@ -0,0 +1,90 @@
+/*!
+ * This is a `i18n` language object.
+ *
+ * Persian
+ *
+ * @author
+ *   wmateam (GitHub: @wmateam)
+ *
+ * @see core/i18n.js
+ */(function (exports) {
+    'use strict';
+    
+    if (exports.fa === undefined) {
+        exports.fa = {
+            'mejs.plural-form': 0,
+            'mejs.download-file': 'دریافت فایل',
+            'mejs.install-flash': 'افزونه فلش پلیر روی مرورگر شما نصب نیست یا غیر فعال است.افزونه را فعال کنید و یا از https://get.adobe.com/flashplayer/ دریافت و نصب کنید.',
+            'mejs.fullscreen': 'تمام صفحه',
+            'mejs.play': 'پخش',
+            'mejs.pause': 'توقف',
+            'mejs.time-slider': 'تغییر زمان',
+            'mejs.time-help-text': 'از کلید های چپ و راست کیبورد برای جا به جایی به میزان یک ثانیه استفاده کنید.همچنین کلید های بالا و پایین 10 ثانیه زمان را جا به جا می کند.',
+            'mejs.live-broadcast': 'پخش زنده',
+            'mejs.volume-help-text': 'از دکمه های بالا و پایین برای کم و زیاد کردن حجم صدا استفاده کنید.',
+            'mejs.unmute': 'صدا دار',
+            'mejs.mute': 'بی صدا',
+            'mejs.volume-slider': 'تغییر حجم صدا',
+            'mejs.video-player': 'پخش کننده ویدیو',
+            'mejs.audio-player': 'پخش کننده صدا',
+            'mejs.captions-subtitles': 'زیرنویس',
+            'mejs.captions-chapters': 'قسمت',
+            'mejs.none': 'هیچ',
+            'mejs.afrikaans': 'آفریقایی',
+            'mejs.albanian': 'آلبانیایی',
+            'mejs.arabic': 'عربی',
+            'mejs.belarusian': 'بلاروس',
+            'mejs.bulgarian': 'بلغاری',
+            'mejs.catalan': 'کاتالان',
+            'mejs.chinese': 'چینی',
+            'mejs.chinese-simplified': 'چینی (ساده شده)',
+            'mejs.chinese-traditional': 'چینی (سنتی)',
+            'mejs.croatian': 'کروات',
+            'mejs.czech': 'چک',
+            'mejs.danish': 'دانمارکی',
+            'mejs.dutch': 'هلندی',
+            'mejs.english': 'انگلیسی',
+            'mejs.estonian': 'استونی',
+            'mejs.filipino': 'فیلیپینی',
+            'mejs.finnish': 'فنلاندری',
+            'mejs.french': 'فرانسوی',
+            'mejs.galician': 'گالیسی',
+            'mejs.german': 'آلمانی',
+            'mejs.greek': 'یونانی',
+            'mejs.haitian-creole': 'کریول هائیتی',
+            'mejs.hebrew': 'عبری',
+            'mejs.hindi': 'هندی',
+            'mejs.hungarian': 'مجارستانی',
+            'mejs.icelandic': 'ایسلندی',
+            'mejs.indonesian': 'اندونزی',
+            'mejs.irish': 'ایرلندی',
+            'mejs.italian': 'ایتالیایی',
+            'mejs.japanese': 'ژاپنی',
+            'mejs.korean': 'کره ای',
+            'mejs.latvian': 'لتونی',
+            'mejs.lithuanian': 'لیتوانی',
+            'mejs.macedonian': 'مقدونی',
+            'mejs.malay': 'مالایی',
+            'mejs.maltese': 'مالتی',
+            'mejs.norwegian': 'نروژی',
+            'mejs.persian': 'فارسی',
+            'mejs.polish': 'لهستانی',
+            'mejs.portuguese': 'پرتغالی',
+            'mejs.romanian': 'روانی',
+            'mejs.russian': 'روسی',
+            'mejs.serbian': 'صرب',
+            'mejs.slovak': 'اسلواکی',
+            'mejs.slovenian': 'اسلوونیایی',
+            'mejs.spanish': 'اسپانیایی',
+            'mejs.swahili': 'سواحیلی',
+            'mejs.swedish': 'سوئد',
+            'mejs.tagalog': 'تاگالوگ',
+            'mejs.thai': 'تایلندی',
+            'mejs.turkish': 'ترکی',
+            'mejs.ukrainian': 'اوکراین',
+            'mejs.vietnamese': 'ویتنامی',
+            'mejs.welsh': 'ولزی',
+            'mejs.yiddish': 'ییدیش'
+        };
+    }
+})(mejs.i18n);

+ 91 - 0
app/Resources/public/assets/mediaelement/build/lang/fr.js

@@ -0,0 +1,91 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * French
+ *
+ * @author
+ *   Luc Poupard (Twitter: @klohFR)
+ *   Jalios (Twitter: @Jalios)
+ *   Sascha Greuel (Twitter: @SoftCreatR)
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.fr === undefined) {
+		exports.fr = {
+			'mejs.plural-form': 2,			
+			'mejs.download-file': 'Télécharger le fichier',			
+			'mejs.install-flash': 'Vous utilisez un navigateur sur lequel Flash ne semble pas installé ou activé. Veuillez activer le plugin Flash ou télécharger la dernière version sur https://get.adobe.com/flashplayer/',			
+			'mejs.fullscreen': 'Plein écran',			
+			'mejs.play': 'Lecture',
+			'mejs.pause': 'Pause',			
+			'mejs.time-slider': 'Curseur temporel',
+			'mejs.time-help-text': 'Utilisez les flèches Gauche/Droite du clavier pour avancer d\'une seconde, les flèches Haut/Bas pour avancer de 10 secondes.',
+			'mejs.live-broadcast' : 'Diffusion en direct',			
+			'mejs.volume-help-text': 'Utilisez les flèches Haut/Bas du clavier pour augmenter ou diminuer le volume.',
+			'mejs.unmute': 'Activer le son',
+			'mejs.mute': 'Désactiver le son',
+			'mejs.volume-slider': 'Volume',			
+			'mejs.video-player': 'Lecteur Vidéo',
+			'mejs.audio-player': 'Lecteur Audio',			
+			'mejs.captions-subtitles': 'Sous-titres',
+			'mejs.captions-chapters': 'Chapitres',
+			'mejs.none': 'Aucun',
+			'mejs.afrikaans': 'Afrikaans',
+			'mejs.albanian': 'Albanais',
+			'mejs.arabic': 'Arabe',
+			'mejs.belarusian': 'Biélorusse',
+			'mejs.bulgarian': 'Bulgare',
+			'mejs.catalan': 'Catalan',
+			'mejs.chinese': 'Chinois',
+			'mejs.chinese-simplified': 'Chinois (simplifié)',
+			'mejs.chinese-traditional': 'Chinois (traditionnel)',
+			'mejs.croatian': 'Croate',
+			'mejs.czech': 'Tchèque',
+			'mejs.danish': 'Danois',
+			'mejs.dutch': 'Néerlandais',
+			'mejs.english': 'Anglais',
+			'mejs.estonian': 'Estonien',
+			'mejs.filipino': 'Filipino',
+			'mejs.finnish': 'Finnois',
+			'mejs.french': 'Français',
+			'mejs.galician': 'Galicien',
+			'mejs.german': 'Allemand',
+			'mejs.greek': 'Grec',
+			'mejs.haitian-creole': 'Créole haïtien',
+			'mejs.hebrew': 'Hébreu',
+			'mejs.hindi': 'Hindi',
+			'mejs.hungarian': 'Hongrois',
+			'mejs.icelandic': 'Islandais',
+			'mejs.indonesian': 'Indonésien',
+			'mejs.irish': 'Irlandais',
+			'mejs.italian': 'Italien',
+			'mejs.japanese': 'Japonais',
+			'mejs.korean': 'Coréen',
+			'mejs.latvian': 'Letton',
+			'mejs.lithuanian': 'Lituanien',
+			'mejs.macedonian': 'Macédonien',
+			'mejs.malay': 'Malais',
+			'mejs.maltese': 'Maltais',
+			'mejs.norwegian': 'Norvégien',
+			'mejs.persian': 'Perse',
+			'mejs.polish': 'Polonais',
+			'mejs.portuguese': 'Portugais',
+			'mejs.romanian': 'Roumain',
+			'mejs.russian': 'Russe',
+			'mejs.serbian': 'Serbe',
+			'mejs.slovak': 'Slovaque',
+			'mejs.slovenian': 'Slovène',
+			'mejs.spanish': 'Espagnol',
+			'mejs.swahili': 'Swahili',
+			'mejs.swedish': 'Suédois',
+			'mejs.tagalog': 'Tagalog',
+			'mejs.thai': 'Thaï',
+			'mejs.turkish': 'Turque',
+			'mejs.ukrainian': 'Ukrainien',
+			'mejs.vietnamese': 'Vietnamien',
+			'mejs.welsh': 'Gallois',
+			'mejs.yiddish': 'Yiddish'
+		};
+	}
+})(mejs.i18n);

+ 87 - 0
app/Resources/public/assets/mediaelement/build/lang/hr.js

@@ -0,0 +1,87 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * Croatian
+ *
+ * @author
+ *   Hrvoj3e (hrvoj3e@gmail.com) * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.hr === undefined) {
+		exports.hr = {
+			'mejs.plural-form': 7,			
+			'mejs.download-file': 'Preuzmi datoteku',			
+			'mejs.install-flash': 'Koristite preglednik koji nema omogućen ili instaliran Flash preglednik. Molimo Vas uključite Flash dodatak ili preuzmite najnoviju verziju s https://get.adobe.com/flashplayer/',			
+			'mejs.fullscreen': 'Puni zaslon',			
+			'mejs.play': 'Pokreni',
+			'mejs.pause': 'Zaustavi',			
+			'mejs.time-slider': 'Vremenska traka',
+			'mejs.time-help-text': 'Koristi strelice lijevo/desno za pomak naprijed za 1 sekundu te gore/dolje za pomak od 10 sekundi.',
+			'mejs.live-broadcast' : 'Prijenos uživo',			
+			'mejs.volume-help-text': 'Koristi strelice gore/dolje za pojačavanje ili stišavanje.',
+			'mejs.unmute': 'Uključi zvuk',
+			'mejs.mute': 'Isključi zvuk',
+			'mejs.volume-slider': 'Pokazivač razine zvuka',			
+			'mejs.video-player': 'Video preglednik',
+			'mejs.audio-player': 'Audio preglednik',			
+			'mejs.captions-subtitles': 'Opisi/Prijevodi',
+			'mejs.captions-chapters': 'Poglavlja',
+			'mejs.none': 'Ništa',
+			'mejs.afrikaans': 'Afrički',
+			'mejs.albanian': 'Albanski',
+			'mejs.arabic': 'Arapski',
+			'mejs.belarusian': 'Bjeloruski',
+			'mejs.bulgarian': 'Bugarski',
+			'mejs.catalan': 'Katalonski',
+			'mejs.chinese': 'Kineski',
+			'mejs.chinese-simplified': 'Kineski (jednostavni)',
+			'mejs.chinese-traditional': 'Kineski (tradicionalni)',
+			'mejs.croatian': 'Hrvatski',
+			'mejs.czech': 'Češki',
+			'mejs.danish': 'Danski',
+			'mejs.dutch': 'Nizozemski',
+			'mejs.english': 'Engleski',
+			'mejs.estonian': 'Estonski',
+			'mejs.filipino': 'Filipinski',
+			'mejs.finnish': 'Finski',
+			'mejs.french': 'Francuski',
+			'mejs.galician': 'Galicijski',
+			'mejs.german': 'Njemački',
+			'mejs.greek': 'Grčki',
+			'mejs.haitian-creole': 'Haićanski kreolski',
+			'mejs.hebrew': 'Hebrejski',
+			'mejs.hindi': 'Hindski',
+			'mejs.hungarian': 'Mađarski',
+			'mejs.icelandic': 'Islandski',
+			'mejs.indonesian': 'Indonezijski',
+			'mejs.irish': 'Irski',
+			'mejs.italian': 'Talijanski',
+			'mejs.japanese': 'Japanski',
+			'mejs.korean': 'Korejski',
+			'mejs.latvian': 'Latvijski',
+			'mejs.lithuanian': 'Litvanski',
+			'mejs.macedonian': 'Makedonski',
+			'mejs.malay': 'Malajski',
+			'mejs.maltese': 'Malteški',
+			'mejs.norwegian': 'Norveški',
+			'mejs.persian': 'Perzijski',
+			'mejs.polish': 'Poljski',
+			'mejs.portuguese': 'Portugalski',
+			'mejs.romanian': 'Rumunjski',
+			'mejs.russian': 'Ruski',
+			'mejs.serbian': 'Srpski',
+			'mejs.slovak': 'Slovački',
+			'mejs.slovenian': 'Slovenski',
+			'mejs.spanish': 'Španjolski',
+			'mejs.swahili': 'Svahili',
+			'mejs.swedish': 'Švedski',
+			'mejs.tagalog': 'Tagaloški',
+			'mejs.thai': 'Tajski',
+			'mejs.turkish': 'Turski',
+			'mejs.ukrainian': 'Ukrajinski',
+			'mejs.vietnamese': 'Vijetnamski',
+			'mejs.welsh': 'Velški',
+			'mejs.yiddish': 'Jidiški'
+		};
+	}
+})(mejs.i18n);

+ 90 - 0
app/Resources/public/assets/mediaelement/build/lang/hu.js

@@ -0,0 +1,90 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * Hungarian
+ *
+ * @author
+ *   Jalios (Twitter: @Jalios)
+ *   Sascha Greuel (Twitter: @SoftCreatR)
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.hu === undefined) {
+		exports.hu = {
+			'mejs.plural-form': 1,			
+			'mejs.download-file': 'Fájl letöltése',			
+			'mejs.install-flash': 'Olyan böngészőt használ, amelyhez nincs engedélyezve vagy telepítve a Flash player. Kérjük, kapcsolja be a Flash-lejátszó bővítményét, vagy töltse le a legfrissebb verziót a https://get.adobe.com/flashplayer/ címen',			
+			'mejs.fullscreen': 'Teljes képernyő',			
+			'mejs.play': 'Lejátszás',
+			'mejs.pause': 'Szünet',			
+			'mejs.time-slider': 'Idő csúszka',
+			'mejs.time-help-text': 'Használja a Bal/Jobb nyíl gombokat az egy másodperces léptetéshez, a Fel/Le nyíl gombokat a tíz másodperces léptetéshez.',
+			'mejs.live-broadcast' : 'Élő közvetítés',			
+			'mejs.volume-help-text': 'Használja a Fel/Le nyíl gombokat a hangerő növeléséhez vagy csökkentéséhez.',
+			'mejs.unmute': 'Némítás feloldása',
+			'mejs.mute': 'Némítás',
+			'mejs.volume-slider': 'Hangerőcsúszka',			
+			'mejs.video-player': 'Videolejátszó',
+			'mejs.audio-player': 'Audiolejátszó',			
+			'mejs.captions-subtitles': 'Képaláírás/Feliratok',
+			'mejs.captions-chapters': 'Fejezetek',
+			'mejs.none': 'Nincs',
+			'mejs.afrikaans': 'Afrikaans',
+			'mejs.albanian': 'Albán',
+			'mejs.arabic': 'Arab',
+			'mejs.belarusian': 'Belorusz',
+			'mejs.bulgarian': 'Bolgár',
+			'mejs.catalan': 'Katalán',
+			'mejs.chinese': 'Kínai',
+			'mejs.chinese-simplified': 'Kínai (Egyszerűsített)',
+			'mejs.chinese-traditional': 'Kínai (Hagyományos)',
+			'mejs.croatian': 'Horvát',
+			'mejs.czech': 'Cseh',
+			'mejs.danish': 'Dán',
+			'mejs.dutch': 'Holland',
+			'mejs.english': 'Angol',
+			'mejs.estonian': 'Észt',
+			'mejs.filipino': 'Filippínó',
+			'mejs.finnish': 'Finn',
+			'mejs.french': 'Francia',
+			'mejs.galician': 'Galíciai',
+			'mejs.german': 'Német',
+			'mejs.greek': 'Görög',
+			'mejs.haitian-creole': 'Haiti Kreol',
+			'mejs.hebrew': 'Héber',
+			'mejs.hindi': 'Hindi',
+			'mejs.hungarian': 'Magyar',
+			'mejs.icelandic': 'Izlandi',
+			'mejs.indonesian': 'Indonéz',
+			'mejs.irish': 'Ír',
+			'mejs.italian': 'Olasz',
+			'mejs.japanese': 'Japán',
+			'mejs.korean': 'Koreai',
+			'mejs.latvian': 'Lett',
+			'mejs.lithuanian': 'Litván',
+			'mejs.macedonian': 'Macedóniai',
+			'mejs.malay': 'Maláj',
+			'mejs.maltese': 'Máltai',
+			'mejs.norwegian': 'Norvég',
+			'mejs.persian': 'Perzsa',
+			'mejs.polish': 'Lengyel',
+			'mejs.portuguese': 'Portugál',
+			'mejs.romanian': 'Román',
+			'mejs.russian': 'Orosz',
+			'mejs.serbian': 'Szerb',
+			'mejs.slovak': 'Szlovák',
+			'mejs.slovenian': 'Szlovén',
+			'mejs.spanish': 'Spanyol',
+			'mejs.swahili': 'Szuahéli',
+			'mejs.swedish': 'Svéd',
+			'mejs.tagalog': 'Tagalog',
+			'mejs.thai': 'Thai',
+			'mejs.turkish': 'Török',
+			'mejs.ukrainian': 'Ukrán',
+			'mejs.vietnamese': 'Vietnami',
+			'mejs.welsh': 'Walesi',
+			'mejs.yiddish': 'Jiddis'
+		};
+	}
+})(mejs.i18n);

+ 90 - 0
app/Resources/public/assets/mediaelement/build/lang/it.js

@@ -0,0 +1,90 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * Italian
+ *
+ * @author
+ *   Jalios (Twitter: @Jalios)
+ *   Sascha 'SoftCreatR' Greuel
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.it === undefined) {
+		exports.it = {
+			'mejs.plural-form': 1,			
+			'mejs.download-file': 'Scaricare il file',			
+			'mejs.install-flash': 'Stai utilizzando un browser che non dispone di Flash Player abilitato o installato. Accenda il tuo plug-in Flash Player o scarica la versione più recente da https://get.adobe.com/flashplayer/',			
+			'mejs.fullscreen': 'Schermo intero',			
+			'mejs.play': 'Eseguire',
+			'mejs.pause': 'Pausa',			
+			'mejs.time-slider': 'Barra di scorrimento',
+			'mejs.time-help-text': 'Utilizzare i tasti Freccia sinistra/Freccia destra per avanzare di un secondo, Freccia Su/Giù per avanzare dieci secondi.',
+			'mejs.live-broadcast' : 'Trasmissione in diretta',			
+			'mejs.volume-help-text': 'Utilizzare i tasti Freccia Su/Giù per aumentare o diminuire il volume.',
+			'mejs.unmute': 'Disattivare muto',
+			'mejs.mute': 'Muto',
+			'mejs.volume-slider': 'Barra del volume',			
+			'mejs.video-player': 'Lettore Video',
+			'mejs.audio-player': 'Lettore Audio',			
+			'mejs.captions-subtitles': 'Acquisizioni/sottotitoli',
+			'mejs.captions-chapters': 'Capitoli',
+			'mejs.none': 'Nessuno',
+			'mejs.afrikaans': 'Afrikaans',
+			'mejs.albanian': 'Albanese',
+			'mejs.arabic': 'Arabo',
+			'mejs.belarusian': 'Bielorusso',
+			'mejs.bulgarian': 'Bulgaro',
+			'mejs.catalan': 'Catalano',
+			'mejs.chinese': 'Cinese',
+			'mejs.chinese-semplificato': 'Cinese (Semplificato)',
+			'mejs.chinese-traditional': 'Cinese (Tradizionale)',
+			'mejs.croatian': 'Croato',
+			'mejs.czech': 'Ceco',
+			'mejs.danish': 'Danese',
+			'mejs.dutch': 'Olandese',
+			'mejs.english': 'Inglese',
+			'mejs.estonian': 'Estone',
+			'mejs.filipino': 'Filippino',
+			'mejs.finnish': 'Finlandese',
+			'mejs.french': 'Francese',
+			'mejs.galician': 'Galiziano',
+			'mejs.german': 'Tedesco',
+			'mejs.greek': 'Greco',
+			'mejs.haitian-creole': 'Creolo Haitiano',
+			'mejs.hebrew': 'Ebraico',
+			'mejs.hindi': 'Hindi',
+			'mejs.hungarian': 'Ungherese',
+			'mejs.icelandic': 'Islandese',
+			'mejs.indonesian': 'Indonesiano',
+			'mejs.irish': 'Irlandese',
+			'mejs.italian': 'Italiano',
+			'mejs.japanese': 'Giapponese',
+			'mejs.korean': 'Coreano',
+			'mejs.latvian': 'Lettone',
+			'mejs.lithuanian': 'Lituano',
+			'mejs.macedonian': 'Macedone',
+			'mejs.malay': 'Malay',
+			'mejs.maltese': 'Maltese',
+			'mejs.norwegian': 'Norvegese',
+			'mejs.persian': 'Persiano',
+			'mejs.polish': 'Polacco',
+			'mejs.portuguese': 'Portoghese',
+			'mejs.romanian': 'Rumeno',
+			'mejs.russian': 'Russo',
+			'mejs.serbian': 'Serbo',
+			'mejs.slovak': 'Slovacco',
+			'mejs.slovenian': 'Sloveno',
+			'mejs.spanish': 'Spagnolo',
+			'mejs.swahili': 'Swahili',
+			'mejs.swedish': 'Svedese',
+			'mejs.tagalog': 'Tagalog',
+			'mejs.thai': 'Thai',
+			'mejs.turkish': 'Turco',
+			'mejs.ukrainian': 'Ucraino',
+			'mejs.vietnamese': 'Vietnamita',
+			'mejs.welsh': 'Gallese',
+			'mejs.yiddish': 'Yiddish'
+		};
+	}
+})(mejs.i18n);

+ 90 - 0
app/Resources/public/assets/mediaelement/build/lang/ja.js

@@ -0,0 +1,90 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * Japanese
+ *
+ * @author
+ *   Jalios (Twitter: @Jalios)
+ *   Sascha 'SoftCreatR' Greuel
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.ja === undefined) {
+		exports.ja = {
+			'mejs.plural-form': 0,			
+			'mejs.download-file': 'ファイルをダウンロードする',			
+			'mejs.install-flash': 'Flash Playerが有効またはインストールされていないブラウザを使用しています。Flash Playerプラグインをオンにするか,https://get.adobe.com/flashplayer/から最新バージョンをダウンロードしてください。',			
+			'mejs.fullscreen': '全画面',			
+			'mejs.play': '再生',
+			'mejs.pause': '一時停止',			
+			'mejs.time-slider': 'タイムスライダー',
+			'mejs.time-help-text': '1秒進めるには左/右矢印をキーを,10秒進めるには上/下矢印を使います。',
+			'mejs.live-broadcast': 'ライブブロードキャスト',			
+			'mejs.volume-help-text': '音量を上げたり下げたりするには,上/下矢印を使います。',
+			'mejs.unmute': 'ミュートを解除',
+			'mejs.mute': 'ミュート',
+			'mejs.volume-slider': '音量スライダー',			
+			'mejs.video-player': 'ビデオプレーヤー',
+			'mejs.audio-player': 'オーディオプレーヤー',			
+			'mejs.captions-subtitles': 'キャプション/字幕',
+			'mejs.captions-chapters': '章',
+			'mejs.none': 'なし',
+			'mejs.afrikaans': 'アフリカーンス語',
+			'mejs.albanian': 'アルバニア語',
+			'mejs.arabic': 'アラビア語',
+			'mejs.belarusian': 'ベラルーシ語',
+			'mejs.bulgarian': 'ブルガリア語',
+			'mejs.catalan': 'カタロニア語',
+			'mejs.chinese': '中国語',
+			'mejs.chinese-simplified': '中国語(簡体字)',
+			'mejs.chinese-traditional': '中国語(繁体字)',
+			'mejs.croatian': 'クロアチア語',
+			'mejs.czech': 'チェコ語',
+			'mejs.danish': 'デンマーク語',
+			'mejs.dutch': 'オランダの',
+			'mejs.english': '英語',
+			'mejs.estonian': 'エストニア語',
+			'mejs.filipino': 'フィリピン人',
+			'mejs.finnish': 'フィンランド語',
+			'mejs.french': 'フランス語',
+			'mejs.galician': 'ガリシア人',
+			'mejs.german': 'ドイツ語',
+			'mejs.greek': 'ギリシャ語',
+			'mejs.haitian-creole': 'ハイチクレオール',
+			'mejs.hebrew': 'ヘブライ語',
+			'mejs.hindi': 'ヒンディー語',
+			'mejs.hungarian': 'ハンガリー語',
+			'mejs.icelandic': 'アイスランド語',
+			'mejs.indonesian': 'インドネシア語',
+			'mejs.irish': 'アイルランド',
+			'mejs.italian': 'イタリア語',
+			'mejs.japanese': '日本語',
+			'mejs.korean': '韓国語',
+			'mejs.latvian': 'ラトビア語',
+			'mejs.lithuanian': 'リトアニア語',
+			'mejs.macedonian': 'マケドニアの',
+			'mejs.malay': 'マレー語',
+			'mejs.maltese': 'マルタ',
+			'mejs.norwegian': 'ノルウェー語',
+			'mejs.persian': 'ペルシア語',
+			'mejs.polish': 'ポーランド語',
+			'mejs.portuguese': 'ポルトガル語',
+			'mejs.romanian': 'ルーマニア語',
+			'mejs.russian': 'ロシア語',
+			'mejs.serbian': 'セルビア語',
+			'mejs.slovak': 'スロバキア語',
+			'mejs.slovenian': 'スロベニア語',
+			'mejs.spanish': 'スペイン語',
+			'mejs.swahili': 'スワヒリ語',
+			'mejs.swedish': 'スウェーデン語',
+			'mejs.tagalog': 'タガログ',
+			'mejs.thai': 'タイ',
+			'mejs.turkish': 'トルコ語',
+			'mejs.ukrainian': 'ウクライナ語',
+			'mejs.vietnamese': 'ベトナム語',
+			'mejs.welsh': 'ウェールズ',
+			'mejs.yiddish': 'イディッシュ'
+		};
+	}
+})(mejs.i18n);

+ 90 - 0
app/Resources/public/assets/mediaelement/build/lang/ko.js

@@ -0,0 +1,90 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * Korean
+ *
+ * @author
+ *   Jalios (Twitter: @Jalios)
+ *   Sascha 'SoftCreatR' Greuel
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.ko === undefined) {
+		exports.ko = {
+			'mejs.plural-form': 0,			
+			'mejs.download-file': '파일 다운로드',			
+			'mejs.install-flash': 'Flash Player가 활성화되거나 설치되지 않은 브라우저를 사용 중입니다. 플래시 플레이어 플러그인을 켜거나 https://get.adobe.com/flashplayer/에서 최신 버전을 다운로드하십시오.',			
+			'mejs.fullscreen': '전체화면',			
+			'mejs.play': '작동',
+			'mejs.pause': '정지',			
+			'mejs.time-slider': '시간 슬라이더',
+			'mejs.time-help-text': '1초 전진하려면 좌/우측 화살표를 사용하시고 10초 전진하려면 위/아래 화살표를 사용하세요.',
+			'mejs.live-broadcast' : '생방송',			
+			'mejs.volume-help-text': '볼륨을 높이거나 낮추려면 위/아래 화살표를 이용하세요.',
+			'mejs.unmute': '음소거 해제',
+			'mejs.mute': '말 없는',
+			'mejs.volume-slider': '볼륨 슬라이더',			
+			'mejs.video-player': '비디오 플레이어',
+			'mejs.audio-player': '오디오 플레이어',			
+			'mejs.captions-subtitles': '캡션/자막',
+			'mejs.captions-chapters': '챕터',
+			'mejs.none': '없음',
+			'mejs.afrikaans': '아프리칸스어',
+			'mejs.albanian': '알바니아',
+			'mejs.arabic': '아랍어',
+			'mejs.belarusian': '벨로루시 어',
+			'mejs.bulgarian': '불가리아',
+			'mejs.catalan': '카탈로니아 어',
+			'mejs.chinese': '중국어',
+			'mejs.chinese-simplified': '중국어 (간체)',
+			'mejs.chinese-traditional': '중국어 (번체)',
+			'mejs.croatian': '크로아티아어',
+			'mejs.czech': '체코 어',
+			'mejs.danish': '덴마크어',
+			'mejs.dutch': '네덜란드어',
+			'mejs.english': '영어',
+			'mejs.estonian': '에스토니아',
+			'mejs.filipino': '필리핀',
+			'mejs.finnish': '핀란드어',
+			'mejs.french': '프랑스어',
+			'mejs.galician': '갈리시아인',
+			'mejs.german': '독일어',
+			'mejs.greek': '그리스어',
+			'mejs.haitian-creole': '아이티 크리올',
+			'mejs.hebrew': '히브리어',
+			'mejs.hindi': '힌디어',
+			'mejs.hungarian': '헝가리어',
+			'mejs.icelandic': '아이슬란드 어',
+			'mejs.indonesian': '인도네시아어',
+			'mejs.irish': '아일랜드어',
+			'mejs.italian': '이탈리아어',
+			'mejs.japanese': '일본어',
+			'mejs.korean': '한국어',
+			'mejs.latvian': '라트비아어',
+			'mejs.lithuanian': '리투아니아어',
+			'mejs.macedonian': '마케도니아인',
+			'mejs.malay': '말레이',
+			'mejs.maltese': '몰타어',
+			'mejs.norwegian': '노르웨이어',
+			'mejs.persian': '페르시아어',
+			'mejs.polish': '폴란드어',
+			'mejs.portuguese': '포르투갈어',
+			'mejs.romanian': '루마니아어',
+			'mejs.russian': '러시아어',
+			'mejs.serbian': '세르비아어',
+			'mejs.slovak': '슬로바키아어',
+			'mejs.slovenian': '슬로베니아어',
+			'mejs.spanish': '스페인어',
+			'mejs.swahili': '스와힐리어',
+			'mejs.swedish': '스웨덴어',
+			'mejs.tagalog': '타갈로그어',
+			'mejs.thai': '태국어',
+			'mejs.turkish': '터키어',
+			'mejs.ukrainian': '우크라이나어',
+			'mejs.vietnamese': '베트남인',
+			'mejs.welsh': '웨일스 어',
+			'mejs.yiddish': '이디시어'
+		};
+	}
+})(mejs.i18n);

+ 0 - 74
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-cs.js

@@ -1,74 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * Czech
- *
- * @author
- *   Jalios (Twitter: @Jalios)
- *   Sascha Greuel (Twitter: @SoftCreatR)
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.cs === undefined) {
-        exports.cs = {
-            "mejs.plural-form": 8,
-
-            // me-shim
-            "mejs.download-file": "Stáhnout soubor",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "Vypnout režim celá obrazovka",
-            "mejs.fullscreen-on": "Na celou obrazovku",
-            "mejs.download-video": "Stáhnout video",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "Celá obrazovka",
-
-            // mep-feature-jumpforward
-            //"mejs.time-jump-forward": "Jump forward %1 second(s)",
-
-            // mep-feature-playpause
-            "mejs.play": "Přehrát",
-            "mejs.pause": "Pozastavit",
-
-            // mep-feature-postroll
-            "mejs.close": "Zavřít",
-
-            // mep-feature-progress
-            "mejs.time-slider": "Posuvný běžec nastavení času",
-            "mejs.time-help-text": "Použijte tlačítka se šipkami doleva / doprava pro posun o jednu vteřinu, tlačítka se šipkami nahoru / dolů pro posun o deset vteřin.",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": "Zpět o %1 vteřin",
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "Titulky",
-            "mejs.none": "Žádný",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "Vypnout/zapnout zvuk",
-            "mejs.volume-help-text": "Použijte tlačítka se šipkami nahoru / dolů pro zesílení nebo zeslabení hlasitosti.",
-            "mejs.unmute": "Zapnout zvuk",
-            "mejs.mute": "Vypnout zvuk",
-            "mejs.volume-slider": "Posuvný běžec nastavení hlasitosti",
-
-            // mep-player
-            "mejs.video-player": "Přehrávač videa",
-            "mejs.audio-player": "Přehrávač hudby",
-
-            // mep-feature-ads
-            //"mejs.ad-skip": "Skip ad",
-            //"mejs.ad-skip-info": "Skip in %1 second(s)",
-
-            // mep-feature-sourcechooser
-            //"mejs.source-chooser": "Source Chooser"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 0 - 74
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-de.js

@@ -1,74 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * German
- *
- * @author
- *   Jalios (Twitter: @Jalios)
- *   Sascha Greuel (Twitter: @SoftCreatR)
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.de === undefined) {
-        exports.de = {
-            "mejs.plural-form": 1,
-
-            // me-shim
-            "mejs.download-file": "Datei herunterladen",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "Vollbildmodus beenden",
-            "mejs.fullscreen-on": "Vollbild",
-            "mejs.download-video": "Video herunterladen",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "Vollbild",
-
-            // mep-feature-jumpforward
-            "mejs.time-jump-forward": ["1 Sekunde vorspulen", "%1 Sekunden vorspulen"],
-
-            // mep-feature-playpause
-            "mejs.play": "Abspielen",
-            "mejs.pause": "Pause",
-
-            // mep-feature-postroll
-            "mejs.close": "Schließen",
-
-            // mep-feature-progress
-            "mejs.time-slider": "Zeitschieberegler",
-            "mejs.time-help-text": "Verwende die Pfeiltaste nach links/rechts, um eine Sekunde zu spulen, hoch/runter um zehn Sekunden zu spulen.",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": ["1 Sekunde zurückspulen", "%1 Sekunden zurückspulen"],
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "Überschriften/Untertitel",
-            "mejs.none": "Keine",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "Stummschaltung umschalten",
-            "mejs.volume-help-text": "Verwende die Pfeiltaste nach oben/nach unten um die Lautstärke zu erhöhen oder zu verringern.",
-            "mejs.unmute": "Stummschaltung aufheben",
-            "mejs.mute": "Stummschalten",
-            "mejs.volume-slider": "Lautstärkeregler",
-
-            // mep-player
-            "mejs.video-player": "Video-Player",
-            "mejs.audio-player": "Audio-Player",
-
-            // mep-feature-ads
-            "mejs.ad-skip": "Werbung überspringen",
-            "mejs.ad-skip-info": ["Überspringen in 1 Sekunde", "Überspringen in %1 Sekunden"],
-
-            // mep-feature-sourcechooser
-            "mejs.source-chooser": "Quellenauswahl"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 0 - 74
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-en.js

@@ -1,74 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * English; This can serve as a template for other languages to translate
- *
- * @author
- *   TBD
- *   Sascha Greuel (Twitter: @SoftCreatR)
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.en === undefined) {
-        exports.en = {
-            "mejs.plural-form": 1,
-
-            // me-shim
-            "mejs.download-file": "Download File",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "Turn off Fullscreen",
-            "mejs.fullscreen-on": "Go Fullscreen",
-            "mejs.download-video": "Download Video",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "Fullscreen",
-
-            // mep-feature-jumpforward
-            "mejs.time-jump-forward": ["Jump forward 1 second", "Jump forward %1 seconds"],
-
-            // mep-feature-playpause
-            "mejs.play": "Play",
-            "mejs.pause": "Pause",
-
-            // mep-feature-postroll
-            "mejs.close": "Close",
-
-            // mep-feature-progress
-            "mejs.time-slider": "Time Slider",
-            "mejs.time-help-text": "Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": ["Skip back 1 second", "Skip back %1 seconds"],
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "Captions/Subtitles",
-            "mejs.none": "None",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "Mute Toggle",
-            "mejs.volume-help-text": "Use Up/Down Arrow keys to increase or decrease volume.",
-            "mejs.unmute": "Unmute",
-            "mejs.mute": "Mute",
-            "mejs.volume-slider": "Volume Slider",
-
-            // mep-player
-            "mejs.video-player": "Video Player",
-            "mejs.audio-player": "Audio Player",
-
-            // mep-feature-ads
-            "mejs.ad-skip": "Skip ad",
-            "mejs.ad-skip-info": ["Skip in 1 second", "Skip in %1 seconds"],
-
-            // mep-feature-sourcechooser
-            "mejs.source-chooser": "Source Chooser"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 0 - 74
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-es.js

@@ -1,74 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * Spanish
- *
- * @author
- *   Jalios (Twitter: @Jalios)
- *   Sascha Greuel (Twitter: @SoftCreatR)
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.es === undefined) {
-        exports.es = {
-            "mejs.plural-form": 1,
-
-            // me-shim
-            "mejs.download-file": "Descargar archivo",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "Desconectar pantalla completa",
-            "mejs.fullscreen-on": "Ir a pantalla completa",
-            "mejs.download-video": "Descargar vídeo",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "Pantalla completa",
-
-            // mep-feature-jumpforward
-            //"mejs.time-jump-forward": "Jump forward %1 second(s)",
-
-            // mep-feature-playpause
-            "mejs.play": "Reproducción",
-            "mejs.pause": "Pausa",
-
-            // mep-feature-postroll
-            "mejs.close": "Cerrar",
-
-            // mep-feature-progress
-            "mejs.time-slider": "Control deslizante de tiempo",
-            "mejs.time-help-text": "Use las flechas Izquierda/Derecha para avanzar un segundo y las flechas Arriba/Abajo para avanzar diez segundos.",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": ["Rebobinar 1 segundo", "Rebobinar %1 segundos"],
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "Leyendas/Subtítulos",
-            "mejs.none": "Ninguno",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "Alternar silencio",
-            "mejs.volume-help-text": "Use las flechas Arriba/Abajo para subir o bajar el volumen.",
-            "mejs.unmute": "Reactivar silencio",
-            "mejs.mute": "Silencio",
-            "mejs.volume-slider": "Control deslizante de volumen",
-
-            // mep-player
-            "mejs.video-player": "Reproductor de video",
-            "mejs.audio-player": "Reproductor de audio",
-
-            // mep-feature-ads
-            "mejs.ad-skip": "Saltar publicidad",
-            "mejs.ad-skip-info": ["Saltar 1 segundo", "Saltar %1 segundos"],
-
-            // mep-feature-sourcechooser
-            "mejs.source-chooser": "Selector de media"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 0 - 75
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-fr.js

@@ -1,75 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * French
- *
- * @author
- *   Luc Poupard (Twitter: @klohFR)
- *   Jalios (Twitter: @Jalios)
- *   Sascha Greuel (Twitter: @SoftCreatR)
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.fr === undefined) {
-        exports.fr = {
-            "mejs.plural-form": 2,
-
-            // me-shim
-            "mejs.download-file": "Télécharger le fichier",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "Quitter le mode plein écran",
-            "mejs.fullscreen-on": "Afficher en plein écran",
-            "mejs.download-video": "Télécharger la vidéo",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "Plein écran",
-
-            // mep-feature-jumpforward
-            "mejs.time-jump-forward": "Avancer de %1 secondes",
-
-            // mep-feature-playpause
-            "mejs.play": "Lecture",
-            "mejs.pause": "Pause",
-
-            // mep-feature-postroll
-            "mejs.close": "Fermer",
-
-            // mep-feature-progress
-            "mejs.time-slider": "Curseur temporel",
-            "mejs.time-help-text": "Utilisez les flèches Gauche/Droite du clavier pour avancer d'une seconde, les flèches Haut/Bas pour avancer de 10 secondes.",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": "Reculer de %1 secondes",
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "Sous-titres",
-            "mejs.none": "Aucun",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "Activer/désactiver le son",
-            "mejs.volume-help-text": "Utilisez les flèches Haut/Bas du clavier pour augmenter ou diminuer le volume.",
-            "mejs.unmute": "Activer le son",
-            "mejs.mute": "Désactiver le son",
-            "mejs.volume-slider": "Volume",
-
-            // mep-player
-            "mejs.video-player": "Lecteur Vidéo",
-            "mejs.audio-player": "Lecteur Audio",
-
-            // mep-feature-ads
-            "mejs.ad-skip": "Passer la publicité",
-            "mejs.ad-skip-info": "Passer la publicité dans %1 secondes",
-
-            // mep-feature-sourcechooser
-            "mejs.source-chooser": "Sélecteur de média"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 0 - 74
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-hu.js

@@ -1,74 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * Hungarian
- *
- * @author
- *   Jalios (Twitter: @Jalios)
- *   Sascha Greuel (Twitter: @SoftCreatR)
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.hu === undefined) {
-        exports.hu = {
-            "mejs.plural-form": 1,
-
-            // me-shim
-            "mejs.download-file": "Fájl letöltése",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "Teljes képernyő kikapcsolása",
-            "mejs.fullscreen-on": "Átlépés teljes képernyős módra",
-            "mejs.download-video": "Videó letöltése",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "Teljes képernyő",
-
-            // mep-feature-jumpforward
-            //"mejs.time-jump-forward": "Jump forward %1 second(s)",
-
-            // mep-feature-playpause
-            "mejs.play": "Lejátszás",
-            "mejs.pause": "Szünet",
-
-            // mep-feature-postroll
-            "mejs.close": "Bezárás",
-
-            // mep-feature-progress
-            "mejs.time-slider": "Idő csúszka",
-            "mejs.time-help-text": "Használja a Bal/Jobb nyíl gombokat az egy másodperces léptetéshez, a Fel/Le nyíl gombokat a tíz másodperces léptetéshez.",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": "Ugrás vissza %1 másodperccel",
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "Képaláírás/Feliratok",
-            "mejs.none": "Nincs",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "Némítás kapcsolója",
-            "mejs.volume-help-text": "Használja a Fel/Le nyíl gombokat a hangerő növeléséhez vagy csökkentéséhez.",
-            "mejs.unmute": "Némítás feloldása",
-            "mejs.mute": "Némítás",
-            "mejs.volume-slider": "Hangerőcsúszka",
-
-            // mep-player
-            "mejs.video-player": "Videolejátszó",
-            "mejs.audio-player": "Audiolejátszó",
-
-            // mep-feature-ads
-            //"mejs.ad-skip": "Skip ad",
-            //"mejs.ad-skip-info": "Skip in %1 second(s)",
-
-            // mep-feature-sourcechooser
-            //"mejs.source-chooser": "Source Chooser"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 0 - 74
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-it.js

@@ -1,74 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * Italian
- *
- * @author
- *   Jalios (Twitter: @Jalios)
- *   Sascha "SoftCreatR" Greuel
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.it === undefined) {
-        exports.it = {
-            "mejs.plural-form": 1,
-
-            // me-shim
-            "mejs.download-file": "Scaricare il file",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "Disattivare lo schermo intero",
-            "mejs.fullscreen-on": "Attivare lo schermo intero",
-            "mejs.download-video": "Scaricare il video",
-
-             // mep-feature-fullscreen
-            "mejs.fullscreen": "Schermo intero",
-
-            // mep-feature-jumpforward
-            //"mejs.time-jump-forward": "Jump forward %1 second(s)",
-
-            // mep-feature-playpause
-            "mejs.play": "Eseguire",
-            "mejs.pause": "Pausa",
-
-            // mep-feature-postroll
-            "mejs.close": "Chiudere",
-
-            // mep-feature-progress
-            "mejs.time-slider": "Barra di scorrimento",
-            "mejs.time-help-text": "Utilizzare i tasti Freccia sinistra/Freccia destra per avanzare di un secondo, Freccia Su/Giù per avanzare dieci secondi.",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": "Riavvolgere %1 secondi",
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "Acquisizioni/sottotitoli",
-            "mejs.none": "Nessuno",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "Toggle muto",
-            "mejs.volume-help-text": "Utilizzare i tasti Freccia Su/Giù per aumentare o diminuire il volume.",
-            "mejs.unmute": "Disattivare muto",
-            "mejs.mute": "Muto",
-            "mejs.volume-slider": "Barra del volume",
-
-            // mep-player
-            "mejs.video-player": "Lettore Video",
-            "mejs.audio-player": "Lettore Audio",
-
-            // mep-feature-ads
-            //"mejs.ad-skip": "Skip ad",
-            //"mejs.ad-skip-info": "Skip in %1 second(s)",
-
-            // mep-feature-sourcechooser
-            //"mejs.source-chooser": "Source Chooser"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 0 - 74
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-ja.js

@@ -1,74 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * Japanese
- *
- * @author
- *   Jalios (Twitter: @Jalios)
- *   Sascha "SoftCreatR" Greuel
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.ja === undefined) {
-        exports.ja = {
-            "mejs.plural-form": 0,
-
-            // me-shim
-            "mejs.download-file": "ファイルをダウンロードする",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "全画面をオフにする",
-            "mejs.fullscreen-on": "全画面にする",
-            "mejs.download-video": "動画をダウンロードする",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "全画面",
-
-            // mep-feature-jumpforward
-            //"mejs.time-jump-forward": "Jump forward %1 second(s)",
-
-            // mep-feature-playpause
-            "mejs.play": "再生",
-            "mejs.pause": "一時停止",
-
-            // mep-feature-postroll
-            "mejs.close": "閉じる",
-
-            // mep-feature-progress
-            "mejs.time-slider": "タイムスライダー",
-            "mejs.time-help-text": "1秒進めるには左/右矢印をキーを、10秒進めるには上/下矢印を使います。",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": "%1秒スキップバックする",
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "キャプション/字幕",
-            "mejs.none": "なし",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "ミュートトグル",
-            "mejs.volume-help-text": "音量を上げたり下げたりするには、上/下矢印を使います。",
-            "mejs.unmute": "ミュートを解除",
-            "mejs.mute": "ミュート",
-            "mejs.volume-slider": "音量スライダー",
-
-            // mep-player
-            "mejs.video-player": "ビデオプレーヤー",
-            "mejs.audio-player": "オーディオプレーヤー",
-
-            // mep-feature-ads
-            //"mejs.ad-skip": "Skip ad",
-            //"mejs.ad-skip-info": "Skip in %1 second(s)",
-
-            // mep-feature-sourcechooser
-            //"mejs.source-chooser": "Source Chooser"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 0 - 74
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-ko.js

@@ -1,74 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * Korean
- *
- * @author
- *   Jalios (Twitter: @Jalios)
- *   Sascha "SoftCreatR" Greuel
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.ko === undefined) {
-        exports.ko = {
-            "mejs.plural-form": 0,
-
-            // me-shim
-            "mejs.download-file": "파일 다운로드",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "전체화면 해제",
-            "mejs.fullscreen-on": "전체화면 가기",
-            "mejs.download-video": "비디오 다운로드",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "전체화면",
-
-            // mep-feature-jumpforward
-            //"mejs.time-jump-forward": "Jump forward %1 second(s)",
-
-            // mep-feature-playpause
-            "mejs.play": "작동",
-            "mejs.pause": "정지",
-
-            // mep-feature-postroll
-            "mejs.close": "종료",
-
-            // mep-feature-progress
-            "mejs.time-slider": "시간 슬라이더",
-            "mejs.time-help-text": "1초 전진하려면 좌/우측 화살표를 사용하시고 10초 전진하려면 위/아래 화살표를 사용하세요.",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": "1초 % 를 뒤로 건너뛰세요",
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "캡션/자막",
-            "mejs.none": "없음",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "음소거 전환",
-            "mejs.volume-help-text": "볼륨을 높이거나 낮추려면 위/아래 화살표를 이용하세요.",
-            "mejs.unmute": "음소거 해제",
-            "mejs.mute": "말 없는",
-            "mejs.volume-slider": "볼륨 슬라이더",
-
-            // mep-player
-            "mejs.video-player": "비디오 플레이어",
-            "mejs.audio-player": "오디오 플레이어",
-
-            // mep-feature-ads
-            //"mejs.ad-skip": "Skip ad",
-            //"mejs.ad-skip-info": "Skip in %1 second(s)",
-
-            // mep-feature-sourcechooser
-            //"mejs.source-chooser": "Source Chooser"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 0 - 75
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-nl.js

@@ -1,75 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * Dutch
- *
- * @author
- *   Leonard de Ruijter, Twitter: @LeonarddR
- *   Jalios (Twitter: @Jalios)
- *   Sascha "SoftCreatR" Greuel
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.nl === undefined) {
-        exports.nl = {
-            "mejs.plural-form": 1,
-
-            // me-shim
-            "mejs.download-file": "Bestand downloaden",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "Volledig scherm uitschakelen",
-            "mejs.fullscreen-on": "Volledig scherm",
-            "mejs.download-video": "Video downloaden",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "Volledig scherm",
-
-            // mep-feature-jumpforward
-            "mejs.time-jump-forward": "%1 seconden vooruit springen",
-
-            // mep-feature-playpause
-            "mejs.play": "Afspelen",
-            "mejs.pause": "Pauzeren",
-
-            // mep-feature-postroll
-            "mejs.close": "Sluiten",
-
-            // mep-feature-progress
-            "mejs.time-slider": "Tijd schuifbalk",
-            "mejs.time-help-text": "Gebruik pijl naar links/rechts om per seconde te springen, pijl omhoog/omlaag om per tien seconden te springen.",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": "%1 seconden terug springen",
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "Bijschriften/ondertiteling",
-            "mejs.none": "Geen",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "Dempen schakelen",
-            "mejs.volume-help-text": "Gebruik pijl omhoog/omlaag om het volume te verhogen/verlagen.",
-            "mejs.unmute": "Dempen opheffen",
-            "mejs.mute": "Dempen",
-            "mejs.volume-slider": "Volume schuifbalk",
-
-            // mep-player
-            "mejs.video-player": "Videospeler",
-            "mejs.audio-player": "Audiospeler",
-
-            // mep-feature-ads
-            "mejs.ad-skip": "Ad overslaan",
-            "mejs.ad-skip-info": "Overslaan in %1 seconden",
-
-            // mep-feature-sourcechooser
-            "mejs.source-chooser": "Bronkeuze"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 0 - 74
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-pl.js

@@ -1,74 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * Polish
- *
- * @author
- *   Jalios (Twitter: @Jalios)
- *   Sascha Greuel (Twitter: @SoftCreatR)
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.pl === undefined) {
-        exports.pl = {
-            "mejs.plural-form": 9,
-
-            // me-shim
-            "mejs.download-file": "Pobierz plik",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "Wyłącz pełny ekran",
-            "mejs.fullscreen-on": "Przejdź na pełny ekran",
-            "mejs.download-video": "Pobierz wideo",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "Pełny ekran",
-
-            // mep-feature-jumpforward
-            //"mejs.time-jump-forward": "Jump forward %1 second(s)",
-
-            // mep-feature-playpause
-            "mejs.play": "Odtwarzaj",
-            "mejs.pause": "Wstrzymaj",
-
-            // mep-feature-postroll
-            "mejs.close": "Zamknij",
-
-            // mep-feature-progress
-            "mejs.time-slider": "Suwak czasu",
-            "mejs.time-help-text": "Strzałki w lewo/w prawo powodują przewijanie o sekundę, strzałki w górę/w dół o dziesięć sekund.",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": "Cofnij o %1 sek.",
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "Podpisy/napisy",
-            "mejs.none": "Brak",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "Przełączanie wyciszania",
-            "mejs.volume-help-text": "Aby zwiększyć lub zmniejszyć głośność, użyj strzałek w górę/w dół.",
-            "mejs.unmute": "Wyłącz wyciszenie",
-            "mejs.mute": "Wycisz",
-            "mejs.volume-slider": "Suwak głośności",
-
-            // mep-player
-            "mejs.video-player": "Odtwarzacz wideo",
-            "mejs.audio-player": "Odtwarzacz audio",
-
-            // mep-feature-ads
-            //"mejs.ad-skip": "Skip ad",
-            //"mejs.ad-skip-info": "Skip in %1 second(s)",
-
-            // mep-feature-sourcechooser
-            //"mejs.source-chooser": "Source Chooser"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 0 - 74
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-pt-br.js

@@ -1,74 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * Brazilian (Portuguese)
- *
- * @author
- *   Armando Meziat (Twitter: @odnamrataizem)
- *   Sascha Greuel (Twitter: @SoftCreatR)
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports["pt-BR"] === undefined) {
-        exports["pt-BR"] = {
-            "mejs.plural-form": 2,
-
-            // me-shim
-            "mejs.download-file": "Baixar arquivo",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "Sair da tela inteira",
-            "mejs.fullscreen-on": "Ir para tela inteira",
-            "mejs.download-video": "Baixar vídeo",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "Tela inteira",
-
-            // mep-feature-jumpforward
-            //"mejs.time-jump-forward": "Jump forward %1 second(s)",
-
-            // mep-feature-playpause
-            //"mejs.play": "Play",
-            //"mejs.pause": "Pause",
-
-            // mep-feature-postroll
-            "mejs.close": "Fechar",
-
-            // mep-feature-progress
-            //"mejs.time-slider": "Time Slider",
-            //"mejs.time-help-text": "Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.",
-
-            // mep-feature-skipback
-            //"mejs.time-skip-back": "Skip back %1 second(s)",
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "Legendas",
-            "mejs.none": "Sem legendas",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "Alternar silêncio",
-            //"mejs.volume-help-text": "Use Up/Down Arrow keys to increase or decrease volume.",
-            "mejs.unmute": "Tirar silêncio",
-            "mejs.mute": "Silenciar",
-            //"mejs.volume-slider": "Volume Slider",
-
-            // mep-player
-            //"mejs.video-player": "Video Player",
-            //"mejs.audio-player": "Audio Player",
-
-            // mep-feature-ads
-            //"mejs.ad-skip": "Skip ad",
-            //"mejs.ad-skip-info": "Skip in %1 second(s)",
-
-            // mep-feature-sourcechooser
-            //"mejs.source-chooser": "Source Chooser"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 0 - 74
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-pt.js

@@ -1,74 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * Portuguese
- *
- * @author
- *   Jalios (Twitter: @Jalios)
- *   Sascha Greuel (Twitter: @SoftCreatR)
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.pt === undefined) {
-        exports.pt = {
-            "mejs.plural-form": 1,
-
-            // me-shim
-            "mejs.download-file": "Descarregar o ficheiro",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "Desligar ecrã completo",
-            "mejs.fullscreen-on": "Ir para ecrã completo",
-            "mejs.download-video": "Descarregar o vídeo",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "Ecrã completo",
-
-            // mep-feature-jumpforward
-            //"mejs.time-jump-forward": "Jump forward %1 second(s)",
-
-            // mep-feature-playpause
-            "mejs.play": "Reprodução",
-            "mejs.pause": "Pausa",
-
-            // mep-feature-postroll
-            "mejs.close": "Fechar",
-
-            // mep-feature-progress
-            "mejs.time-slider": "Deslizador do tempo",
-            "mejs.time-help-text": "Use as teclas das setas para a esquerda/direita para avançar um segundo, e as setas para cima/baixo para avançar dez segundos.",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": "Retroceder %1 segundos",
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "Legendas",
-            "mejs.none": "Nenhum",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "Alternar silêncio",
-            "mejs.volume-help-text": "Use as teclas das setas para cima/baixo para aumentar ou diminuir o volume.",
-            "mejs.unmute": "Voltar ao som",
-            "mejs.mute": "Silêncio",
-            "mejs.volume-slider": "Deslizador do volume",
-
-            // mep-player
-            "mejs.video-player": "Leitor de vídeo",
-            "mejs.audio-player": "Leitor de áudio",
-
-            // mep-feature-ads
-            //"mejs.ad-skip": "Skip ad",
-            //"mejs.ad-skip-info": "Skip in %1 second(s)",
-
-            // mep-feature-sourcechooser
-            //"mejs.source-chooser": "Source Chooser"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 0 - 74
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-ro.js

@@ -1,74 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * Romanian
- *
- * @author
- *   Jalios (Twitter: @Jalios)
- *   Sascha Greuel (Twitter: @SoftCreatR)
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.ro === undefined) {
-        exports.ro = {
-            "mejs.plural-form": 5,
-
-            // me-shim
-            "mejs.download-file": "Descarcă fişierul",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "Opreşte ecranul complet",
-            "mejs.fullscreen-on": "Treci la ecran complet",
-            "mejs.download-video": "Descarcă fişierul video",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "Ecran complet",
-
-            // mep-feature-jumpforward
-            //"mejs.time-jump-forward": "Jump forward %1 second(s)",
-
-            // mep-feature-playpause
-            "mejs.play": "Redare",
-            "mejs.pause": "Pauză",
-
-            // mep-feature-postroll
-            "mejs.close": "Închide",
-
-            // mep-feature-progress
-            "mejs.time-slider": "Cursor timp",
-            "mejs.time-help-text": "Utilizează tastele săgeată Stânga/Dreapta pentru a avansa o secundă şi săgeţile Sus/Jos pentru a avansa zece secunde.",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": "Sari înapoi %1 secunde",
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "Legende/Subtitrări",
-            "mejs.none": "Niciunul",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "Comutare dezactivare sunet",
-            "mejs.volume-help-text": "Utilizează tastele de săgeată Sus/Jos pentru a creşte/micşora volumul",
-            "mejs.unmute": "Cu sunet",
-            "mejs.mute": "Fără sunet",
-            "mejs.volume-slider": "Cursor volum",
-
-            // mep-player
-            "mejs.video-player": "Player video",
-            "mejs.audio-player": "Player audio",
-
-            // mep-feature-ads
-            //"mejs.ad-skip": "Skip ad",
-            //"mejs.ad-skip-info": "Skip in %1 second(s)",
-
-            // mep-feature-sourcechooser
-            //"mejs.source-chooser": "Source Chooser"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 0 - 74
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-ru.js

@@ -1,74 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * Russian
- *
- * @author
- *   Jalios (Twitter: @Jalios)
- *   Sascha Greuel (Twitter: @SoftCreatR)
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.ru === undefined) {
-        exports.ru = {
-            "mejs.plural-form": 7,
-
-            // me-shim
-            "mejs.download-file": "Скачать файл",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "Выключить широкий экран",
-            "mejs.fullscreen-on": "Перейти к широкому экрану",
-            "mejs.download-video": "Скачать видео",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "Широкий экран",
-
-            // mep-feature-jumpforward
-            //"mejs.time-jump-forward": "Jump forward %1 second(s)",
-
-            // mep-feature-playpause
-            "mejs.play": "Воспроизвести",
-            "mejs.pause": "Пауза",
-
-            // mep-feature-postroll
-            "mejs.close": "Закрыть",
-
-            // mep-feature-progress
-            "mejs.time-slider": "Слайдер времени",
-            "mejs.time-help-text": "Используйте Левую/Правую клавиши со стрелками, чтобы продвинуться на одну секунду, клавиши со стрелками Вверх/Вниз, чтобы продвинуться на десять секунд.",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": "Пропустить назад %1 секунд",
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "Титры/Субтитры",
-            "mejs.none": "Нет",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "Без звука",
-            "mejs.volume-help-text": "Используйте клавиши со стрелками Вверх/Вниз, чтобы увеличить или уменьшить громкость.",
-            "mejs.unmute": "Отменить выключение звука",
-            "mejs.mute": "Отключить звук",
-            "mejs.volume-slider": "Слайдер громкости",
-
-            // mep-player
-            "mejs.video-player": "Видеоплеер",
-            "mejs.audio-player": "Аудиоплеер",
-
-            // mep-feature-ads
-            //"mejs.ad-skip": "Skip ad",
-            //"mejs.ad-skip-info": "Skip in %1 second(s)",
-
-            // mep-feature-sourcechooser
-            //"mejs.source-chooser": "Source Chooser"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 0 - 74
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-sk.js

@@ -1,74 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * Slovak
- *
- * @author
- *   Jalios (Twitter: @Jalios)
- *   Sascha Greuel (Twitter: @SoftCreatR)
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.sk === undefined) {
-        exports.sk = {
-            "mejs.plural-form": 8,
-
-            // me-shim
-            "mejs.download-file": "Prevziať súbor",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "Vypnúť celú obrazovku",
-            "mejs.fullscreen-on": "Prejsť na celú obrazovku",
-            "mejs.download-video": "Prevziať video",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "Celá obrazovka",
-
-            // mep-feature-jumpforward
-            //"mejs.time-jump-forward": "Jump forward %1 second(s)",
-
-            // mep-feature-playpause
-            "mejs.play": "Prehrať",
-            "mejs.pause": "Pozastaviť",
-
-            // mep-feature-postroll
-            "mejs.close": "Zavrieť",
-
-            // mep-feature-progress
-            "mejs.time-slider": "Posúvač času",
-            "mejs.time-help-text": "Klávesmi so šípkou doľava/doprava posuniete o jednu sekundu, šípkami nahor/ nadol posuniete o desať sekúnd.",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": "Preskočiť dozadu o %1 s.",
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "Skryté titulky/Titulky",
-            "mejs.none": "Žiadne",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "Prepínač stlmenia",
-            "mejs.volume-help-text": "Klávesmi so šípkou nahor/nadol zvýšite alebo znížite hlasitosť.",
-            "mejs.unmute": "Zrušiť stlmenie",
-            "mejs.mute": "Stlmiť",
-            "mejs.volume-slider": "Posúvač hlasitosti",
-
-            // mep-player
-            "mejs.video-player": "Prehrávač videa",
-            "mejs.audio-player": "Prehrávač zvuku",
-
-            // mep-feature-ads
-            //"mejs.ad-skip": "Skip ad",
-            //"mejs.ad-skip-info": "Skip in %1 second(s)",
-
-            // mep-feature-sourcechooser
-            //"mejs.source-chooser": "Source Chooser"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 0 - 74
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-zh-cn.js

@@ -1,74 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * Chinese (Simplified)
- *
- * @author
- *   Jalios (Twitter: @Jalios)
- *   Sascha Greuel (Twitter: @SoftCreatR)
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports["zh-CN"] === undefined) {
-        exports["zh-CN"] = {
-            "mejs.plural-form": 0,
-
-            // me-shim
-            "mejs.download-file": "下载文件",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "关闭全屏",
-            "mejs.fullscreen-on": "转向全屏",
-            "mejs.download-video": "下载视频",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "全屏",
-
-            // mep-feature-jumpforward
-            //"mejs.time-jump-forward": "Jump forward %1 second(s)",
-
-            // mep-feature-playpause
-            "mejs.play": "播放",
-            "mejs.pause": "暂停",
-
-            // mep-feature-postroll
-            "mejs.close": "关闭",
-
-            // mep-feature-progress
-            "mejs.time-slider": "时间滑动棒",
-            "mejs.time-help-text": "使用作/右箭头快进1秒,使用上/下箭头快进10秒。",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": "后退%1秒",
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "字幕/标题",
-            "mejs.none": "无",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "静音切换",
-            "mejs.volume-help-text": "使用上/下箭头提高或降低音量。",
-            "mejs.unmute": "取消静音",
-            "mejs.mute": "静音",
-            "mejs.volume-slider": "音量选择键",
-
-            // mep-player
-            "mejs.video-player": "视频播放器",
-            "mejs.audio-player": "音频播放器",
-
-            // mep-feature-ads
-            //"mejs.ad-skip": "Skip ad",
-            //"mejs.ad-skip-info": "Skip in %1 second(s)",
-
-            // mep-feature-sourcechooser
-            //"mejs.source-chooser": "Source Chooser"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 0 - 74
app/Resources/public/assets/mediaelement/build/lang/me-i18n-locale-zh.js

@@ -1,74 +0,0 @@
-/*!
- * This is a i18n.locale language object.
- *
- * Chinese (Traditional)
- *
- * @author
- *   Jalios (Twitter: @Jalios)
- *   Sascha Greuel (Twitter: @SoftCreatR)
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.zh === undefined) {
-        exports.zh = {
-            "mejs.plural-form": 0,
-
-            // me-shim
-            "mejs.download-file": "下載文件",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "關閉全屏",
-            "mejs.fullscreen-on": "轉向全屏",
-            "mejs.download-video": "下載視頻",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "全屏",
-
-            // mep-feature-jumpforward
-            //"mejs.time-jump-forward": "Jump forward %1 second(s)",
-
-            // mep-feature-playpause
-            "mejs.play": "播放",
-            "mejs.pause": "暫停",
-
-            // mep-feature-postroll
-            "mejs.close": "關閉",
-
-            // mep-feature-progress
-            "mejs.time-slider": "時間滑動棒",
-            "mejs.time-help-text": "使用左/右箭頭快進1秒,上/下箭頭快進10秒。",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": "跳躍式迴繞%1秒",
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "字幕/標題",
-            "mejs.none": "沒有",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "靜音切換",
-            "mejs.volume-help-text": "使用上/下箭頭提高或降低音量。",
-            "mejs.unmute": "取消靜音",
-            "mejs.mute": "靜音",
-            "mejs.volume-slider": "音量控制鍵",
-
-            // mep-player
-            "mejs.video-player": "視頻播放器",
-            "mejs.audio-player": "音頻播放器",
-
-            // mep-feature-ads
-            //"mejs.ad-skip": "Skip ad",
-            //"mejs.ad-skip-info": "Skip in %1 second(s)",
-
-            // mep-feature-sourcechooser
-            //"mejs.source-chooser": "Source Chooser"
-        };
-    }
-}(mejs.i18n.locale.strings));

+ 91 - 0
app/Resources/public/assets/mediaelement/build/lang/nl.js

@@ -0,0 +1,91 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * Dutch
+ *
+ * @author
+ *   Leonard de Ruijter, Twitter: @LeonarddR
+ *   Jalios (Twitter: @Jalios)
+ *   Sascha 'SoftCreatR' Greuel
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.nl === undefined) {
+		exports.nl = {
+			'mejs.plural-form': 1,			
+			'mejs.download-file': 'Bestand downloaden',			
+			'mejs.install-flash': 'U gebruikt een browser die geen Flash Player heeft ingeschakeld of geïnstalleerd. Zet de Flash Player plug-in of download de nieuwste versie van https://get.adobe.com/flashplayer/',			
+			'mejs.fullscreen': 'Volledig scherm',			
+			'mejs.play': 'Afspelen',
+			'mejs.pause': 'Pauzeren',			
+			'mejs.time-slider': 'Tijd schuifbalk',
+			'mejs.time-help-text': 'Gebruik pijl naar links/rechts om per seconde te springen, pijl omhoog/omlaag om per tien seconden te springen.',
+			'mejs.live-broadcast' : 'Live uitzending',			
+			'mejs.volume-help-text': 'Gebruik pijl omhoog/omlaag om het volume te verhogen/verlagen.',
+			'mejs.unmute': 'Dempen opheffen',
+			'mejs.mute': 'Dempen',
+			'mejs.volume-slider': 'Volume schuifbalk',			
+			'mejs.video-player': 'Videospeler',
+			'mejs.audio-player': 'Audiospeler',			
+			'mejs.captions-subtitles': 'Bijschriften/ondertiteling',
+			'mejs.captions-chapters': 'Hoofdstukken',
+			'mejs.none': 'Geen',
+			'mejs.afrikaans': 'Afrikaans',
+			'mejs.albanian': 'Albanees',
+			'mejs.arabic': 'Arabisch',
+			'mejs.belarusian': 'Wit-Russisch',
+			'mejs.bulgarian': 'Bulgaars',
+			'mejs.catalan': 'Catalaans',
+			'mejs.chinese': 'Chinees',
+			'mejs.chinese-simplified': 'Chinees (Vereenvoudigd)',
+			'mejs.chinese-traditional': 'Chinees (Traditioneel)',
+			'mejs.croatian': 'Kroatisch',
+			'mejs.czech': 'Tsjechisch',
+			'mejs.danish': 'Deens',
+			'mejs.dutch': 'Nederlands',
+			'mejs.english': 'Engels',
+			'mejs.estonian': 'Estlands',
+			'mejs.filipino': 'Filipijns',
+			'mejs.finnish': 'Finse',
+			'mejs.french': 'Frans',
+			'mejs.galician': 'Galicisch',
+			'mejs.german': 'Duits',
+			'mejs.greek': 'Grieks',
+			'mejs.haitian-creole': 'Haïtiaanse Creoolse',
+			'mejs.hebrew': 'Hebreeuws',
+			'mejs.hindi': 'Hindi',
+			'mejs.hungarian': 'Hongaars',
+			'mejs.icelandic': 'Icelandic',
+			'mejs.indonesian': 'Indonesisch',
+			'mejs.irish': 'Iers',
+			'mejs.italian': 'Italiaans',
+			'mejs.japanese': 'Japans',
+			'mejs.korean': 'Koreaans',
+			'mejs.latvian': 'Letlands',
+			'mejs.lithuanian': 'Litouws',
+			'mejs.macedonian': 'Macedonisch',
+			'mejs.malay': 'Maleis',
+			'mejs.maltese': 'Maltese',
+			'mejs.norwegian': 'Noors',
+			'mejs.persian': 'Perzisch',
+			'mejs.polish': 'Pools',
+			'mejs.portuguese': 'Portugees',
+			'mejs.romanian': 'Roemeens',
+			'mejs.russian': 'Russisch',
+			'mejs.serbian': 'Servisch',
+			'mejs.slovak': 'Slowaaks',
+			'mejs.slovenian': 'Sloveens',
+			'mejs.spanish': 'Spaans',
+			'mejs.swahili': 'Swahili',
+			'mejs.swedish': 'Zweeds',
+			'mejs.tagalog': 'Tagalog',
+			'mejs.thai': 'Thai',
+			'mejs.turkish': 'Turks',
+			'mejs.ukrainian': 'Oekraïens',
+			'mejs.vietnamese': 'Vietnamese',
+			'mejs.welsh': 'Welsh',
+			'mejs.yiddish': 'Jiddisch'
+		};
+	}
+})(mejs.i18n);

+ 90 - 0
app/Resources/public/assets/mediaelement/build/lang/pl.js

@@ -0,0 +1,90 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * Polish
+ *
+ * @author
+ *   Jalios (Twitter: @Jalios)
+ *   Sascha Greuel (Twitter: @SoftCreatR)
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.pl === undefined) {
+		exports.pl = {
+			'mejs.plural-form': 9,			
+			'mejs.download-file': 'Pobierz plik',			
+			'mejs.install-flash': 'Twoja przeglądarka nie ma włączonej lub zainstalowanej wtyczki Flash Player. Prosimy ją włączyć lub pobrać najnowszą wersję ze strony https://get.adobe.com/flashplayer/',			
+			'mejs.fullscreen': 'Pełny ekran',			
+			'mejs.play': 'Odtwarzaj',
+			'mejs.pause': 'Wstrzymaj',			
+			'mejs.time-slider': 'Suwak czasu',
+			'mejs.time-help-text': 'Strzałki w lewo/w prawo powodują przewijanie o sekundę, strzałki w górę/w dół o dziesięć sekund.',
+			'mejs.live-broadcast': 'Transmisja na żywo',			
+			'mejs.volume-help-text': 'Aby zwiększyć lub zmniejszyć głośność, użyj strzałek w górę/w dół.',
+			'mejs.unmute': 'Wyłącz wyciszenie',
+			'mejs.mute': 'Wycisz',
+			'mejs.volume-slider': 'Suwak głośności',			
+			'mejs.video-player': 'Odtwarzacz wideo',
+			'mejs.audio-player': 'Odtwarzacz audio',			
+			'mejs.captions-subtitles': 'Podpisy/napisy',
+			'mejs.captions-chapters': 'Rozdziały',
+			'mejs.none': 'Brak',
+			'mejs.afrikaans': 'Afrykański',
+			'mejs.albanian': 'Albański',
+			'mejs.arabic': 'Arabski',
+			'mejs.belarusian': 'Białoruski',
+			'mejs.bulgarian': 'Bułgarski',
+			'mejs.catalan': 'Kataloński',
+			'mejs.chinese': 'Chiński',
+			'mejs.chinese-simplified': 'Chiński (uproszczony)',
+			'mejs.chinese-traditional': 'Chiński (tradycyjny)',
+			'mejs.croatian': 'Chorwacki',
+			'mejs.czech': 'Czeski',
+			'mejs.danish': 'Duński',
+			'mejs.dutch': 'Holenderski',
+			'mejs.english': 'Angielski',
+			'mejs.estonian': 'Estoński',
+			'mejs.filipino': 'Filipiński',
+			'mejs.finnish': 'Fiński',
+			'mejs.french': 'Francuski',
+			'mejs.galician': 'Galicyjski',
+			'mejs.german': 'Niemiecki',
+			'mejs.greek': 'Grecki',
+			'mejs.haitian-creole': 'Haitański',
+			'mejs.hebrew': 'Hebrajski',
+			'mejs.hindi': 'Hinduski',
+			'mejs.hungarian': 'Węgierski',
+			'mejs.icelandic': 'Islandzki',
+			'mejs.indonesian': 'Indonezyjski',
+			'mejs.irish': 'Irlandzki',
+			'mejs.italian': 'Włoski',
+			'mejs.japanese': 'Japoński',
+			'mejs.korean': 'Koreański',
+			'mejs.latvian': 'Łotewski',
+			'mejs.lithuanian': 'Litewski',
+			'mejs.macedonian': 'Macedoński',
+			'mejs.malay': 'Malajski',
+			'mejs.maltese': 'Maltański',
+			'mejs.norwegian': 'Norweski',
+			'mejs.persian': 'Perski',
+			'mejs.polish': 'Polski',
+			'mejs.portuguese': 'Portugalski',
+			'mejs.romanian': 'Rumuński',
+			'mejs.russian': 'Rosyjski',
+			'mejs.serbian': 'Serbski',
+			'mejs.slovak': 'Słowacki',
+			'mejs.slovenian': 'Słoweński',
+			'mejs.spanish': 'Hiszpański',
+			'mejs.swahili': 'Suahili',
+			'mejs.swedish': 'Szwedzki',
+			'mejs.tagalog': 'Tagalski',
+			'mejs.thai': 'Tajski',
+			'mejs.turkish': 'Turecki',
+			'mejs.ukrainian': 'Ukraiński',
+			'mejs.vietnamese': 'Wietnamski',
+			'mejs.welsh': 'Walijski',
+			'mejs.yiddish': 'Jidysz'
+		};
+	}
+})(mejs.i18n);

+ 92 - 0
app/Resources/public/assets/mediaelement/build/lang/pt.js

@@ -0,0 +1,92 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * Portuguese
+ *
+ * @author
+ *   Jalios (Twitter: @Jalios)
+ *   Sascha Greuel (Twitter: @SoftCreatR)
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.pt === undefined) {
+		exports.pt = {
+			'mejs.plural-form': 1,			
+			'mejs.download-file': 'Descarregar o ficheiro',			
+			'mejs.install-flash': 'Você está usando um navegador que não possui o player Flash ativado ou instalado. Por favor, ligue o plugin do Flash Player ou baixe a versão mais recente de https://get.adobe.com/flashplayer/',			
+			'mejs.fullscreen': 'Ecrã completo',			
+			'mejs.play': 'Reprodução',
+			'mejs.pause': 'Pausa',			
+			'mejs.time-slider': 'Deslizador do tempo',
+			'mejs.time-help-text': 'Use as teclas das setas para a esquerda/direita para avançar um segundo, e as setas para cima/baixo para avançar dez segundos.',
+			'mejs.live-broadcast' : 'Transmissão ao vivo',
+			
+			
+			'mejs.volume-help-text': 'Use as teclas das setas para cima/baixo para aumentar ou diminuir o volume.',
+			'mejs.unmute': 'Voltar ao som',
+			'mejs.mute': 'Silêncio',
+			'mejs.volume-slider': 'Deslizador do volume',			
+			'mejs.video-player': 'Leitor de vídeo',
+			'mejs.audio-player': 'Leitor de áudio',			
+			'mejs.captions-subtitles': 'Legendas',
+			'mejs.captions-chapters': 'Capítulos',
+			'mejs.none': 'Nenhum',
+			'mejs.afrikaans': 'Afrikaans',
+			'mejs.albanian': 'Albanês',
+			'mejs.arabic': 'Árabe',
+			'mejs.belarusian': 'Bielorrusso',
+			'mejs.bulgarian': 'Búlgaro',
+			'mejs.catalan': 'Catalão',
+			'mejs.chinese': 'Chinês',
+			'mejs.chinese-simplified': 'Chinese (Simplified)',
+			'mejs.chinese-traditional': 'Chinese (Traditional)',
+			'mejs.croatian': 'Croata',
+			'mejs.czech': 'Checo',
+			'mejs.danish': 'Danish',
+			'mejs.dutch': 'Dutch',
+			'mejs.english': 'Inglês',
+			'mejs.estonian': 'Estoniano',
+			'mejs.filipino': 'Filipino',
+			'mejs.finnish': 'Finlandês',
+			'mejs.french': 'French',
+			'mejs.galician': 'Galego',
+			'mejs.german': 'Alemão',
+			'mejs.greek': 'Grego',
+			'mejs.haitian-creole': 'Crioulo Haitiano',
+			'mejs.hebrew': 'Hebraico',
+			'mejs.hindi': 'Hindi',
+			'mejs.hungarian': 'Húngaro',
+			'mejs.icelandic': 'Islandês',
+			'mejs.indonesian': 'Indonésio',
+			'mejs.irish': 'Irish',
+			'mejs.italian': 'Italiano',
+			'mejs.japanese': 'Japonês',
+			'mejs.korean': 'Coreano',
+			'mejs.latvian': 'Letão',
+			'mejs.lithuanian': 'Lithuanian',
+			'mejs.macedonian': 'Macedônio',
+			'mejs.malay': 'Malaio',
+			'mejs.maltese': 'Maltês',
+			'mejs.norwegian': 'Norwegian',
+			'mejs.persian': 'Persa',
+			'mejs.polish': 'Polish',
+			'mejs.portuguese': 'Português',
+			'mejs.romanian': 'Romanian',
+			'mejs.russian': 'Russian',
+			'mejs.serbian': 'Sérvio',
+			'mejs.slovak': 'Slovak',
+			'mejs.slovenian': 'Slovenian',
+			'mejs.spanish': 'Espanhol',
+			'mejs.swahili': 'Swahili',
+			'mejs.swedish': 'sueco',
+			'mejs.tagalog': 'Tagalog',
+			'mejs.thai': 'Thai',
+			'mejs.turkish': 'Turco',
+			'mejs.ukrainian': 'Ucraniano',
+			'mejs.vietnamese': 'Vietnamita',
+			'mejs.welsh': 'Welsh',
+			'mejs.yiddish': 'Iídiche'
+		};
+	}
+})(mejs.i18n);

+ 90 - 0
app/Resources/public/assets/mediaelement/build/lang/ro.js

@@ -0,0 +1,90 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * Romanian
+ *
+ * @author
+ *   Jalios (Twitter: @Jalios)
+ *   Sascha Greuel (Twitter: @SoftCreatR)
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.ro === undefined) {
+		exports.ro = {
+			'mejs.plural-form': 5,			
+			'mejs.download-file': 'Descarcă fişierul',			
+			'mejs.install-flash': 'Utilizați un browser care nu are activat sau instalat playerul Flash. Porniți pluginul Flash player sau descărcați cea mai recentă versiune de la https://get.adobe.com/flashplayer/',			
+			'mejs.fullscreen': 'Ecran complet',			
+			'mejs.play': 'Redare',
+			'mejs.pause': 'Pauză',			
+			'mejs.time-slider': 'Cursor timp',
+			'mejs.time-help-text': 'Utilizează tastele săgeată Stânga/Dreapta pentru a avansa o secundă şi săgeţile Sus/Jos pentru a avansa zece secunde.',
+			'mejs.live-broadcast' : 'Difuzare în direct',			
+			'mejs.volume-help-text': 'Utilizează tastele de săgeată Sus/Jos pentru a creşte/micşora volumul',
+			'mejs.unmute': 'Cu sunet',
+			'mejs.mute': 'Fără sunet',
+			'mejs.volume-slider': 'Cursor volum',			
+			'mejs.video-player': 'Player video',
+			'mejs.audio-player': 'Player audio',			
+			'mejs.captions-subtitles': 'Legende/Subtitrări',
+			'mejs.captions-chapters': 'Capitolele',
+			'mejs.none': 'Niciunul',
+			'mejs.afrikaans': 'Afrikaans',
+			'mejs.albanian': 'Albanez',
+			'mejs.arabic': 'Arabă',
+			'mejs.belarusian': 'Belarusian',
+			'mejs.bulgarian': 'Bulgară',
+			'mejs.catalan': 'Catalană',
+			'mejs.chinese': 'Chinezesc',
+			'mejs.chinese-simplified': 'Chineză (Simplificată)',
+			'mejs.chinese-traditional': 'Chineză (Tradițională)',
+			'mejs.croatian': 'Croată',
+			'mejs.czech': 'Cehă',
+			'mejs.danish': 'Daneză',
+			'mejs.dutch': 'Olandeză',
+			'mejs.english': 'Engleză',
+			'mejs.estonian': 'Estonă',
+			'mejs.filipino': 'Filipinez',
+			'mejs.finnish': 'Finlandeză',
+			'mejs.french': 'Franceză',
+			'mejs.galician': 'Galiciană',
+			'mejs.german': 'Germană',
+			'mejs.greek': 'Greacă',
+			'mejs.haitian-creole': 'Creolele Haitiene',
+			'mejs.hebrew': 'Ebraică',
+			'mejs.hindi': 'Hindi',
+			'mejs.hungarian': 'Maghiar',
+			'mejs.icelandic': 'Islandeză',
+			'mejs.indonesian': 'Indonezian',
+			'mejs.irish': 'Irlandeză',
+			'mejs.italian': 'Italiană',
+			'mejs.japanese': 'Japoneză',
+			'mejs.korean': 'Coreeană',
+			'mejs.latvian': 'Letonă',
+			'mejs.lithuanian': 'Lituanian',
+			'mejs.macedonian': 'Macedonean',
+			'mejs.malay': 'Malay',
+			'mejs.maltese': 'Malteză',
+			'mejs.norwegian': 'Norvegiană',
+			'mejs.persian': 'Persană',
+			'mejs.polish': 'Polonez',
+			'mejs.portuguese': 'Portugheză',
+			'mejs.romanian': 'Română',
+			'mejs.russian': 'Rusă',
+			'mejs.serbian': 'Sârbă',
+			'mejs.slovak': 'Slovacă',
+			'mejs.slovenian': 'Slovenă',
+			'mejs.spanish': 'Spaniolă',
+			'mejs.swahili': 'Swahili',
+			'mejs.swedish': 'Suedeză',
+			'mejs.tagalog': 'Tagalog',
+			'mejs.thai': 'Thai',
+			'mejs.turkish': 'Turcă',
+			'mejs.ukrainian': 'Ucrainean',
+			'mejs.vietnamese': 'Vietnamez',
+			'mejs.welsh': 'Welsh',
+			'mejs.yiddish': 'Idiș'
+		};
+	}
+})(mejs.i18n);

+ 90 - 0
app/Resources/public/assets/mediaelement/build/lang/ru.js

@@ -0,0 +1,90 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * Russian
+ *
+ * @author
+ *   Jalios (Twitter: @Jalios)
+ *   Sascha Greuel (Twitter: @SoftCreatR)
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.ru === undefined) {
+		exports.ru = {
+			'mejs.plural-form': 7,			
+			'mejs.download-file': 'Скачать файл',			
+			'mejs.install-flash': 'Flash player в вашем браузере не установлен или отключен. Пожалуйста включите ваш Flash player или скачайте последнюю версию с https://get.adobe.com/flashplayer/',			
+			'mejs.fullscreen': 'Полноэкранный режим',			
+			'mejs.play': 'Воспроизвести',
+			'mejs.pause': 'Пауза',			
+			'mejs.time-slider': 'Слайдер времени',
+			'mejs.time-help-text': 'Используйте Левую/Правую клавиши со стрелками, чтобы продвинуться на одну секунду, клавиши со стрелками Вверх/Вниз, чтобы продвинуться на десять секунд.',
+			'mejs.live-broadcast' : 'Прямая трансляция',			
+			'mejs.volume-help-text': 'Используйте клавиши со стрелками Вверх/Вниз, чтобы увеличить или уменьшить громкость.',
+			'mejs.unmute': 'Включить звук',
+			'mejs.mute': 'Отключить звук',
+			'mejs.volume-slider': 'Слайдер громкости',			
+			'mejs.video-player': 'Видеоплеер',
+			'mejs.audio-player': 'Аудиоплеер',			
+			'mejs.captions-subtitles': 'Титры/Субтитры',
+			'mejs.captions-chapters': 'Главы',
+			'mejs.none': 'Нет',
+			'mejs.afrikaans': 'Африканский',
+			'mejs.albanian': 'Албанский',
+			'mejs.arabic': 'Арабский',
+			'mejs.belarusian': 'Белорусский',
+			'mejs.bulgarian': 'Болгарский',
+			'mejs.catalan': 'Каталонский',
+			'mejs.chinese': 'Китайский',
+			'mejs.chinese-simplified': 'Китайский (упрощенный)',
+			'mejs.chinese-traditional': 'Chinese (традиционный)',
+			'mejs.croatian': 'Хорватский',
+			'mejs.czech': 'Чешский',
+			'mejs.danish': 'Датский',
+			'mejs.dutch': 'Голландский',
+			'mejs.english': 'Английский',
+			'mejs.estonian': 'Эстонский',
+			'mejs.filipino': 'Филиппинский',
+			'mejs.finnish': 'Финский',
+			'mejs.french': 'Французский',
+			'mejs.galician': 'Галисийский',
+			'mejs.german': 'Немецкий',
+			'mejs.greek': 'Греческий',
+			'mejs.haitian-creole': 'Гаитянский креольский',
+			'mejs.hebrew': 'Иврит',
+			'mejs.hindi': 'Хинди',
+			'mejs.hungarian': 'Венгерский',
+			'mejs.icelandic': 'Исландский',
+			'mejs.indonesian': 'Индонезийский',
+			'mejs.irish': 'Ирландский',
+			'mejs.italian': 'Итальянский',
+			'mejs.japanese': 'Японский',
+			'mejs.korean': 'Корейский',
+			'mejs.latvian': 'Латышский',
+			'mejs.lithuanian': 'Литовский',
+			'mejs.macedonian': 'Македонский',
+			'mejs.malay': 'Малайский',
+			'mejs.maltese': 'Мальтийский',
+			'mejs.norwegian': 'Норвежский',
+			'mejs.persian': 'Персидский',
+			'mejs.polish': 'Польский',
+			'mejs.portuguese': 'Португальский',
+			'mejs.romanian': 'Румынский',
+			'mejs.russian': 'Русский',
+			'mejs.serbian': 'Сербский',
+			'mejs.slovak': 'Словацкий',
+			'mejs.slovenian': 'Словенский',
+			'mejs.spanish': 'Испанский',
+			'mejs.swahili': 'Суахили',
+			'mejs.swedish': 'Шведский',
+			'mejs.tagalog': 'Тагальский',
+			'mejs.thai': 'Тайский',
+			'mejs.turkish': 'Турецкий',
+			'mejs.ukrainian': 'Украинский',
+			'mejs.vietnamese': 'Вьетнамский',
+			'mejs.welsh': 'Валлийский',
+			'mejs.yiddish': 'Идиш'
+		};
+	}
+})(mejs.i18n);

+ 90 - 0
app/Resources/public/assets/mediaelement/build/lang/sk.js

@@ -0,0 +1,90 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * Slovak
+ *
+ * @author
+ *   Jalios (Twitter: @Jalios)
+ *   Sascha Greuel (Twitter: @SoftCreatR)
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.sk === undefined) {
+		exports.sk = {
+			'mejs.plural-form': 8,			
+			'mejs.download-file': 'Prevziať súbor',			
+			'mejs.install-flash': 'Používate prehliadač, ktorý nemá povolený alebo nainštalovaný prehrávač Flash. Zapnite doplnok prehrávača Flash alebo si prevezmite najnovšiu verziu zo stránky https://get.adobe.com/flashplayer/',			
+			'mejs.fullscreen': 'Celá obrazovka',			
+			'mejs.play': 'Prehrať',
+			'mejs.pause': 'Pozastaviť',			
+			'mejs.time-slider': 'Posúvač času',
+			'mejs.time-help-text': 'Klávesmi so šípkou doľava/doprava posuniete o jednu sekundu, šípkami nahor/ nadol posuniete o desať sekúnd.',
+			'mejs.live-broadcast' : 'Živé vysielanie',			
+			'mejs.volume-help-text': 'Klávesmi so šípkou nahor/nadol zvýšite alebo znížite hlasitosť.',
+			'mejs.unmute': 'Zrušiť stlmenie',
+			'mejs.mute': 'Stlmiť',
+			'mejs.volume-slider': 'Posúvač hlasitosti',			
+			'mejs.video-player': 'Prehrávač videa',
+			'mejs.audio-player': 'Prehrávač zvuku',			
+			'mejs.captions-subtitles': 'Skryté titulky/Titulky',
+			'mejs.captions-chapters': 'Kapitoly',
+			'mejs.none': 'Žiadne',
+			'mejs.afrikaans': 'Afrikaans',
+			'mejs.albanian': 'Albánsky',
+			'mejs.arabic': 'Arabčina',
+			'mejs.belarusian': 'Bieloruský',
+			'mejs.bulgarian': 'Bulharčina',
+			'mejs.catalan': 'Katalánsky',
+			'mejs.chinese': 'čínština',
+			'mejs.chinese-simplified': 'Čínsky (Zjednodušený)',
+			'mejs.chinese-traditional': 'čínsky (Tradičný)',
+			'mejs.croatian': 'Chorvátčina',
+			'mejs.czech': 'čeština',
+			'mejs.danish': 'Dánsky',
+			'mejs.dutch': 'Holandský',
+			'mejs.english': 'Angličtina',
+			'mejs.estonian': 'Estónčina',
+			'mejs.filipino': 'Filipínsky',
+			'mejs.finnish': 'Fínčina',
+			'mejs.french': 'Francúzština',
+			'mejs.galician': 'Galicijčan',
+			'mejs.german': 'Nemčina',
+			'mejs.greek': 'Gréčtina',
+			'mejs.haitian-creole': 'Haitian Kreolský',
+			'mejs.hebrew': 'Hebrejčina',
+			'mejs.hindi': 'Hindčina',
+			'mejs.hungarian': 'Maďarčina',
+			'mejs.icelandic': 'Islandský',
+			'mejs.indonesian': 'Indonézsky',
+			'mejs.irish': 'Írsky',
+			'mejs.italian': 'Taliančina',
+			'mejs.japanese': 'Japonský',
+			'mejs.korean': 'Kórejský',
+			'mejs.latvian': 'Lotyština',
+			'mejs.lithuanian': 'Litovský',
+			'mejs.macedonian': 'Macedónsky',
+			'mejs.malay': 'Malajský',
+			'mejs.maltese': 'Maltčina',
+			'mejs.norwegian': 'Nórsky',
+			'mejs.persian': 'Perzský',
+			'mejs.polish': 'poľština',
+			'mejs.portuguese': 'Portugalčina',
+			'mejs.romanian': 'Rumunčina',
+			'mejs.russian': 'Ruský',
+			'mejs.serbian': 'Srbský',
+			'mejs.slovak': 'Slovenský',
+			'mejs.slovenian': 'Slovinský',
+			'mejs.spanish': 'španielčina',
+			'mejs.swahili': 'Swahili',
+			'mejs.swedish': 'švédčina',
+			'mejs.tagalog': 'Tagalog',
+			'mejs.thai': 'Thai',
+			'mejs.turkish': 'Turecký',
+			'mejs.ukrainian': 'Ukrajinský',
+			'mejs.vietnamese': 'Vietnamčina',
+			'mejs.welsh': 'Welsh',
+			'mejs.yiddish': 'Jidiš'
+		};
+	}
+})(mejs.i18n);

+ 89 - 0
app/Resources/public/assets/mediaelement/build/lang/sv.js

@@ -0,0 +1,89 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * Swedish
+ *
+ * @author
+ *   Petter (Twitter: @petter_j)
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.sv === undefined) {
+		exports.sv = {
+			'mejs.plural-form': 1,			
+			'mejs.download-file': 'Ladda ner fil',			
+			'mejs.install-flash': 'Du använder en webbläsare som inte har Flash Player aktiverat eller installerad. Aktivera Flash Player eller hämta den senaste versionen från https://get.adobe.com/flashplayer/',			
+			'mejs.fullscreen': 'Fullskärm',			
+			'mejs.play': 'Spela',
+			'mejs.pause': 'Pausa',			
+			'mejs.time-slider': 'Tidslinje',
+			'mejs.time-help-text': 'Använd Vänster/Höger piltangent för att spola en sekund, Upp/Ner piltangent spola tio sekunder.',
+			'mejs.live-broadcast': 'Livesändning',			
+			'mejs.volume-help-text': 'Använd Upp/Ner piltangent för att öka eller minska volymen.',
+			'mejs.unmute': 'Ljud på',
+			'mejs.mute': 'Ljud av',
+			'mejs.volume-slider': 'Volymkontroll',			
+			'mejs.video-player': 'Videospelare',
+			'mejs.audio-player': 'Ljudspelare',			
+			'mejs.captions-subtitles': 'Textning/Undertexter',
+			'mejs.captions-chapters': 'Kapitel',
+			'mejs.none': 'Ingen',
+			'mejs.afrikaans': 'Afrikaans',
+			'mejs.albanian': 'Albanska',
+			'mejs.arabic': 'Arabiska',
+			'mejs.belarusian': 'Nederländska',
+			'mejs.bulgarian': 'Bulgariska',
+			'mejs.catalan': 'Katalanska',
+			'mejs.chinese': 'Kinesiska',
+			'mejs.chinese-simplified': 'Kinesiska (Förenklad)',
+			'mejs.chinese-traditional': 'Kinesiska (Traditionell)',
+			'mejs.croatian': 'Kroatiska',
+			'mejs.czech': 'Tjeckiska',
+			'mejs.danish': 'Danska',
+			'mejs.dutch': 'Holländska',
+			'mejs.english': 'Engelska',
+			'mejs.estonian': 'Estniska',
+			'mejs.filipino': 'Filipinska',
+			'mejs.finnish': 'Finska',
+			'mejs.french': 'Franska',
+			'mejs.galician': 'Galiciska',
+			'mejs.german': 'Tyska',
+			'mejs.greek': 'Grekiska',
+			'mejs.haitian-creole': 'Haitisk kreolsk',
+			'mejs.hebrew': 'Hebreiska',
+			'mejs.hindi': 'Hindi',
+			'mejs.hungarian': 'Ungerska',
+			'mejs.icelandic': 'Isländska',
+			'mejs.indonesian': 'Indonesiska',
+			'mejs.irish': 'Irländska',
+			'mejs.italian': 'Italienska',
+			'mejs.japanese': 'Japanska',
+			'mejs.korean': 'Koreanska',
+			'mejs.latvian': 'Lettiska',
+			'mejs.lithuanian': 'Litauiska',
+			'mejs.macedonian': 'Makedonska',
+			'mejs.malay': 'Malaysiska',
+			'mejs.maltese': 'Maltesiska',
+			'mejs.norwegian': 'Norska',
+			'mejs.persian': 'Persiska',
+			'mejs.polish': 'Polska',
+			'mejs.portuguese': 'Portugisiska',
+			'mejs.romanian': 'Romänska',
+			'mejs.russian': 'Ryska',
+			'mejs.serbian': 'Serbiska',
+			'mejs.slovak': 'Slovakiska',
+			'mejs.slovenian': 'Slovenska',
+			'mejs.spanish': 'Spanska',
+			'mejs.swahili': 'Swahiliska',
+			'mejs.swedish': 'Svenska',
+			'mejs.tagalog': 'Tagalogiska',
+			'mejs.thai': 'Thailänska',
+			'mejs.turkish': 'Turkiska',
+			'mejs.ukrainian': 'Ukrainska',
+			'mejs.vietnamese': 'Vietnamesiska',
+			'mejs.welsh': 'Skotska',
+			'mejs.yiddish': 'Jiddisch'
+		};
+	}
+})(mejs.i18n);

+ 89 - 0
app/Resources/public/assets/mediaelement/build/lang/uk.js

@@ -0,0 +1,89 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * Ukrainian
+ *
+ * @author
+ *   Dmitry Krekota (dmitry.krekota@gmail.com)
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.uk === undefined) {
+		exports.uk = {
+			'mejs.plural-form': 7,			
+			'mejs.download-file': 'Завантажити файл',			
+			'mejs.install-flash': 'Flash Player у вашому браузері не встановлений або відключений. Будь ласка включіть Flash Player або скачайте останню версію із https://get.adobe.com/flashplayer/',			
+			'mejs.fullscreen': 'Повноекранний режим',			
+			'mejs.play': 'Пуск',
+			'mejs.pause': 'Пауза',			
+			'mejs.time-slider': 'Повзунок часу',
+			'mejs.time-help-text': 'Використовуйте ліву/праву клавіші зі стрілками, щоб переміститися на одну секунду, або клавіші вверх/вниз, щоб переміститися на десять секунд.',
+			'mejs.live-broadcast' : 'Пряма трансляція',			
+			'mejs.volume-help-text': 'Використовуйте клавіші зі стрілками вверх/вниз, щоб збільшити або зменшити звук.',
+			'mejs.unmute': 'Включити звук',
+			'mejs.mute': 'Відключити звук',
+			'mejs.volume-slider': 'Повзунок звуку',			
+			'mejs.video-player': 'Відеоплеєр',
+			'mejs.audio-player': 'Аудіоплеєр',			
+			'mejs.captions-subtitles': 'Титри/Субтитри',
+			'mejs.captions-chapters': 'Глави',
+			'mejs.none': 'Немає',
+			'mejs.afrikaans': 'Африкаанс',
+			'mejs.albanian': 'Албанська',
+			'mejs.arabic': 'Арабська',
+			'mejs.belarusian': 'Білоруська',
+			'mejs.bulgarian': 'Болгарська',
+			'mejs.catalan': 'Каталонська',
+			'mejs.chinese': 'Китайська',
+			'mejs.chinese-simplified': 'Китайська (спрощена)',
+			'mejs.chinese-traditional': 'Китайська (традиційна)',
+			'mejs.croatian': 'Хорватска',
+			'mejs.czech': 'Чеська',
+			'mejs.danish': 'Дацька',
+			'mejs.dutch': 'Голландська',
+			'mejs.english': 'Английська',
+			'mejs.estonian': 'Естонська',
+			'mejs.filipino': 'Філіппінська',
+			'mejs.finnish': 'Фінська',
+			'mejs.french': 'Французька',
+			'mejs.galician': 'Галісійська',
+			'mejs.german': 'Німецька',
+			'mejs.greek': 'Грецька',
+			'mejs.haitian-creole': 'Гаїтянська креольська',
+			'mejs.hebrew': 'Іврит',
+			'mejs.hindi': 'Хінді',
+			'mejs.hungarian': 'Угорська',
+			'mejs.icelandic': 'Ісландська',
+			'mejs.indonesian': 'Індонезійська',
+			'mejs.irish': 'Ірландська',
+			'mejs.italian': 'Італійська',
+			'mejs.japanese': 'Японська',
+			'mejs.korean': 'Корейська',
+			'mejs.latvian': 'Латвійська',
+			'mejs.lithuanian': 'Литовська',
+			'mejs.macedonian': 'Македонська',
+			'mejs.malay': 'Малайська',
+			'mejs.maltese': 'Мальтійська',
+			'mejs.norwegian': 'Норвезька',
+			'mejs.persian': 'Перська',
+			'mejs.polish': 'Польська',
+			'mejs.portuguese': 'Португальська',
+			'mejs.romanian': 'Румунська',
+			'mejs.russian': 'Російська',
+			'mejs.serbian': 'Сербська',
+			'mejs.slovak': 'Словацька',
+			'mejs.slovenian': 'Словенська',
+			'mejs.spanish': 'Іспанська',
+			'mejs.swahili': 'Суахілі',
+			'mejs.swedish': 'Шведська',
+			'mejs.tagalog': 'Тагальська',
+			'mejs.thai': 'Тайська',
+			'mejs.turkish': 'Турецька',
+			'mejs.ukrainian': 'Українська',
+			'mejs.vietnamese': 'В\'єтнамська',
+			'mejs.welsh': 'Валлійська',
+			'mejs.yiddish': 'Ідиш'
+		};
+	}
+})(mejs.i18n);

+ 90 - 0
app/Resources/public/assets/mediaelement/build/lang/zh-cn.js

@@ -0,0 +1,90 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * Chinese (Simplified)
+ *
+ * @author
+ *   Jalios (Twitter: @Jalios)
+ *   Sascha Greuel (Twitter: @SoftCreatR)
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports['zh-CN'] === undefined) {
+		exports['zh-CN'] = {
+			'mejs.plural-form': 0,			
+			'mejs.download-file': '下载文件',			
+			'mejs.install-flash': '您正在使用未启用或安装Flash播放器的浏览器。请打开您的Flash Player插件,或从https://get.adobe.com/flashplayer/下载最新版本',			
+			'mejs.fullscreen': '全屏',			
+			'mejs.play': '播放',
+			'mejs.pause': '暂停',			
+			'mejs.time-slider': '时间滑动棒',
+			'mejs.time-help-text': '使用作/右箭头快进1秒,使用上/下箭头快进10秒。',
+			'mejs.live-broadcast' : '现场直播',			
+			'mejs.volume-help-text': '使用上/下箭头提高或降低音量。',
+			'mejs.unmute': '取消静音',
+			'mejs.mute': '静音',
+			'mejs.volume-slider': '音量选择键',			
+			'mejs.video-player': '视频播放器',
+			'mejs.audio-player': '音频播放器',			
+			'mejs.captions-subtitles': '字幕/标题',
+			'mejs.captions-chapters': '章',
+			'mejs.none': '无',
+			'mejs.afrikaans': '南非荷兰语',
+			'mejs.albanian': '阿尔巴尼亚人',
+			'mejs.arabic': '阿拉伯语',
+			'mejs.belarusian': '白俄罗斯',
+			'mejs.bulgarian': '保加利亚语',
+			'mejs.catalan': '加泰罗尼亚语',
+			'mejs.chinese': '中国',
+			'mejs.chinese-simplified': '中文(简体)',
+			'mejs.chinese-traditional': '中国(传统)',
+			'mejs.croatian': '克罗地亚语',
+			'mejs.czech': '捷克',
+			'mejs.danish': '丹麦语',
+			'mejs.dutch': '荷兰人',
+			'mejs.english': '英语',
+			'mejs.estonian': '爱沙尼亚语',
+			'mejs.filipino': '菲律宾',
+			'mejs.finnish': '芬兰语',
+			'mejs.french': '法语',
+			'mejs.galician': '加利西亚',
+			'mejs.german': '德语',
+			'mejs.greek': '希腊语',
+			'mejs.haitian-creole': '海地克里奥尔人',
+			'mejs.hebrew': '希伯来语',
+			'mejs.hindi': '印地语',
+			'mejs.hungarian': '匈牙利',
+			'mejs.icelandic': '冰岛',
+			'mejs.indonesian': '印尼语',
+			'mejs.irish': '爱尔兰',
+			'mejs.italian': '意大利语',
+			'mejs.japanese': '日本',
+			'mejs.korean': '韩国人',
+			'mejs.latvian': '拉脱维亚人',
+			'mejs.lithuanian': '立陶宛语',
+			'mejs.macedonian': '马其顿',
+			'mejs.malay': '马来语',
+			'mejs.maltese': '马耳他',
+			'mejs.norwegian': '挪威语',
+			'mejs.persian': '波斯人',
+			'mejs.polish': '波兰语',
+			'mejs.portuguese': '葡萄牙语',
+			'mejs.romanian': '罗马尼亚语',
+			'mejs.russian': '俄罗斯',
+			'mejs.serbian': '塞尔维亚人',
+			'mejs.slovak': '斯洛伐克语',
+			'mejs.slovenian': '斯洛文尼亚语',
+			'mejs.spanish': '西班牙语',
+			'mejs.swahili': '斯瓦希里语',
+			'mejs.swedish': '瑞典语',
+			'mejs.tagalog': '他加禄语',
+			'mejs.thai': '泰国',
+			'mejs.turkish': '土耳其语',
+			'mejs.ukrainian': '乌克兰',
+			'mejs.vietnamese': '越南人',
+			'mejs.welsh': '威尔士',
+			'mejs.yiddish': '意第绪语'
+		};
+	}
+})(mejs.i18n);

+ 91 - 0
app/Resources/public/assets/mediaelement/build/lang/zh.js

@@ -0,0 +1,91 @@
+'use strict';/*!
+ * This is a `i18n` language object.
+ *
+ * Chinese (Traditional)
+ *
+ * @author
+ *   Jalios (Twitter: @Jalios)
+ *   Sascha Greuel (Twitter: @SoftCreatR)
+ *   Peter Dave Hello (Twitter: @PeterDaveHello)
+ *
+ * @see core/i18n.js
+ */
+(function (exports) {
+	if (exports.zh === undefined) {
+		exports.zh = {
+			'mejs.plural-form': 0,			
+			'mejs.download-file': '下載檔案',			
+			'mejs.install-flash': '您正在使用未啟用或安裝Flash播放器的瀏覽器。請打開您的Flash Player插件,或從https://get.adobe.com/flashplayer/下載最新版本',			
+			'mejs.fullscreen': '全螢幕',			
+			'mejs.play': '播放',
+			'mejs.pause': '暫停',			
+			'mejs.time-slider': '時間軸',
+			'mejs.time-help-text': '使用左/右箭頭快轉1秒,上/下箭頭快轉10秒。',
+			'mejs.live-broadcast' : '現場直播',			
+			'mejs.volume-help-text': '使用上/下箭頭提高或降低音量。',
+			'mejs.unmute': '取消靜音',
+			'mejs.mute': '靜音',
+			'mejs.volume-slider': '音量控制鍵',			
+			'mejs.video-player': '影片播放器',
+			'mejs.audio-player': '音樂播放器',			
+			'mejs.captions-subtitles': '字幕/標題',
+			'mejs.captions-chapters': '章節',
+			'mejs.none': '無',
+			'mejs.afrikaans': '南非荷蘭語',
+			'mejs.albanian': '阿爾巴尼亞人',
+			'mejs.arabic': '阿拉伯語',
+			'mejs.belarusian': '白俄羅斯',
+			'mejs.bulgarian': '保加利亞語',
+			'mejs.catalan': '加泰羅尼亞語',
+			'mejs.chinese': '中文',
+			'mejs.chinese-simplified': '简体中文',
+			'mejs.chinese-traditional': '正體中文',
+			'mejs.croatian': '克羅地亞語',
+			'mejs.czech': '捷克',
+			'mejs.danish': '丹麥語',
+			'mejs.dutch': '荷蘭人',
+			'mejs.english': '英語',
+			'mejs.estonian': '愛沙尼亞語',
+			'mejs.filipino': '菲律賓',
+			'mejs.finnish': '芬蘭語',
+			'mejs.french': '法語',
+			'mejs.galician': '加利西亞',
+			'mejs.german': '德語',
+			'mejs.greek': '希臘語',
+			'mejs.haitian-creole': '海地克里奧爾人',
+			'mejs.hebrew': '希伯來語',
+			'mejs.hindi': '印地語',
+			'mejs.hungarian': '匈牙利',
+			'mejs.icelandic': '冰島',
+			'mejs.indonesian': '印尼語',
+			'mejs.irish': '愛爾蘭',
+			'mejs.italian': '意大利語',
+			'mejs.japanese': '日本',
+			'mejs.korean': '韓國人',
+			'mejs.latvian': '拉脫維亞人',
+			'mejs.lithuanian': '立陶宛語',
+			'mejs.macedonian': '馬其頓',
+			'mejs.malay': '馬來語',
+			'mejs.maltese': '馬耳他',
+			'mejs.norwegian': '挪威語',
+			'mejs.persian': '波斯人',
+			'mejs.polish': '波蘭語',
+			'mejs.portuguese': '葡萄牙語',
+			'mejs.romanian': '羅馬尼亞語',
+			'mejs.russian': '俄羅斯',
+			'mejs.serbian': '塞爾維亞人',
+			'mejs.slovak': '斯洛伐克語',
+			'mejs.slovenian': '斯洛文尼亞語',
+			'mejs.spanish': '西班牙語',
+			'mejs.swahili': '斯瓦希里語',
+			'mejs.swedish': '瑞典語',
+			'mejs.tagalog': '他加祿語',
+			'mejs.thai': '泰國',
+			'mejs.turkish': '土耳其語',
+			'mejs.ukrainian': '烏克蘭',
+			'mejs.vietnamese': '越南人',
+			'mejs.welsh': '威爾士',
+			'mejs.yiddish': '意第緒語'
+		};
+	}
+})(mejs.i18n);

BIN
app/Resources/public/assets/mediaelement/build/loading.gif


+ 7440 - 5840
app/Resources/public/assets/mediaelement/build/mediaelement-and-player.js

@@ -1,6655 +1,8255 @@
 /*!
- *
  * MediaElement.js
- * HTML5 <video> and <audio> shim and player
- * http://mediaelementjs.com/
+ * http://www.mediaelementjs.com/
  *
- * Creates a JavaScript object that mimics HTML5 MediaElement API
- * for browsers that don't understand HTML5 or can't play the provided codec
- * Can play MP4 (H.264), Ogg, WebM, FLV, WMV, WMA, ACC, and MP3
+ * Wrapper that mimics native HTML5 MediaElement (audio and video)
+ * using a variety of technologies (pure JavaScript, Flash, iframe)
  *
- * Copyright 2010-2014, John Dyer (http://j.hn)
+ * Copyright 2010-2017, John Dyer (http://j.hn/)
  * License: MIT
  *
- */
-// Namespace
-var mejs = mejs || {};
-
-// version number
-mejs.version = '2.23.5';
-
-
-// player number (for missing, same id attr)
-mejs.meIndex = 0;
-
-// media types accepted by plugins
-mejs.plugins = {
-	silverlight: [
-		{version: [3,0], types: ['video/mp4','video/m4v','video/mov','video/wmv','audio/wma','audio/m4a','audio/mp3','audio/wav','audio/mpeg']}
-	],
-	flash: [
-		{version: [9,0,124], types: ['video/mp4','video/m4v','video/mov','video/flv','video/rtmp','video/x-flv','audio/flv','audio/x-flv','audio/mp3','audio/m4a', 'audio/mp4', 'audio/mpeg', 'video/dailymotion', 'video/x-dailymotion', 'application/x-mpegURL', 'audio/ogg']}
-		// 'video/youtube', 'video/x-youtube', 
-		// ,{version: [12,0], types: ['video/webm']} // for future reference (hopefully!)
-	],
-	youtube: [
-		{version: null, types: ['video/youtube', 'video/x-youtube', 'audio/youtube', 'audio/x-youtube']}
-	],
-	vimeo: [
-		{version: null, types: ['video/vimeo', 'video/x-vimeo']}
-	]
-};
+ */(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){
 
-/*
-Utility methods
-*/
-mejs.Utility = {
-	encodeUrl: function(url) {
-		return encodeURIComponent(url); //.replace(/\?/gi,'%3F').replace(/=/gi,'%3D').replace(/&/gi,'%26');
-	},
-	escapeHTML: function(s) {
-		return s.toString().split('&').join('&amp;').split('<').join('&lt;').split('"').join('&quot;');
-	},
-	absolutizeUrl: function(url) {
-		var el = document.createElement('div');
-		el.innerHTML = '<a href="' + this.escapeHTML(url) + '">x</a>';
-		return el.firstChild.href;
-	},
-	getScriptPath: function(scriptNames) {
-		var
-			i = 0,
-			j,
-			codePath = '',
-			testname = '',
-			slashPos,
-			filenamePos,
-			scriptUrl,
-			scriptPath,			
-			scriptFilename,
-			scripts = document.getElementsByTagName('script'),
-			il = scripts.length,
-			jl = scriptNames.length;
-			
-		// go through all <script> tags
-		for (; i < il; i++) {
-			scriptUrl = scripts[i].src;
-			slashPos = scriptUrl.lastIndexOf('/');
-			if (slashPos > -1) {
-				scriptFilename = scriptUrl.substring(slashPos + 1);
-				scriptPath = scriptUrl.substring(0, slashPos + 1);
-			} else {
-				scriptFilename = scriptUrl;
-				scriptPath = '';			
-			}
-			
-			// see if any <script> tags have a file name that matches the 
-			for (j = 0; j < jl; j++) {
-				testname = scriptNames[j];
-				filenamePos = scriptFilename.indexOf(testname);
-				if (filenamePos > -1) {
-					codePath = scriptPath;
-					break;
-				}
-			}
-			
-			// if we found a path, then break and return it
-			if (codePath !== '') {
-				break;
-			}
-		}
-		
-		// send the best path back
-		return codePath;
-	},
-	/*
-	 * Calculate the time format to use. We have a default format set in the
-	 * options but it can be imcomplete. We ajust it according to the media
-	 * duration.
-	 *
-	 * We support format like 'hh:mm:ss:ff'.
-	 */
-	calculateTimeFormat: function(time, options, fps) {
-		if (time < 0) {
-			time = 0;
-		}
-
-		if(typeof fps == 'undefined') {
-		    fps = 25;
-		}
-
-		var format = options.timeFormat,
-			firstChar = format[0],
-			firstTwoPlaces = (format[1] == format[0]),
-			separatorIndex = firstTwoPlaces? 2: 1,
-			separator = ':',
-			hours = Math.floor(time / 3600) % 24,
-			minutes = Math.floor(time / 60) % 60,
-			seconds = Math.floor(time % 60),
-			frames = Math.floor(((time % 1)*fps).toFixed(3)),
-			lis = [
-				[frames, 'f'],
-				[seconds, 's'],
-				[minutes, 'm'],
-				[hours, 'h']
-			];
-
-		// Try to get the separator from the format
-		if (format.length < separatorIndex) {
-			separator = format[separatorIndex];
-		}
-
-		var required = false;
-
-		for (var i=0, len=lis.length; i < len; i++) {
-			if (format.indexOf(lis[i][1]) !== -1) {
-				required=true;
-			}
-			else if (required) {
-				var hasNextValue = false;
-				for (var j=i; j < len; j++) {
-					if (lis[j][0] > 0) {
-						hasNextValue = true;
-						break;
-					}
-				}
+},{}],2:[function(_dereq_,module,exports){
+(function (global){
+var topLevel = typeof global !== 'undefined' ? global :
+    typeof window !== 'undefined' ? window : {}
+var minDoc = _dereq_(1);
 
-				if (! hasNextValue) {
-					break;
-				}
+var doccy;
 
-				if (!firstTwoPlaces) {
-					format = firstChar + format;
-				}
-				format = lis[i][1] + separator + format;
-				if (firstTwoPlaces) {
-					format = lis[i][1] + format;
-				}
-				firstChar = lis[i][1];
-			}
-		}
-		options.currentTimeFormat = format;
-	},
-	/*
-	 * Prefix the given number by zero if it is lower than 10.
-	 */
-	twoDigitsString: function(n) {
-		if (n < 10) {
-			return '0' + n;
-		}
-		return String(n);
-	},
-	secondsToTimeCode: function(time, options) {
-		if (time < 0) {
-			time = 0;
-		}
+if (typeof document !== 'undefined') {
+    doccy = document;
+} else {
+    doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];
 
-		// Maintain backward compatibility with method signature before v2.18.
-		if (typeof options !== 'object') {
-			var format = 'm:ss';
-			format = arguments[1] ? 'hh:mm:ss' : format; // forceHours
-			format = arguments[2] ? format + ':ff' : format; // showFrameCount
+    if (!doccy) {
+        doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;
+    }
+}
 
-			options = {
-				currentTimeFormat: format,
-				framesPerSecond: arguments[3] || 25
-			};
-		}
+module.exports = doccy;
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"1":1}],3:[function(_dereq_,module,exports){
+(function (global){
+var win;
+
+if (typeof window !== "undefined") {
+    win = window;
+} else if (typeof global !== "undefined") {
+    win = global;
+} else if (typeof self !== "undefined"){
+    win = self;
+} else {
+    win = {};
+}
 
-		var fps = options.framesPerSecond;
-		if(typeof fps === 'undefined') {
-			fps = 25;
-		}
+module.exports = win;
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],4:[function(_dereq_,module,exports){
+(function (root) {
+
+  // Store setTimeout reference so promise-polyfill will be unaffected by
+  // other code modifying setTimeout (like sinon.useFakeTimers())
+  var setTimeoutFunc = setTimeout;
+
+  function noop() {}
+  
+  // Polyfill for Function.prototype.bind
+  function bind(fn, thisArg) {
+    return function () {
+      fn.apply(thisArg, arguments);
+    };
+  }
+
+  function Promise(fn) {
+    if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new');
+    if (typeof fn !== 'function') throw new TypeError('not a function');
+    this._state = 0;
+    this._handled = false;
+    this._value = undefined;
+    this._deferreds = [];
+
+    doResolve(fn, this);
+  }
+
+  function handle(self, deferred) {
+    while (self._state === 3) {
+      self = self._value;
+    }
+    if (self._state === 0) {
+      self._deferreds.push(deferred);
+      return;
+    }
+    self._handled = true;
+    Promise._immediateFn(function () {
+      var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
+      if (cb === null) {
+        (self._state === 1 ? resolve : reject)(deferred.promise, self._value);
+        return;
+      }
+      var ret;
+      try {
+        ret = cb(self._value);
+      } catch (e) {
+        reject(deferred.promise, e);
+        return;
+      }
+      resolve(deferred.promise, ret);
+    });
+  }
+
+  function resolve(self, newValue) {
+    try {
+      // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
+      if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.');
+      if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
+        var then = newValue.then;
+        if (newValue instanceof Promise) {
+          self._state = 3;
+          self._value = newValue;
+          finale(self);
+          return;
+        } else if (typeof then === 'function') {
+          doResolve(bind(then, newValue), self);
+          return;
+        }
+      }
+      self._state = 1;
+      self._value = newValue;
+      finale(self);
+    } catch (e) {
+      reject(self, e);
+    }
+  }
+
+  function reject(self, newValue) {
+    self._state = 2;
+    self._value = newValue;
+    finale(self);
+  }
+
+  function finale(self) {
+    if (self._state === 2 && self._deferreds.length === 0) {
+      Promise._immediateFn(function() {
+        if (!self._handled) {
+          Promise._unhandledRejectionFn(self._value);
+        }
+      });
+    }
+
+    for (var i = 0, len = self._deferreds.length; i < len; i++) {
+      handle(self, self._deferreds[i]);
+    }
+    self._deferreds = null;
+  }
+
+  function Handler(onFulfilled, onRejected, promise) {
+    this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
+    this.onRejected = typeof onRejected === 'function' ? onRejected : null;
+    this.promise = promise;
+  }
+
+  /**
+   * Take a potentially misbehaving resolver function and make sure
+   * onFulfilled and onRejected are only called once.
+   *
+   * Makes no guarantees about asynchrony.
+   */
+  function doResolve(fn, self) {
+    var done = false;
+    try {
+      fn(function (value) {
+        if (done) return;
+        done = true;
+        resolve(self, value);
+      }, function (reason) {
+        if (done) return;
+        done = true;
+        reject(self, reason);
+      });
+    } catch (ex) {
+      if (done) return;
+      done = true;
+      reject(self, ex);
+    }
+  }
+
+  Promise.prototype['catch'] = function (onRejected) {
+    return this.then(null, onRejected);
+  };
+
+  Promise.prototype.then = function (onFulfilled, onRejected) {
+    var prom = new (this.constructor)(noop);
+
+    handle(this, new Handler(onFulfilled, onRejected, prom));
+    return prom;
+  };
+
+  Promise.all = function (arr) {
+    var args = Array.prototype.slice.call(arr);
+
+    return new Promise(function (resolve, reject) {
+      if (args.length === 0) return resolve([]);
+      var remaining = args.length;
+
+      function res(i, val) {
+        try {
+          if (val && (typeof val === 'object' || typeof val === 'function')) {
+            var then = val.then;
+            if (typeof then === 'function') {
+              then.call(val, function (val) {
+                res(i, val);
+              }, reject);
+              return;
+            }
+          }
+          args[i] = val;
+          if (--remaining === 0) {
+            resolve(args);
+          }
+        } catch (ex) {
+          reject(ex);
+        }
+      }
+
+      for (var i = 0; i < args.length; i++) {
+        res(i, args[i]);
+      }
+    });
+  };
+
+  Promise.resolve = function (value) {
+    if (value && typeof value === 'object' && value.constructor === Promise) {
+      return value;
+    }
+
+    return new Promise(function (resolve) {
+      resolve(value);
+    });
+  };
+
+  Promise.reject = function (value) {
+    return new Promise(function (resolve, reject) {
+      reject(value);
+    });
+  };
+
+  Promise.race = function (values) {
+    return new Promise(function (resolve, reject) {
+      for (var i = 0, len = values.length; i < len; i++) {
+        values[i].then(resolve, reject);
+      }
+    });
+  };
+
+  // Use polyfill for setImmediate for performance gains
+  Promise._immediateFn = (typeof setImmediate === 'function' && function (fn) { setImmediate(fn); }) ||
+    function (fn) {
+      setTimeoutFunc(fn, 0);
+    };
+
+  Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {
+    if (typeof console !== 'undefined' && console) {
+      console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console
+    }
+  };
+
+  /**
+   * Set the immediate function to execute callbacks
+   * @param fn {function} Function to execute
+   * @deprecated
+   */
+  Promise._setImmediateFn = function _setImmediateFn(fn) {
+    Promise._immediateFn = fn;
+  };
+
+  /**
+   * Change the function to execute on unhandled rejection
+   * @param {function} fn Function to execute on unhandled rejection
+   * @deprecated
+   */
+  Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {
+    Promise._unhandledRejectionFn = fn;
+  };
+  
+  if (typeof module !== 'undefined' && module.exports) {
+    module.exports = Promise;
+  } else if (!root.Promise) {
+    root.Promise = Promise;
+  }
+
+})(this);
+
+},{}],5:[function(_dereq_,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _mejs = _dereq_(7);
+
+var _mejs2 = _interopRequireDefault(_mejs);
+
+var _en = _dereq_(15);
+
+var _general = _dereq_(27);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var i18n = { lang: 'en', en: _en.EN };
 
-		var format = options.currentTimeFormat,
-			hours = Math.floor(time / 3600) % 24,
-			minutes = Math.floor(time / 60) % 60,
-			seconds = Math.floor(time % 60),
-			frames = Math.floor(((time % 1)*fps).toFixed(3));
-			lis = [
-				[frames, 'f'],
-				[seconds, 's'],
-				[minutes, 'm'],
-				[hours, 'h']
-			];
+i18n.language = function () {
+	for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+		args[_key] = arguments[_key];
+	}
+
+	if (args !== null && args !== undefined && args.length) {
 
-		var res = format;
-		for (i=0,len=lis.length; i < len; i++) {
-			res = res.replace(lis[i][1]+lis[i][1], this.twoDigitsString(lis[i][0]));
-			res = res.replace(lis[i][1], lis[i][0]);
+		if (typeof args[0] !== 'string') {
+			throw new TypeError('Language code must be a string value');
 		}
-		return res;
-	},
-	
-	timeCodeToSeconds: function(hh_mm_ss_ff, forceHours, showFrameCount, fps){
-		if (typeof showFrameCount == 'undefined') {
-		    showFrameCount=false;
-		} else if(typeof fps == 'undefined') {
-		    fps = 25;
-		}
-	
-		var tc_array = hh_mm_ss_ff.split(":"),
-			tc_hh = parseInt(tc_array[0], 10),
-			tc_mm = parseInt(tc_array[1], 10),
-			tc_ss = parseInt(tc_array[2], 10),
-			tc_ff = 0,
-			tc_in_seconds = 0;
-		
-		if (showFrameCount) {
-		    tc_ff = parseInt(tc_array[3])/fps;
+
+		if (!/^[a-z]{2}(\-[a-z]{2})?$/i.test(args[0])) {
+			throw new TypeError('Language code must have format `xx` or `xx-xx`');
 		}
-		
-		tc_in_seconds = ( tc_hh * 3600 ) + ( tc_mm * 60 ) + tc_ss + tc_ff;
-		
-		return tc_in_seconds;
-	},
-	
 
-	convertSMPTEtoSeconds: function (SMPTE) {
-		if (typeof SMPTE != 'string') 
-			return false;
+		i18n.lang = args[0];
 
-		SMPTE = SMPTE.replace(',', '.');
-		
-		var secs = 0,
-			decimalLen = (SMPTE.indexOf('.') != -1) ? SMPTE.split('.')[1].length : 0,
-			multiplier = 1;
-		
-		SMPTE = SMPTE.split(':').reverse();
-		
-		for (var i = 0; i < SMPTE.length; i++) {
-			multiplier = 1;
-			if (i > 0) {
-				multiplier = Math.pow(60, i); 
-			}
-			secs += Number(SMPTE[i]) * multiplier;
-		}
-		return Number(secs.toFixed(decimalLen));
-	},	
-	
-	/* borrowed from SWFObject: http://code.google.com/p/swfobject/source/browse/trunk/swfobject/src/swfobject.js#474 */
-	removeSwf: function(id) {
-		var obj = document.getElementById(id);
-		if (obj && /object|embed/i.test(obj.nodeName)) {
-			if (mejs.MediaFeatures.isIE) {
-				obj.style.display = "none";
-				(function(){
-					if (obj.readyState == 4) {
-						mejs.Utility.removeObjectInIE(id);
-					} else {
-						setTimeout(arguments.callee, 10);
-					}
-				})();
-			} else {
-				obj.parentNode.removeChild(obj);
-			}
+		if (i18n[args[0]] === undefined) {
+			args[1] = args[1] !== null && args[1] !== undefined && _typeof(args[1]) === 'object' ? args[1] : {};
+			i18n[args[0]] = !(0, _general.isObjectEmpty)(args[1]) ? args[1] : _en.EN;
+		} else if (args[1] !== null && args[1] !== undefined && _typeof(args[1]) === 'object') {
+			i18n[args[0]] = args[1];
 		}
-	},
-	removeObjectInIE: function(id) {
-		var obj = document.getElementById(id);
-		if (obj) {
-			for (var i in obj) {
-				if (typeof obj[i] == "function") {
-					obj[i] = null;
-				}
-			}
-			obj.parentNode.removeChild(obj);
-		}		
-	},
-    determineScheme: function(url) {
-        if (url && url.indexOf("://") != -1) {
-            return url.substr(0, url.indexOf("://")+3);
-        }
-        return "//"; // let user agent figure this out
-    },
-
-	// taken from underscore
-	debounce: function(func, wait, immediate) {
-		var timeout;
-		return function() {
-			var context = this, args = arguments;
-			var later = function() {
-				timeout = null;
-				if (!immediate) func.apply(context, args);
-			};
-			var callNow = immediate && !timeout;
-			clearTimeout(timeout);
-			timeout = setTimeout(later, wait);
-			if (callNow) func.apply(context, args);
-		};
-	},
-
-	/**
-	* Returns true if targetNode appears after sourceNode in the dom.
-	* @param {HTMLElement} sourceNode - the source node for comparison
-	* @param {HTMLElement} targetNode - the node to compare against sourceNode
-	*/
-	isNodeAfter: function(sourceNode, targetNode) {
-		return !!(
-			sourceNode &&
-			targetNode &&
-			typeof sourceNode.compareDocumentPosition === 'function' &&
-			sourceNode.compareDocumentPosition(targetNode) & Node.DOCUMENT_POSITION_PRECEDING
-		);
 	}
+
+	return i18n.lang;
 };
 
+i18n.t = function (message) {
+	var pluralParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
 
-// Core detector, plugins are added below
-mejs.PluginDetector = {
 
-	// main public function to test a plug version number PluginDetector.hasPluginVersion('flash',[9,0,125]);
-	hasPluginVersion: function(plugin, v) {
-		var pv = this.plugins[plugin];
-		v[1] = v[1] || 0;
-		v[2] = v[2] || 0;
-		return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
-	},
+	if (typeof message === 'string' && message.length) {
 
-	// cached values
-	nav: window.navigator,
-	ua: window.navigator.userAgent.toLowerCase(),
+		var str = void 0,
+		    pluralForm = void 0;
 
-	// stored version numbers
-	plugins: [],
+		var language = i18n.language();
 
-	// runs detectPlugin() and stores the version number
-	addPlugin: function(p, pluginName, mimeType, activeX, axDetect) {
-		this.plugins[p] = this.detectPlugin(pluginName, mimeType, activeX, axDetect);
-	},
+		var _plural = function _plural(input, number, form) {
+
+			if ((typeof input === 'undefined' ? 'undefined' : _typeof(input)) !== 'object' || typeof number !== 'number' || typeof form !== 'number') {
+				return input;
+			}
 
-	// get the version number from the mimetype (all but IE) or ActiveX (IE)
-	detectPlugin: function(pluginName, mimeType, activeX, axDetect) {
+			var _pluralForms = function () {
+				return [function () {
+					return arguments.length <= 1 ? undefined : arguments[1];
+				}, function () {
+					return (arguments.length <= 0 ? undefined : arguments[0]) === 1 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2];
+				}, function () {
+					return (arguments.length <= 0 ? undefined : arguments[0]) === 0 || (arguments.length <= 0 ? undefined : arguments[0]) === 1 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2];
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 !== 11) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) !== 0) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1 || (arguments.length <= 0 ? undefined : arguments[0]) === 11) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2 || (arguments.length <= 0 ? undefined : arguments[0]) === 12) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) > 2 && (arguments.length <= 0 ? undefined : arguments[0]) < 20) {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					} else {
+						return arguments.length <= 4 ? undefined : arguments[4];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 0 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 > 0 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 < 20) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 !== 11) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return [3];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 !== 11) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 <= 4 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) <= 4) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 <= 4 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 === 1) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 === 2) {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 === 3 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 === 4) {
+						return arguments.length <= 4 ? undefined : arguments[4];
+					} else {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) > 2 && (arguments.length <= 0 ? undefined : arguments[0]) < 7) {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) > 6 && (arguments.length <= 0 ? undefined : arguments[0]) < 11) {
+						return arguments.length <= 4 ? undefined : arguments[4];
+					} else {
+						return arguments.length <= 5 ? undefined : arguments[5];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 0) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 3 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 <= 10) {
+						return arguments.length <= 4 ? undefined : arguments[4];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 11) {
+						return arguments.length <= 5 ? undefined : arguments[5];
+					} else {
+						return arguments.length <= 6 ? undefined : arguments[6];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 0 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 > 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 < 11) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 > 10 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 < 20) {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					} else {
+						return arguments.length <= 4 ? undefined : arguments[4];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 2) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					}
+				}, function () {
+					return (arguments.length <= 0 ? undefined : arguments[0]) !== 11 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2];
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 <= 4 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) !== 8 && (arguments.length <= 0 ? undefined : arguments[0]) !== 11) {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					} else {
+						return arguments.length <= 4 ? undefined : arguments[4];
+					}
+				}, function () {
+					return (arguments.length <= 0 ? undefined : arguments[0]) === 0 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2];
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 3) {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					} else {
+						return arguments.length <= 4 ? undefined : arguments[4];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 0) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					}
+				}];
+			}();
 
-		var version = [0,0,0],
-			description,
-			i,
-			ax;
+			return _pluralForms[form].apply(null, [number].concat(input));
+		};
 
-		// Firefox, Webkit, Opera
-		if (typeof(this.nav.plugins) != 'undefined' && typeof this.nav.plugins[pluginName] == 'object') {
-			description = this.nav.plugins[pluginName].description;
-			if (description && !(typeof this.nav.mimeTypes != 'undefined' && this.nav.mimeTypes[mimeType] && !this.nav.mimeTypes[mimeType].enabledPlugin)) {
-				version = description.replace(pluginName, '').replace(/^\s+/,'').replace(/\sr/gi,'.').split('.');
-				for (i=0; i<version.length; i++) {
-					version[i] = parseInt(version[i].match(/\d+/), 10);
-				}
+		if (i18n[language] !== undefined) {
+			str = i18n[language][message];
+			if (pluralParam !== null && typeof pluralParam === 'number') {
+				pluralForm = i18n[language]['mejs.plural-form'];
+				str = _plural.apply(null, [str, pluralParam, pluralForm]);
 			}
-		// Internet Explorer / ActiveX
-		} else if (typeof(window.ActiveXObject) != 'undefined') {
-			try {
-				ax = new ActiveXObject(activeX);
-				if (ax) {
-					version = axDetect(ax);
-				}
+		}
+
+		if (!str && i18n.en) {
+			str = i18n.en[message];
+			if (pluralParam !== null && typeof pluralParam === 'number') {
+				pluralForm = i18n.en['mejs.plural-form'];
+				str = _plural.apply(null, [str, pluralParam, pluralForm]);
 			}
-			catch (e) { }
 		}
-		return version;
-	}
-};
 
-// Add Flash detection
-mejs.PluginDetector.addPlugin('flash','Shockwave Flash','application/x-shockwave-flash','ShockwaveFlash.ShockwaveFlash', function(ax) {
-	// adapted from SWFObject
-	var version = [],
-		d = ax.GetVariable("$version");
-	if (d) {
-		d = d.split(" ")[1].split(",");
-		version = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
-	}
-	return version;
-});
+		str = str || message;
 
-// Add Silverlight detection
-mejs.PluginDetector.addPlugin('silverlight','Silverlight Plug-In','application/x-silverlight-2','AgControl.AgControl', function (ax) {
-	// Silverlight cannot report its version number to IE
-	// but it does have a isVersionSupported function, so we have to loop through it to get a version number.
-	// adapted from http://www.silverlightversion.com/
-	var v = [0,0,0,0],
-		loopMatch = function(ax, v, i, n) {
-			while(ax.isVersionSupported(v[0]+ "."+ v[1] + "." + v[2] + "." + v[3])){
-				v[i]+=n;
-			}
-			v[i] -= n;
-		};
-	loopMatch(ax, v, 0, 1);
-	loopMatch(ax, v, 1, 1);
-	loopMatch(ax, v, 2, 10000); // the third place in the version number is usually 5 digits (4.0.xxxxx)
-	loopMatch(ax, v, 2, 1000);
-	loopMatch(ax, v, 2, 100);
-	loopMatch(ax, v, 2, 10);
-	loopMatch(ax, v, 2, 1);
-	loopMatch(ax, v, 3, 1);
-
-	return v;
-});
-// add adobe acrobat
-/*
-PluginDetector.addPlugin('acrobat','Adobe Acrobat','application/pdf','AcroPDF.PDF', function (ax) {
-	var version = [],
-		d = ax.GetVersions().split(',')[0].split('=')[1].split('.');
+		if (pluralParam !== null && typeof pluralParam === 'number') {
+			str = str.replace('%1', pluralParam);
+		}
 
-	if (d) {
-		version = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+		return (0, _general.escapeHTML)(str);
 	}
-	return version;
-});
-*/
-// necessary detection (fixes for <IE9)
-mejs.MediaFeatures = {
-	init: function() {
-		var
-			t = this,
-			d = document,
-			nav = mejs.PluginDetector.nav,
-			ua = mejs.PluginDetector.ua.toLowerCase(),
-			i,
-			v,
-			html5Elements = ['source','track','audio','video'];
-
-		// detect browsers (only the ones that have some kind of quirk we need to work around)
-		t.isiPad = (ua.match(/ipad/i) !== null);
-		t.isiPhone = (ua.match(/iphone/i) !== null);
-		t.isiOS = t.isiPhone || t.isiPad;
-		t.isAndroid = (ua.match(/android/i) !== null);
-		t.isBustedAndroid = (ua.match(/android 2\.[12]/) !== null);
-		t.isBustedNativeHTTPS = (location.protocol === 'https:' && (ua.match(/android [12]\./) !== null || ua.match(/macintosh.* version.* safari/) !== null));
-		t.isIE = (nav.appName.toLowerCase().indexOf("microsoft") != -1 || nav.appName.toLowerCase().match(/trident/gi) !== null);
-		t.isChrome = (ua.match(/chrome/gi) !== null);
-		t.isChromium = (ua.match(/chromium/gi) !== null);
-		t.isFirefox = (ua.match(/firefox/gi) !== null);
-		t.isWebkit = (ua.match(/webkit/gi) !== null);
-		t.isGecko = (ua.match(/gecko/gi) !== null) && !t.isWebkit && !t.isIE;
-		t.isOpera = (ua.match(/opera/gi) !== null);
-		t.hasTouch = ('ontouchstart' in window); //  && window.ontouchstart != null); // this breaks iOS 7
-
-		// Borrowed from `Modernizr.svgasimg`, sources:
-		// - https://github.com/Modernizr/Modernizr/issues/687
-		// - https://github.com/Modernizr/Modernizr/pull/1209/files
-		t.svgAsImg = !!document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#Image', '1.1');
-
-		// create HTML5 media elements for IE before 9, get a <video> element for fullscreen detection
-		for (i=0; i<html5Elements.length; i++) {
-			v = document.createElement(html5Elements[i]);
-		}
-
-		t.supportsMediaTag = (typeof v.canPlayType !== 'undefined' || t.isBustedAndroid);
-
-		// Fix for IE9 on Windows 7N / Windows 7KN (Media Player not installer)
-		try{
-			v.canPlayType("video/mp4");
-		}catch(e){
-			t.supportsMediaTag = false;
-		}
-
-		t.supportsPointerEvents = (function() {
-			// TAKEN FROM MODERNIZR
-			var element = document.createElement('x'),
-				documentElement = document.documentElement,
-				getComputedStyle = window.getComputedStyle,
-				supports;
-			if(!('pointerEvents' in element.style)){
-				return false;
-			}
-			element.style.pointerEvents = 'auto';
-			element.style.pointerEvents = 'x';
-			documentElement.appendChild(element);
-			supports = getComputedStyle &&
-				getComputedStyle(element, '').pointerEvents === 'auto';
-			documentElement.removeChild(element);
-			return !!supports;
-		})();
 
+	return message;
+};
 
-		 // Older versions of Firefox can't move plugins around without it resetting,
-		t.hasFirefoxPluginMovingProblem = false;
+_mejs2.default.i18n = i18n;
 
-		// detect native JavaScript fullscreen (Safari/Firefox only, Chrome still fails)
+if (typeof mejsL10n !== 'undefined') {
+	_mejs2.default.i18n.language(mejsL10n.language, mejsL10n.strings);
+}
 
-		// iOS
-		t.hasiOSFullScreen = (typeof v.webkitEnterFullscreen !== 'undefined');
+exports.default = i18n;
 
-		// W3C
-		t.hasNativeFullscreen = (typeof v.requestFullscreen !== 'undefined');
+},{"15":15,"27":27,"7":7}],6:[function(_dereq_,module,exports){
+'use strict';
 
-		// webkit/firefox/IE11+
-		t.hasWebkitNativeFullScreen = (typeof v.webkitRequestFullScreen !== 'undefined');
-		t.hasMozNativeFullScreen = (typeof v.mozRequestFullScreen !== 'undefined');
-		t.hasMsNativeFullScreen = (typeof v.msRequestFullscreen !== 'undefined');
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
 
-		t.hasTrueNativeFullScreen = (t.hasWebkitNativeFullScreen || t.hasMozNativeFullScreen || t.hasMsNativeFullScreen);
-		t.nativeFullScreenEnabled = t.hasTrueNativeFullScreen;
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
 
-		// Enabled?
-		if (t.hasMozNativeFullScreen) {
-			t.nativeFullScreenEnabled = document.mozFullScreenEnabled;
-		} else if (t.hasMsNativeFullScreen) {
-			t.nativeFullScreenEnabled = document.msFullscreenEnabled;
-		}
+var _window = _dereq_(3);
 
-		if (t.isChrome) {
-			t.hasiOSFullScreen = false;
-		}
+var _window2 = _interopRequireDefault(_window);
 
-		if (t.hasTrueNativeFullScreen) {
+var _document = _dereq_(2);
 
-			t.fullScreenEventName = '';
-			if (t.hasWebkitNativeFullScreen) {
-				t.fullScreenEventName = 'webkitfullscreenchange';
+var _document2 = _interopRequireDefault(_document);
 
-			} else if (t.hasMozNativeFullScreen) {
-				t.fullScreenEventName = 'mozfullscreenchange';
+var _mejs = _dereq_(7);
 
-			} else if (t.hasMsNativeFullScreen) {
-				t.fullScreenEventName = 'MSFullscreenChange';
-			}
+var _mejs2 = _interopRequireDefault(_mejs);
 
-			t.isFullScreen = function() {
-				if (t.hasMozNativeFullScreen) {
-					return d.mozFullScreen;
+var _general = _dereq_(27);
 
-				} else if (t.hasWebkitNativeFullScreen) {
-					return d.webkitIsFullScreen;
+var _media2 = _dereq_(28);
 
-				} else if (t.hasMsNativeFullScreen) {
-					return d.msFullscreenElement !== null;
-				}
-			}
+var _renderer = _dereq_(8);
 
-			t.requestFullScreen = function(el) {
+var _constants = _dereq_(25);
 
-				if (t.hasWebkitNativeFullScreen) {
-					el.webkitRequestFullScreen();
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-				} else if (t.hasMozNativeFullScreen) {
-					el.mozRequestFullScreen();
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 
-				} else if (t.hasMsNativeFullScreen) {
-					el.msRequestFullscreen();
+var MediaElement = function MediaElement(idOrNode, options, sources) {
+	var _this = this;
 
-				}
-			}
+	_classCallCheck(this, MediaElement);
 
-			t.cancelFullScreen = function() {
-				if (t.hasWebkitNativeFullScreen) {
-					document.webkitCancelFullScreen();
+	var t = this;
 
-				} else if (t.hasMozNativeFullScreen) {
-					document.mozCancelFullScreen();
+	sources = Array.isArray(sources) ? sources : null;
 
-				} else if (t.hasMsNativeFullScreen) {
-					document.msExitFullscreen();
+	t.defaults = {
+		renderers: [],
 
-				}
-			}
+		fakeNodeName: 'mediaelementwrapper',
 
-		}
+		pluginPath: 'build/',
 
+		shimScriptAccess: 'sameDomain'
+	};
 
-		// OS X 10.5 can't do this even if it says it can :(
-		if (t.hasiOSFullScreen && ua.match(/mac os x 10_5/i)) {
-			t.hasNativeFullScreen = false;
-			t.hasiOSFullScreen = false;
-		}
+	options = Object.assign(t.defaults, options);
+
+	t.mediaElement = _document2.default.createElement(options.fakeNodeName);
+
+	var id = idOrNode,
+	    error = false;
 
+	if (typeof idOrNode === 'string') {
+		t.mediaElement.originalNode = _document2.default.getElementById(idOrNode);
+	} else {
+		t.mediaElement.originalNode = idOrNode;
+		id = idOrNode.id;
 	}
-};
-mejs.MediaFeatures.init();
 
-/*
-extension methods to <video> or <audio> object to bring it into parity with PluginMediaElement (see below)
-*/
-mejs.HtmlMediaElement = {
-	pluginType: 'native',
-	isFullScreen: false,
+	if (t.mediaElement.originalNode === undefined || t.mediaElement.originalNode === null) {
+		return null;
+	}
 
-	setCurrentTime: function (time) {
-		this.currentTime = time;
-	},
+	t.mediaElement.options = options;
+	id = id || 'mejs_' + Math.random().toString().slice(2);
 
-	setMuted: function (muted) {
-		this.muted = muted;
-	},
+	t.mediaElement.originalNode.setAttribute('id', id + '_from_mejs');
 
-	setVolume: function (volume) {
-		this.volume = volume;
-	},
+	var tagName = t.mediaElement.originalNode.tagName.toLowerCase();
+	if (['video', 'audio'].indexOf(tagName) > -1 && !t.mediaElement.originalNode.getAttribute('preload')) {
+		t.mediaElement.originalNode.setAttribute('preload', 'none');
+	}
 
-	// for parity with the plugin versions
-	stop: function () {
-		this.pause();
-	},
+	t.mediaElement.originalNode.parentNode.insertBefore(t.mediaElement, t.mediaElement.originalNode);
 
-	// This can be a url string
-	// or an array [{src:'file.mp4',type:'video/mp4'},{src:'file.webm',type:'video/webm'}]
-	setSrc: function (url) {
-		
-		// Fix for IE9 which can't set .src when there are <source> elements. Awesome, right?
-		var 
-			existingSources = this.getElementsByTagName('source');
-		while (existingSources.length > 0){
-			this.removeChild(existingSources[0]);
-		}
-	
-		if (typeof url == 'string') {
-			this.src = url;
-		} else {
-			var i, media;
+	t.mediaElement.appendChild(t.mediaElement.originalNode);
 
-			for (i=0; i<url.length; i++) {
-				media = url[i];
-				if (this.canPlayType(media.type)) {
-					this.src = media.src;
-					break;
+	var processURL = function processURL(url, type) {
+		if (_window2.default.location.protocol === 'https:' && url.indexOf('http:') === 0 && _constants.IS_IOS && _mejs2.default.html5media.mediaTypes.indexOf(type) > -1) {
+			var xhr = new XMLHttpRequest();
+			xhr.onreadystatechange = function () {
+				if (this.readyState === 4 && this.status === 200) {
+					var _url = _window2.default.URL || _window2.default.webkitURL,
+					    blobUrl = _url.createObjectURL(this.response);
+					t.mediaElement.originalNode.setAttribute('src', blobUrl);
+					return blobUrl;
 				}
-			}
+				return url;
+			};
+			xhr.open('GET', url);
+			xhr.responseType = 'blob';
+			xhr.send();
 		}
-	},
 
-	setVideoSize: function (width, height) {
-		this.width = width;
-		this.height = height;
-	}
-};
+		return url;
+	};
 
-/*
-Mimics the <video/audio> element by calling Flash's External Interface or Silverlights [ScriptableMember]
-*/
-mejs.PluginMediaElement = function (pluginid, pluginType, mediaUrl) {
-	this.id = pluginid;
-	this.pluginType = pluginType;
-	this.src = mediaUrl;
-	this.events = {};
-	this.attributes = {};
-};
+	var mediaFiles = void 0;
 
-// JavaScript values and ExternalInterface methods that match HTML5 video properties methods
-// http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/fl/video/FLVPlayback.html
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html
-mejs.PluginMediaElement.prototype = {
+	if (sources !== null) {
+		mediaFiles = sources;
+	} else if (t.mediaElement.originalNode !== null) {
 
-	// special
-	pluginElement: null,
-	pluginType: '',
-	isFullScreen: false,
+		mediaFiles = [];
 
-	// not implemented :(
-	playbackRate: -1,
-	defaultPlaybackRate: -1,
-	seekable: [],
-	played: [],
+		switch (t.mediaElement.originalNode.nodeName.toLowerCase()) {
+			case 'iframe':
+				mediaFiles.push({
+					type: '',
+					src: t.mediaElement.originalNode.getAttribute('src')
+				});
+				break;
+			case 'audio':
+			case 'video':
+				var _sources = t.mediaElement.originalNode.children.length,
+				    nodeSource = t.mediaElement.originalNode.getAttribute('src');
+
+				if (nodeSource) {
+					var node = t.mediaElement.originalNode,
+					    type = (0, _media2.formatType)(nodeSource, node.getAttribute('type'));
+					mediaFiles.push({
+						type: type,
+						src: processURL(nodeSource, type)
+					});
+				}
 
-	// HTML5 read-only properties
-	paused: true,
-	ended: false,
-	seeking: false,
-	duration: 0,
-	error: null,
-	tagName: '',
-
-	// HTML5 get/set properties, but only set (updated by event handlers)
-	muted: false,
-	volume: 1,
-	currentTime: 0,
-
-	// HTML5 methods
-	play: function () {
-		if (this.pluginApi != null) {
-			if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') {
-				this.pluginApi.playVideo();
-			} else {
-				this.pluginApi.playMedia();
-			}
-			this.paused = false;
-		}
-	},
-	load: function () {
-		if (this.pluginApi != null) {
-			if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') {
-			} else {
-				this.pluginApi.loadMedia();
-			}
-			
-			this.paused = false;
-		}
-	},
-	pause: function () {
-		if (this.pluginApi != null) {
-			if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') {
-		        if( this.pluginApi.getPlayerState() == 1 ) {
-				    this.pluginApi.pauseVideo();
-                }
-			} else {
-				this.pluginApi.pauseMedia();
-			}			
-			
-			
-			this.paused = true;
-		}
-	},
-	stop: function () {
-		if (this.pluginApi != null) {
-			if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') {
-				this.pluginApi.stopVideo();
-			} else {
-				this.pluginApi.stopMedia();
-			}	
-			this.paused = true;
-		}
-	},
-	canPlayType: function(type) {
-		var i,
-			j,
-			pluginInfo,
-			pluginVersions = mejs.plugins[this.pluginType];
-
-		for (i=0; i<pluginVersions.length; i++) {
-			pluginInfo = pluginVersions[i];
-
-			// test if user has the correct plugin version
-			if (mejs.PluginDetector.hasPluginVersion(this.pluginType, pluginInfo.version)) {
-
-				// test for plugin playback types
-				for (j=0; j<pluginInfo.types.length; j++) {
-					// find plugin that can play the type
-					if (type == pluginInfo.types[j]) {
-						return 'probably';
+				for (var i = 0; i < _sources; i++) {
+					var n = t.mediaElement.originalNode.children[i];
+					if (n.tagName.toLowerCase() === 'source') {
+						var src = n.getAttribute('src'),
+						    _type = (0, _media2.formatType)(src, n.getAttribute('type'));
+						mediaFiles.push({ type: _type, src: processURL(src, _type) });
 					}
 				}
-			}
+				break;
 		}
+	}
 
-		return '';
-	},
-	
-	positionFullscreenButton: function(x,y,visibleAndAbove) {
-		if (this.pluginApi != null && this.pluginApi.positionFullscreenButton) {
-			this.pluginApi.positionFullscreenButton(Math.floor(x),Math.floor(y),visibleAndAbove);
-		}
-	},
-	
-	hideFullscreenButton: function() {
-		if (this.pluginApi != null && this.pluginApi.hideFullscreenButton) {
-			this.pluginApi.hideFullscreenButton();
-		}		
-	},	
-	
-
-	// custom methods since not all JavaScript implementations support get/set
-
-	// This can be a url string
-	// or an array [{src:'file.mp4',type:'video/mp4'},{src:'file.webm',type:'video/webm'}]
-	setSrc: function (url) {
-		if (typeof url == 'string') {
-			this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(url));
-			this.src = mejs.Utility.absolutizeUrl(url);
-		} else {
-			var i, media;
+	t.mediaElement.id = id;
+	t.mediaElement.renderers = {};
+	t.mediaElement.events = {};
+	t.mediaElement.promises = [];
+	t.mediaElement.renderer = null;
+	t.mediaElement.rendererName = null;
 
-			for (i=0; i<url.length; i++) {
-				media = url[i];
-				if (this.canPlayType(media.type)) {
-					this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(media.src));
-					this.src = mejs.Utility.absolutizeUrl(media.src);
-					break;
-				}
-			}
-		}
+	t.mediaElement.changeRenderer = function (rendererName, mediaFiles) {
 
-	},
-	setCurrentTime: function (time) {
-		if (this.pluginApi != null) {
-			if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') {
-				this.pluginApi.seekTo(time);
-			} else {
-				this.pluginApi.setCurrentTime(time);
-			}				
-			
-			
-			
-			this.currentTime = time;
-		}
-	},
-	setVolume: function (volume) {
-		if (this.pluginApi != null) {
-			// same on YouTube and MEjs
-			if (this.pluginType == 'youtube') {
-				this.pluginApi.setVolume(volume * 100);
-			} else {
-				this.pluginApi.setVolume(volume);
+		var t = _this,
+		    media = Object.keys(mediaFiles[0]).length > 2 ? mediaFiles[0] : mediaFiles[0].src;
+
+		if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null && t.mediaElement.renderer.name === rendererName) {
+			t.mediaElement.renderer.pause();
+			if (t.mediaElement.renderer.stop) {
+				t.mediaElement.renderer.stop();
 			}
-			this.volume = volume;
+			t.mediaElement.renderer.show();
+			t.mediaElement.renderer.setSrc(media);
+			return true;
 		}
-	},
-	setMuted: function (muted) {
-		if (this.pluginApi != null) {
-			if (this.pluginType == 'youtube') {
-				if (muted) {
-					this.pluginApi.mute();
-				} else {
-					this.pluginApi.unMute();
-				}
-				this.muted = muted;
-				this.dispatchEvent({type:'volumechange'});
-			} else {
-				this.pluginApi.setMuted(muted);
+
+		if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null) {
+			t.mediaElement.renderer.pause();
+			if (t.mediaElement.renderer.stop) {
+				t.mediaElement.renderer.stop();
 			}
-			this.muted = muted;
+			t.mediaElement.renderer.hide();
 		}
-	},
 
-	// additional non-HTML5 methods
-	setVideoSize: function (width, height) {
-		
-		//if (this.pluginType == 'flash' || this.pluginType == 'silverlight') {
-			if (this.pluginElement && this.pluginElement.style) {
-				this.pluginElement.style.width = width + 'px';
-				this.pluginElement.style.height = height + 'px';
-			}
-			if (this.pluginApi != null && this.pluginApi.setVideoSize) {
-				this.pluginApi.setVideoSize(width, height);
-			}
-		//}
-	},
+		var newRenderer = t.mediaElement.renderers[rendererName],
+		    newRendererType = null;
 
-	setFullscreen: function (fullscreen) {
-		if (this.pluginApi != null && this.pluginApi.setFullscreen) {
-			this.pluginApi.setFullscreen(fullscreen);
-		}
-	},
-	
-	enterFullScreen: function() {
-		if (this.pluginApi != null && this.pluginApi.setFullscreen) {
-			this.setFullscreen(true);
-		}		
-		
-	},
-	
-	exitFullScreen: function() {
-		if (this.pluginApi != null && this.pluginApi.setFullscreen) {
-			this.setFullscreen(false);
+		if (newRenderer !== undefined && newRenderer !== null) {
+			newRenderer.show();
+			newRenderer.setSrc(media);
+			t.mediaElement.renderer = newRenderer;
+			t.mediaElement.rendererName = rendererName;
+			return true;
 		}
-	},	
 
-	// start: fake events
-	addEventListener: function (eventName, callback, bubble) {
-		this.events[eventName] = this.events[eventName] || [];
-		this.events[eventName].push(callback);
-	},
-	removeEventListener: function (eventName, callback) {
-		if (!eventName) { this.events = {}; return true; }
-		var callbacks = this.events[eventName];
-		if (!callbacks) return true;
-		if (!callback) { this.events[eventName] = []; return true; }
-		for (var i = 0; i < callbacks.length; i++) {
-			if (callbacks[i] === callback) {
-				this.events[eventName].splice(i, 1);
+		var rendererArray = t.mediaElement.options.renderers.length ? t.mediaElement.options.renderers : _renderer.renderer.order;
+
+		for (var _i = 0, total = rendererArray.length; _i < total; _i++) {
+			var index = rendererArray[_i];
+
+			if (index === rendererName) {
+				var rendererList = _renderer.renderer.renderers;
+				newRendererType = rendererList[index];
+
+				var renderOptions = Object.assign(newRendererType.options, t.mediaElement.options);
+				newRenderer = newRendererType.create(t.mediaElement, renderOptions, mediaFiles);
+				newRenderer.name = rendererName;
+
+				t.mediaElement.renderers[newRendererType.name] = newRenderer;
+				t.mediaElement.renderer = newRenderer;
+				t.mediaElement.rendererName = rendererName;
+				newRenderer.show();
 				return true;
 			}
 		}
+
 		return false;
-	},	
-	dispatchEvent: function (event) {
-		var i,
-			args,
-			callbacks = this.events[event.type];
+	};
 
-		if (callbacks) {
-			for (i = 0; i < callbacks.length; i++) {
-				callbacks[i].apply(this, [event]);
-			}
-		}
-	},
-	// end: fake events
-	
-	// fake DOM attribute methods
-	hasAttribute: function(name){
-		return (name in this.attributes);  
-	},
-	removeAttribute: function(name){
-		delete this.attributes[name];
-	},
-	getAttribute: function(name){
-		if (this.hasAttribute(name)) {
-			return this.attributes[name];
+	t.mediaElement.setSize = function (width, height) {
+		if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null) {
+			t.mediaElement.renderer.setSize(width, height);
 		}
-		return null;
-	},
-	setAttribute: function(name, value){
-		this.attributes[name] = value;
-	},
+	};
 
-	remove: function() {
-		mejs.Utility.removeSwf(this.pluginElement.id);
-	}
-};
+	t.mediaElement.generateError = function (message, urlList) {
+		message = message || '';
+		urlList = Array.isArray(urlList) ? urlList : [];
+		var event = (0, _general.createEvent)('error', t.mediaElement);
+		event.message = message;
+		event.urls = urlList;
+		t.mediaElement.dispatchEvent(event);
+		error = true;
+	};
 
-/*
-Default options
-*/
-mejs.MediaElementDefaults = {
-	// allows testing on HTML5, flash, silverlight
-	// auto: attempts to detect what the browser can do
-	// auto_plugin: prefer plugins and then attempt native HTML5
-	// native: forces HTML5 playback
-	// shim: disallows HTML5, will attempt either Flash or Silverlight
-	// none: forces fallback view
-	mode: 'auto',
-	// remove or reorder to change plugin priority and availability
-	plugins: ['flash','silverlight','youtube','vimeo'],
-	// shows debug errors on screen
-	enablePluginDebug: false,
-	// use plugin for browsers that have trouble with Basic Authentication on HTTPS sites
-	httpsBasicAuthSite: false,
-	// overrides the type specified, useful for dynamic instantiation
-	type: '',
-	// path to Flash and Silverlight plugins
-	pluginPath: mejs.Utility.getScriptPath(['mediaelement.js','mediaelement.min.js','mediaelement-and-player.js','mediaelement-and-player.min.js']),
-	// name of flash file
-	flashName: 'flashmediaelement.swf',
-	// streamer for RTMP streaming
-	flashStreamer: '',
-	// set to 'always' for CDN version
-	flashScriptAccess: 'sameDomain',	
-	// turns on the smoothing filter in Flash
-	enablePluginSmoothing: false,
-	// enabled pseudo-streaming (seek) on .mp4 files
-	enablePseudoStreaming: false,
-	// start query parameter sent to server for pseudo-streaming
-	pseudoStreamingStartQueryParam: 'start',
-	// name of silverlight file
-	silverlightName: 'silverlightmediaelement.xap',
-	// default if the <video width> is not specified
-	defaultVideoWidth: 480,
-	// default if the <video height> is not specified
-	defaultVideoHeight: 270,
-	// overrides <video width>
-	pluginWidth: -1,
-	// overrides <video height>
-	pluginHeight: -1,
-	// additional plugin variables in 'key=value' form
-	pluginVars: [],	
-	// rate in milliseconds for Flash and Silverlight to fire the timeupdate event
-	// larger number is less accurate, but less strain on plugin->JavaScript bridge
-	timerRate: 250,
-	// initial volume for player
-	startVolume: 0.8,
-	// custom error message in case media cannot be played; otherwise, Download File
-	// link will be displayed
-	customError: "",
-	success: function () { },
-	error: function () { }
-};
+	var props = _mejs2.default.html5media.properties,
+	    methods = _mejs2.default.html5media.methods,
+	    addProperty = function addProperty(obj, name, onGet, onSet) {
+		var oldValue = obj[name];
+		var getFn = function getFn() {
+			return onGet.apply(obj, [oldValue]);
+		},
+		    setFn = function setFn(newValue) {
+			oldValue = onSet.apply(obj, [newValue]);
+			return oldValue;
+		};
 
-/*
-Determines if a browser supports the <video> or <audio> element
-and returns either the native element or a Flash/Silverlight version that
-mimics HTML5 MediaElement
-*/
-mejs.MediaElement = function (el, o) {
-	return mejs.HtmlMediaElementShim.create(el,o);
-};
+		Object.defineProperty(obj, name, {
+			get: getFn,
+			set: setFn
+		});
+	},
+	    assignGettersSetters = function assignGettersSetters(propName) {
+		if (propName !== 'src') {
 
-mejs.HtmlMediaElementShim = {
-
-	create: function(el, o) {
-		var
-			options = {},
-			htmlMediaElement = (typeof(el) == 'string') ? document.getElementById(el) : el,
-			tagName = htmlMediaElement.tagName.toLowerCase(),
-			isMediaTag = (tagName === 'audio' || tagName === 'video'),
-			src = (isMediaTag) ? htmlMediaElement.getAttribute('src') : htmlMediaElement.getAttribute('href'),
-			poster = htmlMediaElement.getAttribute('poster'),
-			autoplay =  htmlMediaElement.getAttribute('autoplay'),
-			preload =  htmlMediaElement.getAttribute('preload'),
-			controls =  htmlMediaElement.getAttribute('controls'),
-			playback,
-			prop;
-
-		// extend options
-		for (prop in mejs.MediaElementDefaults) {
-			options[prop] = mejs.MediaElementDefaults[prop];
-		}
-		for (prop in o) {
-			options[prop] = o[prop];
-		}		
-		
-
-		// clean up attributes
-		src = 		(typeof src == 'undefined' 	|| src === null || src == '') ? null : src;		
-		poster =	(typeof poster == 'undefined' 	|| poster === null) ? '' : poster;
-		preload = 	(typeof preload == 'undefined' 	|| preload === null || preload === 'false') ? 'none' : preload;
-		autoplay = 	!(typeof autoplay == 'undefined' || autoplay === null || autoplay === 'false');
-		controls = 	!(typeof controls == 'undefined' || controls === null || controls === 'false');
-
-		// test for HTML5 and plugin capabilities
-		playback = this.determinePlayback(htmlMediaElement, options, mejs.MediaFeatures.supportsMediaTag, isMediaTag, src);
-		playback.url = (playback.url !== null) ? mejs.Utility.absolutizeUrl(playback.url) : '';
-        	playback.scheme = mejs.Utility.determineScheme(playback.url);
-
-		if (playback.method == 'native') {
-			// second fix for android
-			if (mejs.MediaFeatures.isBustedAndroid) {
-				htmlMediaElement.src = playback.url;
-				htmlMediaElement.addEventListener('click', function() {
-					htmlMediaElement.play();
-				}, false);
-			}
-		
-			// add methods to native HTMLMediaElement
-			return this.updateNative(playback, options, autoplay, preload);
-		} else if (playback.method !== '') {
-			// create plugin to mimic HTMLMediaElement
-			
-			return this.createPlugin( playback,  options, poster, autoplay, preload, controls);
-		} else {
-			// boo, no HTML5, no Flash, no Silverlight.
-			this.createErrorMessage( playback, options, poster );
-			
-			return this;
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1),
+			    getFn = function getFn() {
+				return t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null && typeof t.mediaElement.renderer['get' + capName] === 'function' ? t.mediaElement.renderer['get' + capName]() : null;
+			},
+			    setFn = function setFn(value) {
+				if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null && typeof t.mediaElement.renderer['set' + capName] === 'function') {
+					t.mediaElement.renderer['set' + capName](value);
+				}
+			};
+
+			addProperty(t.mediaElement, propName, getFn, setFn);
+			t.mediaElement['get' + capName] = getFn;
+			t.mediaElement['set' + capName] = setFn;
 		}
 	},
-	
-	determinePlayback: function(htmlMediaElement, options, supportsMediaTag, isMediaTag, src) {
-		var
-			mediaFiles = [],
-			i,
-			j,
-			k,
-			l,
-			n,
-			type,
-			result = { method: '', url: '', htmlMediaElement: htmlMediaElement, isVideo: (htmlMediaElement.tagName.toLowerCase() !== 'audio'), scheme: ''},
-			pluginName,
-			pluginVersions,
-			pluginInfo,
-			dummy,
-			media;
-			
-		// STEP 1: Get URL and type from <video src> or <source src>
-
-		// supplied type overrides <video type> and <source type>
-		if (typeof options.type != 'undefined' && options.type !== '') {
-			
-			// accept either string or array of types
-			if (typeof options.type == 'string') {
-				mediaFiles.push({type:options.type, url:src});
-			} else {
-				
-				for (i=0; i<options.type.length; i++) {
-					mediaFiles.push({type:options.type[i], url:src});
-				}
-			}
+	    getSrc = function getSrc() {
+		return t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null ? t.mediaElement.renderer.getSrc() : null;
+	},
+	    setSrc = function setSrc(value) {
+		var mediaFiles = [];
 
-		// test for src attribute first
-		} else if (src !== null) {
-			type = this.formatType(src, htmlMediaElement.getAttribute('type'));
-			mediaFiles.push({type:type, url:src});
+		if (typeof value === 'string') {
+			mediaFiles.push({
+				src: value,
+				type: value ? (0, _media2.getTypeFromFile)(value) : ''
+			});
+		} else if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value.src !== undefined) {
+			var _src = (0, _media2.absolutizeUrl)(value.src),
+			    _type2 = value.type,
+			    media = Object.assign(value, {
+				src: _src,
+				type: (_type2 === '' || _type2 === null || _type2 === undefined) && _src ? (0, _media2.getTypeFromFile)(_src) : _type2
+			});
+			mediaFiles.push(media);
+		} else if (Array.isArray(value)) {
+			for (var _i2 = 0, total = value.length; _i2 < total; _i2++) {
+
+				var _src2 = (0, _media2.absolutizeUrl)(value[_i2].src),
+				    _type3 = value[_i2].type,
+				    _media = Object.assign(value[_i2], {
+					src: _src2,
+					type: (_type3 === '' || _type3 === null || _type3 === undefined) && _src2 ? (0, _media2.getTypeFromFile)(_src2) : _type3
+				});
 
-		// then test for <source> elements
-		} else {
-			// test <source> types to see if they are usable
-			for (i = 0; i < htmlMediaElement.childNodes.length; i++) {
-				n = htmlMediaElement.childNodes[i];
-				if (n.nodeType == 1 && n.tagName.toLowerCase() == 'source') {
-					src = n.getAttribute('src');
-					type = this.formatType(src, n.getAttribute('type'));
-					media = n.getAttribute('media');
-
-					if (!media || !window.matchMedia || (window.matchMedia && window.matchMedia(media).matches)) {
-						mediaFiles.push({type:type, url:src});
-					}
-				}
+				mediaFiles.push(_media);
 			}
 		}
-		
-		// in the case of dynamicly created players
-		// check for audio types
-		if (!isMediaTag && mediaFiles.length > 0 && mediaFiles[0].url !== null && this.getTypeFromFile(mediaFiles[0].url).indexOf('audio') > -1) {
-			result.isVideo = false;
-		}
-		
 
-		// STEP 2: Test for playback method
-		
-		// special case for Android which sadly doesn't implement the canPlayType function (always returns '')
-		if (result.isVideo && mejs.MediaFeatures.isBustedAndroid) {
-			htmlMediaElement.canPlayType = function(type) {
-				return (type.match(/video\/(mp4|m4v)/gi) !== null) ? 'maybe' : '';
-			};
-		}		
-		
-		// special case for Chromium to specify natively supported video codecs (i.e. WebM and Theora) 
-		if (result.isVideo && mejs.MediaFeatures.isChromium) {
-			htmlMediaElement.canPlayType = function(type) { 
-				return (type.match(/video\/(webm|ogv|ogg)/gi) !== null) ? 'maybe' : '';
-			}; 
+		var renderInfo = _renderer.renderer.select(mediaFiles, t.mediaElement.options.renderers.length ? t.mediaElement.options.renderers : []),
+		    event = void 0;
+
+		if (!t.mediaElement.paused) {
+			t.mediaElement.pause();
+			event = (0, _general.createEvent)('pause', t.mediaElement);
+			t.mediaElement.dispatchEvent(event);
 		}
+		t.mediaElement.originalNode.src = mediaFiles[0].src || '';
 
-		// test for native playback first
-		if (supportsMediaTag && (options.mode === 'auto' || options.mode === 'auto_plugin' || options.mode === 'native')  && !(mejs.MediaFeatures.isBustedNativeHTTPS && options.httpsBasicAuthSite === true)) {
-						
-			if (!isMediaTag) {
+		if (renderInfo === null && mediaFiles[0].src) {
+			t.mediaElement.generateError('No renderer found', mediaFiles);
+			return;
+		}
 
-				// create a real HTML5 Media Element 
-				dummy = document.createElement( result.isVideo ? 'video' : 'audio');			
-				htmlMediaElement.parentNode.insertBefore(dummy, htmlMediaElement);
-				htmlMediaElement.style.display = 'none';
-				
-				// use this one from now on
-				result.htmlMediaElement = htmlMediaElement = dummy;
+		return mediaFiles[0].src ? t.mediaElement.changeRenderer(renderInfo.rendererName, mediaFiles) : null;
+	},
+	    triggerAction = function triggerAction(methodName, args) {
+		try {
+			if (methodName === 'play' && t.mediaElement.rendererName === 'native_dash') {
+				setTimeout(function () {
+					t.mediaElement.renderer[methodName](args);
+				}, 100);
+			} else {
+				t.mediaElement.renderer[methodName](args);
 			}
-				
-			for (i=0; i<mediaFiles.length; i++) {
-				// normal check
-				if (mediaFiles[i].type == "video/m3u8" || htmlMediaElement.canPlayType(mediaFiles[i].type).replace(/no/, '') !== ''
-					// special case for Mac/Safari 5.0.3 which answers '' to canPlayType('audio/mp3') but 'maybe' to canPlayType('audio/mpeg')
-					|| htmlMediaElement.canPlayType(mediaFiles[i].type.replace(/mp3/,'mpeg')).replace(/no/, '') !== ''
-					// special case for m4a supported by detecting mp4 support
-					|| htmlMediaElement.canPlayType(mediaFiles[i].type.replace(/m4a/,'mp4')).replace(/no/, '') !== '') {
-					result.method = 'native';
-					result.url = mediaFiles[i].url;
-					break;
-				}
-			}			
-			
-			if (result.method === 'native') {
-				if (result.url !== null) {
-					htmlMediaElement.src = result.url;
-				}
-			
-				// if `auto_plugin` mode, then cache the native result but try plugins.
-				if (options.mode !== 'auto_plugin') {
-					return result;
+		} catch (e) {
+			t.mediaElement.generateError(e, mediaFiles);
+		}
+	},
+	    assignMethods = function assignMethods(methodName) {
+		t.mediaElement[methodName] = function () {
+			for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+				args[_key] = arguments[_key];
+			}
+
+			if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null && typeof t.mediaElement.renderer[methodName] === 'function') {
+				if (t.mediaElement.promises.length) {
+					Promise.all(t.mediaElement.promises).then(function () {
+						triggerAction(methodName, args);
+					}).catch(function (e) {
+						t.mediaElement.generateError(e, mediaFiles);
+					});
+				} else {
+					triggerAction(methodName, args);
 				}
 			}
+			return null;
+		};
+	};
+
+	addProperty(t.mediaElement, 'src', getSrc, setSrc);
+	t.mediaElement.getSrc = getSrc;
+	t.mediaElement.setSrc = setSrc;
+
+	for (var _i3 = 0, total = props.length; _i3 < total; _i3++) {
+		assignGettersSetters(props[_i3]);
+	}
+
+	for (var _i4 = 0, _total = methods.length; _i4 < _total; _i4++) {
+		assignMethods(methods[_i4]);
+	}
+
+	t.mediaElement.addEventListener = function (eventName, callback) {
+		t.mediaElement.events[eventName] = t.mediaElement.events[eventName] || [];
+
+		t.mediaElement.events[eventName].push(callback);
+	};
+	t.mediaElement.removeEventListener = function (eventName, callback) {
+		if (!eventName) {
+			t.mediaElement.events = {};
+			return true;
 		}
 
-		// if native playback didn't work, then test plugins
-		if (options.mode === 'auto' || options.mode === 'auto_plugin' || options.mode === 'shim') {
-			for (i=0; i<mediaFiles.length; i++) {
-				type = mediaFiles[i].type;
+		var callbacks = t.mediaElement.events[eventName];
 
-				// test all plugins in order of preference [silverlight, flash]
-				for (j=0; j<options.plugins.length; j++) {
+		if (!callbacks) {
+			return true;
+		}
 
-					pluginName = options.plugins[j];
-			
-					// test version of plugin (for future features)
-					pluginVersions = mejs.plugins[pluginName];				
-					
-					for (k=0; k<pluginVersions.length; k++) {
-						pluginInfo = pluginVersions[k];
-					
-						// test if user has the correct plugin version
-						
-						// for youtube/vimeo
-						if (pluginInfo.version == null || 
-							
-							mejs.PluginDetector.hasPluginVersion(pluginName, pluginInfo.version)) {
-
-							// test for plugin playback types
-							for (l=0; l<pluginInfo.types.length; l++) {
-								// find plugin that can play the type
-								if (type.toLowerCase() == pluginInfo.types[l].toLowerCase()) {
-									result.method = pluginName;
-									result.url = mediaFiles[i].url;
-									return result;
-								}
-							}
-						}
-					}
-				}
-			}
+		if (!callback) {
+			t.mediaElement.events[eventName] = [];
+			return true;
 		}
-		
-		// at this point, being in 'auto_plugin' mode implies that we tried plugins but failed.
-		// if we have native support then return that.
-		if (options.mode === 'auto_plugin' && result.method === 'native') {
-			return result;
+
+		for (var _i5 = 0; _i5 < callbacks.length; _i5++) {
+			if (callbacks[_i5] === callback) {
+				t.mediaElement.events[eventName].splice(_i5, 1);
+				return true;
+			}
 		}
+		return false;
+	};
 
-		// what if there's nothing to play? just grab the first available
-		if (result.method === '' && mediaFiles.length > 0) {
-			result.url = mediaFiles[0].url;
+	t.mediaElement.dispatchEvent = function (event) {
+		var callbacks = t.mediaElement.events[event.type];
+		if (callbacks) {
+			for (var _i6 = 0; _i6 < callbacks.length; _i6++) {
+				callbacks[_i6].apply(null, [event]);
+			}
 		}
+	};
 
-		return result;
-	},
+	if (mediaFiles.length) {
+		t.mediaElement.src = mediaFiles;
+	}
 
-	formatType: function(url, type) {
-		// if no type is supplied, fake it with the extension
-		if (url && !type) {		
-			return this.getTypeFromFile(url);
-		} else {
-			// only return the mime part of the type in case the attribute contains the codec
-			// see http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html#the-source-element
-			// `video/mp4; codecs="avc1.42E01E, mp4a.40.2"` becomes `video/mp4`
-			
-			if (type && ~type.indexOf(';')) {
-				return type.substr(0, type.indexOf(';')); 
-			} else {
-				return type;
+	if (t.mediaElement.promises.length) {
+		Promise.all(t.mediaElement.promises).then(function () {
+			if (t.mediaElement.options.success) {
+				t.mediaElement.options.success(t.mediaElement, t.mediaElement.originalNode);
+			}
+		}).catch(function () {
+			if (error && t.mediaElement.options.error) {
+				t.mediaElement.options.error(t.mediaElement, t.mediaElement.originalNode);
 			}
+		});
+	} else {
+		if (t.mediaElement.options.success) {
+			t.mediaElement.options.success(t.mediaElement, t.mediaElement.originalNode);
 		}
-	},
-	
-	getTypeFromFile: function(url) {
-		url = url.split('?')[0];
-		var
-			ext = url.substring(url.lastIndexOf('.') + 1).toLowerCase(),
-			av = /(mp4|m4v|ogg|ogv|m3u8|webm|webmv|flv|wmv|mpeg|mov)/gi.test(ext) ? 'video/' : 'audio/';
-		return this.getTypeFromExtension(ext, av);
-	},
-	
-	getTypeFromExtension: function(ext, av) {
-		av = av || '';
-		
-		switch (ext) {
-			case 'mp4':
-			case 'm4v':
-			case 'm4a':
-			case 'f4v':
-			case 'f4a':
-				return av + 'mp4';
-			case 'flv':
-				return av + 'x-flv';
-			case 'webm':
-			case 'webma':
-			case 'webmv':	
-				return av + 'webm';
-			case 'ogg':
-			case 'oga':
-			case 'ogv':	
-				return av + 'ogg';
-			case 'm3u8':
-				return 'application/x-mpegurl';
-			case 'ts':
-				return av + 'mp2t';
-			default:
-				return av + ext;
+
+		if (error && t.mediaElement.options.error) {
+			t.mediaElement.options.error(t.mediaElement, t.mediaElement.originalNode);
 		}
-	},
+	}
 
-	createErrorMessage: function(playback, options, poster) {
-		var 
-			htmlMediaElement = playback.htmlMediaElement,
-			errorContainer = document.createElement('div'),
-			errorContent = options.customError;
-			
-		errorContainer.className = 'me-cannotplay';
+	return t.mediaElement;
+};
 
-		try {
-			errorContainer.style.width = htmlMediaElement.width + 'px';
-			errorContainer.style.height = htmlMediaElement.height + 'px';
-		} catch (e) {}
+_window2.default.MediaElement = MediaElement;
 
-		if (!errorContent) {
-			errorContent = '<a href="' + playback.url + '">';
+exports.default = MediaElement;
 
-			if (poster !== '') {
-				errorContent += '<img src="' + poster + '" width="100%" height="100%" alt="" />';
-			}
+},{"2":2,"25":25,"27":27,"28":28,"3":3,"7":7,"8":8}],7:[function(_dereq_,module,exports){
+'use strict';
 
-			errorContent += '<span>' + mejs.i18n.t('mejs.download-file') + '</span></a>';
-		}
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
 
-		errorContainer.innerHTML = errorContent;
+var _window = _dereq_(3);
 
-		htmlMediaElement.parentNode.insertBefore(errorContainer, htmlMediaElement);
-		htmlMediaElement.style.display = 'none';
+var _window2 = _interopRequireDefault(_window);
 
-		options.error(htmlMediaElement);
-	},
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-	createPlugin:function(playback, options, poster, autoplay, preload, controls) {
-		var 
-			htmlMediaElement = playback.htmlMediaElement,
-			width = 1,
-			height = 1,
-			pluginid = 'me_' + playback.method + '_' + (mejs.meIndex++),
-			pluginMediaElement = new mejs.PluginMediaElement(pluginid, playback.method, playback.url),
-			container = document.createElement('div'),
-			specialIEContainer,
-			node,
-			initVars;
+var mejs = {};
 
-		// copy tagName from html media element
-		pluginMediaElement.tagName = htmlMediaElement.tagName;
+mejs.version = '4.2.5';
 
-		// copy attributes from html media element to plugin media element
-		for (var i = 0; i < htmlMediaElement.attributes.length; i++) {
-			var attribute = htmlMediaElement.attributes[i];
-			if (attribute.specified) {
-				pluginMediaElement.setAttribute(attribute.name, attribute.value);
-			}
-		}
+mejs.html5media = {
+	properties: ['volume', 'src', 'currentTime', 'muted', 'duration', 'paused', 'ended', 'buffered', 'error', 'networkState', 'readyState', 'seeking', 'seekable', 'currentSrc', 'preload', 'bufferedBytes', 'bufferedTime', 'initialTime', 'startOffsetTime', 'defaultPlaybackRate', 'playbackRate', 'played', 'autoplay', 'loop', 'controls'],
+	readOnlyProperties: ['duration', 'paused', 'ended', 'buffered', 'error', 'networkState', 'readyState', 'seeking', 'seekable'],
 
-		// check for placement inside a <p> tag (sometimes WYSIWYG editors do this)
-		node = htmlMediaElement.parentNode;
+	methods: ['load', 'play', 'pause', 'canPlayType'],
 
-		while (node !== null && node.tagName != null && node.tagName.toLowerCase() !== 'body' && 
-				node.parentNode != null && node.parentNode.tagName != null && node.parentNode.constructor != null && node.parentNode.constructor.name === "ShadowRoot") {
-			if (node.parentNode.tagName.toLowerCase() === 'p') {
-				node.parentNode.parentNode.insertBefore(node, node.parentNode);
-				break;
-			}
-			node = node.parentNode;
-		}
+	events: ['loadstart', 'durationchange', 'loadedmetadata', 'loadeddata', 'progress', 'canplay', 'canplaythrough', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'play', 'playing', 'pause', 'waiting', 'seeking', 'seeked', 'timeupdate', 'ended', 'ratechange', 'volumechange'],
 
-		if (playback.isVideo) {
-			width = (options.pluginWidth > 0) ? options.pluginWidth : (options.videoWidth > 0) ? options.videoWidth : (htmlMediaElement.getAttribute('width') !== null) ? htmlMediaElement.getAttribute('width') : options.defaultVideoWidth;
-			height = (options.pluginHeight > 0) ? options.pluginHeight : (options.videoHeight > 0) ? options.videoHeight : (htmlMediaElement.getAttribute('height') !== null) ? htmlMediaElement.getAttribute('height') : options.defaultVideoHeight;
-		
-			// in case of '%' make sure it's encoded
-			width = mejs.Utility.encodeUrl(width);
-			height = mejs.Utility.encodeUrl(height);
-		
-		} else {
-			if (options.enablePluginDebug) {
-				width = 320;
-				height = 240;
+	mediaTypes: ['audio/mp3', 'audio/ogg', 'audio/oga', 'audio/wav', 'audio/x-wav', 'audio/wave', 'audio/x-pn-wav', 'audio/mpeg', 'audio/mp4', 'video/mp4', 'video/webm', 'video/ogg', 'video/ogv']
+};
+
+_window2.default.mejs = mejs;
+
+exports.default = mejs;
+
+},{"3":3}],8:[function(_dereq_,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
+exports.renderer = undefined;
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _mejs = _dereq_(7);
+
+var _mejs2 = _interopRequireDefault(_mejs);
+
+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 Renderer = function () {
+	function Renderer() {
+		_classCallCheck(this, Renderer);
+
+		this.renderers = {};
+		this.order = [];
+	}
+
+	_createClass(Renderer, [{
+		key: 'add',
+		value: function add(renderer) {
+			if (renderer.name === undefined) {
+				throw new TypeError('renderer must contain at least `name` property');
 			}
-		}
 
-		// register plugin
-		pluginMediaElement.success = options.success;
-		
-		// add container (must be added to DOM before inserting HTML for IE)
-		container.className = 'me-plugin';
-		container.id = pluginid + '_container';
-		
-		if (playback.isVideo) {
-				htmlMediaElement.parentNode.insertBefore(container, htmlMediaElement);
-		} else {
-				document.body.insertBefore(container, document.body.childNodes[0]);
+			this.renderers[renderer.name] = renderer;
+			this.order.push(renderer.name);
 		}
-		
-		if (playback.method === 'flash' || playback.method === 'silverlight') {
+	}, {
+		key: 'select',
+		value: function select(mediaFiles) {
+			var renderers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
 
-			var canPlayVideo = htmlMediaElement.getAttribute('type') === 'audio/mp4',
-				childrenSources = htmlMediaElement.getElementsByTagName('source');
+			var renderersLength = renderers.length;
 
-			if (childrenSources && !canPlayVideo) {
-				for (var i = 0, total = childrenSources.length; i < total; i++) {
-					if (childrenSources[i].getAttribute('type') === 'audio/mp4') {
-						canPlayVideo = true;
+			renderers = renderers.length ? renderers : this.order;
+
+			if (!renderersLength) {
+				var rendererIndicator = [/^(html5|native)/i, /^flash/i, /iframe$/i],
+				    rendererRanking = function rendererRanking(renderer) {
+					for (var i = 0, total = rendererIndicator.length; i < total; i++) {
+						if (rendererIndicator[i].test(renderer)) {
+							return i;
+						}
 					}
-				}
+					return rendererIndicator.length;
+				};
+
+				renderers.sort(function (a, b) {
+					return rendererRanking(a) - rendererRanking(b);
+				});
 			}
 
-			// flash/silverlight vars
-			initVars = [
-				'id=' + pluginid,
-				'isvideo=' + ((playback.isVideo || canPlayVideo) ? "true" : "false"),
-				'autoplay=' + ((autoplay) ? "true" : "false"),
-				'preload=' + preload,
-				'width=' + width,
-				'startvolume=' + options.startVolume,
-				'timerrate=' + options.timerRate,
-				'flashstreamer=' + options.flashStreamer,
-				'height=' + height,
-				'pseudostreamstart=' + options.pseudoStreamingStartQueryParam];
-	
-			if (playback.url !== null) {
-				if (playback.method == 'flash') {
-					initVars.push('file=' + mejs.Utility.encodeUrl(playback.url));
-				} else {
-					initVars.push('file=' + playback.url);
+			for (var i = 0, total = renderers.length; i < total; i++) {
+				var key = renderers[i],
+				    _renderer = this.renderers[key];
+
+				if (_renderer !== null && _renderer !== undefined) {
+					for (var j = 0, jl = mediaFiles.length; j < jl; j++) {
+						if (typeof _renderer.canPlayType === 'function' && typeof mediaFiles[j].type === 'string' && _renderer.canPlayType(mediaFiles[j].type)) {
+							return {
+								rendererName: _renderer.name,
+								src: mediaFiles[j].src
+							};
+						}
+					}
 				}
 			}
-			if (options.enablePluginDebug) {
-				initVars.push('debug=true');
-			}
-			if (options.enablePluginSmoothing) {
-				initVars.push('smoothing=true');
-			}
-			if (options.enablePseudoStreaming) {
-				initVars.push('pseudostreaming=true');
+
+			return null;
+		}
+	}, {
+		key: 'order',
+		set: function set(order) {
+			if (!Array.isArray(order)) {
+				throw new TypeError('order must be an array of strings.');
 			}
-			if (controls) {
-				initVars.push('controls=true'); // shows controls in the plugin if desired
+
+			this._order = order;
+		},
+		get: function get() {
+			return this._order;
+		}
+	}, {
+		key: 'renderers',
+		set: function set(renderers) {
+			if (renderers !== null && (typeof renderers === 'undefined' ? 'undefined' : _typeof(renderers)) !== 'object') {
+				throw new TypeError('renderers must be an array of objects.');
 			}
-			if (options.pluginVars) {
-				initVars = initVars.concat(options.pluginVars);
-			}		
-			
-			// call from plugin
-			window[pluginid + '_init'] = function() {
-				switch (pluginMediaElement.pluginType) {
-					case 'flash':
-						pluginMediaElement.pluginElement = pluginMediaElement.pluginApi = document.getElementById(pluginid);
-						break;
-					case 'silverlight':
-						pluginMediaElement.pluginElement = document.getElementById(pluginMediaElement.id);
-						pluginMediaElement.pluginApi = pluginMediaElement.pluginElement.Content.MediaElementJS;
-						break;
-				}
-	
-				if (pluginMediaElement.pluginApi != null && pluginMediaElement.success) {
-					pluginMediaElement.success(pluginMediaElement, htmlMediaElement);
-				}
-			};
-			
-			// event call from plugin
-			window[pluginid + '_event'] = function(eventName, values) {
-		
-				var
-					e,
-					i,
-					bufferedTime;
-		        
-				// fake event object to mimic real HTML media event.
-				e = {
-					type: eventName,
-					target: pluginMediaElement
-				};
-		
-				// attach all values to element and event object
-				for (i in values) {
-					pluginMediaElement[i] = values[i];
-					e[i] = values[i];
-				}
-		
-				// fake the newer W3C buffered TimeRange (loaded and total have been removed)
-				bufferedTime = values.bufferedTime || 0;
-		
-				e.target.buffered = e.buffered = {
-					start: function(index) {
-						return 0;
-					},
-					end: function (index) {
-						return bufferedTime;
-					},
-					length: 1
-				};
-		
-				pluginMediaElement.dispatchEvent(e);
-			}			
-			
-			
-		}
-
-		switch (playback.method) {
-			case 'silverlight':
-				container.innerHTML =
-'<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" id="' + pluginid + '" name="' + pluginid + '" width="' + width + '" height="' + height + '" class="mejs-shim">' +
-'<param name="initParams" value="' + initVars.join(',') + '" />' +
-'<param name="windowless" value="true" />' +
-'<param name="background" value="black" />' +
-'<param name="minRuntimeVersion" value="3.0.0.0" />' +
-'<param name="autoUpgrade" value="true" />' +
-'<param name="source" value="' + options.pluginPath + options.silverlightName + '" />' +
-'</object>';
-					break;
 
-			case 'flash':
-
-				if (mejs.MediaFeatures.isIE) {
-					specialIEContainer = document.createElement('div');
-					container.appendChild(specialIEContainer);
-					specialIEContainer.outerHTML =
-'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" ' +
-'id="' + pluginid + '" width="' + width + '" height="' + height + '" class="mejs-shim">' +
-'<param name="movie" value="' + options.pluginPath + options.flashName + '?' + (new Date().getTime()) + '" />' +
-'<param name="flashvars" value="' + initVars.join('&amp;') + '" />' +
-'<param name="quality" value="high" />' +
-'<param name="bgcolor" value="#000000" />' +
-'<param name="wmode" value="transparent" />' +
-'<param name="allowScriptAccess" value="' + options.flashScriptAccess + '" />' +
-'<param name="allowFullScreen" value="true" />' +
-'<param name="scale" value="default" />' + 
-'</object>';
+			this._renderers = renderers;
+		},
+		get: function get() {
+			return this._renderers;
+		}
+	}]);
 
-				} else {
+	return Renderer;
+}();
 
-					container.innerHTML =
-'<embed id="' + pluginid + '" name="' + pluginid + '" ' +
-'play="true" ' +
-'loop="false" ' +
-'quality="high" ' +
-'bgcolor="#000000" ' +
-'wmode="transparent" ' +
-'allowScriptAccess="' + options.flashScriptAccess + '" ' +
-'allowFullScreen="true" ' +
-'type="application/x-shockwave-flash" pluginspage="//www.macromedia.com/go/getflashplayer" ' +
-'src="' + options.pluginPath + options.flashName + '" ' +
-'flashvars="' + initVars.join('&') + '" ' +
-'width="' + width + '" ' +
-'height="' + height + '" ' +
-'scale="default"' + 
-'class="mejs-shim"></embed>';
-				}
-				break;
-			
-			case 'youtube':
-			
-				
-				var videoId;
-				// youtu.be url from share button
-				if (playback.url.lastIndexOf("youtu.be") != -1) {
-					videoId = playback.url.substr(playback.url.lastIndexOf('/')+1);
-					if (videoId.indexOf('?') != -1) {
-						videoId = videoId.substr(0, videoId.indexOf('?'));
-					}
-				}
-				else {
-					// https://www.youtube.com/watch?v=
-					var videoIdMatch = playback.url.match( /[?&]v=([^&#]+)|&|#|$/ );
-					if ( videoIdMatch ) {
-						videoId = videoIdMatch[1];
-					}
-				}
-				youtubeSettings = {
-						container: container,
-						containerId: container.id,
-						pluginMediaElement: pluginMediaElement,
-						pluginId: pluginid,
-						videoId: videoId,
-						height: height,
-						width: width,
-                        scheme: playback.scheme,
-						variables: options.youtubeIframeVars
-					};				
-				
-				// favor iframe version of YouTube
-				if (window.postMessage) {
-					mejs.YouTubeApi.enqueueIframe(youtubeSettings);		
-				} else if (mejs.PluginDetector.hasPluginVersion('flash', [10,0,0]) ) {
-					mejs.YouTubeApi.createFlash(youtubeSettings, options);
-				}
-				break;
-			
-			// DEMO Code. Does NOT work.
-			case 'vimeo':
-				var player_id = pluginid + "_player";
-				pluginMediaElement.vimeoid = playback.url.substr(playback.url.lastIndexOf('/')+1);
-				
-				container.innerHTML ='<iframe src="' + playback.scheme + 'player.vimeo.com/video/' + pluginMediaElement.vimeoid + '?api=1&portrait=0&byline=0&title=0&player_id=' + player_id + '" width="' + width +'" height="' + height +'" frameborder="0" class="mejs-shim" id="' + player_id + '" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>';
-				if (typeof($f) == 'function') { // froogaloop available
-					var player = $f(container.childNodes[0]),
-						playerState = -1;
-					
-					player.addEvent('ready', function() {
-		
-						player.playVideo = function() {
-							player.api( 'play' );
-						};
-						player.stopVideo = function() {
-							player.api( 'unload' );
-						};
-						player.pauseVideo = function() {
-							player.api( 'pause' );
-						};
-						player.seekTo = function( seconds ) {
-							player.api( 'seekTo', seconds );
-						};
-						player.setVolume = function( volume ) {
-							player.api( 'setVolume', volume );
-						};
-						player.setMuted = function( muted ) {
-							if( muted ) {
-								player.lastVolume = player.api( 'getVolume' );
-								player.api( 'setVolume', 0 );
-							} else {
-								player.api( 'setVolume', player.lastVolume );
-								delete player.lastVolume;
-							}
-						};
-						// parity with YT player
-						player.getPlayerState = function() {
-							return playerState;
-						};
+var renderer = exports.renderer = new Renderer();
 
-						function createEvent(player, pluginMediaElement, eventName, e) {
-							var event = {
-								type: eventName,
-								target: pluginMediaElement
-							};
-							if (eventName == 'timeupdate') {
-								pluginMediaElement.currentTime = event.currentTime = e.seconds;
-								pluginMediaElement.duration = event.duration = e.duration;
-							}
-							pluginMediaElement.dispatchEvent(event);
-						}
+_mejs2.default.Renderers = renderer;
 
-						player.addEvent('play', function() {
-							playerState = 1;
-							createEvent(player, pluginMediaElement, 'play');
-							createEvent(player, pluginMediaElement, 'playing');
-						});
+},{"7":7}],9:[function(_dereq_,module,exports){
+'use strict';
 
-						player.addEvent('pause', function() {
-							playerState = 2;							
-							createEvent(player, pluginMediaElement, 'pause');
-						});
+var _window = _dereq_(3);
 
-						player.addEvent('finish', function() {
-							playerState = 0;							
-							createEvent(player, pluginMediaElement, 'ended');
-						});
+var _window2 = _interopRequireDefault(_window);
 
-						player.addEvent('playProgress', function(e) {
-							createEvent(player, pluginMediaElement, 'timeupdate', e);
-						});
-						
-						player.addEvent('seek', function(e) {
-							playerState = 3;
-							createEvent(player, pluginMediaElement, 'seeked', e);
-						});	
-						
-						player.addEvent('loadProgress', function(e) {
-							playerState = 3;
-							createEvent(player, pluginMediaElement, 'progress', e);
-						});												
+var _document = _dereq_(2);
 
-						pluginMediaElement.pluginElement = container;
-						pluginMediaElement.pluginApi = player;
+var _document2 = _interopRequireDefault(_document);
 
-						pluginMediaElement.success(pluginMediaElement, pluginMediaElement.pluginElement);						
-					});
-				}
-				else {
-					console.warn("You need to include froogaloop for vimeo to work");
-				}
-				break;			
-		}
-		// hide original element
-		htmlMediaElement.style.display = 'none';
-		// prevent browser from autoplaying when using a plugin
-		htmlMediaElement.removeAttribute('autoplay');
-		
-		return pluginMediaElement;
-	},
+var _i18n = _dereq_(5);
 
-	updateNative: function(playback, options, autoplay, preload) {
-		
-		var htmlMediaElement = playback.htmlMediaElement,
-			m;
-		
-		
-		// add methods to video object to bring it into parity with Flash Object
-		for (m in mejs.HtmlMediaElement) {
-			htmlMediaElement[m] = mejs.HtmlMediaElement[m];
-		}
-
-		/*
-		Chrome now supports preload="none"
-		if (mejs.MediaFeatures.isChrome) {
-		
-			// special case to enforce preload attribute (Chrome doesn't respect this)
-			if (preload === 'none' && !autoplay) {
-			
-				// forces the browser to stop loading (note: fails in IE9)
-				htmlMediaElement.src = '';
-				htmlMediaElement.load();
-				htmlMediaElement.canceledPreload = true;
-
-				htmlMediaElement.addEventListener('play',function() {
-					if (htmlMediaElement.canceledPreload) {
-						htmlMediaElement.src = playback.url;
-						htmlMediaElement.load();
-						htmlMediaElement.play();
-						htmlMediaElement.canceledPreload = false;
-					}
-				}, false);
-			// for some reason Chrome forgets how to autoplay sometimes.
-			} else if (autoplay) {
-				htmlMediaElement.load();
-				htmlMediaElement.play();
-			}
-		}
-		*/
+var _i18n2 = _interopRequireDefault(_i18n);
 
-		// fire success code
-		options.success(htmlMediaElement, htmlMediaElement);
-		
-		return htmlMediaElement;
-	}
-};
+var _player = _dereq_(16);
 
-/*
- - test on IE (object vs. embed)
- - determine when to use iframe (Firefox, Safari, Mobile) vs. Flash (Chrome, IE)
- - fullscreen?
-*/
+var _player2 = _interopRequireDefault(_player);
 
-// YouTube Flash and Iframe API
-mejs.YouTubeApi = {
-	isIframeStarted: false,
-	isIframeLoaded: false,
-	loadIframeApi: function(yt) {
-		if (!this.isIframeStarted) {
-			var tag = document.createElement('script');
-			tag.src = yt.scheme + "www.youtube.com/player_api";
-			var firstScriptTag = document.getElementsByTagName('script')[0];
-			firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
-			this.isIframeStarted = true;
-		}
-	},
-	iframeQueue: [],
-	enqueueIframe: function(yt) {
-		
-		if (this.isLoaded) {
-			this.createIframe(yt);
-		} else {
-			this.loadIframeApi(yt);
-			this.iframeQueue.push(yt);
+var _constants = _dereq_(25);
+
+var Features = _interopRequireWildcard(_constants);
+
+var _general = _dereq_(27);
+
+var _dom = _dereq_(26);
+
+var _media = _dereq_(28);
+
+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 }; }
+
+Object.assign(_player.config, {
+	usePluginFullScreen: true,
+
+	fullscreenText: null,
+
+	useFakeFullscreen: false
+});
+
+Object.assign(_player2.default.prototype, {
+	isFullScreen: false,
+
+	isNativeFullScreen: false,
+
+	isInIframe: false,
+
+	isPluginClickThroughCreated: false,
+
+	fullscreenMode: '',
+
+	containerSizeTimeout: null,
+
+	buildfullscreen: function buildfullscreen(player) {
+		if (!player.isVideo) {
+			return;
 		}
-	},
-	createIframe: function(settings) {
-
-		var
-		pluginMediaElement = settings.pluginMediaElement,
-		defaultVars = {controls:0, wmode:'transparent'},
-		player = new YT.Player(settings.containerId, {
-			height: settings.height,
-			width: settings.width,
-			videoId: settings.videoId,
-			playerVars: mejs.$.extend({}, defaultVars, settings.variables),
-			events: {
-				'onReady': function(e) {
-					
-					// wrapper to match
-					player.setVideoSize = function(width, height) {
-						player.setSize(width, height);
-					};
-					
-					// hook up iframe object to MEjs
-					settings.pluginMediaElement.pluginApi = player;
-					settings.pluginMediaElement.pluginElement = document.getElementById(settings.containerId);
-					
-					// init mejs
-					pluginMediaElement.success(pluginMediaElement, pluginMediaElement.pluginElement);
-
-					mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'canplay');
-					
-					// create timer
-					setInterval(function() {
-						mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'timeupdate');
-					}, 250);
-
-					if (typeof pluginMediaElement.attributes.autoplay !== 'undefined') {
-						player.playVideo();
-					}
-				},
-				'onStateChange': function(e) {
-					
-					mejs.YouTubeApi.handleStateChange(e.data, player, pluginMediaElement);
-					
-				}
+
+		player.isInIframe = _window2.default.location !== _window2.default.parent.location;
+
+		player.detectFullscreenMode();
+
+		var t = this,
+		    fullscreenTitle = (0, _general.isString)(t.options.fullscreenText) ? t.options.fullscreenText : _i18n2.default.t('mejs.fullscreen'),
+		    fullscreenBtn = _document2.default.createElement('div');
+
+		fullscreenBtn.className = t.options.classPrefix + 'button ' + t.options.classPrefix + 'fullscreen-button';
+		fullscreenBtn.innerHTML = '<button type="button" aria-controls="' + t.id + '" title="' + fullscreenTitle + '" aria-label="' + fullscreenTitle + '" tabindex="0"></button>';
+		t.addControlElement(fullscreenBtn, 'fullscreen');
+
+		fullscreenBtn.addEventListener('click', function () {
+			var isFullScreen = Features.HAS_TRUE_NATIVE_FULLSCREEN && Features.IS_FULLSCREEN || player.isFullScreen;
+
+			if (isFullScreen) {
+				player.exitFullScreen();
+			} else {
+				player.enterFullScreen();
 			}
 		});
-	},
-	
-	createEvent: function (player, pluginMediaElement, eventName) {
-		var event = {
-			type: eventName,
-			target: pluginMediaElement
+
+		player.fullscreenBtn = fullscreenBtn;
+
+		t.exitFullscreenCallback = function (e) {
+			var key = e.which || e.keyCode || 0;
+			if (key === 27 && (Features.HAS_TRUE_NATIVE_FULLSCREEN && Features.IS_FULLSCREEN || t.isFullScreen)) {
+				player.exitFullScreen();
+			}
 		};
 
-		if (player && player.getDuration) {
-			
-			// time 
-			pluginMediaElement.currentTime = event.currentTime = player.getCurrentTime();
-			pluginMediaElement.duration = event.duration = player.getDuration();
-			
-			// state
-			event.paused = pluginMediaElement.paused;
-			event.ended = pluginMediaElement.ended;			
-			
-			// sound
-			event.muted = player.isMuted();
-			event.volume = player.getVolume() / 100;
-			
-			// progress
-			event.bytesTotal = player.getVideoBytesTotal();
-			event.bufferedBytes = player.getVideoBytesLoaded();
-			
-			// fake the W3C buffered TimeRange
-			var bufferedTime = event.bufferedBytes / event.bytesTotal * event.duration;
-			
-			event.target.buffered = event.buffered = {
-				start: function(index) {
-					return 0;
-				},
-				end: function (index) {
-					return bufferedTime;
-				},
-				length: 1
+		t.globalBind('keydown', t.exitFullscreenCallback);
+
+		t.normalHeight = 0;
+		t.normalWidth = 0;
+
+		if (Features.HAS_TRUE_NATIVE_FULLSCREEN) {
+			var fullscreenChanged = function fullscreenChanged() {
+				if (player.isFullScreen) {
+					if (Features.isFullScreen()) {
+						player.isNativeFullScreen = true;
+
+						player.setControlsSize();
+					} else {
+						player.isNativeFullScreen = false;
+
+						player.exitFullScreen();
+					}
+				}
 			};
 
+			player.globalBind(Features.FULLSCREEN_EVENT_NAME, fullscreenChanged);
 		}
-		
-		// send event up the chain
-		pluginMediaElement.dispatchEvent(event);
-	},	
-	
-	iFrameReady: function() {
-		
-		this.isLoaded = true;
-		this.isIframeLoaded = true;
-		
-		while (this.iframeQueue.length > 0) {
-			var settings = this.iframeQueue.pop();
-			this.createIframe(settings);
-		}	
 	},
-	
-	// FLASH!
-	flashPlayers: {},
-	createFlash: function(settings) {
-		
-		this.flashPlayers[settings.pluginId] = settings;
-		
-		/*
-		settings.container.innerHTML =
-			'<object type="application/x-shockwave-flash" id="' + settings.pluginId + '" data="' + settings.scheme + 'www.youtube.com/apiplayer?enablejsapi=1&amp;playerapiid=' + settings.pluginId  + '&amp;version=3&amp;autoplay=0&amp;controls=0&amp;modestbranding=1&loop=0" ' +
-				'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; " class="mejs-shim">' +
-				'<param name="allowScriptAccess" value="sameDomain">' +
-				'<param name="wmode" value="transparent">' +
-			'</object>';
-		*/
-
-		var specialIEContainer,
-			youtubeUrl = settings.scheme + 'www.youtube.com/apiplayer?enablejsapi=1&amp;playerapiid=' + settings.pluginId  + '&amp;version=3&amp;autoplay=0&amp;controls=0&amp;modestbranding=1&loop=0';
-			
-		if (mejs.MediaFeatures.isIE) {
-			
-			specialIEContainer = document.createElement('div');
-			settings.container.appendChild(specialIEContainer);
-			specialIEContainer.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="' + settings.scheme + 'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" ' +
-'id="' + settings.pluginId + '" width="' + settings.width + '" height="' + settings.height + '" class="mejs-shim">' +
-	'<param name="movie" value="' + youtubeUrl + '" />' +
-	'<param name="wmode" value="transparent" />' +
-	'<param name="allowScriptAccess" value="' + options.flashScriptAccess + '" />' +
-	'<param name="allowFullScreen" value="true" />' +
-'</object>';
-		} else {
-		settings.container.innerHTML =
-			'<object type="application/x-shockwave-flash" id="' + settings.pluginId + '" data="' + youtubeUrl + '" ' +
-				'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; " class="mejs-shim">' +
-				'<param name="allowScriptAccess" value="' + options.flashScriptAccess + '">' +
-				'<param name="wmode" value="transparent">' +
-			'</object>';
-		}		
-		
+	cleanfullscreen: function cleanfullscreen(player) {
+		player.exitFullScreen();
+		player.globalUnbind('keydown', player.exitFullscreenCallback);
 	},
-	
-	flashReady: function(id) {
-		var
-			settings = this.flashPlayers[id],
-			player = document.getElementById(id),
-			pluginMediaElement = settings.pluginMediaElement;
-		
-		// hook up and return to MediaELementPlayer.success	
-		pluginMediaElement.pluginApi = 
-		pluginMediaElement.pluginElement = player;
-		
-		settings.success(pluginMediaElement, pluginMediaElement.pluginElement);
-		
-		// load the youtube video
-		player.cueVideoById(settings.videoId);
-		
-		var callbackName = settings.containerId + '_callback';
-		
-		window[callbackName] = function(e) {
-			mejs.YouTubeApi.handleStateChange(e, player, pluginMediaElement);
-		};
-		
-		player.addEventListener('onStateChange', callbackName);
-		
-		setInterval(function() {
-			mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'timeupdate');
-		}, 250);
-		
-		mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'canplay');
+	detectFullscreenMode: function detectFullscreenMode() {
+		var t = this,
+		    isNative = t.media.rendererName !== null && /(native|html5)/i.test(t.media.rendererName);
+
+		var mode = '';
+
+		if (Features.HAS_TRUE_NATIVE_FULLSCREEN && isNative) {
+			mode = 'native-native';
+		} else if (Features.HAS_TRUE_NATIVE_FULLSCREEN && !isNative) {
+			mode = 'plugin-native';
+		} else if (t.usePluginFullScreen && Features.SUPPORT_POINTER_EVENTS) {
+			mode = 'plugin-click';
+		}
+
+		t.fullscreenMode = mode;
+		return mode;
 	},
-	
-	handleStateChange: function(youTubeState, player, pluginMediaElement) {
-		switch (youTubeState) {
-			case -1: // not started
-				pluginMediaElement.paused = true;
-				pluginMediaElement.ended = true;
-				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'loadedmetadata');
-				//createYouTubeEvent(player, pluginMediaElement, 'loadeddata');
-				break;
-			case 0:
-				pluginMediaElement.paused = false;
-				pluginMediaElement.ended = true;
-				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'ended');
-				break;
-			case 1:
-				pluginMediaElement.paused = false;
-				pluginMediaElement.ended = false;				
-				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'play');
-				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'playing');
-				break;
-			case 2:
-				pluginMediaElement.paused = true;
-				pluginMediaElement.ended = false;				
-				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'pause');
-				break;
-			case 3: // buffering
-				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'progress');
-				break;
-			case 5:
-				// cued?
-				break;						
-			
-		}			
-		
-	}
-}
-// IFRAME
-window.onYouTubePlayerAPIReady = function() {
-	mejs.YouTubeApi.iFrameReady();
-};
-// FLASH
-window.onYouTubePlayerReady = function(id) {
-	mejs.YouTubeApi.flashReady(id);
-};
+	enterFullScreen: function enterFullScreen() {
+		var t = this,
+		    isNative = t.media.rendererName !== null && /(html5|native)/i.test(t.media.rendererName),
+		    containerStyles = getComputedStyle(t.container);
 
-window.mejs = mejs;
-window.MediaElement = mejs.MediaElement;
+		if (t.options.useFakeFullscreen === false && Features.IS_IOS && Features.HAS_IOS_FULLSCREEN && typeof t.media.originalNode.webkitEnterFullscreen === 'function' && t.media.originalNode.canPlayType((0, _media.getTypeFromFile)(t.media.getSrc()))) {
+			t.media.originalNode.webkitEnterFullscreen();
+			return;
+		}
 
-/**
- * Localize strings
- *
- * Include translations from JS files and method to pluralize properly strings.
- *
- */
-(function (doc, win, mejs, undefined) {
-
-	var i18n = {
-		/**
-		 * @type {String}
-		 */
-		'default': 'en',
-
-		/**
-		 * @type {String[]}
-		 */
-		locale: {
-			language: (mejs.i18n && mejs.i18n.locale.language) || '',
-			strings: (mejs.i18n && mejs.i18n.locale.strings) || {}
+		(0, _dom.addClass)(_document2.default.documentElement, t.options.classPrefix + 'fullscreen');
+		(0, _dom.addClass)(t.container, t.options.classPrefix + 'container-fullscreen');
+
+		t.normalHeight = parseFloat(containerStyles.height);
+		t.normalWidth = parseFloat(containerStyles.width);
+
+		if (t.fullscreenMode === 'native-native' || t.fullscreenMode === 'plugin-native') {
+			Features.requestFullScreen(t.container);
+
+			if (t.isInIframe) {
+				setTimeout(function checkFullscreen() {
+
+					if (t.isNativeFullScreen) {
+						var percentErrorMargin = 0.002,
+						    windowWidth = _window2.default.innerWidth || _document2.default.documentElement.clientWidth || _document2.default.body.clientWidth,
+						    screenWidth = screen.width,
+						    absDiff = Math.abs(screenWidth - windowWidth),
+						    marginError = screenWidth * percentErrorMargin;
+
+						if (absDiff > marginError) {
+							t.exitFullScreen();
+						} else {
+							setTimeout(checkFullscreen, 500);
+						}
+					}
+				}, 1000);
+			}
+		}
+
+		t.container.style.width = '100%';
+		t.container.style.height = '100%';
+
+		t.containerSizeTimeout = setTimeout(function () {
+			t.container.style.width = '100%';
+			t.container.style.height = '100%';
+			t.setControlsSize();
+		}, 500);
+
+		if (isNative) {
+			t.node.style.width = '100%';
+			t.node.style.height = '100%';
+		} else {
+			var elements = t.container.querySelectorAll('embed, object, video'),
+			    _total = elements.length;
+			for (var i = 0; i < _total; i++) {
+				elements[i].style.width = '100%';
+				elements[i].style.height = '100%';
+			}
+		}
+
+		if (t.options.setDimensions && typeof t.media.setSize === 'function') {
+			t.media.setSize(screen.width, screen.height);
+		}
+
+		var layers = t.layers.children,
+		    total = layers.length;
+		for (var _i = 0; _i < total; _i++) {
+			layers[_i].style.width = '100%';
+			layers[_i].style.height = '100%';
+		}
+
+		if (t.fullscreenBtn) {
+			(0, _dom.removeClass)(t.fullscreenBtn, t.options.classPrefix + 'fullscreen');
+			(0, _dom.addClass)(t.fullscreenBtn, t.options.classPrefix + 'unfullscreen');
+		}
+
+		t.setControlsSize();
+		t.isFullScreen = true;
+
+		var zoomFactor = Math.min(screen.width / t.width, screen.height / t.height),
+		    captionText = t.container.querySelector('.' + t.options.classPrefix + 'captions-text');
+		if (captionText) {
+			captionText.style.fontSize = zoomFactor * 100 + '%';
+			captionText.style.lineHeight = 'normal';
+			t.container.querySelector('.' + t.options.classPrefix + 'captions-position').style.bottom = '45px';
+		}
+		var event = (0, _general.createEvent)('enteredfullscreen', t.container);
+		t.container.dispatchEvent(event);
+	},
+	exitFullScreen: function exitFullScreen() {
+		var t = this,
+		    isNative = t.media.rendererName !== null && /(native|html5)/i.test(t.media.rendererName);
+
+		clearTimeout(t.containerSizeTimeout);
+
+		if (Features.HAS_TRUE_NATIVE_FULLSCREEN && (Features.IS_FULLSCREEN || t.isFullScreen)) {
+			Features.cancelFullScreen();
+		}
+
+		(0, _dom.removeClass)(_document2.default.documentElement, t.options.classPrefix + 'fullscreen');
+		(0, _dom.removeClass)(t.container, t.options.classPrefix + 'container-fullscreen');
+
+		if (t.options.setDimensions) {
+			t.container.style.width = t.normalWidth + 'px';
+			t.container.style.height = t.normalHeight + 'px';
+
+			if (isNative) {
+				t.node.style.width = t.normalWidth + 'px';
+				t.node.style.height = t.normalHeight + 'px';
+			} else {
+				var elements = t.container.querySelectorAll('embed, object, video'),
+				    _total2 = elements.length;
+				for (var i = 0; i < _total2; i++) {
+					elements[i].style.width = t.normalWidth + 'px';
+					elements[i].style.height = t.normalHeight + 'px';
+				}
+			}
+
+			if (typeof t.media.setSize === 'function') {
+				t.media.setSize(t.normalWidth, t.normalHeight);
+			}
+
+			var layers = t.layers.children,
+			    total = layers.length;
+			for (var _i2 = 0; _i2 < total; _i2++) {
+				layers[_i2].style.width = t.normalWidth + 'px';
+				layers[_i2].style.height = t.normalHeight + 'px';
+			}
+		}
+
+		if (t.fullscreenBtn) {
+			(0, _dom.removeClass)(t.fullscreenBtn, t.options.classPrefix + 'unfullscreen');
+			(0, _dom.addClass)(t.fullscreenBtn, t.options.classPrefix + 'fullscreen');
+		}
+
+		t.setControlsSize();
+		t.isFullScreen = false;
+
+		var captionText = t.container.querySelector('.' + t.options.classPrefix + 'captions-text');
+		if (captionText) {
+			captionText.style.fontSize = '';
+			captionText.style.lineHeight = '';
+			t.container.querySelector('.' + t.options.classPrefix + 'captions-position').style.bottom = '';
+		}
+		var event = (0, _general.createEvent)('exitedfullscreen', t.container);
+		t.container.dispatchEvent(event);
+	}
+});
+
+},{"16":16,"2":2,"25":25,"26":26,"27":27,"28":28,"3":3,"5":5}],10:[function(_dereq_,module,exports){
+'use strict';
+
+var _document = _dereq_(2);
+
+var _document2 = _interopRequireDefault(_document);
+
+var _player = _dereq_(16);
+
+var _player2 = _interopRequireDefault(_player);
+
+var _i18n = _dereq_(5);
+
+var _i18n2 = _interopRequireDefault(_i18n);
+
+var _general = _dereq_(27);
+
+var _dom = _dereq_(26);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+Object.assign(_player.config, {
+	playText: null,
+
+	pauseText: null
+});
+
+Object.assign(_player2.default.prototype, {
+	buildplaypause: function buildplaypause(player, controls, layers, media) {
+		var t = this,
+		    op = t.options,
+		    playTitle = (0, _general.isString)(op.playText) ? op.playText : _i18n2.default.t('mejs.play'),
+		    pauseTitle = (0, _general.isString)(op.pauseText) ? op.pauseText : _i18n2.default.t('mejs.pause'),
+		    play = _document2.default.createElement('div');
+
+		play.className = t.options.classPrefix + 'button ' + t.options.classPrefix + 'playpause-button ' + t.options.classPrefix + 'play';
+		play.innerHTML = '<button type="button" aria-controls="' + t.id + '" title="' + playTitle + '" aria-label="' + pauseTitle + '" tabindex="0"></button>';
+		play.addEventListener('click', function () {
+			if (t.paused) {
+				t.play();
+			} else {
+				t.pause();
+			}
+		});
+
+		var playBtn = play.querySelector('button');
+		t.addControlElement(play, 'playpause');
+
+		function togglePlayPause(which) {
+			if ('play' === which) {
+				(0, _dom.removeClass)(play, t.options.classPrefix + 'play');
+				(0, _dom.removeClass)(play, t.options.classPrefix + 'replay');
+				(0, _dom.addClass)(play, t.options.classPrefix + 'pause');
+				playBtn.setAttribute('title', pauseTitle);
+				playBtn.setAttribute('aria-label', pauseTitle);
+			} else {
+
+				(0, _dom.removeClass)(play, t.options.classPrefix + 'pause');
+				(0, _dom.removeClass)(play, t.options.classPrefix + 'replay');
+				(0, _dom.addClass)(play, t.options.classPrefix + 'play');
+				playBtn.setAttribute('title', playTitle);
+				playBtn.setAttribute('aria-label', playTitle);
+			}
+		}
+
+		togglePlayPause('pse');
+
+		media.addEventListener('loadedmetadata', function () {
+			if (media.rendererName.indexOf('flash') === -1) {
+				togglePlayPause('pse');
+			}
+		});
+		media.addEventListener('play', function () {
+			togglePlayPause('play');
+		});
+		media.addEventListener('playing', function () {
+			togglePlayPause('play');
+		});
+		media.addEventListener('pause', function () {
+			togglePlayPause('pse');
+		});
+		media.addEventListener('ended', function () {
+			if (!player.options.loop) {
+				(0, _dom.removeClass)(play, t.options.classPrefix + 'pause');
+				(0, _dom.removeClass)(play, t.options.classPrefix + 'play');
+				(0, _dom.addClass)(play, t.options.classPrefix + 'replay');
+				playBtn.setAttribute('title', playTitle);
+				playBtn.setAttribute('aria-label', playTitle);
+			}
+		});
+	}
+});
+
+},{"16":16,"2":2,"26":26,"27":27,"5":5}],11:[function(_dereq_,module,exports){
+'use strict';
+
+var _document = _dereq_(2);
+
+var _document2 = _interopRequireDefault(_document);
+
+var _player = _dereq_(16);
+
+var _player2 = _interopRequireDefault(_player);
+
+var _i18n = _dereq_(5);
+
+var _i18n2 = _interopRequireDefault(_i18n);
+
+var _constants = _dereq_(25);
+
+var _time = _dereq_(30);
+
+var _dom = _dereq_(26);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+Object.assign(_player.config, {
+	enableProgressTooltip: true,
+
+	useSmoothHover: true,
+
+	forceLive: false
+});
+
+Object.assign(_player2.default.prototype, {
+	buildprogress: function buildprogress(player, controls, layers, media) {
+
+		var lastKeyPressTime = 0,
+		    mouseIsDown = false,
+		    startedPaused = false;
+
+		var t = this,
+		    autoRewindInitial = player.options.autoRewind,
+		    tooltip = player.options.enableProgressTooltip ? '<span class="' + t.options.classPrefix + 'time-float">' + ('<span class="' + t.options.classPrefix + 'time-float-current">00:00</span>') + ('<span class="' + t.options.classPrefix + 'time-float-corner"></span>') + '</span>' : '',
+		    rail = _document2.default.createElement('div');
+
+		rail.className = t.options.classPrefix + 'time-rail';
+		rail.innerHTML = '<span class="' + t.options.classPrefix + 'time-total ' + t.options.classPrefix + 'time-slider">' + ('<span class="' + t.options.classPrefix + 'time-buffering"></span>') + ('<span class="' + t.options.classPrefix + 'time-loaded"></span>') + ('<span class="' + t.options.classPrefix + 'time-current"></span>') + ('<span class="' + t.options.classPrefix + 'time-hovered no-hover"></span>') + ('<span class="' + t.options.classPrefix + 'time-handle"><span class="' + t.options.classPrefix + 'time-handle-content"></span></span>') + ('' + tooltip) + '</span>';
+
+		t.addControlElement(rail, 'progress');
+
+		controls.querySelector('.' + t.options.classPrefix + 'time-buffering').style.display = 'none';
+
+		t.rail = controls.querySelector('.' + t.options.classPrefix + 'time-rail');
+		t.total = controls.querySelector('.' + t.options.classPrefix + 'time-total');
+		t.loaded = controls.querySelector('.' + t.options.classPrefix + 'time-loaded');
+		t.current = controls.querySelector('.' + t.options.classPrefix + 'time-current');
+		t.handle = controls.querySelector('.' + t.options.classPrefix + 'time-handle');
+		t.timefloat = controls.querySelector('.' + t.options.classPrefix + 'time-float');
+		t.timefloatcurrent = controls.querySelector('.' + t.options.classPrefix + 'time-float-current');
+		t.slider = controls.querySelector('.' + t.options.classPrefix + 'time-slider');
+		t.hovered = controls.querySelector('.' + t.options.classPrefix + 'time-hovered');
+		t.newTime = 0;
+		t.forcedHandlePause = false;
+		t.setTransformStyle = function (element, value) {
+			element.style.transform = value;
+			element.style.webkitTransform = value;
+			element.style.MozTransform = value;
+			element.style.msTransform = value;
+			element.style.OTransform = value;
+		};
+
+		var handleMouseMove = function handleMouseMove(e) {
+			var totalStyles = getComputedStyle(t.total),
+			    offsetStyles = (0, _dom.offset)(t.total),
+			    width = t.total.offsetWidth,
+			    transform = function () {
+				if (totalStyles.webkitTransform !== undefined) {
+					return 'webkitTransform';
+				} else if (totalStyles.mozTransform !== undefined) {
+					return 'mozTransform ';
+				} else if (totalStyles.oTransform !== undefined) {
+					return 'oTransform';
+				} else if (totalStyles.msTransform !== undefined) {
+					return 'msTransform';
+				} else {
+					return 'transform';
+				}
+			}(),
+			    cssMatrix = function () {
+				if ('WebKitCSSMatrix' in window) {
+					return 'WebKitCSSMatrix';
+				} else if ('MSCSSMatrix' in window) {
+					return 'MSCSSMatrix';
+				} else if ('CSSMatrix' in window) {
+					return 'CSSMatrix';
+				}
+			}();
+
+			var percentage = 0,
+			    leftPos = 0,
+			    pos = 0,
+			    x = void 0;
+
+			if (e.originalEvent && e.originalEvent.changedTouches) {
+				x = e.originalEvent.changedTouches[0].pageX;
+			} else if (e.changedTouches) {
+				x = e.changedTouches[0].pageX;
+			} else {
+				x = e.pageX;
+			}
+
+			if (t.getDuration()) {
+				if (x < offsetStyles.left) {
+					x = offsetStyles.left;
+				} else if (x > width + offsetStyles.left) {
+					x = width + offsetStyles.left;
+				}
+
+				pos = x - offsetStyles.left;
+				percentage = pos / width;
+				t.newTime = percentage <= 0.02 ? 0 : percentage * t.getDuration();
+
+				if (mouseIsDown && t.getCurrentTime() !== null && t.newTime.toFixed(4) !== t.getCurrentTime().toFixed(4)) {
+					t.setCurrentRailHandle(t.newTime);
+					t.updateCurrent(t.newTime);
+				}
+
+				if (!_constants.IS_IOS && !_constants.IS_ANDROID && t.timefloat) {
+					if (pos < 0) {
+						pos = 0;
+					}
+					if (t.options.useSmoothHover && cssMatrix !== null && typeof window[cssMatrix] !== 'undefined') {
+						var matrix = new window[cssMatrix](getComputedStyle(t.handle)[transform]),
+						    handleLocation = matrix.m41,
+						    hoverScaleX = pos / parseFloat(getComputedStyle(t.total).width) - handleLocation / parseFloat(getComputedStyle(t.total).width);
+
+						t.hovered.style.left = handleLocation + 'px';
+						t.setTransformStyle(t.hovered, 'scaleX(' + hoverScaleX + ')');
+						t.hovered.setAttribute('pos', pos);
+
+						if (hoverScaleX >= 0) {
+							(0, _dom.removeClass)(t.hovered, 'negative');
+						} else {
+							(0, _dom.addClass)(t.hovered, 'negative');
+						}
+					}
+
+					var half = t.timefloat.offsetWidth / 2;
+					if (x <= t.timefloat.offsetWidth + half) {
+						leftPos = half;
+					} else if (x >= t.container.offsetWidth - half) {
+						leftPos = t.total.offsetWidth - half;
+					} else {
+						leftPos = pos;
+					}
+
+					t.timefloat.style.left = leftPos + 'px';
+					t.timefloatcurrent.innerHTML = (0, _time.secondsToTimeCode)(t.newTime, player.options.alwaysShowHours, player.options.showTimecodeFrameCount, player.options.framesPerSecond, player.options.secondsDecimalLength);
+					t.timefloat.style.display = 'block';
+				}
+			} else if (!_constants.IS_IOS && !_constants.IS_ANDROID && t.timefloat) {
+				leftPos = t.timefloat.offsetWidth + width >= t.container.offsetWidth ? t.timefloat.offsetWidth / 2 : 0;
+				t.timefloat.style.left = leftPos + 'px';
+				t.timefloat.style.left = leftPos + 'px';
+				t.timefloat.style.display = 'block';
+			}
+		},
+		    updateSlider = function updateSlider() {
+			var seconds = t.getCurrentTime(),
+			    timeSliderText = _i18n2.default.t('mejs.time-slider'),
+			    time = (0, _time.secondsToTimeCode)(seconds, player.options.alwaysShowHours, player.options.showTimecodeFrameCount, player.options.framesPerSecond, player.options.secondsDecimalLength),
+			    duration = t.getDuration();
+
+			t.slider.setAttribute('role', 'slider');
+			t.slider.tabIndex = 0;
+
+			if (media.paused) {
+				t.slider.setAttribute('aria-label', timeSliderText);
+				t.slider.setAttribute('aria-valuemin', 0);
+				t.slider.setAttribute('aria-valuemax', duration);
+				t.slider.setAttribute('aria-valuenow', seconds);
+				t.slider.setAttribute('aria-valuetext', time);
+			} else {
+				t.slider.removeAttribute('aria-label');
+				t.slider.removeAttribute('aria-valuemin');
+				t.slider.removeAttribute('aria-valuemax');
+				t.slider.removeAttribute('aria-valuenow');
+				t.slider.removeAttribute('aria-valuetext');
+			}
 		},
+		    restartPlayer = function restartPlayer() {
+			if (new Date() - lastKeyPressTime >= 1000) {
+				t.play();
+			}
+		},
+		    handleMouseup = function handleMouseup() {
+			if (mouseIsDown && t.getCurrentTime() !== null && t.newTime.toFixed(4) !== t.getCurrentTime().toFixed(4)) {
+				t.setCurrentTime(t.newTime);
+				t.setCurrentRail();
+				t.updateCurrent(t.newTime);
+			}
+			if (t.forcedHandlePause) {
+				t.slider.focus();
+				t.play();
+			}
+			t.forcedHandlePause = false;
+		};
+
+		t.slider.addEventListener('focus', function () {
+			player.options.autoRewind = false;
+		});
+		t.slider.addEventListener('blur', function () {
+			player.options.autoRewind = autoRewindInitial;
+		});
+		t.slider.addEventListener('keydown', function (e) {
+			if (new Date() - lastKeyPressTime >= 1000) {
+				startedPaused = t.paused;
+			}
+
+			if (t.options.keyActions.length) {
+
+				var keyCode = e.which || e.keyCode || 0,
+				    duration = t.getDuration(),
+				    seekForward = player.options.defaultSeekForwardInterval(media),
+				    seekBackward = player.options.defaultSeekBackwardInterval(media);
+
+				var seekTime = t.getCurrentTime();
+
+				switch (keyCode) {
+					case 37:
+					case 40:
+						if (t.getDuration() !== Infinity) {
+							seekTime -= seekBackward;
+						}
+						break;
+					case 39:
+					case 38:
+						if (t.getDuration() !== Infinity) {
+							seekTime += seekForward;
+						}
+						break;
+					case 36:
+						seekTime = 0;
+						break;
+					case 35:
+						seekTime = duration;
+						break;
+					case 32:
+						if (!_constants.IS_FIREFOX) {
+							if (t.paused) {
+								t.play();
+							} else {
+								t.pause();
+							}
+						}
+						return;
+					case 13:
+						if (t.paused) {
+							t.play();
+						} else {
+							t.pause();
+						}
+						return;
+					default:
+						return;
+				}
+
+				seekTime = seekTime < 0 ? 0 : seekTime >= duration ? duration : Math.floor(seekTime);
+				lastKeyPressTime = new Date();
+				if (!startedPaused) {
+					player.pause();
+				}
+
+				if (seekTime < t.getDuration() && !startedPaused) {
+					setTimeout(restartPlayer, 1100);
+				}
+
+				t.setCurrentTime(seekTime);
+
+				e.preventDefault();
+				e.stopPropagation();
+			}
+		});
+
+		var events = ['mousedown', 'touchstart'];
+
+		t.slider.addEventListener('dragstart', function () {
+			return false;
+		});
+
+		for (var i = 0, total = events.length; i < total; i++) {
+			t.slider.addEventListener(events[i], function (e) {
+				t.forcedHandlePause = false;
+				if (t.getDuration() !== Infinity) {
+					if (e.which === 1 || e.which === 0) {
+						if (!t.paused) {
+							t.pause();
+							t.forcedHandlePause = true;
+						}
+
+						mouseIsDown = true;
+						handleMouseMove(e);
+						var endEvents = ['mouseup', 'touchend'];
+
+						for (var j = 0, totalEvents = endEvents.length; j < totalEvents; j++) {
+							t.container.addEventListener(endEvents[j], function (event) {
+								var target = event.target;
+								if (target === t.slider || target.closest('.' + t.options.classPrefix + 'time-slider')) {
+									handleMouseMove(event);
+								}
+							});
+						}
+						t.globalBind('mouseup.dur touchend.dur', function () {
+							handleMouseup();
+							mouseIsDown = false;
+							if (t.timefloat) {
+								t.timefloat.style.display = 'none';
+							}
+						});
+					}
+				}
+			});
+		}
+		t.slider.addEventListener('mouseenter', function (e) {
+			if (e.target === t.slider && t.getDuration() !== Infinity) {
+				t.container.addEventListener('mousemove', function (event) {
+					var target = event.target;
+					if (target === t.slider || target.closest('.' + t.options.classPrefix + 'time-slider')) {
+						handleMouseMove(event);
+					}
+				});
+				if (t.timefloat && !_constants.IS_IOS && !_constants.IS_ANDROID) {
+					t.timefloat.style.display = 'block';
+				}
+				if (t.hovered && !_constants.IS_IOS && !_constants.IS_ANDROID && t.options.useSmoothHover) {
+					(0, _dom.removeClass)(t.hovered, 'no-hover');
+				}
+			}
+		});
+		t.slider.addEventListener('mouseleave', function () {
+			if (t.getDuration() !== Infinity) {
+				if (!mouseIsDown) {
+					if (t.timefloat) {
+						t.timefloat.style.display = 'none';
+					}
+					if (t.hovered && t.options.useSmoothHover) {
+						(0, _dom.addClass)(t.hovered, 'no-hover');
+					}
+				}
+			}
+		});
+
+		t.broadcastCallback = function (e) {
+			var broadcast = controls.querySelector('.' + t.options.classPrefix + 'broadcast');
+			if (!t.options.forceLive && t.getDuration() !== Infinity) {
+				if (broadcast) {
+					t.slider.style.display = '';
+					broadcast.remove();
+				}
+
+				player.setProgressRail(e);
+				if (!t.forcedHandlePause) {
+					player.setCurrentRail(e);
+				}
+				updateSlider();
+			} else if (!broadcast || t.options.forceLive) {
+				var label = _document2.default.createElement('span');
+				label.className = t.options.classPrefix + 'broadcast';
+				label.innerText = _i18n2.default.t('mejs.live-broadcast');
+				t.slider.style.display = 'none';
+				t.rail.appendChild(label);
+			}
+		};
+
+		media.addEventListener('progress', t.broadcastCallback);
+		media.addEventListener('timeupdate', t.broadcastCallback);
+
+		t.container.addEventListener('controlsresize', function (e) {
+			if (t.getDuration() !== Infinity) {
+				player.setProgressRail(e);
+				if (!t.forcedHandlePause) {
+					player.setCurrentRail(e);
+				}
+			}
+		});
+	},
+	cleanprogress: function cleanprogress(player, controls, layers, media) {
+		media.removeEventListener('progress', player.broadcastCallback);
+		media.removeEventListener('timeupdate', player.broadcastCallback);
+		if (player.rail) {
+			player.rail.remove();
+		}
+	},
+	setProgressRail: function setProgressRail(e) {
+		var t = this,
+		    target = e !== undefined ? e.detail.target || e.target : t.media;
+
+		var percent = null;
+
+		if (target && target.buffered && target.buffered.length > 0 && target.buffered.end && t.getDuration()) {
+			percent = target.buffered.end(target.buffered.length - 1) / t.getDuration();
+		} else if (target && target.bytesTotal !== undefined && target.bytesTotal > 0 && target.bufferedBytes !== undefined) {
+				percent = target.bufferedBytes / target.bytesTotal;
+			} else if (e && e.lengthComputable && e.total !== 0) {
+					percent = e.loaded / e.total;
+				}
+
+		if (percent !== null) {
+			percent = Math.min(1, Math.max(0, percent));
+
+			if (t.loaded) {
+				t.setTransformStyle(t.loaded, 'scaleX(' + percent + ')');
+			}
+		}
+	},
+	setCurrentRailHandle: function setCurrentRailHandle(fakeTime) {
+		var t = this;
+		t.setCurrentRailMain(t, fakeTime);
+	},
+	setCurrentRail: function setCurrentRail() {
+		var t = this;
+		t.setCurrentRailMain(t);
+	},
+	setCurrentRailMain: function setCurrentRailMain(t, fakeTime) {
+		if (t.getCurrentTime() !== undefined && t.getDuration()) {
+			var nTime = typeof fakeTime === 'undefined' ? t.getCurrentTime() : fakeTime;
+
+			if (t.total && t.handle) {
+				var tW = parseFloat(getComputedStyle(t.total).width);
+
+				var newWidth = Math.round(tW * nTime / t.getDuration()),
+				    handlePos = newWidth - Math.round(t.handle.offsetWidth / 2);
+
+				handlePos = handlePos < 0 ? 0 : handlePos;
+				t.setTransformStyle(t.current, 'scaleX(' + newWidth / tW + ')');
+				t.setTransformStyle(t.handle, 'translateX(' + handlePos + 'px)');
+
+				if (t.options.useSmoothHover && !(0, _dom.hasClass)(t.hovered, 'no-hover')) {
+					var pos = parseInt(t.hovered.getAttribute('pos'));
+					pos = isNaN(pos) ? 0 : pos;
+
+					var hoverScaleX = pos / tW - handlePos / tW;
+
+					t.hovered.style.left = handlePos + 'px';
+					t.setTransformStyle(t.hovered, 'scaleX(' + hoverScaleX + ')');
+
+					if (hoverScaleX >= 0) {
+						(0, _dom.removeClass)(t.hovered, 'negative');
+					} else {
+						(0, _dom.addClass)(t.hovered, 'negative');
+					}
+				}
+			}
+		}
+	}
+});
+
+},{"16":16,"2":2,"25":25,"26":26,"30":30,"5":5}],12:[function(_dereq_,module,exports){
+'use strict';
+
+var _document = _dereq_(2);
+
+var _document2 = _interopRequireDefault(_document);
+
+var _player = _dereq_(16);
+
+var _player2 = _interopRequireDefault(_player);
+
+var _time = _dereq_(30);
+
+var _dom = _dereq_(26);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+Object.assign(_player.config, {
+	duration: 0,
+
+	timeAndDurationSeparator: '<span> | </span>'
+});
+
+Object.assign(_player2.default.prototype, {
+	buildcurrent: function buildcurrent(player, controls, layers, media) {
+		var t = this,
+		    time = _document2.default.createElement('div');
+
+		time.className = t.options.classPrefix + 'time';
+		time.setAttribute('role', 'timer');
+		time.setAttribute('aria-live', 'off');
+		time.innerHTML = '<span class="' + t.options.classPrefix + 'currenttime">' + (0, _time.secondsToTimeCode)(0, player.options.alwaysShowHours, player.options.showTimecodeFrameCount, player.options.framesPerSecond, player.options.secondsDecimalLength) + '</span>';
+
+		t.addControlElement(time, 'current');
+		t.updateTimeCallback = function () {
+			if (t.controlsAreVisible) {
+				player.updateCurrent();
+			}
+		};
+		media.addEventListener('timeupdate', t.updateTimeCallback);
+	},
+	cleancurrent: function cleancurrent(player, controls, layers, media) {
+		media.removeEventListener('timeupdate', player.updateTimeCallback);
+	},
+	buildduration: function buildduration(player, controls, layers, media) {
+		var t = this,
+		    currTime = controls.lastChild.querySelector('.' + t.options.classPrefix + 'currenttime');
+
+		if (currTime) {
+			controls.querySelector('.' + t.options.classPrefix + 'time').innerHTML += t.options.timeAndDurationSeparator + '<span class="' + t.options.classPrefix + 'duration">' + ((0, _time.secondsToTimeCode)(t.options.duration, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond, t.options.secondsDecimalLength) + '</span>');
+		} else {
+			if (controls.querySelector('.' + t.options.classPrefix + 'currenttime')) {
+				(0, _dom.addClass)(controls.querySelector('.' + t.options.classPrefix + 'currenttime').parentNode, t.options.classPrefix + 'currenttime-container');
+			}
+
+			var duration = _document2.default.createElement('div');
+			duration.className = t.options.classPrefix + 'time ' + t.options.classPrefix + 'duration-container';
+			duration.innerHTML = '<span class="' + t.options.classPrefix + 'duration">' + ((0, _time.secondsToTimeCode)(t.options.duration, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond, t.options.secondsDecimalLength) + '</span>');
+
+			t.addControlElement(duration, 'duration');
+		}
+
+		media.addEventListener('timeupdate', t.updateTimeCallback);
+	},
+	cleanduration: function cleanduration(player, controls, layers, media) {
+		media.removeEventListener('timeupdate', player.updateTimeCallback);
+	},
+	updateCurrent: function updateCurrent() {
+		var t = this;
+
+		var currentTime = t.getCurrentTime();
+
+		if (isNaN(currentTime)) {
+			currentTime = 0;
+		}
+
+		var timecode = (0, _time.secondsToTimeCode)(currentTime, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond, t.options.secondsDecimalLength);
+
+		if (timecode.length > 5) {
+			(0, _dom.addClass)(t.container, t.options.classPrefix + 'long-video');
+		} else {
+			(0, _dom.removeClass)(t.container, t.options.classPrefix + 'long-video');
+		}
+
+		if (t.controls.querySelector('.' + t.options.classPrefix + 'currenttime')) {
+			t.controls.querySelector('.' + t.options.classPrefix + 'currenttime').innerText = timecode;
+		}
+	},
+	updateDuration: function updateDuration() {
+		var t = this;
+
+		var duration = t.getDuration();
+
+		if (isNaN(duration) || duration === Infinity || duration < 0) {
+			t.media.duration = t.options.duration = duration = 0;
+		}
+
+		if (t.options.duration > 0) {
+			duration = t.options.duration;
+		}
+
+		var timecode = (0, _time.secondsToTimeCode)(duration, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond, t.options.secondsDecimalLength);
+
+		if (timecode.length > 5) {
+			(0, _dom.addClass)(t.container, t.options.classPrefix + 'long-video');
+		} else {
+			(0, _dom.removeClass)(t.container, t.options.classPrefix + 'long-video');
+		}
+
+		if (t.controls.querySelector('.' + t.options.classPrefix + 'duration') && duration > 0) {
+			t.controls.querySelector('.' + t.options.classPrefix + 'duration').innerHTML = timecode;
+		}
+	}
+});
+
+},{"16":16,"2":2,"26":26,"30":30}],13:[function(_dereq_,module,exports){
+'use strict';
+
+var _document = _dereq_(2);
+
+var _document2 = _interopRequireDefault(_document);
+
+var _mejs = _dereq_(7);
+
+var _mejs2 = _interopRequireDefault(_mejs);
+
+var _i18n = _dereq_(5);
+
+var _i18n2 = _interopRequireDefault(_i18n);
+
+var _player = _dereq_(16);
+
+var _player2 = _interopRequireDefault(_player);
+
+var _time = _dereq_(30);
+
+var _general = _dereq_(27);
+
+var _dom = _dereq_(26);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+Object.assign(_player.config, {
+	startLanguage: '',
+
+	tracksText: null,
+
+	chaptersText: null,
+
+	tracksAriaLive: false,
+
+	hideCaptionsButtonWhenEmpty: true,
+
+	toggleCaptionsButtonWhenOnlyOne: false,
+
+	slidesSelector: ''
+});
+
+Object.assign(_player2.default.prototype, {
+	hasChapters: false,
+
+	buildtracks: function buildtracks(player, controls, layers, media) {
+
+		if (!player.tracks.length && (!player.trackFiles || !player.trackFiles.length === 0)) {
+			return;
+		}
+
+		var t = this,
+		    attr = t.options.tracksAriaLive ? ' role="log" aria-live="assertive" aria-atomic="false"' : '',
+		    tracksTitle = (0, _general.isString)(t.options.tracksText) ? t.options.tracksText : _i18n2.default.t('mejs.captions-subtitles'),
+		    chaptersTitle = (0, _general.isString)(t.options.chaptersText) ? t.options.chaptersText : _i18n2.default.t('mejs.captions-chapters'),
+		    total = player.trackFiles === null ? player.tracks.length : player.trackFiles.length;
+
+		if (t.domNode.textTracks) {
+			for (var i = t.domNode.textTracks.length - 1; i >= 0; i--) {
+				t.domNode.textTracks[i].mode = 'hidden';
+			}
+		}
+
+		t.cleartracks(player);
+
+		player.captions = _document2.default.createElement('div');
+		player.captions.className = t.options.classPrefix + 'captions-layer ' + t.options.classPrefix + 'layer';
+		player.captions.innerHTML = '<div class="' + t.options.classPrefix + 'captions-position ' + t.options.classPrefix + 'captions-position-hover"' + attr + '>' + ('<span class="' + t.options.classPrefix + 'captions-text"></span>') + '</div>';
+		player.captions.style.display = 'none';
+		layers.insertBefore(player.captions, layers.firstChild);
+
+		player.captionsText = player.captions.querySelector('.' + t.options.classPrefix + 'captions-text');
+
+		player.captionsButton = _document2.default.createElement('div');
+		player.captionsButton.className = t.options.classPrefix + 'button ' + t.options.classPrefix + 'captions-button';
+		player.captionsButton.innerHTML = '<button type="button" aria-controls="' + t.id + '" title="' + tracksTitle + '" aria-label="' + tracksTitle + '" tabindex="0"></button>' + ('<div class="' + t.options.classPrefix + 'captions-selector ' + t.options.classPrefix + 'offscreen">') + ('<ul class="' + t.options.classPrefix + 'captions-selector-list">') + ('<li class="' + t.options.classPrefix + 'captions-selector-list-item">') + ('<input type="radio" class="' + t.options.classPrefix + 'captions-selector-input" ') + ('name="' + player.id + '_captions" id="' + player.id + '_captions_none" ') + 'value="none" checked disabled>' + ('<label class="' + t.options.classPrefix + 'captions-selector-label ') + (t.options.classPrefix + 'captions-selected" ') + ('for="' + player.id + '_captions_none">' + _i18n2.default.t('mejs.none') + '</label>') + '</li>' + '</ul>' + '</div>';
+
+		t.addControlElement(player.captionsButton, 'tracks');
+
+		player.captionsButton.querySelector('.' + t.options.classPrefix + 'captions-selector-input').disabled = false;
+
+		player.chaptersButton = _document2.default.createElement('div');
+		player.chaptersButton.className = t.options.classPrefix + 'button ' + t.options.classPrefix + 'chapters-button';
+		player.chaptersButton.innerHTML = '<button type="button" aria-controls="' + t.id + '" title="' + chaptersTitle + '" aria-label="' + chaptersTitle + '" tabindex="0"></button>' + ('<div class="' + t.options.classPrefix + 'chapters-selector ' + t.options.classPrefix + 'offscreen">') + ('<ul class="' + t.options.classPrefix + 'chapters-selector-list"></ul>') + '</div>';
+
+		var subtitleCount = 0;
+
+		for (var _i = 0; _i < total; _i++) {
+			var kind = player.tracks[_i].kind,
+			    src = player.tracks[_i].src;
+			if (src.trim()) {
+				if (kind === 'subtitles' || kind === 'captions') {
+					subtitleCount++;
+				} else if (kind === 'chapters' && !controls.querySelector('.' + t.options.classPrefix + 'chapter-selector')) {
+					player.captionsButton.parentNode.insertBefore(player.chaptersButton, player.captionsButton);
+				}
+			}
+		}
+
+		player.trackToLoad = -1;
+		player.selectedTrack = null;
+		player.isLoadingTrack = false;
+
+		for (var _i2 = 0; _i2 < total; _i2++) {
+			var _kind = player.tracks[_i2].kind;
+			if (player.tracks[_i2].src.trim() && (_kind === 'subtitles' || _kind === 'captions')) {
+				player.addTrackButton(player.tracks[_i2].trackId, player.tracks[_i2].srclang, player.tracks[_i2].label);
+			}
+		}
+
+		player.loadNextTrack();
+
+		var inEvents = ['mouseenter', 'focusin'],
+		    outEvents = ['mouseleave', 'focusout'];
+
+		if (t.options.toggleCaptionsButtonWhenOnlyOne && subtitleCount === 1) {
+			player.captionsButton.addEventListener('click', function () {
+				var trackId = 'none';
+				if (player.selectedTrack === null) {
+					trackId = player.tracks[0].trackId;
+				}
+				player.setTrack(trackId);
+			});
+		} else {
+			var labels = player.captionsButton.querySelectorAll('.' + t.options.classPrefix + 'captions-selector-label'),
+			    captions = player.captionsButton.querySelectorAll('input[type=radio]');
+
+			for (var _i3 = 0, _total = inEvents.length; _i3 < _total; _i3++) {
+				player.captionsButton.addEventListener(inEvents[_i3], function () {
+					(0, _dom.removeClass)(this.querySelector('.' + t.options.classPrefix + 'captions-selector'), t.options.classPrefix + 'offscreen');
+				});
+			}
+
+			for (var _i4 = 0, _total2 = outEvents.length; _i4 < _total2; _i4++) {
+				player.captionsButton.addEventListener(outEvents[_i4], function () {
+					(0, _dom.addClass)(this.querySelector('.' + t.options.classPrefix + 'captions-selector'), t.options.classPrefix + 'offscreen');
+				});
+			}
+
+			for (var _i5 = 0, _total3 = captions.length; _i5 < _total3; _i5++) {
+				captions[_i5].addEventListener('click', function () {
+					player.setTrack(this.value);
+				});
+			}
+
+			for (var _i6 = 0, _total4 = labels.length; _i6 < _total4; _i6++) {
+				labels[_i6].addEventListener('click', function () {
+					var radio = (0, _dom.siblings)(this, function (el) {
+						return el.tagName === 'INPUT';
+					})[0],
+					    event = (0, _general.createEvent)('click', radio);
+					radio.dispatchEvent(event);
+				});
+			}
+
+			player.captionsButton.addEventListener('keydown', function (e) {
+				e.stopPropagation();
+			});
+		}
+
+		for (var _i7 = 0, _total5 = inEvents.length; _i7 < _total5; _i7++) {
+			player.chaptersButton.addEventListener(inEvents[_i7], function () {
+				if (this.querySelector('.' + t.options.classPrefix + 'chapters-selector-list').children.length) {
+					(0, _dom.removeClass)(this.querySelector('.' + t.options.classPrefix + 'chapters-selector'), t.options.classPrefix + 'offscreen');
+				}
+			});
+		}
+
+		for (var _i8 = 0, _total6 = outEvents.length; _i8 < _total6; _i8++) {
+			player.chaptersButton.addEventListener(outEvents[_i8], function () {
+				(0, _dom.addClass)(this.querySelector('.' + t.options.classPrefix + 'chapters-selector'), t.options.classPrefix + 'offscreen');
+			});
+		}
+
+		player.chaptersButton.addEventListener('keydown', function (e) {
+			e.stopPropagation();
+		});
+
+		if (!player.options.alwaysShowControls) {
+			player.container.addEventListener('controlsshown', function () {
+				(0, _dom.addClass)(player.container.querySelector('.' + t.options.classPrefix + 'captions-position'), t.options.classPrefix + 'captions-position-hover');
+			});
+
+			player.container.addEventListener('controlshidden', function () {
+				if (!media.paused) {
+					(0, _dom.removeClass)(player.container.querySelector('.' + t.options.classPrefix + 'captions-position'), t.options.classPrefix + 'captions-position-hover');
+				}
+			});
+		} else {
+			(0, _dom.addClass)(player.container.querySelector('.' + t.options.classPrefix + 'captions-position'), t.options.classPrefix + 'captions-position-hover');
+		}
+
+		media.addEventListener('timeupdate', function () {
+			player.displayCaptions();
+		});
+
+		if (player.options.slidesSelector !== '') {
+			player.slidesContainer = _document2.default.querySelectorAll(player.options.slidesSelector);
+
+			media.addEventListener('timeupdate', function () {
+				player.displaySlides();
+			});
+		}
+	},
+	cleartracks: function cleartracks(player) {
+		if (player) {
+			if (player.captions) {
+				player.captions.remove();
+			}
+			if (player.chapters) {
+				player.chapters.remove();
+			}
+			if (player.captionsText) {
+				player.captionsText.remove();
+			}
+			if (player.captionsButton) {
+				player.captionsButton.remove();
+			}
+			if (player.chaptersButton) {
+				player.chaptersButton.remove();
+			}
+		}
+	},
+	rebuildtracks: function rebuildtracks() {
+		var t = this;
+		t.findTracks();
+		t.buildtracks(t, t.controls, t.layers, t.media);
+	},
+	findTracks: function findTracks() {
+		var t = this,
+		    tracktags = t.trackFiles === null ? t.node.querySelectorAll('track') : t.trackFiles,
+		    total = tracktags.length;
+
+		t.tracks = [];
+		for (var i = 0; i < total; i++) {
+			var track = tracktags[i],
+			    srclang = track.getAttribute('srclang').toLowerCase() || '',
+			    trackId = t.id + '_track_' + i + '_' + track.getAttribute('kind') + '_' + srclang;
+			t.tracks.push({
+				trackId: trackId,
+				srclang: srclang,
+				src: track.getAttribute('src'),
+				kind: track.getAttribute('kind'),
+				label: track.getAttribute('label') || '',
+				entries: [],
+				isLoaded: false
+			});
+		}
+	},
+	setTrack: function setTrack(trackId) {
+
+		var t = this,
+		    radios = t.captionsButton.querySelectorAll('input[type="radio"]'),
+		    captions = t.captionsButton.querySelectorAll('.' + t.options.classPrefix + 'captions-selected'),
+		    track = t.captionsButton.querySelector('input[value="' + trackId + '"]');
+
+		for (var i = 0, total = radios.length; i < total; i++) {
+			radios[i].checked = false;
+		}
+
+		for (var _i9 = 0, _total7 = captions.length; _i9 < _total7; _i9++) {
+			(0, _dom.removeClass)(captions[_i9], t.options.classPrefix + 'captions-selected');
+		}
+
+		track.checked = true;
+		var labels = (0, _dom.siblings)(track, function (el) {
+			return (0, _dom.hasClass)(el, t.options.classPrefix + 'captions-selector-label');
+		});
+		for (var _i10 = 0, _total8 = labels.length; _i10 < _total8; _i10++) {
+			(0, _dom.addClass)(labels[_i10], t.options.classPrefix + 'captions-selected');
+		}
+
+		if (trackId === 'none') {
+			t.selectedTrack = null;
+			(0, _dom.removeClass)(t.captionsButton, t.options.classPrefix + 'captions-enabled');
+		} else {
+			for (var _i11 = 0, _total9 = t.tracks.length; _i11 < _total9; _i11++) {
+				var _track = t.tracks[_i11];
+				if (_track.trackId === trackId) {
+					if (t.selectedTrack === null) {
+						(0, _dom.addClass)(t.captionsButton, t.options.classPrefix + 'captions-enabled');
+					}
+					t.selectedTrack = _track;
+					t.captions.setAttribute('lang', t.selectedTrack.srclang);
+					t.displayCaptions();
+					break;
+				}
+			}
+		}
+
+		var event = (0, _general.createEvent)('captionschange', t.media);
+		event.detail.caption = t.selectedTrack;
+		t.media.dispatchEvent(event);
+	},
+	loadNextTrack: function loadNextTrack() {
+		var t = this;
+
+		t.trackToLoad++;
+		if (t.trackToLoad < t.tracks.length) {
+			t.isLoadingTrack = true;
+			t.loadTrack(t.trackToLoad);
+		} else {
+			t.isLoadingTrack = false;
+			t.checkForTracks();
+		}
+	},
+	loadTrack: function loadTrack(index) {
+		var t = this,
+		    track = t.tracks[index];
+
+		if (track !== undefined && (track.src !== undefined || track.src !== "")) {
+			(0, _dom.ajax)(track.src, 'text', function (d) {
+				track.entries = typeof d === 'string' && /<tt\s+xml/ig.exec(d) ? _mejs2.default.TrackFormatParser.dfxp.parse(d) : _mejs2.default.TrackFormatParser.webvtt.parse(d);
+
+				track.isLoaded = true;
+				t.enableTrackButton(track);
+				t.loadNextTrack();
+
+				if (track.kind === 'slides') {
+					t.setupSlides(track);
+				} else if (track.kind === 'chapters' && !t.hasChapters) {
+						t.drawChapters(track);
+						t.hasChapters = true;
+					}
+			}, function () {
+				t.removeTrackButton(track.trackId);
+				t.loadNextTrack();
+			});
+		}
+	},
+	enableTrackButton: function enableTrackButton(track) {
+		var t = this,
+		    lang = track.srclang,
+		    target = _document2.default.getElementById('' + track.trackId);
+
+		if (!target) {
+			return;
+		}
+
+		var label = track.label;
+
+		if (label === '') {
+			label = _i18n2.default.t(_mejs2.default.language.codes[lang]) || lang;
+		}
+		target.disabled = false;
+		var targetSiblings = (0, _dom.siblings)(target, function (el) {
+			return (0, _dom.hasClass)(el, t.options.classPrefix + 'captions-selector-label');
+		});
+		for (var i = 0, total = targetSiblings.length; i < total; i++) {
+			targetSiblings[i].innerHTML = label;
+		}
+
+		if (t.options.startLanguage === lang) {
+			target.checked = true;
+			var event = (0, _general.createEvent)('click', target);
+			target.dispatchEvent(event);
+		}
+	},
+	removeTrackButton: function removeTrackButton(trackId) {
+		var element = _document2.default.getElementById('' + trackId);
+		if (element) {
+			var button = element.closest('li');
+			if (button) {
+				button.remove();
+			}
+		}
+	},
+	addTrackButton: function addTrackButton(trackId, lang, label) {
+		var t = this;
+		if (label === '') {
+			label = _i18n2.default.t(_mejs2.default.language.codes[lang]) || lang;
+		}
+
+		t.captionsButton.querySelector('ul').innerHTML += '<li class="' + t.options.classPrefix + 'captions-selector-list-item">' + ('<input type="radio" class="' + t.options.classPrefix + 'captions-selector-input" ') + ('name="' + t.id + '_captions" id="' + trackId + '" value="' + trackId + '" disabled>') + ('<label class="' + t.options.classPrefix + 'captions-selector-label"') + ('for="' + trackId + '">' + label + ' (loading)</label>') + '</li>';
+	},
+	checkForTracks: function checkForTracks() {
+		var t = this;
+
+		var hasSubtitles = false;
+
+		if (t.options.hideCaptionsButtonWhenEmpty) {
+			for (var i = 0, total = t.tracks.length; i < total; i++) {
+				var kind = t.tracks[i].kind;
+				if ((kind === 'subtitles' || kind === 'captions') && t.tracks[i].isLoaded) {
+					hasSubtitles = true;
+					break;
+				}
+			}
+
+			t.captionsButton.style.display = hasSubtitles ? '' : 'none';
+			t.setControlsSize();
+		}
+	},
+	displayCaptions: function displayCaptions() {
+		if (this.tracks === undefined) {
+			return;
+		}
+
+		var t = this,
+		    track = t.selectedTrack,
+		    sanitize = function sanitize(html) {
+			var div = _document2.default.createElement('div');
+			div.innerHTML = html;
+
+			var scripts = div.getElementsByTagName('script');
+			var i = scripts.length;
+			while (i--) {
+				scripts[i].remove();
+			}
+
+			var allElements = div.getElementsByTagName('*');
+			for (var _i12 = 0, n = allElements.length; _i12 < n; _i12++) {
+				var attributesObj = allElements[_i12].attributes,
+				    attributes = Array.prototype.slice.call(attributesObj);
+
+				for (var j = 0, total = attributes.length; j < total; j++) {
+					if (attributes[j].name.startsWith('on') || attributes[j].value.startsWith('javascript')) {
+						allElements[_i12].remove();
+					} else if (attributes[j].name === 'style') {
+						allElements[_i12].removeAttribute(attributes[j].name);
+					}
+				}
+			}
+			return div.innerHTML;
+		};
+
+		if (track !== null && track.isLoaded) {
+			var i = t.searchTrackPosition(track.entries, t.media.currentTime);
+			if (i > -1) {
+				t.captionsText.innerHTML = sanitize(track.entries[i].text);
+				t.captionsText.className = t.options.classPrefix + 'captions-text ' + (track.entries[i].identifier || '');
+				t.captions.style.display = '';
+				t.captions.style.height = '0px';
+				return;
+			}
+			t.captions.style.display = 'none';
+		} else {
+			t.captions.style.display = 'none';
+		}
+	},
+	setupSlides: function setupSlides(track) {
+		var t = this;
+		t.slides = track;
+		t.slides.entries.imgs = [t.slides.entries.length];
+		t.showSlide(0);
+	},
+	showSlide: function showSlide(index) {
+		var _this = this;
+
+		var t = this;
+
+		if (t.tracks === undefined || t.slidesContainer === undefined) {
+			return;
+		}
+
+		var url = t.slides.entries[index].text;
+
+		var img = t.slides.entries[index].imgs;
+
+		if (img === undefined || img.fadeIn === undefined) {
+			var image = _document2.default.createElement('img');
+			image.src = url;
+			image.addEventListener('load', function () {
+				var self = _this,
+				    visible = (0, _dom.siblings)(self, function (el) {
+					return visible(el);
+				});
+				self.style.display = 'none';
+				t.slidesContainer.innerHTML += self.innerHTML;
+				(0, _dom.fadeIn)(t.slidesContainer.querySelector(image));
+				for (var i = 0, total = visible.length; i < total; i++) {
+					(0, _dom.fadeOut)(visible[i], 400);
+				}
+			});
+			t.slides.entries[index].imgs = img = image;
+		} else if (!(0, _dom.visible)(img)) {
+			var _visible = (0, _dom.siblings)(self, function (el) {
+				return _visible(el);
+			});
+			(0, _dom.fadeIn)(t.slidesContainer.querySelector(img));
+			for (var i = 0, total = _visible.length; i < total; i++) {
+				(0, _dom.fadeOut)(_visible[i]);
+			}
+		}
+	},
+	displaySlides: function displaySlides() {
+		var t = this;
+
+		if (this.slides === undefined) {
+			return;
+		}
+
+		var slides = t.slides,
+		    i = t.searchTrackPosition(slides.entries, t.media.currentTime);
+
+		if (i > -1) {
+			t.showSlide(i);
+		}
+	},
+	drawChapters: function drawChapters(chapters) {
+		var t = this,
+		    total = chapters.entries.length;
+
+		if (!total) {
+			return;
+		}
+
+		t.chaptersButton.querySelector('ul').innerHTML = '';
+
+		for (var i = 0; i < total; i++) {
+			t.chaptersButton.querySelector('ul').innerHTML += '<li class="' + t.options.classPrefix + 'chapters-selector-list-item" ' + 'role="menuitemcheckbox" aria-live="polite" aria-disabled="false" aria-checked="false">' + ('<input type="radio" class="' + t.options.classPrefix + 'captions-selector-input" ') + ('name="' + t.id + '_chapters" id="' + t.id + '_chapters_' + i + '" value="' + chapters.entries[i].start + '" disabled>') + ('<label class="' + t.options.classPrefix + 'chapters-selector-label"') + ('for="' + t.id + '_chapters_' + i + '">' + chapters.entries[i].text + '</label>') + '</li>';
+		}
+
+		var radios = t.chaptersButton.querySelectorAll('input[type="radio"]'),
+		    labels = t.chaptersButton.querySelectorAll('.' + t.options.classPrefix + 'chapters-selector-label');
+
+		for (var _i13 = 0, _total10 = radios.length; _i13 < _total10; _i13++) {
+			radios[_i13].disabled = false;
+			radios[_i13].checked = false;
+			radios[_i13].addEventListener('click', function () {
+				var self = this,
+				    listItems = t.chaptersButton.querySelectorAll('li'),
+				    label = (0, _dom.siblings)(self, function (el) {
+					return (0, _dom.hasClass)(el, t.options.classPrefix + 'chapters-selector-label');
+				})[0];
+
+				self.checked = true;
+				self.parentNode.setAttribute('aria-checked', true);
+				(0, _dom.addClass)(label, t.options.classPrefix + 'chapters-selected');
+				(0, _dom.removeClass)(t.chaptersButton.querySelector('.' + t.options.classPrefix + 'chapters-selected'), t.options.classPrefix + 'chapters-selected');
+
+				for (var _i14 = 0, _total11 = listItems.length; _i14 < _total11; _i14++) {
+					listItems[_i14].setAttribute('aria-checked', false);
+				}
+
+				t.media.setCurrentTime(parseFloat(self.value));
+				if (t.media.paused) {
+					t.media.play();
+				}
+			});
+		}
+
+		for (var _i15 = 0, _total12 = labels.length; _i15 < _total12; _i15++) {
+			labels[_i15].addEventListener('click', function () {
+				var radio = (0, _dom.siblings)(this, function (el) {
+					return el.tagName === 'INPUT';
+				})[0],
+				    event = (0, _general.createEvent)('click', radio);
+				radio.dispatchEvent(event);
+			});
+		}
+	},
+	searchTrackPosition: function searchTrackPosition(tracks, currentTime) {
+		var lo = 0,
+		    hi = tracks.length - 1,
+		    mid = void 0,
+		    start = void 0,
+		    stop = void 0;
+
+		while (lo <= hi) {
+			mid = lo + hi >> 1;
+			start = tracks[mid].start;
+			stop = tracks[mid].stop;
+
+			if (currentTime >= start && currentTime < stop) {
+				return mid;
+			} else if (start < currentTime) {
+				lo = mid + 1;
+			} else if (start > currentTime) {
+				hi = mid - 1;
+			}
+		}
+
+		return -1;
+	}
+});
+
+_mejs2.default.language = {
+	codes: {
+		af: 'mejs.afrikaans',
+		sq: 'mejs.albanian',
+		ar: 'mejs.arabic',
+		be: 'mejs.belarusian',
+		bg: 'mejs.bulgarian',
+		ca: 'mejs.catalan',
+		zh: 'mejs.chinese',
+		'zh-cn': 'mejs.chinese-simplified',
+		'zh-tw': 'mejs.chines-traditional',
+		hr: 'mejs.croatian',
+		cs: 'mejs.czech',
+		da: 'mejs.danish',
+		nl: 'mejs.dutch',
+		en: 'mejs.english',
+		et: 'mejs.estonian',
+		fl: 'mejs.filipino',
+		fi: 'mejs.finnish',
+		fr: 'mejs.french',
+		gl: 'mejs.galician',
+		de: 'mejs.german',
+		el: 'mejs.greek',
+		ht: 'mejs.haitian-creole',
+		iw: 'mejs.hebrew',
+		hi: 'mejs.hindi',
+		hu: 'mejs.hungarian',
+		is: 'mejs.icelandic',
+		id: 'mejs.indonesian',
+		ga: 'mejs.irish',
+		it: 'mejs.italian',
+		ja: 'mejs.japanese',
+		ko: 'mejs.korean',
+		lv: 'mejs.latvian',
+		lt: 'mejs.lithuanian',
+		mk: 'mejs.macedonian',
+		ms: 'mejs.malay',
+		mt: 'mejs.maltese',
+		no: 'mejs.norwegian',
+		fa: 'mejs.persian',
+		pl: 'mejs.polish',
+		pt: 'mejs.portuguese',
+		ro: 'mejs.romanian',
+		ru: 'mejs.russian',
+		sr: 'mejs.serbian',
+		sk: 'mejs.slovak',
+		sl: 'mejs.slovenian',
+		es: 'mejs.spanish',
+		sw: 'mejs.swahili',
+		sv: 'mejs.swedish',
+		tl: 'mejs.tagalog',
+		th: 'mejs.thai',
+		tr: 'mejs.turkish',
+		uk: 'mejs.ukrainian',
+		vi: 'mejs.vietnamese',
+		cy: 'mejs.welsh',
+		yi: 'mejs.yiddish'
+	}
+};
+
+_mejs2.default.TrackFormatParser = {
+	webvtt: {
+		pattern: /^((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/,
+
+		parse: function parse(trackText) {
+			var lines = trackText.split(/\r?\n/),
+			    entries = [];
+
+			var timecode = void 0,
+			    text = void 0,
+			    identifier = void 0;
+
+			for (var i = 0, total = lines.length; i < total; i++) {
+				timecode = this.pattern.exec(lines[i]);
+
+				if (timecode && i < lines.length) {
+					if (i - 1 >= 0 && lines[i - 1] !== '') {
+						identifier = lines[i - 1];
+					}
+					i++;
+
+					text = lines[i];
+					i++;
+					while (lines[i] !== '' && i < lines.length) {
+						text = text + '\n' + lines[i];
+						i++;
+					}
+					text = text.trim().replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>");
+					entries.push({
+						identifier: identifier,
+						start: (0, _time.convertSMPTEtoSeconds)(timecode[1]) === 0 ? 0.200 : (0, _time.convertSMPTEtoSeconds)(timecode[1]),
+						stop: (0, _time.convertSMPTEtoSeconds)(timecode[3]),
+						text: text,
+						settings: timecode[5]
+					});
+				}
+				identifier = '';
+			}
+			return entries;
+		}
+	},
+
+	dfxp: {
+		parse: function parse(trackText) {
+			trackText = $(trackText).filter('tt');
+			var container = trackText.firstChild,
+			    lines = container.querySelectorAll('p'),
+			    styleNode = trackText.getElementById('' + container.attr('style')),
+			    entries = [];
+
+			var styles = void 0;
+
+			if (styleNode.length) {
+				styleNode.removeAttribute('id');
+				var attributes = styleNode.attributes;
+				if (attributes.length) {
+					styles = {};
+					for (var i = 0, total = attributes.length; i < total; i++) {
+						styles[attributes[i].name.split(":")[1]] = attributes[i].value;
+					}
+				}
+			}
+
+			for (var _i16 = 0, _total13 = lines.length; _i16 < _total13; _i16++) {
+				var style = void 0,
+				    _temp = {
+					start: null,
+					stop: null,
+					style: null,
+					text: null
+				};
+
+				if (lines.eq(_i16).attr('begin')) {
+					_temp.start = (0, _time.convertSMPTEtoSeconds)(lines.eq(_i16).attr('begin'));
+				}
+				if (!_temp.start && lines.eq(_i16 - 1).attr('end')) {
+					_temp.start = (0, _time.convertSMPTEtoSeconds)(lines.eq(_i16 - 1).attr('end'));
+				}
+				if (lines.eq(_i16).attr('end')) {
+					_temp.stop = (0, _time.convertSMPTEtoSeconds)(lines.eq(_i16).attr('end'));
+				}
+				if (!_temp.stop && lines.eq(_i16 + 1).attr('begin')) {
+					_temp.stop = (0, _time.convertSMPTEtoSeconds)(lines.eq(_i16 + 1).attr('begin'));
+				}
+
+				if (styles) {
+					style = '';
+					for (var _style in styles) {
+						style += _style + ':' + styles[_style] + ';';
+					}
+				}
+				if (style) {
+					_temp.style = style;
+				}
+				if (_temp.start === 0) {
+					_temp.start = 0.200;
+				}
+				_temp.text = lines.eq(_i16).innerHTML.trim().replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>");
+				entries.push(_temp);
+			}
+			return entries;
+		}
+	}
+};
+
+},{"16":16,"2":2,"26":26,"27":27,"30":30,"5":5,"7":7}],14:[function(_dereq_,module,exports){
+'use strict';
+
+var _document = _dereq_(2);
+
+var _document2 = _interopRequireDefault(_document);
+
+var _player = _dereq_(16);
+
+var _player2 = _interopRequireDefault(_player);
+
+var _i18n = _dereq_(5);
+
+var _i18n2 = _interopRequireDefault(_i18n);
+
+var _constants = _dereq_(25);
+
+var _general = _dereq_(27);
+
+var _dom = _dereq_(26);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+Object.assign(_player.config, {
+	muteText: null,
+
+	unmuteText: null,
+
+	allyVolumeControlText: null,
+
+	hideVolumeOnTouchDevices: true,
+
+	audioVolume: 'horizontal',
+
+	videoVolume: 'vertical',
+
+	startVolume: 0.8
+});
+
+Object.assign(_player2.default.prototype, {
+	buildvolume: function buildvolume(player, controls, layers, media) {
+		if ((_constants.IS_ANDROID || _constants.IS_IOS) && this.options.hideVolumeOnTouchDevices) {
+			return;
+		}
+
+		var t = this,
+		    mode = t.isVideo ? t.options.videoVolume : t.options.audioVolume,
+		    muteText = (0, _general.isString)(t.options.muteText) ? t.options.muteText : _i18n2.default.t('mejs.mute'),
+		    unmuteText = (0, _general.isString)(t.options.unmuteText) ? t.options.unmuteText : _i18n2.default.t('mejs.unmute'),
+		    volumeControlText = (0, _general.isString)(t.options.allyVolumeControlText) ? t.options.allyVolumeControlText : _i18n2.default.t('mejs.volume-help-text'),
+		    mute = _document2.default.createElement('div');
+
+		mute.className = t.options.classPrefix + 'button ' + t.options.classPrefix + 'volume-button ' + t.options.classPrefix + 'mute';
+		mute.innerHTML = mode === 'horizontal' ? '<button type="button" aria-controls="' + t.id + '" title="' + muteText + '" aria-label="' + muteText + '" tabindex="0"></button>' : '<button type="button" aria-controls="' + t.id + '" title="' + muteText + '" aria-label="' + muteText + '" tabindex="0"></button>' + ('<a href="javascript:void(0);" class="' + t.options.classPrefix + 'volume-slider" ') + ('aria-label="' + _i18n2.default.t('mejs.volume-slider') + '" aria-valuemin="0" aria-valuemax="100" role="slider" ') + 'aria-orientation="vertical">' + ('<span class="' + t.options.classPrefix + 'offscreen">' + volumeControlText + '</span>') + ('<div class="' + t.options.classPrefix + 'volume-total">') + ('<div class="' + t.options.classPrefix + 'volume-current"></div>') + ('<div class="' + t.options.classPrefix + 'volume-handle"></div>') + '</div>' + '</a>';
+
+		t.addControlElement(mute, 'volume');
+
+		if (mode === 'horizontal') {
+			var anchor = _document2.default.createElement('a');
+			anchor.className = t.options.classPrefix + 'horizontal-volume-slider';
+			anchor.href = 'javascript:void(0);';
+			anchor.setAttribute('aria-label', _i18n2.default.t('mejs.volume-slider'));
+			anchor.setAttribute('aria-valuemin', 0);
+			anchor.setAttribute('aria-valuemax', 100);
+			anchor.setAttribute('role', 'slider');
+			anchor.innerHTML += '<span class="' + t.options.classPrefix + 'offscreen">' + volumeControlText + '</span>' + ('<div class="' + t.options.classPrefix + 'horizontal-volume-total">') + ('<div class="' + t.options.classPrefix + 'horizontal-volume-current"></div>') + ('<div class="' + t.options.classPrefix + 'horizontal-volume-handle"></div>') + '</div>';
+			mute.parentNode.insertBefore(anchor, mute.nextSibling);
+		}
+
+		var mouseIsDown = false,
+		    mouseIsOver = false,
+		    modified = false,
+		    updateVolumeSlider = function updateVolumeSlider() {
+			var volume = Math.floor(media.volume * 100);
+			volumeSlider.setAttribute('aria-valuenow', volume);
+			volumeSlider.setAttribute('aria-valuetext', volume + '%');
+		};
+
+		var volumeSlider = mode === 'vertical' ? t.container.querySelector('.' + t.options.classPrefix + 'volume-slider') : t.container.querySelector('.' + t.options.classPrefix + 'horizontal-volume-slider'),
+		    volumeTotal = mode === 'vertical' ? t.container.querySelector('.' + t.options.classPrefix + 'volume-total') : t.container.querySelector('.' + t.options.classPrefix + 'horizontal-volume-total'),
+		    volumeCurrent = mode === 'vertical' ? t.container.querySelector('.' + t.options.classPrefix + 'volume-current') : t.container.querySelector('.' + t.options.classPrefix + 'horizontal-volume-current'),
+		    volumeHandle = mode === 'vertical' ? t.container.querySelector('.' + t.options.classPrefix + 'volume-handle') : t.container.querySelector('.' + t.options.classPrefix + 'horizontal-volume-handle'),
+		    positionVolumeHandle = function positionVolumeHandle(volume) {
+
+			if (volume === null || isNaN(volume) || volume === undefined) {
+				return;
+			}
+
+			volume = Math.max(0, volume);
+			volume = Math.min(volume, 1);
+
+			if (volume === 0) {
+				(0, _dom.removeClass)(mute, t.options.classPrefix + 'mute');
+				(0, _dom.addClass)(mute, t.options.classPrefix + 'unmute');
+				var button = mute.firstElementChild;
+				button.setAttribute('title', unmuteText);
+				button.setAttribute('aria-label', unmuteText);
+			} else {
+				(0, _dom.removeClass)(mute, t.options.classPrefix + 'unmute');
+				(0, _dom.addClass)(mute, t.options.classPrefix + 'mute');
+				var _button = mute.firstElementChild;
+				_button.setAttribute('title', muteText);
+				_button.setAttribute('aria-label', muteText);
+			}
+
+			var volumePercentage = volume * 100 + '%',
+			    volumeStyles = getComputedStyle(volumeHandle);
+
+			if (mode === 'vertical') {
+				volumeCurrent.style.bottom = 0;
+				volumeCurrent.style.height = volumePercentage;
+				volumeHandle.style.bottom = volumePercentage;
+				volumeHandle.style.marginBottom = -parseFloat(volumeStyles.height) / 2 + 'px';
+			} else {
+				volumeCurrent.style.left = 0;
+				volumeCurrent.style.width = volumePercentage;
+				volumeHandle.style.left = volumePercentage;
+				volumeHandle.style.marginLeft = -parseFloat(volumeStyles.width) / 2 + 'px';
+			}
+		},
+		    handleVolumeMove = function handleVolumeMove(e) {
+			var totalOffset = (0, _dom.offset)(volumeTotal),
+			    volumeStyles = getComputedStyle(volumeTotal);
+
+			modified = true;
+
+			var volume = null;
+
+			if (mode === 'vertical') {
+				var railHeight = parseFloat(volumeStyles.height),
+				    newY = e.pageY - totalOffset.top;
+
+				volume = (railHeight - newY) / railHeight;
+
+				if (totalOffset.top === 0 || totalOffset.left === 0) {
+					return;
+				}
+			} else {
+				var railWidth = parseFloat(volumeStyles.width),
+				    newX = e.pageX - totalOffset.left;
+
+				volume = newX / railWidth;
+			}
+
+			volume = Math.max(0, volume);
+			volume = Math.min(volume, 1);
+
+			positionVolumeHandle(volume);
+
+			t.setMuted(volume === 0);
+			t.setVolume(volume);
+
+			e.preventDefault();
+			e.stopPropagation();
+		},
+		    toggleMute = function toggleMute() {
+			if (t.muted) {
+				positionVolumeHandle(0);
+				(0, _dom.removeClass)(mute, t.options.classPrefix + 'mute');
+				(0, _dom.addClass)(mute, t.options.classPrefix + 'unmute');
+			} else {
+				positionVolumeHandle(media.volume);
+				(0, _dom.removeClass)(mute, t.options.classPrefix + 'unmute');
+				(0, _dom.addClass)(mute, t.options.classPrefix + 'mute');
+			}
+		};
+
+		mute.addEventListener('mouseenter', function (e) {
+			if (e.target === mute) {
+				volumeSlider.style.display = 'block';
+				mouseIsOver = true;
+				e.preventDefault();
+				e.stopPropagation();
+			}
+		});
+		mute.addEventListener('focusin', function () {
+			volumeSlider.style.display = 'block';
+			mouseIsOver = true;
+		});
+
+		mute.addEventListener('focusout', function (e) {
+			if ((!e.relatedTarget || e.relatedTarget && !e.relatedTarget.matches('.' + t.options.classPrefix + 'volume-slider')) && mode === 'vertical') {
+				volumeSlider.style.display = 'none';
+			}
+		});
+		mute.addEventListener('mouseleave', function () {
+			mouseIsOver = false;
+			if (!mouseIsDown && mode === 'vertical') {
+				volumeSlider.style.display = 'none';
+			}
+		});
+		mute.addEventListener('focusout', function () {
+			mouseIsOver = false;
+		});
+		mute.addEventListener('keydown', function (e) {
+			if (t.options.keyActions.length) {
+				var keyCode = e.which || e.keyCode || 0,
+				    volume = media.volume;
+
+				switch (keyCode) {
+					case 38:
+						volume = Math.min(volume + 0.1, 1);
+						break;
+					case 40:
+						volume = Math.max(0, volume - 0.1);
+						break;
+					default:
+						return true;
+				}
+
+				mouseIsDown = false;
+				positionVolumeHandle(volume);
+				media.setVolume(volume);
+
+				e.preventDefault();
+				e.stopPropagation();
+			}
+		});
+		mute.querySelector('button').addEventListener('click', function () {
+			media.setMuted(!media.muted);
+			var event = (0, _general.createEvent)('volumechange', media);
+			media.dispatchEvent(event);
+		});
+
+		volumeSlider.addEventListener('dragstart', function () {
+			return false;
+		});
+
+		volumeSlider.addEventListener('mouseover', function () {
+			mouseIsOver = true;
+		});
+		volumeSlider.addEventListener('focusin', function () {
+			volumeSlider.style.display = 'block';
+			mouseIsOver = true;
+		});
+		volumeSlider.addEventListener('focusout', function () {
+			mouseIsOver = false;
+			if (!mouseIsDown && mode === 'vertical') {
+				volumeSlider.style.display = 'none';
+			}
+		});
+		volumeSlider.addEventListener('mousedown', function (e) {
+			handleVolumeMove(e);
+			t.globalBind('mousemove.vol', function (event) {
+				var target = event.target;
+				if (mouseIsDown && (target === volumeSlider || target.closest(mode === 'vertical' ? '.' + t.options.classPrefix + 'volume-slider' : '.' + t.options.classPrefix + 'horizontal-volume-slider'))) {
+					handleVolumeMove(event);
+				}
+			});
+			t.globalBind('mouseup.vol', function () {
+				mouseIsDown = false;
+				if (!mouseIsOver && mode === 'vertical') {
+					volumeSlider.style.display = 'none';
+				}
+			});
+			mouseIsDown = true;
+			e.preventDefault();
+			e.stopPropagation();
+		});
+
+		media.addEventListener('volumechange', function (e) {
+			if (!mouseIsDown) {
+				toggleMute();
+			}
+			updateVolumeSlider(e);
+		});
+
+		var rendered = false;
+		media.addEventListener('rendererready', function () {
+			if (!modified) {
+				setTimeout(function () {
+					rendered = true;
+					if (player.options.startVolume === 0 || media.originalNode.muted) {
+						media.setMuted(true);
+						player.options.startVolume = 0;
+					}
+					media.setVolume(player.options.startVolume);
+					t.setControlsSize();
+				}, 250);
+			}
+		});
+
+		media.addEventListener('loadedmetadata', function () {
+			setTimeout(function () {
+				if (!modified && !rendered) {
+					if (player.options.startVolume === 0 || media.originalNode.muted) {
+						media.setMuted(true);
+						player.options.startVolume = 0;
+					}
+					media.setVolume(player.options.startVolume);
+					t.setControlsSize();
+				}
+				rendered = false;
+			}, 250);
+		});
+
+		if (player.options.startVolume === 0 || media.originalNode.muted) {
+			media.setMuted(true);
+			player.options.startVolume = 0;
+			toggleMute();
+		}
+
+		t.container.addEventListener('controlsresize', function () {
+			toggleMute();
+		});
+	}
+});
+
+},{"16":16,"2":2,"25":25,"26":26,"27":27,"5":5}],15:[function(_dereq_,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
+var EN = exports.EN = {
+	'mejs.plural-form': 1,
+
+	'mejs.download-file': 'Download File',
+
+	'mejs.install-flash': 'You are using a browser that does not have Flash player enabled or installed. Please turn on your Flash player plugin or download the latest version from https://get.adobe.com/flashplayer/',
+
+	'mejs.fullscreen': 'Fullscreen',
+
+	'mejs.play': 'Play',
+	'mejs.pause': 'Pause',
+
+	'mejs.time-slider': 'Time Slider',
+	'mejs.time-help-text': 'Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.',
+	'mejs.live-broadcast': 'Live Broadcast',
+
+	'mejs.volume-help-text': 'Use Up/Down Arrow keys to increase or decrease volume.',
+	'mejs.unmute': 'Unmute',
+	'mejs.mute': 'Mute',
+	'mejs.volume-slider': 'Volume Slider',
+
+	'mejs.video-player': 'Video Player',
+	'mejs.audio-player': 'Audio Player',
+
+	'mejs.captions-subtitles': 'Captions/Subtitles',
+	'mejs.captions-chapters': 'Chapters',
+	'mejs.none': 'None',
+	'mejs.afrikaans': 'Afrikaans',
+	'mejs.albanian': 'Albanian',
+	'mejs.arabic': 'Arabic',
+	'mejs.belarusian': 'Belarusian',
+	'mejs.bulgarian': 'Bulgarian',
+	'mejs.catalan': 'Catalan',
+	'mejs.chinese': 'Chinese',
+	'mejs.chinese-simplified': 'Chinese (Simplified)',
+	'mejs.chinese-traditional': 'Chinese (Traditional)',
+	'mejs.croatian': 'Croatian',
+	'mejs.czech': 'Czech',
+	'mejs.danish': 'Danish',
+	'mejs.dutch': 'Dutch',
+	'mejs.english': 'English',
+	'mejs.estonian': 'Estonian',
+	'mejs.filipino': 'Filipino',
+	'mejs.finnish': 'Finnish',
+	'mejs.french': 'French',
+	'mejs.galician': 'Galician',
+	'mejs.german': 'German',
+	'mejs.greek': 'Greek',
+	'mejs.haitian-creole': 'Haitian Creole',
+	'mejs.hebrew': 'Hebrew',
+	'mejs.hindi': 'Hindi',
+	'mejs.hungarian': 'Hungarian',
+	'mejs.icelandic': 'Icelandic',
+	'mejs.indonesian': 'Indonesian',
+	'mejs.irish': 'Irish',
+	'mejs.italian': 'Italian',
+	'mejs.japanese': 'Japanese',
+	'mejs.korean': 'Korean',
+	'mejs.latvian': 'Latvian',
+	'mejs.lithuanian': 'Lithuanian',
+	'mejs.macedonian': 'Macedonian',
+	'mejs.malay': 'Malay',
+	'mejs.maltese': 'Maltese',
+	'mejs.norwegian': 'Norwegian',
+	'mejs.persian': 'Persian',
+	'mejs.polish': 'Polish',
+	'mejs.portuguese': 'Portuguese',
+	'mejs.romanian': 'Romanian',
+	'mejs.russian': 'Russian',
+	'mejs.serbian': 'Serbian',
+	'mejs.slovak': 'Slovak',
+	'mejs.slovenian': 'Slovenian',
+	'mejs.spanish': 'Spanish',
+	'mejs.swahili': 'Swahili',
+	'mejs.swedish': 'Swedish',
+	'mejs.tagalog': 'Tagalog',
+	'mejs.thai': 'Thai',
+	'mejs.turkish': 'Turkish',
+	'mejs.ukrainian': 'Ukrainian',
+	'mejs.vietnamese': 'Vietnamese',
+	'mejs.welsh': 'Welsh',
+	'mejs.yiddish': 'Yiddish'
+};
+
+},{}],16:[function(_dereq_,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
+exports.config = undefined;
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _window = _dereq_(3);
+
+var _window2 = _interopRequireDefault(_window);
+
+var _document = _dereq_(2);
+
+var _document2 = _interopRequireDefault(_document);
+
+var _mejs = _dereq_(7);
+
+var _mejs2 = _interopRequireDefault(_mejs);
+
+var _mediaelement = _dereq_(6);
+
+var _mediaelement2 = _interopRequireDefault(_mediaelement);
+
+var _default = _dereq_(17);
+
+var _default2 = _interopRequireDefault(_default);
+
+var _i18n = _dereq_(5);
+
+var _i18n2 = _interopRequireDefault(_i18n);
+
+var _constants = _dereq_(25);
+
+var _general = _dereq_(27);
+
+var _time = _dereq_(30);
+
+var _media = _dereq_(28);
+
+var _dom = _dereq_(26);
+
+var dom = _interopRequireWildcard(_dom);
+
+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"); } }
+
+_mejs2.default.mepIndex = 0;
+
+_mejs2.default.players = {};
+
+var config = exports.config = {
+	poster: '',
+
+	showPosterWhenEnded: false,
+
+	showPosterWhenPaused: false,
+
+	defaultVideoWidth: 480,
+
+	defaultVideoHeight: 270,
+
+	videoWidth: -1,
+
+	videoHeight: -1,
+
+	defaultAudioWidth: 400,
+
+	defaultAudioHeight: 40,
+
+	defaultSeekBackwardInterval: function defaultSeekBackwardInterval(media) {
+		return media.getDuration() * 0.05;
+	},
+
+	defaultSeekForwardInterval: function defaultSeekForwardInterval(media) {
+		return media.getDuration() * 0.05;
+	},
+
+	setDimensions: true,
+
+	audioWidth: -1,
+
+	audioHeight: -1,
+
+	loop: false,
+
+	autoRewind: true,
+
+	enableAutosize: true,
+
+	timeFormat: '',
+
+	alwaysShowHours: false,
+
+	showTimecodeFrameCount: false,
+
+	framesPerSecond: 25,
+
+	alwaysShowControls: false,
+
+	hideVideoControlsOnLoad: false,
+
+	hideVideoControlsOnPause: false,
+
+	clickToPlayPause: true,
+
+	controlsTimeoutDefault: 1500,
+
+	controlsTimeoutMouseEnter: 2500,
+
+	controlsTimeoutMouseLeave: 1000,
+
+	iPadUseNativeControls: false,
+
+	iPhoneUseNativeControls: false,
+
+	AndroidUseNativeControls: false,
+
+	features: ['playpause', 'current', 'progress', 'duration', 'tracks', 'volume', 'fullscreen'],
+
+	useDefaultControls: false,
+
+	isVideo: true,
+
+	stretching: 'auto',
+
+	classPrefix: 'mejs__',
+
+	enableKeyboard: true,
+
+	pauseOtherPlayers: true,
+
+	secondsDecimalLength: 0,
+
+	customError: null,
+
+	keyActions: [{
+		keys: [32, 179],
+		action: function action(player) {
+
+			if (!_constants.IS_FIREFOX) {
+				if (player.paused || player.ended) {
+					player.play();
+				} else {
+					player.pause();
+				}
+			}
+		}
+	}, {
+		keys: [38],
+		action: function action(player) {
+
+			if (player.container.querySelector('.' + config.classPrefix + 'volume-button>button').matches(':focus') || player.container.querySelector('.' + config.classPrefix + 'volume-slider').matches(':focus')) {
+				player.container.querySelector('.' + config.classPrefix + 'volume-slider').style.display = '';
+			}
+			if (player.isVideo) {
+				player.showControls();
+				player.startControlsTimer();
+			}
+
+			var newVolume = Math.min(player.volume + 0.1, 1);
+			player.setVolume(newVolume);
+			if (newVolume > 0) {
+				player.setMuted(false);
+			}
+		}
+	}, {
+		keys: [40],
+		action: function action(player) {
+
+			if (player.container.querySelector('.' + config.classPrefix + 'volume-button>button').matches(':focus') || player.container.querySelector('.' + config.classPrefix + 'volume-slider').matches(':focus')) {
+				player.container.querySelector('.' + config.classPrefix + 'volume-slider').style.display = '';
+			}
+
+			if (player.isVideo) {
+				player.showControls();
+				player.startControlsTimer();
+			}
+
+			var newVolume = Math.max(player.volume - 0.1, 0);
+			player.setVolume(newVolume);
+
+			if (newVolume <= 0.1) {
+				player.setMuted(true);
+			}
+		}
+	}, {
+		keys: [37, 227],
+		action: function action(player) {
+			if (!isNaN(player.duration) && player.duration > 0) {
+				if (player.isVideo) {
+					player.showControls();
+					player.startControlsTimer();
+				}
+
+				var newTime = Math.max(player.currentTime - player.options.defaultSeekBackwardInterval(player), 0);
+				player.setCurrentTime(newTime);
+			}
+		}
+	}, {
+		keys: [39, 228],
+		action: function action(player) {
+
+			if (!isNaN(player.duration) && player.duration > 0) {
+				if (player.isVideo) {
+					player.showControls();
+					player.startControlsTimer();
+				}
+
+				var newTime = Math.min(player.currentTime + player.options.defaultSeekForwardInterval(player), player.duration);
+				player.setCurrentTime(newTime);
+			}
+		}
+	}, {
+		keys: [70],
+		action: function action(player, media, key, event) {
+			if (!event.ctrlKey) {
+				if (typeof player.enterFullScreen !== 'undefined') {
+					if (player.isFullScreen) {
+						player.exitFullScreen();
+					} else {
+						player.enterFullScreen();
+					}
+				}
+			}
+		}
+	}, {
+		keys: [77],
+		action: function action(player) {
+
+			player.container.querySelector('.' + config.classPrefix + 'volume-slider').style.display = '';
+			if (player.isVideo) {
+				player.showControls();
+				player.startControlsTimer();
+			}
+			if (player.media.muted) {
+				player.setMuted(false);
+			} else {
+				player.setMuted(true);
+			}
+		}
+	}]
+};
+
+_mejs2.default.MepDefaults = config;
+
+var MediaElementPlayer = function () {
+	function MediaElementPlayer(node, o) {
+		_classCallCheck(this, MediaElementPlayer);
+
+		var t = this,
+		    element = typeof node === 'string' ? _document2.default.getElementById(node) : node;
+
+		if (!(t instanceof MediaElementPlayer)) {
+			return new MediaElementPlayer(element, o);
+		}
+
+		t.node = t.media = element;
+
+		if (!t.node) {
+			return;
+		}
+
+		if (t.media.player) {
+			return t.media.player;
+		}
+
+		t.hasFocus = false;
+
+		t.controlsAreVisible = true;
+
+		t.controlsEnabled = true;
+
+		t.controlsTimer = null;
+
+		t.currentMediaTime = 0;
+
+		t.proxy = null;
+
+		if (o === undefined) {
+			var options = t.node.getAttribute('data-mejsoptions');
+			o = options ? JSON.parse(options) : {};
+		}
+
+		t.options = Object.assign({}, config, o);
+
+		if (t.options.loop && !t.media.getAttribute('loop')) {
+			t.media.loop = true;
+			t.node.loop = true;
+		} else if (t.media.loop) {
+			t.options.loop = true;
+		}
+
+		if (!t.options.timeFormat) {
+			t.options.timeFormat = 'mm:ss';
+			if (t.options.alwaysShowHours) {
+				t.options.timeFormat = 'hh:mm:ss';
+			}
+			if (t.options.showTimecodeFrameCount) {
+				t.options.timeFormat += ':ff';
+			}
+		}
+
+		(0, _time.calculateTimeFormat)(0, t.options, t.options.framesPerSecond || 25);
+
+		t.id = 'mep_' + _mejs2.default.mepIndex++;
+
+		_mejs2.default.players[t.id] = t;
+
+		var playerOptions = Object.assign({}, t.options, {
+			success: function success(media, domNode) {
+				t._meReady(media, domNode);
+			},
+			error: function error(e) {
+				t._handleError(e);
+			}
+		}),
+		    tagName = t.node.tagName.toLowerCase();
+
+		t.isDynamic = tagName !== 'audio' && tagName !== 'video' && tagName !== 'iframe';
+		t.isVideo = t.isDynamic ? t.options.isVideo : tagName !== 'audio' && t.options.isVideo;
+		t.mediaFiles = null;
+		t.trackFiles = null;
+
+		if (_constants.IS_IPAD && t.options.iPadUseNativeControls || _constants.IS_IPHONE && t.options.iPhoneUseNativeControls) {
+			t.node.setAttribute('controls', true);
+
+			if (_constants.IS_IPAD && t.node.getAttribute('autoplay')) {
+				t.play();
+			}
+		} else if ((t.isVideo || !t.isVideo && (t.options.features.length || t.options.useDefaultControls)) && !(_constants.IS_ANDROID && t.options.AndroidUseNativeControls)) {
+			t.node.removeAttribute('controls');
+			var videoPlayerTitle = t.isVideo ? _i18n2.default.t('mejs.video-player') : _i18n2.default.t('mejs.audio-player');
+
+			var offscreen = _document2.default.createElement('span');
+			offscreen.className = t.options.classPrefix + 'offscreen';
+			offscreen.innerText = videoPlayerTitle;
+			t.media.parentNode.insertBefore(offscreen, t.media);
+
+			t.container = _document2.default.createElement('div');
+			t.container.id = t.id;
+			t.container.className = t.options.classPrefix + 'container ' + t.options.classPrefix + 'container-keyboard-inactive ' + t.media.className;
+			t.container.tabIndex = 0;
+			t.container.setAttribute('role', 'application');
+			t.container.setAttribute('aria-label', videoPlayerTitle);
+			t.container.innerHTML = '<div class="' + t.options.classPrefix + 'inner">' + ('<div class="' + t.options.classPrefix + 'mediaelement"></div>') + ('<div class="' + t.options.classPrefix + 'layers"></div>') + ('<div class="' + t.options.classPrefix + 'controls"></div>') + '</div>';
+			t.container.addEventListener('focus', function (e) {
+				if (!t.controlsAreVisible && !t.hasFocus && t.controlsEnabled) {
+					t.showControls(true);
+
+					var btnSelector = (0, _general.isNodeAfter)(e.relatedTarget, t.container) ? '.' + t.options.classPrefix + 'controls .' + t.options.classPrefix + 'button:last-child > button' : '.' + t.options.classPrefix + 'playpause-button > button',
+					    button = t.container.querySelector(btnSelector);
+
+					button.focus();
+				}
+			});
+			t.node.parentNode.insertBefore(t.container, t.node);
+
+			if (!t.options.features.length && !t.options.useDefaultControls) {
+				t.container.style.background = 'transparent';
+				t.container.querySelector('.' + t.options.classPrefix + 'controls').style.display = 'none';
+			}
+
+			if (t.isVideo && t.options.stretching === 'fill' && !dom.hasClass(t.container.parentNode, t.options.classPrefix + 'fill-container')) {
+				t.outerContainer = t.media.parentNode;
+
+				var wrapper = _document2.default.createElement('div');
+				wrapper.className = t.options.classPrefix + 'fill-container';
+				t.container.parentNode.insertBefore(wrapper, t.container);
+				wrapper.appendChild(t.container);
+			}
+
+			if (_constants.IS_ANDROID) {
+				dom.addClass(t.container, t.options.classPrefix + 'android');
+			}
+			if (_constants.IS_IOS) {
+				dom.addClass(t.container, t.options.classPrefix + 'ios');
+			}
+			if (_constants.IS_IPAD) {
+				dom.addClass(t.container, t.options.classPrefix + 'ipad');
+			}
+			if (_constants.IS_IPHONE) {
+				dom.addClass(t.container, t.options.classPrefix + 'iphone');
+			}
+			dom.addClass(t.container, t.isVideo ? t.options.classPrefix + 'video' : t.options.classPrefix + 'audio');
+
+			if (_constants.IS_SAFARI && !_constants.IS_IOS) {
+
+				dom.addClass(t.container, t.options.classPrefix + 'hide-cues');
+
+				var cloneNode = t.node.cloneNode(),
+				    children = t.node.children,
+				    mediaFiles = [],
+				    tracks = [];
+
+				for (var i = 0, total = children.length; i < total; i++) {
+					var childNode = children[i];
+
+					(function () {
+						switch (childNode.tagName.toLowerCase()) {
+							case 'source':
+								var elements = {};
+								Array.prototype.slice.call(childNode.attributes).forEach(function (item) {
+									elements[item.name] = item.value;
+								});
+								elements.type = (0, _media.formatType)(elements.src, elements.type);
+								mediaFiles.push(elements);
+								break;
+							case 'track':
+								childNode.mode = 'hidden';
+								tracks.push(childNode);
+								break;
+							default:
+								cloneNode.appendChild(childNode);
+								break;
+						}
+					})();
+				}
+
+				t.node.remove();
+				t.node = t.media = cloneNode;
+
+				if (mediaFiles.length) {
+					t.mediaFiles = mediaFiles;
+				}
+				if (tracks.length) {
+					t.trackFiles = tracks;
+				}
+			}
+
+			t.container.querySelector('.' + t.options.classPrefix + 'mediaelement').appendChild(t.node);
+
+			t.media.player = t;
+
+			t.controls = t.container.querySelector('.' + t.options.classPrefix + 'controls');
+			t.layers = t.container.querySelector('.' + t.options.classPrefix + 'layers');
+
+			var tagType = t.isVideo ? 'video' : 'audio',
+			    capsTagName = tagType.substring(0, 1).toUpperCase() + tagType.substring(1);
+
+			if (t.options[tagType + 'Width'] > 0 || t.options[tagType + 'Width'].toString().indexOf('%') > -1) {
+				t.width = t.options[tagType + 'Width'];
+			} else if (t.node.style.width !== '' && t.node.style.width !== null) {
+				t.width = t.node.style.width;
+			} else if (t.node.getAttribute('width')) {
+				t.width = t.node.getAttribute('width');
+			} else {
+				t.width = t.options['default' + capsTagName + 'Width'];
+			}
+
+			if (t.options[tagType + 'Height'] > 0 || t.options[tagType + 'Height'].toString().indexOf('%') > -1) {
+				t.height = t.options[tagType + 'Height'];
+			} else if (t.node.style.height !== '' && t.node.style.height !== null) {
+				t.height = t.node.style.height;
+			} else if (t.node.getAttribute('height')) {
+				t.height = t.node.getAttribute('height');
+			} else {
+				t.height = t.options['default' + capsTagName + 'Height'];
+			}
+
+			t.initialAspectRatio = t.height >= t.width ? t.width / t.height : t.height / t.width;
+
+			t.setPlayerSize(t.width, t.height);
+
+			playerOptions.pluginWidth = t.width;
+			playerOptions.pluginHeight = t.height;
+		} else if (!t.isVideo && !t.options.features.length && !t.options.useDefaultControls) {
+				t.node.style.display = 'none';
+			}
+
+		_mejs2.default.MepDefaults = playerOptions;
+
+		new _mediaelement2.default(t.media, playerOptions, t.mediaFiles);
+
+		if (t.container !== undefined && t.options.features.length && t.controlsAreVisible && !t.options.hideVideoControlsOnLoad) {
+			var event = (0, _general.createEvent)('controlsshown', t.container);
+			t.container.dispatchEvent(event);
+		}
+
+		return t;
+	}
+
+	_createClass(MediaElementPlayer, [{
+		key: 'showControls',
+		value: function showControls(doAnimation) {
+			var t = this;
+
+			doAnimation = doAnimation === undefined || doAnimation;
+
+			if (t.controlsAreVisible || !t.isVideo) {
+				return;
+			}
+
+			if (doAnimation) {
+				(function () {
+					dom.fadeIn(t.controls, 200, function () {
+						dom.removeClass(t.controls, t.options.classPrefix + 'offscreen');
+						var event = (0, _general.createEvent)('controlsshown', t.container);
+						t.container.dispatchEvent(event);
+					});
+
+					var controls = t.container.querySelectorAll('.' + t.options.classPrefix + 'control');
+
+					var _loop = function _loop(i, total) {
+						dom.fadeIn(controls[i], 200, function () {
+							dom.removeClass(controls[i], t.options.classPrefix + 'offscreen');
+						});
+					};
+
+					for (var i = 0, total = controls.length; i < total; i++) {
+						_loop(i, total);
+					}
+				})();
+			} else {
+				dom.removeClass(t.controls, t.options.classPrefix + 'offscreen');
+				t.controls.style.display = '';
+				t.controls.style.opacity = 1;
+
+				var controls = t.container.querySelectorAll('.' + t.options.classPrefix + 'control');
+				for (var i = 0, total = controls.length; i < total; i++) {
+					dom.removeClass(controls[i], t.options.classPrefix + 'offscreen');
+					controls[i].style.display = '';
+				}
+
+				var event = (0, _general.createEvent)('controlsshown', t.container);
+				t.container.dispatchEvent(event);
+			}
+
+			t.controlsAreVisible = true;
+			t.setControlsSize();
+		}
+	}, {
+		key: 'hideControls',
+		value: function hideControls(doAnimation, forceHide) {
+			var t = this;
+
+			doAnimation = doAnimation === undefined || doAnimation;
+
+			if (forceHide !== true && (!t.controlsAreVisible || t.options.alwaysShowControls || t.paused && t.readyState === 4 && (!t.options.hideVideoControlsOnLoad && t.currentTime <= 0 || !t.options.hideVideoControlsOnPause && t.currentTime > 0) || t.isVideo && !t.options.hideVideoControlsOnLoad && !t.readyState || t.ended)) {
+				return;
+			}
+
+			if (doAnimation) {
+				(function () {
+					dom.fadeOut(t.controls, 200, function () {
+						dom.addClass(t.controls, t.options.classPrefix + 'offscreen');
+						t.controls.style.display = '';
+						var event = (0, _general.createEvent)('controlshidden', t.container);
+						t.container.dispatchEvent(event);
+					});
+
+					var controls = t.container.querySelectorAll('.' + t.options.classPrefix + 'control');
+
+					var _loop2 = function _loop2(i, total) {
+						dom.fadeOut(controls[i], 200, function () {
+							dom.addClass(controls[i], t.options.classPrefix + 'offscreen');
+							controls[i].style.display = '';
+						});
+					};
+
+					for (var i = 0, total = controls.length; i < total; i++) {
+						_loop2(i, total);
+					}
+				})();
+			} else {
+				dom.addClass(t.controls, t.options.classPrefix + 'offscreen');
+				t.controls.style.display = '';
+				t.controls.style.opacity = 0;
+
+				var controls = t.container.querySelectorAll('.' + t.options.classPrefix + 'control');
+				for (var i = 0, total = controls.length; i < total; i++) {
+					dom.addClass(controls[i], t.options.classPrefix + 'offscreen');
+					controls[i].style.display = '';
+				}
+
+				var event = (0, _general.createEvent)('controlshidden', t.container);
+				t.container.dispatchEvent(event);
+			}
+
+			t.controlsAreVisible = false;
+		}
+	}, {
+		key: 'startControlsTimer',
+		value: function startControlsTimer(timeout) {
+			var t = this;
+
+			timeout = typeof timeout !== 'undefined' ? timeout : t.options.controlsTimeoutDefault;
+
+			t.killControlsTimer('start');
+
+			t.controlsTimer = setTimeout(function () {
+				t.hideControls();
+				t.killControlsTimer('hide');
+			}, timeout);
+		}
+	}, {
+		key: 'killControlsTimer',
+		value: function killControlsTimer() {
+			var t = this;
+
+			if (t.controlsTimer !== null) {
+				clearTimeout(t.controlsTimer);
+				delete t.controlsTimer;
+				t.controlsTimer = null;
+			}
+		}
+	}, {
+		key: 'disableControls',
+		value: function disableControls() {
+			var t = this;
+
+			t.killControlsTimer();
+			t.controlsEnabled = false;
+			t.hideControls(false, true);
+		}
+	}, {
+		key: 'enableControls',
+		value: function enableControls() {
+			var t = this;
+
+			t.controlsEnabled = true;
+			t.showControls(false);
+		}
+	}, {
+		key: '_setDefaultPlayer',
+		value: function _setDefaultPlayer() {
+			var t = this;
+			if (t.proxy) {
+				t.proxy.pause();
+			}
+			t.proxy = new _default2.default(t);
+			t.media.addEventListener('loadedmetadata', function () {
+				if (t.getCurrentTime() > 0 && t.currentMediaTime > 0) {
+					t.setCurrentTime(t.currentMediaTime);
+					if (!_constants.IS_IOS && !_constants.IS_ANDROID) {
+						t.play();
+					}
+				}
+			});
+		}
+	}, {
+		key: '_meReady',
+		value: function _meReady(media, domNode) {
+			var t = this,
+			    autoplayAttr = domNode.getAttribute('autoplay'),
+			    autoplay = !(autoplayAttr === undefined || autoplayAttr === null || autoplayAttr === 'false'),
+			    isNative = media.rendererName !== null && /(native|html5)/i.test(t.media.rendererName);
+
+			if (t.controls) {
+				t.enableControls();
+			}
+
+			if (t.container && t.container.querySelector('.' + t.options.classPrefix + 'overlay-play')) {
+				t.container.querySelector('.' + t.options.classPrefix + 'overlay-play').style.display = '';
+			}
+
+			if (t.created) {
+				return;
+			}
+
+			t.created = true;
+			t.media = media;
+			t.domNode = domNode;
+
+			if (!(_constants.IS_ANDROID && t.options.AndroidUseNativeControls) && !(_constants.IS_IPAD && t.options.iPadUseNativeControls) && !(_constants.IS_IPHONE && t.options.iPhoneUseNativeControls)) {
+				if (!t.isVideo && !t.options.features.length && !t.options.useDefaultControls) {
+					if (autoplay && isNative) {
+						t.play();
+					}
+
+					if (t.options.success) {
+
+						if (typeof t.options.success === 'string') {
+							_window2.default[t.options.success](t.media, t.domNode, t);
+						} else {
+							t.options.success(t.media, t.domNode, t);
+						}
+					}
+
+					return;
+				}
+
+				t.findTracks();
+
+				t.featurePosition = {};
+
+				t._setDefaultPlayer();
+
+				if (t.options.useDefaultControls) {
+					var defaultControls = ['playpause', 'current', 'progress', 'duration', 'tracks', 'volume', 'fullscreen'];
+					t.options.features = defaultControls.concat(t.options.features.filter(function (item) {
+						return defaultControls.indexOf(item) === -1;
+					}));
+				}
+
+				for (var i = 0, total = t.options.features.length; i < total; i++) {
+					var feature = t.options.features[i];
+					if (t['build' + feature]) {
+						try {
+							t['build' + feature](t, t.controls, t.layers, t.media);
+						} catch (e) {
+							console.error('error building ' + feature, e);
+						}
+					}
+				}
+
+				t.buildposter(t, t.controls, t.layers, t.media);
+				t.buildkeyboard(t, t.controls, t.layers, t.media);
+				t.buildoverlays(t, t.controls, t.layers, t.media);
+
+				var event = (0, _general.createEvent)('controlsready', t.container);
+				t.container.dispatchEvent(event);
+
+				t.setPlayerSize(t.width, t.height);
+				t.setControlsSize();
+
+				if (t.isVideo) {
+					t.clickToPlayPauseCallback = function () {
+
+						if (t.options.clickToPlayPause) {
+							var button = t.container.querySelector('.' + t.options.classPrefix + 'overlay-button'),
+							    pressed = button.getAttribute('aria-pressed');
+
+							if (t.paused && pressed) {
+								t.pause();
+							} else if (t.paused) {
+								t.play();
+							} else {
+								t.pause();
+							}
+
+							button.setAttribute('aria-pressed', !pressed);
+							t.container.focus();
+						}
+					};
+
+					t.createIframeLayer();
+
+					t.media.addEventListener('click', t.clickToPlayPauseCallback);
+
+					if ((_constants.IS_ANDROID || _constants.IS_IOS) && !t.options.alwaysShowControls) {
+						t.node.addEventListener('touchstart', function () {
+							if (t.controlsAreVisible) {
+								t.hideControls(false);
+							} else {
+								if (t.controlsEnabled) {
+									t.showControls(false);
+								}
+							}
+						});
+					} else {
+						t.container.addEventListener('mouseenter', function () {
+							if (t.controlsEnabled) {
+								if (!t.options.alwaysShowControls) {
+									t.killControlsTimer('enter');
+									t.showControls();
+									t.startControlsTimer(t.options.controlsTimeoutMouseEnter);
+								}
+							}
+						});
+						t.container.addEventListener('mousemove', function () {
+							if (t.controlsEnabled) {
+								if (!t.controlsAreVisible) {
+									t.showControls();
+								}
+								if (!t.options.alwaysShowControls) {
+									t.startControlsTimer(t.options.controlsTimeoutMouseEnter);
+								}
+							}
+						});
+						t.container.addEventListener('mouseleave', function () {
+							if (t.controlsEnabled) {
+								if (!t.paused && !t.options.alwaysShowControls) {
+									t.startControlsTimer(t.options.controlsTimeoutMouseLeave);
+								}
+							}
+						});
+					}
+
+					if (t.options.hideVideoControlsOnLoad) {
+						t.hideControls(false);
+					}
+
+					if (t.options.enableAutosize) {
+						t.media.addEventListener('loadedmetadata', function (e) {
+							var target = e !== undefined ? e.detail.target || e.target : t.media;
+							if (t.options.videoHeight <= 0 && !t.domNode.getAttribute('height') && target !== null && !isNaN(target.videoHeight)) {
+								t.setPlayerSize(target.videoWidth, target.videoHeight);
+								t.setControlsSize();
+								t.media.setSize(target.videoWidth, target.videoHeight);
+							}
+						});
+					}
+				}
+
+				t.media.addEventListener('play', function () {
+					t.hasFocus = true;
+
+					for (var playerIndex in _mejs2.default.players) {
+						if (_mejs2.default.players.hasOwnProperty(playerIndex)) {
+							var p = _mejs2.default.players[playerIndex];
+
+							if (p.id !== t.id && t.options.pauseOtherPlayers && !p.paused && !p.ended) {
+								p.pause();
+								p.hasFocus = false;
+							}
+						}
+					}
+
+					if (!(_constants.IS_ANDROID || _constants.IS_IOS) && !t.options.alwaysShowControls && t.isVideo) {
+						t.hideControls();
+					}
+				});
+
+				t.media.addEventListener('ended', function () {
+					if (t.options.autoRewind) {
+						try {
+							t.setCurrentTime(0);
+
+							setTimeout(function () {
+								var loadingElement = t.container.querySelector('.' + t.options.classPrefix + 'overlay-loading');
+								if (loadingElement && loadingElement.parentNode) {
+									loadingElement.parentNode.style.display = 'none';
+								}
+							}, 20);
+						} catch (exp) {
+							
+						}
+					}
+
+					if (typeof t.media.renderer.stop === 'function') {
+						t.media.renderer.stop();
+					} else {
+						t.pause();
+					}
+
+					if (t.setProgressRail) {
+						t.setProgressRail();
+					}
+					if (t.setCurrentRail) {
+						t.setCurrentRail();
+					}
+
+					if (t.options.loop) {
+						t.play();
+					} else if (!t.options.alwaysShowControls && t.controlsEnabled) {
+						t.showControls();
+					}
+				});
+
+				t.media.addEventListener('loadedmetadata', function () {
+
+					(0, _time.calculateTimeFormat)(t.getDuration(), t.options, t.options.framesPerSecond || 25);
+
+					if (t.updateDuration) {
+						t.updateDuration();
+					}
+					if (t.updateCurrent) {
+						t.updateCurrent();
+					}
+
+					if (!t.isFullScreen) {
+						t.setPlayerSize(t.width, t.height);
+						t.setControlsSize();
+					}
+				});
+
+				var duration = null;
+				t.media.addEventListener('timeupdate', function () {
+					if (!isNaN(t.getDuration()) && duration !== t.getDuration()) {
+						duration = t.getDuration();
+						(0, _time.calculateTimeFormat)(duration, t.options, t.options.framesPerSecond || 25);
+
+						if (t.updateDuration) {
+							t.updateDuration();
+						}
+						if (t.updateCurrent) {
+							t.updateCurrent();
+						}
+
+						t.setControlsSize();
+					}
+				});
+
+				t.container.addEventListener('click', function (e) {
+					dom.addClass(e.currentTarget, t.options.classPrefix + 'container-keyboard-inactive');
+				});
+
+				t.container.addEventListener('focusin', function (e) {
+					dom.removeClass(e.currentTarget, t.options.classPrefix + 'container-keyboard-inactive');
+					if (t.isVideo && !_constants.IS_ANDROID && !_constants.IS_IOS && t.controlsEnabled && !t.options.alwaysShowControls) {
+						t.killControlsTimer('enter');
+						t.showControls();
+						t.startControlsTimer(t.options.controlsTimeoutMouseEnter);
+					}
+				});
+
+				t.container.addEventListener('focusout', function (e) {
+					setTimeout(function () {
+						if (e.relatedTarget) {
+							if (t.keyboardAction && !e.relatedTarget.closest('.' + t.options.classPrefix + 'container')) {
+								t.keyboardAction = false;
+								if (t.isVideo && !t.options.alwaysShowControls && !t.paused) {
+									t.startControlsTimer(t.options.controlsTimeoutMouseLeave);
+								}
+							}
+						}
+					}, 0);
+				});
+
+				setTimeout(function () {
+					t.setPlayerSize(t.width, t.height);
+					t.setControlsSize();
+				}, 0);
+
+				t.globalResizeCallback = function () {
+					if (!(t.isFullScreen || _constants.HAS_TRUE_NATIVE_FULLSCREEN && _document2.default.webkitIsFullScreen)) {
+						t.setPlayerSize(t.width, t.height);
+					}
+
+					t.setControlsSize();
+				};
+
+				t.globalBind('resize', t.globalResizeCallback);
+			}
+
+			if (autoplay && isNative) {
+				t.play();
+			}
+
+			if (t.options.success) {
+				if (typeof t.options.success === 'string') {
+					_window2.default[t.options.success](t.media, t.domNode, t);
+				} else {
+					t.options.success(t.media, t.domNode, t);
+				}
+			}
+		}
+	}, {
+		key: '_handleError',
+		value: function _handleError(e, media, node) {
+			var t = this,
+			    play = t.layers.querySelector('.' + t.options.classPrefix + 'overlay-play');
 
-		/**
-		 * Filters for available languages.
-		 *
-		 * This plural forms are grouped in family groups based on
-		 * https://developer.mozilla.org/en-US/docs/Mozilla/Localization/Localization_and_Plurals#List_of_Plural_Rules
-		 * with some additions and corrections according to the Localization Guide list
-		 * (http://localization-guide.readthedocs.io/en/latest/l10n/pluralforms.html)
-		 *
-		 * Arguments are dynamic following the structure:
-		 * - argument1 : Number to determine form
-		 * - argument2...argumentN: Possible matches
-		 *
-		 * @type {Function[]}
-		 */
-		pluralForms: [
-			// 0: Chinese, Japanese, Korean, Persian, Turkish, Thai, Lao, Aymará,
-			// Tibetan, Chiga, Dzongkha, Indonesian, Lojban, Georgian, Kazakh, Khmer, Kyrgyz, Malay,
-			// Burmese, Yakut, Sundanese, Tatar, Uyghur, Vietnamese, Wolof
-			function () {
-				return arguments[1];
-			},
-			// 1: Danish, Dutch, English, Faroese, Frisian, German, Norwegian, Swedish, Estonian, Finnish,
-			// Hungarian, Basque, Greek, Hebrew, Italian, Portuguese, Spanish, Catalan, Afrikaans,
-			// Angika, Assamese, Asturian, Azerbaijani, Bulgarian, Bengali, Bodo, Aragonese, Dogri,
-			// Esperanto, Argentinean Spanish, Fulah, Friulian, Galician, Gujarati, Hausa,
-			// Hindi, Chhattisgarhi, Armenian, Interlingua, Greenlandic, Kannada, Kurdish, Letzeburgesch,
-			// Maithili, Malayalam, Mongolian, Manipuri, Marathi, Nahuatl, Neapolitan, Norwegian Bokmal,
-			// Nepali, Norwegian Nynorsk, Norwegian (old code), Northern Sotho, Oriya, Punjabi, Papiamento,
-			// Piemontese, Pashto, Romansh, Kinyarwanda, Santali, Scots, Sindhi, Northern Sami, Sinhala,
-			// Somali, Songhay, Albanian, Swahili, Tamil, Telugu, Turkmen, Urdu, Yoruba
-			function () {
-				var args = arguments;
-				if (args[0] === 1) {
-					return args[1];
-				} else {
-					return args[2];
+			if (play) {
+				play.style.display = 'none';
+			}
+
+			if (t.options.error) {
+				t.options.error(e, media, node);
+			}
+
+			if (t.container.querySelector('.' + t.options.classPrefix + 'cannotplay')) {
+				t.container.querySelector('.' + t.options.classPrefix + 'cannotplay').remove();
+			}
+
+			var errorContainer = _document2.default.createElement('div');
+			errorContainer.className = t.options.classPrefix + 'cannotplay';
+			errorContainer.style.width = '100%';
+			errorContainer.style.height = '100%';
+
+			var errorContent = typeof t.options.customError === 'function' ? t.options.customError(t.media, t.media.originalNode) : t.options.customError,
+			    imgError = '';
+
+			if (errorContent) {
+				var poster = t.media.originalNode.getAttribute('poster');
+				if (poster) {
+					imgError = '<img src="' + poster + '" alt="' + _mejs2.default.i18n.t('mejs.download-file') + '">';
 				}
-			},
-			// 2: French, Brazilian Portuguese, Acholi, Akan, Amharic, Mapudungun, Breton, Filipino,
-			// Gun, Lingala, Mauritian Creole, Malagasy, Maori, Occitan, Tajik, Tigrinya, Uzbek, Walloon
-			function () {
-				var args = arguments;
-				if ([0, 1].indexOf(args[0]) > -1) {
-					return args[1];
-				} else {
-					return args[2];
+
+				if (e.message) {
+					errorContent += '<p>' + e.message + '</p>';
 				}
-			},
-			// 3: Latvian
-			function () {
-				var args = arguments;
-				if (args[0] % 10 === 1 && args[0] % 100 !== 11) {
-					return args[1];
-				} else if (args[0] !== 0) {
-					return args[2];
-				} else {
-					return args[3];
+
+				if (e.urls) {
+					for (var i = 0, total = e.urls.length; i < total; i++) {
+						var url = e.urls[i];
+						errorContent += '<a href="' + url.src + '" data-type="' + url.type + '"><span>' + _mejs2.default.i18n.t('mejs.download-file') + ': ' + url.src + '</span></a>';
+					}
 				}
-			},
-			// 4: Scottish Gaelic
-			function () {
-				var args = arguments;
-				if (args[0] === 1 || args[0] === 11) {
-					return args[1];
-				} else if (args[0] === 2 || args[0] === 12) {
-					return args[2];
-				} else if (args[0] > 2 && args[0] < 20) {
-					return args[3];
-				} else {
-					return args[4];
+			}
+
+			if (errorContent && t.layers.querySelector('.' + t.options.classPrefix + 'overlay-error')) {
+				errorContainer.innerHTML = errorContent;
+				t.layers.querySelector('.' + t.options.classPrefix + 'overlay-error').innerHTML = '' + imgError + errorContainer.outerHTML;
+				t.layers.querySelector('.' + t.options.classPrefix + 'overlay-error').parentNode.style.display = 'block';
+			}
+		}
+	}, {
+		key: 'setPlayerSize',
+		value: function setPlayerSize(width, height) {
+			var t = this;
+
+			if (!t.options.setDimensions) {
+				return false;
+			}
+
+			if (typeof width !== 'undefined') {
+				t.width = width;
+			}
+
+			if (typeof height !== 'undefined') {
+				t.height = height;
+			}
+
+			switch (t.options.stretching) {
+				case 'fill':
+					if (t.isVideo) {
+						t.setFillMode();
+					} else {
+						t.setDimensions(t.width, t.height);
+					}
+					break;
+				case 'responsive':
+					t.setResponsiveMode();
+					break;
+				case 'none':
+					t.setDimensions(t.width, t.height);
+					break;
+
+				default:
+					if (t.hasFluidMode() === true) {
+						t.setResponsiveMode();
+					} else {
+						t.setDimensions(t.width, t.height);
+					}
+					break;
+			}
+		}
+	}, {
+		key: 'hasFluidMode',
+		value: function hasFluidMode() {
+			var t = this;
+
+			return t.height.toString().indexOf('%') !== -1 || t.node && t.node.style.maxWidth && t.node.style.maxWidth !== 'none' && t.node.style.maxWidth !== t.width || t.node && t.node.currentStyle && t.node.currentStyle.maxWidth === '100%';
+		}
+	}, {
+		key: 'setResponsiveMode',
+		value: function setResponsiveMode() {
+			var t = this,
+			    parent = function () {
+
+				var parentEl = void 0,
+				    el = t.container;
+
+				while (el) {
+					try {
+						if (_constants.IS_FIREFOX && el.tagName.toLowerCase() === 'html' && _window2.default.self !== _window2.default.top && _window2.default.frameElement !== null) {
+							return _window2.default.frameElement;
+						} else {
+							parentEl = el.parentElement;
+						}
+					} catch (e) {
+						parentEl = el.parentElement;
+					}
+
+					if (parentEl && dom.visible(parentEl)) {
+						return parentEl;
+					}
+					el = parentEl;
 				}
-			},
-			// 5:  Romanian
-			function () {
-				if (args[0] === 1) {
-					return args[1];
-				} else if (args[0] === 0 || (args[0] % 100 > 0 && args[0] % 100 < 20)) {
-					return args[2];
+
+				return null;
+			}(),
+			    parentStyles = parent ? getComputedStyle(parent, null) : getComputedStyle(_document2.default.body, null),
+			    nativeWidth = function () {
+				if (t.isVideo) {
+					if (t.media.videoWidth && t.media.videoWidth > 0) {
+						return t.media.videoWidth;
+					} else if (t.node.getAttribute('width')) {
+						return t.node.getAttribute('width');
+					} else {
+						return t.options.defaultVideoWidth;
+					}
 				} else {
-					return args[3];
+					return t.options.defaultAudioWidth;
 				}
-			},
-			// 6: Lithuanian
-			function () {
-				var args = arguments;
-				if (args[0] % 10 === 1 && args[0] % 100 !== 11) {
-					return args[1];
-				} else if (args[0] % 10 >= 2 && (args[0] % 100 < 10 || args[0] % 100 >= 20)) {
-					return args[2];
+			}(),
+			    nativeHeight = function () {
+				if (t.isVideo) {
+					if (t.media.videoHeight && t.media.videoHeight > 0) {
+						return t.media.videoHeight;
+					} else if (t.node.getAttribute('height')) {
+						return t.node.getAttribute('height');
+					} else {
+						return t.options.defaultVideoHeight;
+					}
 				} else {
-					return [3];
+					return t.options.defaultAudioHeight;
 				}
-			},
-			// 7: Belarusian, Bosnian, Croatian, Serbian, Russian, Ukrainian
-			function () {
-				var args = arguments;
-				if (args[0] % 10 === 1 && args[0] % 100 !== 11) {
-					return args[1];
-				} else if (args[0] % 10 >= 2 && args[0] % 10 <= 4 && (args[0] % 100 < 10 || args[0] % 100 >= 20)) {
-					return args[2];
-				} else {
-					return args[3];
+			}(),
+			    aspectRatio = function () {
+				var ratio = 1;
+				if (!t.isVideo) {
+					return ratio;
 				}
-			},
-			// 8:  Slovak, Czech
-			function () {
-				var args = arguments;
-				if (args[0] === 1) {
-					return args[1];
-				} else if (args[0] >= 2 && args[0] <= 4) {
-					return args[2];
+
+				if (t.media.videoWidth && t.media.videoWidth > 0 && t.media.videoHeight && t.media.videoHeight > 0) {
+					ratio = t.height >= t.width ? t.media.videoWidth / t.media.videoHeight : t.media.videoHeight / t.media.videoWidth;
 				} else {
-					return args[3];
+					ratio = t.initialAspectRatio;
 				}
-			},
-			// 9: Polish
-			function () {
-				var args = arguments;
-				if (args[0] === 1) {
-					return args[1];
-				} else if (args[0] % 10 >= 2 && args[0] % 10 <= 4 && (args[0] % 100 < 10 || args[0] % 100 >= 20)) {
-					return args[2];
-				} else {
-					return args[3];
+
+				if (isNaN(ratio) || ratio < 0.01 || ratio > 100) {
+					ratio = 1;
 				}
-			},
-			// 10: Slovenian
-			function () {
-				var args = arguments;
-				if (args[0] % 100 === 1) {
-					return args[2];
-				} else if (args[0] % 100 === 2) {
-					return args[3];
-				} else if (args[0] % 100 === 3 || args[0] % 100 === 4) {
-					return args[4];
+
+				return ratio;
+			}(),
+			    parentHeight = parseFloat(parentStyles.height);
+
+			var newHeight = void 0,
+			    parentWidth = parseFloat(parentStyles.width);
+
+			if (t.isVideo) {
+				if (t.height === '100%') {
+					newHeight = parseFloat(parentWidth * nativeHeight / nativeWidth, 10);
 				} else {
-					return args[1];
+					newHeight = t.height >= t.width ? parseFloat(parentWidth / aspectRatio, 10) : parseFloat(parentWidth * aspectRatio, 10);
 				}
-			},
-			// 11: Irish Gaelic
-			function () {
-				var args = arguments;
-				if (args[0] === 1) {
-					return args[1];
-				} else if (args[0] === 2) {
-					return args[2];
-				} else if (args[0] > 2 && args[0] < 7) {
-					return args[3];
-				} else if (args[0] > 6 && args[0] < 11) {
-					return args[4];
-				} else {
-					return args[5];
+			} else {
+				newHeight = nativeHeight;
+			}
+
+			if (isNaN(newHeight)) {
+				newHeight = parentHeight;
+			}
+
+			if (t.container.parentNode.length > 0 && t.container.parentNode.tagName.toLowerCase() === 'body') {
+				parentWidth = _window2.default.innerWidth || _document2.default.documentElement.clientWidth || _document2.default.body.clientWidth;
+				newHeight = _window2.default.innerHeight || _document2.default.documentElement.clientHeight || _document2.default.body.clientHeight;
+			}
+
+			if (newHeight && parentWidth) {
+				t.container.style.width = parentWidth + 'px';
+				t.container.style.height = newHeight + 'px';
+
+				t.node.style.width = '100%';
+				t.node.style.height = '100%';
+
+				if (t.isVideo && t.media.setSize) {
+					t.media.setSize(parentWidth, newHeight);
 				}
-			},
-			// 12: Arabic
-			function () {
-				var args = arguments;
-				if (args[0] === 0) {
-					return args[1];
-				} else if (args[0] === 1) {
-					return args[2];
-				} else if (args[0] === 2) {
-					return args[3];
-				} else if (args[0] % 100 >= 3 && args[0] % 100 <= 10) {
-					return args[4];
-				} else if (args[0] % 100 >= 11) {
-					return args[5];
-				} else {
-					return args[6];
+
+				var layerChildren = t.layers.children;
+				for (var i = 0, total = layerChildren.length; i < total; i++) {
+					layerChildren[i].style.width = '100%';
+					layerChildren[i].style.height = '100%';
 				}
-			},
-			// 13: Maltese
-			function () {
-				var args = arguments;
-				if (args[0] === 1) {
-					return args[1];
-				} else if (args[0] === 0 || (args[0] % 100 > 1 && args[0] % 100 < 11)) {
-					return args[2];
-				} else if (args[0] % 100 > 10 && args[0] % 100 < 20) {
-					return args[3];
+			}
+		}
+	}, {
+		key: 'setFillMode',
+		value: function setFillMode() {
+			var t = this;
+
+			var parent = void 0,
+			    isIframe = false;
+
+			try {
+				if (_window2.default.self !== _window2.default.top) {
+					isIframe = true;
+					parent = _window2.default.frameElement;
 				} else {
-					return args[4];
+					parent = t.outerContainer;
+				}
+			} catch (e) {
+				parent = t.outerContainer;
+			}
+
+			var parentStyles = getComputedStyle(parent);
+
+			if (t.node.style.height !== 'none' && t.node.style.height !== t.height) {
+				t.node.style.height = 'auto';
+			}
+			if (t.node.style.maxWidth !== 'none' && t.node.style.maxWidth !== t.width) {
+				t.node.style.maxWidth = 'none';
+			}
+
+			if (t.node.style.maxHeight !== 'none' && t.node.style.maxHeight !== t.height) {
+				t.node.style.maxHeight = 'none';
+			}
+
+			if (t.node.currentStyle) {
+				if (t.node.currentStyle.height === '100%') {
+					t.node.currentStyle.height = 'auto';
+				}
+				if (t.node.currentStyle.maxWidth === '100%') {
+					t.node.currentStyle.maxWidth = 'none';
+				}
+				if (t.node.currentStyle.maxHeight === '100%') {
+					t.node.currentStyle.maxHeight = 'none';
+				}
+			}
+
+			if (!isIframe && !parseFloat(parentStyles.width)) {
+				parent.style.width = t.media.offsetWidth + 'px';
+			}
+
+			if (!isIframe && !parseFloat(parentStyles.height)) {
+				parent.style.height = t.media.offsetHeight + 'px';
+			}
+
+			parentStyles = getComputedStyle(parent);
+
+			var parentWidth = parseFloat(parentStyles.width),
+			    parentHeight = parseFloat(parentStyles.height);
+
+			t.setDimensions('100%', '100%');
+
+			var poster = t.container.querySelector('.' + t.options.classPrefix + 'poster>img');
+			if (poster) {
+				poster.style.display = '';
+			}
+
+			var targetElement = t.container.querySelectorAll('object, embed, iframe, video'),
+			    initHeight = t.height,
+			    initWidth = t.width,
+			    scaleX1 = parentWidth,
+			    scaleY1 = initHeight * parentWidth / initWidth,
+			    scaleX2 = initWidth * parentHeight / initHeight,
+			    scaleY2 = parentHeight,
+			    bScaleOnWidth = scaleX2 > parentWidth === false,
+			    finalWidth = bScaleOnWidth ? Math.floor(scaleX1) : Math.floor(scaleX2),
+			    finalHeight = bScaleOnWidth ? Math.floor(scaleY1) : Math.floor(scaleY2),
+			    width = bScaleOnWidth ? parentWidth + 'px' : finalWidth + 'px',
+			    height = bScaleOnWidth ? finalHeight + 'px' : parentHeight + 'px';
+
+			for (var i = 0, total = targetElement.length; i < total; i++) {
+				targetElement[i].style.height = height;
+				targetElement[i].style.width = width;
+				if (t.media.setSize) {
+					t.media.setSize(width, height);
+				}
+
+				targetElement[i].style.marginLeft = Math.floor((parentWidth - finalWidth) / 2) + 'px';
+				targetElement[i].style.marginTop = 0;
+			}
+		}
+	}, {
+		key: 'setDimensions',
+		value: function setDimensions(width, height) {
+			var t = this;
+
+			width = (0, _general.isString)(width) && width.indexOf('%') > -1 ? width : parseFloat(width) + 'px';
+			height = (0, _general.isString)(height) && height.indexOf('%') > -1 ? height : parseFloat(height) + 'px';
+
+			t.container.style.width = width;
+			t.container.style.height = height;
+
+			var layers = t.layers.children;
+			for (var i = 0, total = layers.length; i < total; i++) {
+				layers[i].style.width = width;
+				layers[i].style.height = height;
+			}
+		}
+	}, {
+		key: 'setControlsSize',
+		value: function setControlsSize() {
+			var t = this;
+
+			if (!dom.visible(t.container)) {
+				return;
+			}
+
+			if (t.rail && dom.visible(t.rail)) {
+				var totalStyles = t.total ? getComputedStyle(t.total, null) : null,
+				    totalMargin = totalStyles ? parseFloat(totalStyles.marginLeft) + parseFloat(totalStyles.marginRight) : 0,
+				    railStyles = getComputedStyle(t.rail),
+				    railMargin = parseFloat(railStyles.marginLeft) + parseFloat(railStyles.marginRight);
+
+				var siblingsWidth = 0;
+
+				var siblings = dom.siblings(t.rail, function (el) {
+					return el !== t.rail;
+				}),
+				    total = siblings.length;
+				for (var i = 0; i < total; i++) {
+					siblingsWidth += siblings[i].offsetWidth;
+				}
+
+				siblingsWidth += totalMargin + (totalMargin === 0 ? railMargin * 2 : railMargin) + 1;
+
+				t.container.style.minWidth = siblingsWidth + 'px';
+
+				var event = (0, _general.createEvent)('controlsresize', t.container);
+				t.container.dispatchEvent(event);
+			} else {
+				var children = t.controls.children;
+				var minWidth = 0;
+
+				for (var _i = 0, _total = children.length; _i < _total; _i++) {
+					minWidth += children[_i].offsetWidth;
+				}
+
+				t.container.style.minWidth = minWidth + 'px';
+			}
+		}
+	}, {
+		key: 'addControlElement',
+		value: function addControlElement(element, key) {
+
+			var t = this;
+
+			if (t.featurePosition[key] !== undefined) {
+				var child = t.controls.children[t.featurePosition[key] - 1];
+				child.parentNode.insertBefore(element, child.nextSibling);
+			} else {
+				t.controls.appendChild(element);
+				var children = t.controls.children;
+				for (var i = 0, total = children.length; i < total; i++) {
+					if (element === children[i]) {
+						t.featurePosition[key] = i;
+						break;
+					}
+				}
+			}
+		}
+	}, {
+		key: 'createIframeLayer',
+		value: function createIframeLayer() {
+			var t = this;
+
+			if (t.isVideo && t.media.rendererName !== null && t.media.rendererName.indexOf('iframe') > -1 && !_document2.default.getElementById(t.media.id + '-iframe-overlay')) {
+
+				var layer = _document2.default.createElement('div'),
+				    target = _document2.default.getElementById(t.media.id + '_' + t.media.rendererName);
+
+				layer.id = t.media.id + '-iframe-overlay';
+				layer.className = t.options.classPrefix + 'iframe-overlay';
+				layer.addEventListener('click', function (e) {
+					if (t.options.clickToPlayPause) {
+						if (t.paused) {
+							t.play();
+						} else {
+							t.pause();
+						}
+
+						e.preventDefault();
+						e.stopPropagation();
+					}
+				});
+
+				target.parentNode.insertBefore(layer, target);
+			}
+		}
+	}, {
+		key: 'resetSize',
+		value: function resetSize() {
+			var t = this;
+
+			setTimeout(function () {
+				t.setPlayerSize(t.width, t.height);
+				t.setControlsSize();
+			}, 50);
+		}
+	}, {
+		key: 'setPoster',
+		value: function setPoster(url) {
+			var t = this;
+
+			var posterDiv = t.container.querySelector('.' + t.options.classPrefix + 'poster');
+
+			if (!posterDiv) {
+				posterDiv = _document2.default.createElement('div');
+				posterDiv.className = t.options.classPrefix + 'poster ' + t.options.classPrefix + 'layer';
+				t.layers.appendChild(posterDiv);
+			}
+
+			var posterImg = posterDiv.querySelector('img');
+
+			if (!posterImg && url) {
+				posterImg = _document2.default.createElement('img');
+				posterImg.className = t.options.classPrefix + 'poster-img';
+				posterImg.width = '100%';
+				posterImg.height = '100%';
+				posterDiv.style.display = '';
+				posterDiv.appendChild(posterImg);
+			}
+
+			if (url) {
+				posterImg.setAttribute('src', url);
+				posterDiv.style.backgroundImage = 'url("' + url + '")';
+				posterDiv.style.display = '';
+			} else if (posterImg) {
+				posterDiv.style.backgroundImage = 'none';
+				posterDiv.style.display = 'none';
+				posterImg.remove();
+			} else {
+				posterDiv.style.display = 'none';
+			}
+		}
+	}, {
+		key: 'changeSkin',
+		value: function changeSkin(className) {
+			var t = this;
+
+			t.container.className = t.options.classPrefix + 'container ' + className;
+			t.setPlayerSize(t.width, t.height);
+			t.setControlsSize();
+		}
+	}, {
+		key: 'globalBind',
+		value: function globalBind(events, callback) {
+			var t = this,
+			    doc = t.node ? t.node.ownerDocument : _document2.default;
+
+			events = (0, _general.splitEvents)(events, t.id);
+			if (events.d) {
+				var eventList = events.d.split(' ');
+				for (var i = 0, total = eventList.length; i < total; i++) {
+					eventList[i].split('.').reduce(function (part, e) {
+						doc.addEventListener(e, callback, false);
+						return e;
+					}, '');
+				}
+			}
+			if (events.w) {
+				var _eventList = events.w.split(' ');
+				for (var _i2 = 0, _total2 = _eventList.length; _i2 < _total2; _i2++) {
+					_eventList[_i2].split('.').reduce(function (part, e) {
+						_window2.default.addEventListener(e, callback, false);
+						return e;
+					}, '');
+				}
+			}
+		}
+	}, {
+		key: 'globalUnbind',
+		value: function globalUnbind(events, callback) {
+			var t = this,
+			    doc = t.node ? t.node.ownerDocument : _document2.default;
+
+			events = (0, _general.splitEvents)(events, t.id);
+			if (events.d) {
+				var eventList = events.d.split(' ');
+				for (var i = 0, total = eventList.length; i < total; i++) {
+					eventList[i].split('.').reduce(function (part, e) {
+						doc.removeEventListener(e, callback, false);
+						return e;
+					}, '');
+				}
+			}
+			if (events.w) {
+				var _eventList2 = events.w.split(' ');
+				for (var _i3 = 0, _total3 = _eventList2.length; _i3 < _total3; _i3++) {
+					_eventList2[_i3].split('.').reduce(function (part, e) {
+						_window2.default.removeEventListener(e, callback, false);
+						return e;
+					}, '');
+				}
+			}
+		}
+	}, {
+		key: 'buildposter',
+		value: function buildposter(player, controls, layers, media) {
+			var t = this,
+			    poster = _document2.default.createElement('div');
+
+			poster.className = t.options.classPrefix + 'poster ' + t.options.classPrefix + 'layer';
+			layers.appendChild(poster);
+
+			var posterUrl = media.originalNode.getAttribute('poster');
+
+			if (player.options.poster !== '' && posterUrl && _constants.IS_IOS) {
+				media.originalNode.removeAttribute('poster');
+				posterUrl = player.options.poster;
+			}
+
+			if (posterUrl) {
+				t.setPoster(posterUrl);
+			} else if (t.media.renderer !== null && typeof t.media.renderer.getPosterUrl === 'function') {
+				t.setPoster(t.media.renderer.getPosterUrl());
+			} else {
+				poster.style.display = 'none';
+			}
+
+			media.addEventListener('play', function () {
+				poster.style.display = 'none';
+			});
+
+			media.addEventListener('playing', function () {
+				poster.style.display = 'none';
+			});
+
+			if (player.options.showPosterWhenEnded && player.options.autoRewind) {
+				media.addEventListener('ended', function () {
+					poster.style.display = '';
+				});
+			}
+
+			media.addEventListener('error', function () {
+				poster.style.display = 'none';
+			});
+
+			if (player.options.showPosterWhenPaused) {
+				media.addEventListener('pause', function () {
+					if (!player.ended) {
+						poster.style.display = '';
+					}
+				});
+			}
+		}
+	}, {
+		key: 'buildoverlays',
+		value: function buildoverlays(player, controls, layers, media) {
+
+			if (!player.isVideo) {
+				return;
+			}
+
+			var t = this,
+			    loading = _document2.default.createElement('div'),
+			    error = _document2.default.createElement('div'),
+			    bigPlay = _document2.default.createElement('div'),
+			    buffer = controls.querySelector('.' + t.options.classPrefix + 'time-buffering');
+
+			loading.style.display = 'none';
+			loading.className = t.options.classPrefix + 'overlay ' + t.options.classPrefix + 'layer';
+			loading.innerHTML = '<div class="' + t.options.classPrefix + 'overlay-loading">' + ('<span class="' + t.options.classPrefix + 'overlay-loading-bg-img"></span>') + '</div>';
+			layers.appendChild(loading);
+
+			error.style.display = 'none';
+			error.className = t.options.classPrefix + 'overlay ' + t.options.classPrefix + 'layer';
+			error.innerHTML = '<div class="' + t.options.classPrefix + 'overlay-error"></div>';
+			layers.appendChild(error);
+
+			bigPlay.className = t.options.classPrefix + 'overlay ' + t.options.classPrefix + 'layer ' + t.options.classPrefix + 'overlay-play';
+			bigPlay.innerHTML = '<div class="' + t.options.classPrefix + 'overlay-button" role="button" tabindex="0" ' + ('aria-label="' + _i18n2.default.t('mejs.play') + '" aria-pressed="false"></div>');
+			bigPlay.addEventListener('click', function () {
+				if (t.options.clickToPlayPause) {
+
+					var button = t.container.querySelector('.' + t.options.classPrefix + 'overlay-button'),
+					    pressed = button.getAttribute('aria-pressed');
+
+					if (t.paused) {
+						t.play();
+					} else {
+						t.pause();
+					}
+
+					button.setAttribute('aria-pressed', !!pressed);
+					t.container.focus();
 				}
+			});
 
-			},
-			// 14: Macedonian
-			function () {
-				var args = arguments;
-				if (args[0] % 10 === 1) {
-					return args[1];
-				} else if (args[0] % 10 === 2) {
-					return args[2];
-				} else {
-					return args[3];
+			bigPlay.addEventListener('keydown', function (e) {
+				var keyPressed = e.keyCode || e.which || 0;
+
+				if (keyPressed === 13 || _constants.IS_FIREFOX && keyPressed === 32) {
+					var event = (0, _general.createEvent)('click', bigPlay);
+					bigPlay.dispatchEvent(event);
+					return false;
 				}
-			},
-			// 15:  Icelandic
-			function () {
-				var args = arguments;
-				if (args[0] !== 11 && args[0] % 10 === 1) {
-					return args[1];
-				} else {
-					return args[2];
+			});
+
+			layers.appendChild(bigPlay);
+
+			if (t.media.rendererName !== null && (/(youtube|facebook)/i.test(t.media.rendererName) && !(t.media.originalNode.getAttribute('poster') || player.options.poster || typeof t.media.renderer.getPosterUrl === 'function' && t.media.renderer.getPosterUrl()) || _constants.IS_STOCK_ANDROID || t.media.originalNode.getAttribute('autoplay'))) {
+				bigPlay.style.display = 'none';
+			}
+
+			var hasError = false;
+
+			media.addEventListener('play', function () {
+				bigPlay.style.display = 'none';
+				loading.style.display = 'none';
+				if (buffer !== null) {
+					buffer.style.display = 'none';
 				}
-			},
-			// New additions
-
-			// 16:  Kashubian
-			// Note: in https://developer.mozilla.org/en-US/docs/Mozilla/Localization/Localization_and_Plurals#List_of_Plural_Rules
-			// Breton is listed as #16 but in the Localization Guide it belongs to the group 2
-			function () {
-				var args = arguments;
-				if (args[0] === 1) {
-					return args[1];
-				} else if (args[0] % 10 >= 2 && args[0] % 10 <= 4 && (args[0] % 100 < 10 || args[0] % 100 >= 20)) {
-					return args[2];
-				} else {
-					return args[3];
+				error.style.display = 'none';
+				hasError = false;
+			});
+			media.addEventListener('playing', function () {
+				bigPlay.style.display = 'none';
+				loading.style.display = 'none';
+				if (buffer !== null) {
+					buffer.style.display = 'none';
+				}
+				error.style.display = 'none';
+				hasError = false;
+			});
+			media.addEventListener('seeking', function () {
+				bigPlay.style.display = 'none';
+				loading.style.display = '';
+				if (buffer !== null) {
+					buffer.style.display = '';
 				}
-			},
-			// 17:  Welsh
-			function () {
-				var args = arguments;
-				if (args[0] === 1) {
-					return args[1];
-				} else if (args[0] === 2) {
-					return args[2];
-				} else if (args[0] !== 8 && args[0] !== 11) {
-					return args[3];
-				} else {
-					return args[4];
+				hasError = false;
+			});
+			media.addEventListener('seeked', function () {
+				bigPlay.style.display = t.paused && !_constants.IS_STOCK_ANDROID ? '' : 'none';
+				loading.style.display = 'none';
+				if (buffer !== null) {
+					buffer.style.display = 'none';
 				}
-			},
-			// 18:  Javanese
-			function () {
-				var args = arguments;
-				if (args[0] === 0) {
-					return args[1];
-				} else {
-					return args[2];
+				hasError = false;
+			});
+			media.addEventListener('pause', function () {
+				loading.style.display = 'none';
+				if (!_constants.IS_STOCK_ANDROID && !hasError) {
+					bigPlay.style.display = '';
 				}
-			},
-			// 19:  Cornish
-			function () {
-				var args = arguments;
-				if (args[0] === 1) {
-					return args[1];
-				} else if (args[0] === 2) {
-					return args[2];
-				} else if (args[0] === 3) {
-					return args[3];
-				} else {
-					return args[4];
+				if (buffer !== null) {
+					buffer.style.display = 'none';
 				}
-			},
-			// 20:  Mandinka
-			function () {
-				var args = arguments;
-				if (args[0] === 0) {
-					return args[1];
-				} else if (args[0] === 1) {
-					return args[2];
-				} else {
-					return args[3];
+				hasError = false;
+			});
+			media.addEventListener('waiting', function () {
+				loading.style.display = '';
+				if (buffer !== null) {
+					buffer.style.display = '';
 				}
-			}
-		],
-		/**
-		 * Get specified language
-		 *
-		 */
-		getLanguage: function () {
-			var language = i18n.locale.language || i18n['default'];
-			return /^(x\-)?[a-z]{2,}(\-\w{2,})?(\-\w{2,})?$/.exec(language) ? language : i18n['default'];
-		},
+				hasError = false;
+			});
 
-		/**
-		 * Translate a string to a specified language, including optionally a number to pluralize translation
-		 *
-		 * @param {String} message
-		 * @param {Number} pluralParam
-		 * @return {String}
-		 */
-		t: function (message, pluralParam) {
-
-			if (typeof message === 'string' && message.length) {
-
-				var
-					language = i18n.getLanguage(),
-					str,
-					pluralForm,
-					/**
-					 * Modify string using algorithm to detect plural forms.
-					 *
-					 * @private
-					 * @see http://stackoverflow.com/questions/1353408/messageformat-in-javascript-parameters-in-localized-ui-strings
-					 * @param {String|String[]} input   - String or array of strings to pick the plural form
-					 * @param {Number} number           - Number to determine the proper plural form
-					 * @param {Number} form             - Number of language family to apply plural form
-					 * @return {String}
-					 */
-					plural = function (input, number, form) {
-
-						if (typeof input !== 'object' || typeof number !== 'number' || typeof form !== 'number') {
-							return input;
-						}
+			media.addEventListener('loadeddata', function () {
+				loading.style.display = '';
+				if (buffer !== null) {
+					buffer.style.display = '';
+				}
 
-						if (typeof input === 'string') {
-							return input;
+				if (_constants.IS_ANDROID) {
+					media.canplayTimeout = setTimeout(function () {
+						if (_document2.default.createEvent) {
+							var evt = _document2.default.createEvent('HTMLEvents');
+							evt.initEvent('canplay', true, true);
+							return media.dispatchEvent(evt);
 						}
+					}, 300);
+				}
+				hasError = false;
+			});
+			media.addEventListener('canplay', function () {
+				loading.style.display = 'none';
+				if (buffer !== null) {
+					buffer.style.display = 'none';
+				}
 
-						// Perform plural form or return original text
-						return i18n.pluralForms[form].apply(null, [number].concat(input));
-					},
-					/**
-					 *
-					 * @param {String} input
-					 * @return {String}
-					 */
-					escapeHTML = function (input) {
-						var map = {
-							'&': '&amp;',
-							'<': '&lt;',
-							'>': '&gt;',
-							'"': '&quot;'
-						};
+				clearTimeout(media.canplayTimeout);
+				hasError = false;
+			});
 
-						return input.replace(/[&<>"]/g, function(c) {
-							return map[c];
-						});
-					}
-				;
-
-				// Fetch the localized version of the string
-				if (i18n.locale.strings && i18n.locale.strings[language]) {
-					str = i18n.locale.strings[language][message];
-					if (typeof pluralParam === 'number') {
-						pluralForm = i18n.locale.strings[language]['mejs.plural-form'];
-						str = plural.apply(null, [str, pluralParam, pluralForm]);
-					}
+			media.addEventListener('error', function (e) {
+				t._handleError(e, t.media, t.node);
+				loading.style.display = 'none';
+				bigPlay.style.display = 'none';
+				if (buffer !== null) {
+					buffer.style.display = 'none';
 				}
+				hasError = true;
+			});
 
-				// Fallback to default language if requested uid is not translated
-				if (!str && i18n.locale.strings && i18n.locale.strings[i18n['default']]) {
-					str = i18n.locale.strings[i18n['default']][message];
-					if (typeof pluralParam === 'number') {
-						pluralForm = i18n.locale.strings[i18n['default']]['mejs.plural-form'];
-						str = plural.apply(null, [str, pluralParam, pluralForm]);
+			media.addEventListener('keydown', function (e) {
+				t.onkeydown(player, media, e);
+				hasError = false;
+			});
+		}
+	}, {
+		key: 'buildkeyboard',
+		value: function buildkeyboard(player, controls, layers, media) {
 
-					}
-				}
+			var t = this;
 
-				// As a last resort, use the requested uid, to mimic original behavior of i18n utils (in which uid was the english text)
-				str = str || message;
+			t.container.addEventListener('keydown', function () {
+				t.keyboardAction = true;
+			});
 
-				// Replace token
-				if (typeof pluralParam === 'number') {
-					str = str.replace('%1', pluralParam);
-				}
+			t.globalKeydownCallback = function (event) {
+				var container = _document2.default.activeElement.closest('.' + t.options.classPrefix + 'container'),
+				    target = t.media.closest('.' + t.options.classPrefix + 'container');
+				t.hasFocus = !!(container && target && container.id === target.id);
+				return t.onkeydown(player, media, event);
+			};
 
-				return escapeHTML(str);
+			t.globalClickCallback = function (event) {
+				t.hasFocus = !!event.target.closest('.' + t.options.classPrefix + 'container');
+			};
 
-			}
+			t.globalBind('keydown', t.globalKeydownCallback);
 
-			return message;
+			t.globalBind('click', t.globalClickCallback);
 		}
+	}, {
+		key: 'onkeydown',
+		value: function onkeydown(player, media, e) {
 
-	};
+			if (player.hasFocus && player.options.enableKeyboard) {
+				for (var i = 0, total = player.options.keyActions.length; i < total; i++) {
+					var keyAction = player.options.keyActions[i];
 
-	// i18n fixes for compatibility with WordPress
-	if (typeof mejsL10n !== 'undefined') {
-		i18n.locale.language = mejsL10n.language;
-	}
+					for (var j = 0, jl = keyAction.keys.length; j < jl; j++) {
+						if (e.keyCode === keyAction.keys[j]) {
+							keyAction.action(player, media, e.keyCode, e);
+							e.preventDefault();
+							e.stopPropagation();
+						}
+					}
+				}
+			}
 
-	// Register variable
-	mejs.i18n = i18n;
+			return true;
+		}
+	}, {
+		key: 'play',
+		value: function play() {
+			this.proxy.play();
+		}
+	}, {
+		key: 'pause',
+		value: function pause() {
+			this.proxy.pause();
+		}
+	}, {
+		key: 'load',
+		value: function load() {
+			this.proxy.load();
+		}
+	}, {
+		key: 'setCurrentTime',
+		value: function setCurrentTime(time) {
+			this.proxy.setCurrentTime(time);
+		}
+	}, {
+		key: 'getCurrentTime',
+		value: function getCurrentTime() {
+			return this.proxy.currentTime;
+		}
+	}, {
+		key: 'getDuration',
+		value: function getDuration() {
+			return this.proxy.duration;
+		}
+	}, {
+		key: 'setVolume',
+		value: function setVolume(volume) {
+			this.proxy.volume = volume;
+		}
+	}, {
+		key: 'getVolume',
+		value: function getVolume() {
+			return this.proxy.getVolume();
+		}
+	}, {
+		key: 'setMuted',
+		value: function setMuted(value) {
+			this.proxy.setMuted(value);
+		}
+	}, {
+		key: 'setSrc',
+		value: function setSrc(src) {
+			if (!this.controlsEnabled) {
+				this.enableControls();
+			}
+			this.proxy.setSrc(src);
+		}
+	}, {
+		key: 'getSrc',
+		value: function getSrc() {
+			return this.proxy.getSrc();
+		}
+	}, {
+		key: 'canPlayType',
+		value: function canPlayType(type) {
+			return this.proxy.canPlayType(type);
+		}
+	}, {
+		key: 'remove',
+		value: function remove() {
+			var t = this,
+			    rendererName = t.media.rendererName,
+			    src = t.media.originalNode.src;
 
+			for (var featureIndex in t.options.features) {
+				var feature = t.options.features[featureIndex];
+				if (t['clean' + feature]) {
+					try {
+						t['clean' + feature](t, t.layers, t.controls, t.media);
+					} catch (e) {
+						console.error('error cleaning ' + feature, e);
+					}
+				}
+			}
 
-}(document, window, mejs));
+			var nativeWidth = t.node.getAttribute('width'),
+			    nativeHeight = t.node.getAttribute('height');
 
-// i18n fixes for compatibility with WordPress
-;(function (mejs, undefined) {
+			if (nativeWidth) {
+				if (nativeWidth.indexOf('%') === -1) {
+					nativeWidth = nativeWidth + 'px';
+				}
+			} else {
+				nativeWidth = 'auto';
+			}
 
-	"use strict";
+			if (nativeHeight) {
+				if (nativeHeight.indexOf('%') === -1) {
+					nativeHeight = nativeHeight + 'px';
+				}
+			} else {
+				nativeHeight = 'auto';
+			}
 
-	if (typeof mejsL10n !== 'undefined') {
-		mejs[mejsL10n.language] = mejsL10n.strings;
-	}
+			t.node.style.width = nativeWidth;
+			t.node.style.height = nativeHeight;
 
-}(mejs.i18n.locale.strings));
-/*!
- * This is a i18n.locale language object.
- *
- * English; This can serve as a template for other languages to translate
- *
- * @author
- *   TBD
- *   Sascha Greuel (Twitter: @SoftCreatR)
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.en === undefined) {
-        exports.en = {
-            "mejs.plural-form": 1,
-
-            // me-shim
-            "mejs.download-file": "Download File",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "Turn off Fullscreen",
-            "mejs.fullscreen-on": "Go Fullscreen",
-            "mejs.download-video": "Download Video",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "Fullscreen",
-
-            // mep-feature-jumpforward
-            "mejs.time-jump-forward": ["Jump forward 1 second", "Jump forward %1 seconds"],
-
-            // mep-feature-playpause
-            "mejs.play": "Play",
-            "mejs.pause": "Pause",
-
-            // mep-feature-postroll
-            "mejs.close": "Close",
-
-            // mep-feature-progress
-            "mejs.time-slider": "Time Slider",
-            "mejs.time-help-text": "Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": ["Skip back 1 second", "Skip back %1 seconds"],
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "Captions/Subtitles",
-            "mejs.none": "None",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "Mute Toggle",
-            "mejs.volume-help-text": "Use Up/Down Arrow keys to increase or decrease volume.",
-            "mejs.unmute": "Unmute",
-            "mejs.mute": "Mute",
-            "mejs.volume-slider": "Volume Slider",
-
-            // mep-player
-            "mejs.video-player": "Video Player",
-            "mejs.audio-player": "Audio Player",
-
-            // mep-feature-ads
-            "mejs.ad-skip": "Skip ad",
-            "mejs.ad-skip-info": ["Skip in 1 second", "Skip in %1 seconds"],
-
-            // mep-feature-sourcechooser
-            "mejs.source-chooser": "Source Chooser"
-        };
-    }
-}(mejs.i18n.locale.strings));
+			if (!t.isDynamic) {
+				(function () {
+					t.node.setAttribute('controls', true);
+					t.node.setAttribute('id', t.node.getAttribute('id').replace('_' + rendererName, '').replace('_from_mejs', ''));
+					var poster = t.container.querySelector('.' + t.options.classPrefix + 'poster>img');
+					if (poster) {
+						t.node.setAttribute('poster', poster.src);
+					}
 
-/*!
- *
- * MediaElementPlayer
- * http://mediaelementjs.com/
- *
- * Creates a controller bar for HTML5 <video> add <audio> tags
- * using jQuery and MediaElement.js (HTML5 Flash/Silverlight wrapper)
- *
- * Copyright 2010-2013, John Dyer (http://j.hn/)
- * License: MIT
- *
- */
-if (typeof jQuery != 'undefined') {
-	mejs.$ = jQuery;
-} else if (typeof Zepto != 'undefined') {
-	mejs.$ = Zepto;
-
-	// define `outerWidth` method which has not been realized in Zepto
-	Zepto.fn.outerWidth = function(includeMargin) {
-		var width = $(this).width();
-		if (includeMargin) {
-			width += parseInt($(this).css('margin-right'), 10);
-			width += parseInt($(this).css('margin-left'), 10);
-		}
-		return width
-	}
+					delete t.node.autoplay;
 
-} else if (typeof ender != 'undefined') {
-	mejs.$ = ender;
-}
-(function ($) {
+					if (t.media.canPlayType((0, _media.getTypeFromFile)(src)) !== '') {
+						t.node.setAttribute('src', src);
+					}
 
-	// default player values
-	mejs.MepDefaults = {
-		// url to poster (to fix iOS 3.x)
-		poster: '',
-		// When the video is ended, we can show the poster.
-		showPosterWhenEnded: false,
-		// default if the <video width> is not specified
-		defaultVideoWidth: 480,
-		// default if the <video height> is not specified
-		defaultVideoHeight: 270,
-		// if set, overrides <video width>
-		videoWidth: -1,
-		// if set, overrides <video height>
-		videoHeight: -1,
-		// default if the user doesn't specify
-		defaultAudioWidth: 400,
-		// default if the user doesn't specify
-		defaultAudioHeight: 30,
-		// default amount to move back when back key is pressed
-		defaultSeekBackwardInterval: function(media) {
-			return (media.duration * 0.05);
-		},
-		// default amount to move forward when forward key is pressed
-		defaultSeekForwardInterval: function(media) {
-			return (media.duration * 0.05);
-		},
-		// set dimensions via JS instead of CSS
-		setDimensions: true,
-		// width of audio player
-		audioWidth: -1,
-		// height of audio player
-		audioHeight: -1,
-		// initial volume when the player starts (overrided by user cookie)
-		startVolume: 0.8,
-		// useful for <audio> player loops
-		loop: false,
-		// rewind to beginning when media ends
-		autoRewind: true,
-		// resize to media dimensions
-		enableAutosize: true,
-		/*
-		 * Time format to use. Default: 'mm:ss'
-		 * Supported units:
-		 *   h: hour
-		 *   m: minute
-		 *   s: second
-		 *   f: frame count
-		 * When using 'hh', 'mm', 'ss' or 'ff' we always display 2 digits.
-		 * If you use 'h', 'm', 's' or 'f' we display 1 digit if possible.
-		 *
-		 * Example to display 75 seconds:
-		 * Format 'mm:ss': 01:15
-		 * Format 'm:ss': 1:15
-		 * Format 'm:s': 1:15
-		 */
-		timeFormat: '',
-		// forces the hour marker (##:00:00)
-		alwaysShowHours: false,
-		// show framecount in timecode (##:00:00:00)
-		showTimecodeFrameCount: false,
-		// used when showTimecodeFrameCount is set to true
-		framesPerSecond: 25,
-		// automatically calculate the width of the progress bar based on the sizes of other elements
-		autosizeProgress : true,
-		// Hide controls when playing and mouse is not over the video
-		alwaysShowControls: false,
-		// Display the video control
-		hideVideoControlsOnLoad: false,
-		// Enable click video element to toggle play/pause
-		clickToPlayPause: true,
-		// Time in ms to hide controls
-		controlsTimeoutDefault: 1500,
-		// Time in ms to trigger the timer when mouse moves
-		controlsTimeoutMouseEnter: 2500,
-		// Time in ms to trigger the timer when mouse leaves
-		controlsTimeoutMouseLeave: 1000,
-		// force iPad's native controls
-		iPadUseNativeControls: false,
-		// force iPhone's native controls
-		iPhoneUseNativeControls: false,
-		// force Android's native controls
-		AndroidUseNativeControls: false,
-		// features to show
-		features: ['playpause','current','progress','duration','tracks','volume','fullscreen'],
-		// only for dynamic
-		isVideo: true,
-		// stretching modes (auto, fill, responsive, none)
-		stretching: 'auto',
-		// turns keyboard support on and off for this instance
-		enableKeyboard: true,
-		// when this player starts, it will pause other players
-		pauseOtherPlayers: true,
-		// array of keyboard actions such as play pause
-		keyActions: [
-				{
-						keys: [
-								32, // SPACE
-								179 // GOOGLE play/pause button
-								 ],
-						action: function(player, media, key, event) {
-
-							if (!mejs.MediaFeatures.isFirefox) {
-								if (media.paused || media.ended) {
-									media.play();
-								} else {
-									media.pause();
-								}
-							}
-						}
-				},
-				{
-						keys: [38], // UP
-						action: function(player, media, key, event) {
-								player.container.find('.mejs-volume-slider').css('display','block');
-								if (player.isVideo) {
-										player.showControls();
-										player.startControlsTimer();
-								}
+					if (~rendererName.indexOf('iframe')) {
+						var layer = _document2.default.getElementById(t.media.id + '-iframe-overlay');
+						layer.remove();
+					}
 
-								var newVolume = Math.min(media.volume + 0.1, 1);
-								media.setVolume(newVolume);
+					var node = t.node.cloneNode();
+					node.style.display = '';
+					t.container.parentNode.insertBefore(node, t.container);
+					t.node.remove();
+
+					if (t.mediaFiles) {
+						for (var i = 0, total = t.mediaFiles.length; i < total; i++) {
+							var source = _document2.default.createElement('source');
+							source.setAttribute('src', t.mediaFiles[i].src);
+							source.setAttribute('type', t.mediaFiles[i].type);
+							node.appendChild(source);
 						}
-				},
-				{
-						keys: [40], // DOWN
-						action: function(player, media, key, event) {
-								player.container.find('.mejs-volume-slider').css('display','block');
-								if (player.isVideo) {
-										player.showControls();
-										player.startControlsTimer();
-								}
+					}
+					if (t.trackFiles) {
+						var _loop3 = function _loop3(_i4, _total4) {
+							var track = t.trackFiles[_i4];
+							var newTrack = _document2.default.createElement('track');
+							newTrack.kind = track.kind;
+							newTrack.label = track.label;
+							newTrack.srclang = track.srclang;
+							newTrack.src = track.src;
+
+							node.appendChild(newTrack);
+							newTrack.addEventListener('load', function () {
+								this.mode = 'showing';
+								node.textTracks[_i4].mode = 'showing';
+							});
+						};
 
-								var newVolume = Math.max(media.volume - 0.1, 0);
-								media.setVolume(newVolume);
-						}
-				},
-				{
-						keys: [
-								37, // LEFT
-								227 // Google TV rewind
-						],
-						action: function(player, media, key, event) {
-								if (!isNaN(media.duration) && media.duration > 0) {
-										if (player.isVideo) {
-												player.showControls();
-												player.startControlsTimer();
-										}
-
-										// 5%
-										var newTime = Math.max(media.currentTime - player.options.defaultSeekBackwardInterval(media), 0);
-										media.setCurrentTime(newTime);
-								}
-						}
-				},
-				{
-						keys: [
-								39, // RIGHT
-								228 // Google TV forward
-						],
-						action: function(player, media, key, event) {
-								if (!isNaN(media.duration) && media.duration > 0) {
-										if (player.isVideo) {
-												player.showControls();
-												player.startControlsTimer();
-										}
-
-										// 5%
-										var newTime = Math.min(media.currentTime + player.options.defaultSeekForwardInterval(media), media.duration);
-										media.setCurrentTime(newTime);
-								}
-						}
-				},
-				{
-						keys: [70], // F
-						action: function(player, media, key, event) {
-								if (typeof player.enterFullScreen != 'undefined') {
-										if (player.isFullScreen) {
-												player.exitFullScreen();
-										} else {
-												player.enterFullScreen();
-										}
-								}
-						}
-				},
-				{
-						keys: [77], // M
-						action: function(player, media, key, event) {
-								player.container.find('.mejs-volume-slider').css('display','block');
-								if (player.isVideo) {
-										player.showControls();
-										player.startControlsTimer();
-								}
-								if (player.media.muted) {
-										player.setMuted(false);
-								} else {
-										player.setMuted(true);
-								}
+						for (var _i4 = 0, _total4 = t.trackFiles.length; _i4 < _total4; _i4++) {
+							_loop3(_i4, _total4);
 						}
-				}
-		]
-	};
+					}
+
+					delete t.node;
+					delete t.mediaFiles;
+					delete t.trackFiles;
+				})();
+			} else {
+				t.container.parentNode.insertBefore(t.node, t.container);
+			}
+
+			if (typeof t.media.renderer.destroy === 'function') {
+				t.media.renderer.destroy();
+			}
 
-	mejs.mepIndex = 0;
+			delete _mejs2.default.players[t.id];
 
-	mejs.players = {};
+			if (_typeof(t.container) === 'object') {
+				var offscreen = t.container.parentNode.querySelector('.' + t.options.classPrefix + 'offscreen');
+				offscreen.remove();
+				t.container.remove();
+			}
+			t.globalUnbind('resize', t.globalResizeCallback);
+			t.globalUnbind('keydown', t.globalKeydownCallback);
+			t.globalUnbind('click', t.globalClickCallback);
 
-	// wraps a MediaElement object in player controls
-	mejs.MediaElementPlayer = function(node, o) {
-		// enforce object, even without "new" (via John Resig)
-		if ( !(this instanceof mejs.MediaElementPlayer) ) {
-			return new mejs.MediaElementPlayer(node, o);
+			delete t.media.player;
+		}
+	}, {
+		key: 'paused',
+		get: function get() {
+			return this.proxy.paused;
+		}
+	}, {
+		key: 'muted',
+		get: function get() {
+			return this.proxy.muted;
+		},
+		set: function set(muted) {
+			this.setMuted(muted);
+		}
+	}, {
+		key: 'ended',
+		get: function get() {
+			return this.proxy.ended;
+		}
+	}, {
+		key: 'readyState',
+		get: function get() {
+			return this.proxy.readyState;
 		}
+	}, {
+		key: 'currentTime',
+		set: function set(time) {
+			this.setCurrentTime(time);
+		},
+		get: function get() {
+			return this.getCurrentTime();
+		}
+	}, {
+		key: 'duration',
+		get: function get() {
+			return this.getDuration();
+		}
+	}, {
+		key: 'volume',
+		set: function set(volume) {
+			this.setVolume(volume);
+		},
+		get: function get() {
+			return this.getVolume();
+		}
+	}, {
+		key: 'src',
+		set: function set(src) {
+			this.setSrc(src);
+		},
+		get: function get() {
+			return this.getSrc();
+		}
+	}]);
 
-		var t = this;
+	return MediaElementPlayer;
+}();
 
-		// these will be reset after the MediaElement.success fires
-		t.$media = t.$node = $(node);
-		t.node = t.media = t.$media[0];
+_window2.default.MediaElementPlayer = MediaElementPlayer;
 
-		if(!t.node) {
-			return;
-		}
+exports.default = MediaElementPlayer;
 
-		// check for existing player
-		if (typeof t.node.player != 'undefined') {
-			return t.node.player;
-		}
+},{"17":17,"2":2,"25":25,"26":26,"27":27,"28":28,"3":3,"30":30,"5":5,"6":6,"7":7}],17:[function(_dereq_,module,exports){
+'use strict';
 
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
 
-		// try to get options from data-mejsoptions
-		if (typeof o == 'undefined') {
-			o = t.$node.data('mejsoptions');
-		}
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
 
-		// extend default options
-		t.options = $.extend({},mejs.MepDefaults,o);
+var _window = _dereq_(3);
 
-		if (!t.options.timeFormat) {
-			// Generate the time format according to options
-			t.options.timeFormat = 'mm:ss';
-			if (t.options.alwaysShowHours) {
-				t.options.timeFormat = 'hh:mm:ss';
-			}
-			if (t.options.showTimecodeFrameCount) {
-				t.options.timeFormat += ':ff';
-			}
-		}
+var _window2 = _interopRequireDefault(_window);
 
-		mejs.Utility.calculateTimeFormat(0, t.options, t.options.framesPerSecond || 25);
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-		// unique ID
-		t.id = 'mep_' + mejs.mepIndex++;
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 
-		// add to player array (for focus events)
-		mejs.players[t.id] = t;
+var DefaultPlayer = function () {
+	function DefaultPlayer(player) {
+		_classCallCheck(this, DefaultPlayer);
+
+		this.media = player.media;
+		this.isVideo = player.isVideo;
+		this.classPrefix = player.options.classPrefix;
+		this.createIframeLayer = function () {
+			return player.createIframeLayer();
+		};
+		this.setPoster = function (url) {
+			return player.setPoster(url);
+		};
+		return this;
+	}
 
-		// start up
-		t.init();
+	_createClass(DefaultPlayer, [{
+		key: 'play',
+		value: function play() {
+			this.media.play();
+		}
+	}, {
+		key: 'pause',
+		value: function pause() {
+			this.media.pause();
+		}
+	}, {
+		key: 'load',
+		value: function load() {
+			var t = this;
 
-		return t;
-	};
+			if (!t.isLoaded) {
+				t.media.load();
+			}
 
-	// actual player
-	mejs.MediaElementPlayer.prototype = {
+			t.isLoaded = true;
+		}
+	}, {
+		key: 'setCurrentTime',
+		value: function setCurrentTime(time) {
+			this.media.setCurrentTime(time);
+		}
+	}, {
+		key: 'getCurrentTime',
+		value: function getCurrentTime() {
+			return this.media.currentTime;
+		}
+	}, {
+		key: 'getDuration',
+		value: function getDuration() {
+			return this.media.getDuration();
+		}
+	}, {
+		key: 'setVolume',
+		value: function setVolume(volume) {
+			this.media.setVolume(volume);
+		}
+	}, {
+		key: 'getVolume',
+		value: function getVolume() {
+			return this.media.getVolume();
+		}
+	}, {
+		key: 'setMuted',
+		value: function setMuted(value) {
+			this.media.setMuted(value);
+		}
+	}, {
+		key: 'setSrc',
+		value: function setSrc(src) {
+			var t = this,
+			    layer = document.getElementById(t.media.id + '-iframe-overlay');
 
-		hasFocus: false,
+			if (layer) {
+				layer.remove();
+			}
 
-		controlsAreVisible: true,
+			t.media.setSrc(src);
+			t.createIframeLayer();
+			if (t.media.renderer !== null && typeof t.media.renderer.getPosterUrl === 'function') {
+				t.setPoster(t.media.renderer.getPosterUrl());
+			}
+		}
+	}, {
+		key: 'getSrc',
+		value: function getSrc() {
+			return this.media.getSrc();
+		}
+	}, {
+		key: 'canPlayType',
+		value: function canPlayType(type) {
+			return this.media.canPlayType(type);
+		}
+	}, {
+		key: 'paused',
+		get: function get() {
+			return this.media.paused;
+		}
+	}, {
+		key: 'muted',
+		set: function set(muted) {
+			this.setMuted(muted);
+		},
+		get: function get() {
+			return this.media.muted;
+		}
+	}, {
+		key: 'ended',
+		get: function get() {
+			return this.media.ended;
+		}
+	}, {
+		key: 'readyState',
+		get: function get() {
+			return this.media.readyState;
+		}
+	}, {
+		key: 'currentTime',
+		set: function set(time) {
+			this.setCurrentTime(time);
+		},
+		get: function get() {
+			return this.getCurrentTime();
+		}
+	}, {
+		key: 'duration',
+		get: function get() {
+			return this.getDuration();
+		}
+	}, {
+		key: 'volume',
+		set: function set(volume) {
+			this.setVolume(volume);
+		},
+		get: function get() {
+			return this.getVolume();
+		}
+	}, {
+		key: 'src',
+		set: function set(src) {
+			this.setSrc(src);
+		},
+		get: function get() {
+			return this.getSrc();
+		}
+	}]);
 
-		init: function() {
+	return DefaultPlayer;
+}();
 
-			var
-				t = this,
-				mf = mejs.MediaFeatures,
-				// options for MediaElement (shim)
-				meOptions = $.extend(true, {}, t.options, {
-					success: function(media, domNode) { t.meReady(media, domNode); },
-					error: function(e) { t.handleError(e);}
-				}),
-				tagName = t.media.tagName.toLowerCase();
+exports.default = DefaultPlayer;
 
-			t.isDynamic = (tagName !== 'audio' && tagName !== 'video');
 
-			if (t.isDynamic) {
-				// get video from src or href?
-				t.isVideo = t.options.isVideo;
-			} else {
-				t.isVideo = (tagName !== 'audio' && t.options.isVideo);
-			}
-
-			// use native controls in iPad, iPhone, and Android
-			if ((mf.isiPad && t.options.iPadUseNativeControls) || (mf.isiPhone && t.options.iPhoneUseNativeControls)) {
-
-				// add controls and stop
-				t.$media.attr('controls', 'controls');
-
-				// attempt to fix iOS 3 bug
-				//t.$media.removeAttr('poster');
-								// no Issue found on iOS3 -ttroxell
-
-				// override Apple's autoplay override for iPads
-				if (mf.isiPad && t.media.getAttribute('autoplay') !== null) {
-					t.play();
-				}
-
-			} else if (mf.isAndroid && t.options.AndroidUseNativeControls) {
-
-				// leave default player
-
-			} else if (t.isVideo || (!t.isVideo && t.options.features.length)) {
-
-				// DESKTOP: use MediaElementPlayer controls
-
-				// remove native controls
-				t.$media.removeAttr('controls');
-				var videoPlayerTitle = t.isVideo ?
-					mejs.i18n.t('mejs.video-player') : mejs.i18n.t('mejs.audio-player');
-				// insert description for screen readers
-				$('<span class="mejs-offscreen">' + videoPlayerTitle + '</span>').insertBefore(t.$media);
-				// build container
-				t.container =
-					$('<div id="' + t.id + '" class="mejs-container ' + (mejs.MediaFeatures.svgAsImg ? 'svg' : 'no-svg') +
-					  '" tabindex="0" role="application" aria-label="' + videoPlayerTitle + '">'+
-						'<div class="mejs-inner">'+
-							'<div class="mejs-mediaelement"></div>'+
-							'<div class="mejs-layers"></div>'+
-							'<div class="mejs-controls"></div>'+
-							'<div class="mejs-clear"></div>'+
-						'</div>' +
-					'</div>')
-					.addClass(t.$media[0].className)
-					.insertBefore(t.$media)
-					.focus(function ( e ) {
-						if( !t.controlsAreVisible && !t.hasFocus && t.controlsEnabled) {
-							t.showControls(true);
-							// In versions older than IE11, the focus causes the playbar to be displayed
-							// if user clicks on the Play/Pause button in the control bar once it attempts
-							// to hide it
-							if (!t.hasMsNativeFullScreen) {
-								// If e.relatedTarget appears before container, send focus to play button,
-								// else send focus to last control button.
-								var btnSelector = '.mejs-playpause-button > button';
-
-								if (mejs.Utility.isNodeAfter(e.relatedTarget, t.container[0])) {
-									btnSelector = '.mejs-controls .mejs-button:last-child > button';
-								}
+_window2.default.DefaultPlayer = DefaultPlayer;
 
-								var button = t.container.find(btnSelector);
-								button.focus();
-							}
-						}
-					});
+},{"3":3}],18:[function(_dereq_,module,exports){
+'use strict';
 
-				// When no elements in controls, hide bar completely
-				if (!t.options.features.length) {
-					t.container.css('background', 'transparent').find('.mejs-controls').hide();
-				}
- 
-				if (t.isVideo && t.options.stretching === 'fill' && !t.container.parent('mejs-fill-container').length) {
-					// outer container
-					t.outerContainer = t.$media.parent();
-					t.container.wrap('<div class="mejs-fill-container"/>');
-				}
+var _window = _dereq_(3);
+
+var _window2 = _interopRequireDefault(_window);
 
-				// add classes for user and content
-				t.container.addClass(
-					(mf.isAndroid ? 'mejs-android ' : '') +
-					(mf.isiOS ? 'mejs-ios ' : '') +
-					(mf.isiPad ? 'mejs-ipad ' : '') +
-					(mf.isiPhone ? 'mejs-iphone ' : '') +
-					(t.isVideo ? 'mejs-video ' : 'mejs-audio ')
-				);
+var _mejs = _dereq_(7);
 
+var _mejs2 = _interopRequireDefault(_mejs);
 
-				// move the <video/video> tag into the right spot
-				t.container.find('.mejs-mediaelement').append(t.$media);
+var _player = _dereq_(16);
 
-				// needs to be assigned here, after iOS remap
-				t.node.player = t;
+var _player2 = _interopRequireDefault(_player);
 
-				// find parts
-				t.controls = t.container.find('.mejs-controls');
-				t.layers = t.container.find('.mejs-layers');
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-				// determine the size
+if (typeof jQuery !== 'undefined') {
+	_mejs2.default.$ = _window2.default.jQuery = _window2.default.$ = jQuery;
+} else if (typeof Zepto !== 'undefined') {
+	_mejs2.default.$ = _window2.default.Zepto = _window2.default.$ = Zepto;
+} else if (typeof ender !== 'undefined') {
+	_mejs2.default.$ = _window2.default.ender = _window2.default.$ = ender;
+}
 
-				/* size priority:
-					(1) videoWidth (forced),
-					(2) style="width;height;"
-					(3) width attribute,
-					(4) defaultVideoWidth (for unspecified cases)
-				*/
+(function ($) {
+	if (typeof $ !== 'undefined') {
+		$.fn.mediaelementplayer = function (options) {
+			if (options === false) {
+				this.each(function () {
+					var player = $(this).data('mediaelementplayer');
+					if (player) {
+						player.remove();
+					}
+					$(this).removeData('mediaelementplayer');
+				});
+			} else {
+				this.each(function () {
+					$(this).data('mediaelementplayer', new _player2.default(this, options));
+				});
+			}
+			return this;
+		};
 
-				var tagType = (t.isVideo ? 'video' : 'audio'),
-					capsTagName = tagType.substring(0,1).toUpperCase() + tagType.substring(1);
+		$(document).ready(function () {
+			$('.' + _mejs2.default.MepDefaults.classPrefix + 'player').mediaelementplayer();
+		});
+	}
+})(_mejs2.default.$);
 
+},{"16":16,"3":3,"7":7}],19:[function(_dereq_,module,exports){
+'use strict';
 
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
 
-				if (t.options[tagType + 'Width'] > 0 || t.options[tagType + 'Width'].toString().indexOf('%') > -1) {
-					t.width = t.options[tagType + 'Width'];
-				} else if (t.media.style.width !== '' && t.media.style.width !== null) {
-					t.width = t.media.style.width;
-				} else if (t.media.getAttribute('width') !== null) {
-					t.width = t.$media.attr('width');
-				} else {
-					t.width = t.options['default' + capsTagName + 'Width'];
-				}
+var _window = _dereq_(3);
 
-				if (t.options[tagType + 'Height'] > 0 || t.options[tagType + 'Height'].toString().indexOf('%') > -1) {
-					t.height = t.options[tagType + 'Height'];
-				} else if (t.media.style.height !== '' && t.media.style.height !== null) {
-					t.height = t.media.style.height;
-				} else if (t.$media[0].getAttribute('height') !== null) {
-					t.height = t.$media.attr('height');
-				} else {
-					t.height = t.options['default' + capsTagName + 'Height'];
-				}
+var _window2 = _interopRequireDefault(_window);
 
-				// set the size, while we wait for the plugins to load below
-				t.setPlayerSize(t.width, t.height);
+var _mejs = _dereq_(7);
 
-				// create MediaElementShim
-				meOptions.pluginWidth = t.width;
-				meOptions.pluginHeight = t.height;
-			}
-			// Hide media completely for audio that doesn't have any features
-			else if (!t.isVideo && !t.options.features.length) {
-				t.$media.hide();
-			}
+var _mejs2 = _interopRequireDefault(_mejs);
 
-			// create MediaElement shim
-			mejs.MediaElement(t.$media[0], meOptions);
+var _renderer = _dereq_(8);
 
-			if (typeof(t.container) !== 'undefined' && t.options.features.length && t.controlsAreVisible) {
-				// controls are shown when loaded
-				t.container.trigger('controlsshown');
-			}
-		},
+var _general = _dereq_(27);
 
-		showControls: function(doAnimation) {
-			var t = this;
+var _media = _dereq_(28);
 
-			doAnimation = typeof doAnimation == 'undefined' || doAnimation;
+var _constants = _dereq_(25);
 
-			if (t.controlsAreVisible)
-				return;
+var _dom = _dereq_(26);
 
-			if (doAnimation) {
-				t.controls
-					.removeClass('mejs-offscreen')
-					.stop(true, true).fadeIn(200, function() {
-						t.controlsAreVisible = true;
-						t.container.trigger('controlsshown');
-					});
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-				// any additional controls people might add and want to hide
-				t.container.find('.mejs-control')
-					.removeClass('mejs-offscreen')
-					.stop(true, true).fadeIn(200, function() {t.controlsAreVisible = true;});
+var NativeDash = {
 
-			} else {
-				t.controls
-					.removeClass('mejs-offscreen')
-					.css('display','block');
+	promise: null,
 
-				// any additional controls people might add and want to hide
-				t.container.find('.mejs-control')
-					.removeClass('mejs-offscreen')
-					.css('display','block');
+	load: function load(settings) {
+		if (typeof dashjs !== 'undefined') {
+			NativeDash.promise = new Promise(function (resolve) {
+				resolve();
+			}).then(function () {
+				NativeDash._createPlayer(settings);
+			});
+		} else {
+			settings.options.path = typeof settings.options.path === 'string' ? settings.options.path : 'https://cdn.dashjs.org/latest/dash.all.min.js';
 
-				t.controlsAreVisible = true;
-				t.container.trigger('controlsshown');
-			}
+			NativeDash.promise = NativeDash.promise || (0, _dom.loadScript)(settings.options.path);
+			NativeDash.promise.then(function () {
+				NativeDash._createPlayer(settings);
+			});
+		}
 
-			t.setControlsSize();
+		return NativeDash.promise;
+	},
 
-		},
+	_createPlayer: function _createPlayer(settings) {
+		var player = dashjs.MediaPlayer().create();
+		_window2.default['__ready__' + settings.id](player);
+		return player;
+	}
+};
 
-		hideControls: function(doAnimation) {
-			var t = this;
+var DashNativeRenderer = {
+	name: 'native_dash',
+	options: {
+		prefix: 'native_dash',
+		dash: {
+			path: 'https://cdn.dashjs.org/latest/dash.all.min.js',
+			debug: false,
+			drm: {},
 
-			doAnimation = typeof doAnimation == 'undefined' || doAnimation;
+			robustnessLevel: ''
+		}
+	},
 
-			if (!t.controlsAreVisible || t.options.alwaysShowControls || t.keyboardAction || t.media.paused || t.media.ended)
-				return;
+	canPlayType: function canPlayType(type) {
+		return _constants.HAS_MSE && ['application/dash+xml'].indexOf(type.toLowerCase()) > -1;
+	},
 
-			if (doAnimation) {
-				// fade out main controls
-				t.controls.stop(true, true).fadeOut(200, function() {
-					$(this)
-						.addClass('mejs-offscreen')
-						.css('display','block');
-
-					t.controlsAreVisible = false;
-					t.container.trigger('controlshidden');
-				});
+	create: function create(mediaElement, options, mediaFiles) {
 
-				// any additional controls people might add and want to hide
-				t.container.find('.mejs-control').stop(true, true).fadeOut(200, function() {
-					$(this)
-						.addClass('mejs-offscreen')
-						.css('display','block');
-				});
-			} else {
+		var originalNode = mediaElement.originalNode,
+		    id = mediaElement.id + '_' + options.prefix,
+		    autoplay = originalNode.autoplay,
+		    children = originalNode.children;
 
-				// hide main controls
-				t.controls
-					.addClass('mejs-offscreen')
-					.css('display','block');
+		var node = null,
+		    dashPlayer = null;
+
+		originalNode.removeAttribute('type');
+		for (var i = 0, total = children.length; i < total; i++) {
+			children[i].removeAttribute('type');
+		}
 
-				// hide others
-				t.container.find('.mejs-control')
-					.addClass('mejs-offscreen')
-					.css('display','block');
+		node = originalNode.cloneNode(true);
+		options = Object.assign(options, mediaElement.options);
 
-				t.controlsAreVisible = false;
-				t.container.trigger('controlshidden');
+		var props = _mejs2.default.html5media.properties,
+		    events = _mejs2.default.html5media.events.concat(['click', 'mouseover', 'mouseout']),
+		    attachNativeEvents = function attachNativeEvents(e) {
+			if (e.type !== 'error') {
+				var _event = (0, _general.createEvent)(e.type, mediaElement);
+				mediaElement.dispatchEvent(_event);
 			}
 		},
+		    assignGettersSetters = function assignGettersSetters(propName) {
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
 
-		controlsTimer: null,
+			node['get' + capName] = function () {
+				return dashPlayer !== null ? node[propName] : null;
+			};
 
-		startControlsTimer: function(timeout) {
+			node['set' + capName] = function (value) {
+				if (_mejs2.default.html5media.readOnlyProperties.indexOf(propName) === -1) {
+					if (propName === 'src') {
+						var source = (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value.src ? value.src : value;
+						node[propName] = source;
+						if (dashPlayer !== null) {
+							dashPlayer.reset();
+							for (var _i = 0, _total = events.length; _i < _total; _i++) {
+								node.removeEventListener(events[_i], attachNativeEvents);
+							}
+							dashPlayer = NativeDash._createPlayer({
+								options: options.dash,
+								id: id
+							});
 
-			var t = this;
+							if (value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && _typeof(value.drm) === 'object') {
+								dashPlayer.setProtectionData(value.drm);
+								if ((0, _general.isString)(options.dash.robustnessLevel) && options.dash.robustnessLevel) {
+									dashPlayer.getProtectionController().setRobustnessLevel(options.dash.robustnessLevel);
+								}
+							}
+							dashPlayer.attachSource(source);
+							if (autoplay) {
+								dashPlayer.play();
+							}
+						}
+					} else {
+						node[propName] = value;
+					}
+				}
+			};
+		};
 
-			timeout = typeof timeout != 'undefined' ? timeout : t.options.controlsTimeoutDefault;
+		for (var _i2 = 0, _total2 = props.length; _i2 < _total2; _i2++) {
+			assignGettersSetters(props[_i2]);
+		}
 
-			t.killControlsTimer('start');
+		_window2.default['__ready__' + id] = function (_dashPlayer) {
+			mediaElement.dashPlayer = dashPlayer = _dashPlayer;
+
+			var dashEvents = dashjs.MediaPlayer.events,
+			    assignEvents = function assignEvents(eventName) {
+				if (eventName === 'loadedmetadata') {
+					dashPlayer.getDebug().setLogToBrowserConsole(options.dash.debug);
+					dashPlayer.initialize();
+					dashPlayer.setScheduleWhilePaused(false);
+					dashPlayer.setFastSwitchEnabled(true);
+					dashPlayer.attachView(node);
+					dashPlayer.setAutoPlay(false);
+
+					if (_typeof(options.dash.drm) === 'object' && !_mejs2.default.Utils.isObjectEmpty(options.dash.drm)) {
+						dashPlayer.setProtectionData(options.dash.drm);
+						if ((0, _general.isString)(options.dash.robustnessLevel) && options.dash.robustnessLevel) {
+							dashPlayer.getProtectionController().setRobustnessLevel(options.dash.robustnessLevel);
+						}
+					}
+					dashPlayer.attachSource(node.getSrc());
+				}
 
-			t.controlsTimer = setTimeout(function() {
-				//
-				t.hideControls();
-				t.killControlsTimer('hide');
-			}, timeout);
-		},
+				node.addEventListener(eventName, attachNativeEvents);
+			};
 
-		killControlsTimer: function(src) {
+			for (var _i3 = 0, _total3 = events.length; _i3 < _total3; _i3++) {
+				assignEvents(events[_i3]);
+			}
 
-			var t = this;
+			var assignMdashEvents = function assignMdashEvents(name, data) {
+				if (name.toLowerCase() === 'error') {
+					mediaElement.generateError(data.message, node.src);
+					console.error(data);
+				} else {
+					var _event2 = (0, _general.createEvent)(name, mediaElement);
+					_event2.data = data;
+					mediaElement.dispatchEvent(_event2);
+				}
+			};
 
-			if (t.controlsTimer !== null) {
-				clearTimeout(t.controlsTimer);
-				delete t.controlsTimer;
-				t.controlsTimer = null;
+			for (var eventType in dashEvents) {
+				if (dashEvents.hasOwnProperty(eventType)) {
+					dashPlayer.on(dashEvents[eventType], function (e) {
+						for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+							args[_key - 1] = arguments[_key];
+						}
+
+						return assignMdashEvents(e.type, args);
+					});
+				}
 			}
-		},
+		};
 
-		controlsEnabled: true,
+		if (mediaFiles && mediaFiles.length > 0) {
+			for (var _i4 = 0, _total4 = mediaFiles.length; _i4 < _total4; _i4++) {
+				if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i4].type)) {
+					node.setAttribute('src', mediaFiles[_i4].src);
+					if (typeof mediaFiles[_i4].drm !== 'undefined') {
+						options.dash.drm = mediaFiles[_i4].drm;
+					}
+					break;
+				}
+			}
+		}
 
-		disableControls: function() {
-			var t= this;
+		node.setAttribute('id', id);
 
-			t.killControlsTimer();
-			t.hideControls(false);
-			this.controlsEnabled = false;
-		},
+		originalNode.parentNode.insertBefore(node, originalNode);
+		originalNode.autoplay = false;
+		originalNode.style.display = 'none';
 
-		enableControls: function() {
-			var t= this;
+		node.setSize = function (width, height) {
+			node.style.width = width + 'px';
+			node.style.height = height + 'px';
+			return node;
+		};
 
-			t.showControls(false);
+		node.hide = function () {
+			node.pause();
+			node.style.display = 'none';
+			return node;
+		};
 
-			t.controlsEnabled = true;
-		},
+		node.show = function () {
+			node.style.display = '';
+			return node;
+		};
 
-		// Sets up all controls and events
-		meReady: function(media, domNode) {
-			
-			var
-				t = this,
-				mf = mejs.MediaFeatures,
-				autoplayAttr = domNode.getAttribute('autoplay'),
-				autoplay = !(typeof autoplayAttr == 'undefined' || autoplayAttr === null || autoplayAttr === 'false'),
-				featureIndex,
-				feature;
-
-			// make sure it can't create itself again if a plugin reloads
-			if (t.created) {
-				return;
-			} else {
-				t.created = true;
+		node.destroy = function () {
+			if (dashPlayer !== null) {
+				dashPlayer.reset();
 			}
+		};
 
-			t.media = media;
-			t.domNode = domNode;
-
-			if (!(mf.isAndroid && t.options.AndroidUseNativeControls) && !(mf.isiPad && t.options.iPadUseNativeControls) && !(mf.isiPhone && t.options.iPhoneUseNativeControls)) {
+		var event = (0, _general.createEvent)('rendererready', node);
+		mediaElement.dispatchEvent(event);
 
-				// In the event that no features are specified for audio,
-				// create only MediaElement instance rather than
-				// doing all the work to create a full player
-				if (!t.isVideo && !t.options.features.length) {
+		mediaElement.promises.push(NativeDash.load({
+			options: options.dash,
+			id: id
+		}));
 
-					// force autoplay for HTML5
-					if (autoplay && media.pluginType == 'native') {
-						t.play();
-					}
+		return node;
+	}
+};
 
+_media.typeChecks.push(function (url) {
+	return ~url.toLowerCase().indexOf('.mpd') ? 'application/dash+xml' : null;
+});
 
-					if (t.options.success) {
+_renderer.renderer.add(DashNativeRenderer);
 
-						if (typeof t.options.success == 'string') {
-							window[t.options.success](t.media, t.domNode, t);
-						} else {
-							t.options.success(t.media, t.domNode, t);
-						}
-					}
+},{"25":25,"26":26,"27":27,"28":28,"3":3,"7":7,"8":8}],20:[function(_dereq_,module,exports){
+'use strict';
 
-					return;
-				}
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
+exports.PluginDetector = undefined;
 
-				// two built in features
-				t.buildposter(t, t.controls, t.layers, t.media);
-				t.buildkeyboard(t, t.controls, t.layers, t.media);
-				t.buildoverlays(t, t.controls, t.layers, t.media);
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
 
-				// grab for use by features
-				t.findTracks();
+var _window = _dereq_(3);
 
-				// add user-defined features/controls
-				for (featureIndex in t.options.features) {
-					feature = t.options.features[featureIndex];
-					if (t['build' + feature]) {
-						try {
-							t['build' + feature](t, t.controls, t.layers, t.media);
-						} catch (e) {
-							// TODO: report control error
-							//throw e;
-							
-							
-						}
-					}
-				}
+var _window2 = _interopRequireDefault(_window);
 
-				t.container.trigger('controlsready');
+var _document = _dereq_(2);
 
-				// reset all layers and controls
-				t.setPlayerSize(t.width, t.height);
-				t.setControlsSize();
+var _document2 = _interopRequireDefault(_document);
 
+var _mejs = _dereq_(7);
 
-				// controls fade
-				if (t.isVideo) {
+var _mejs2 = _interopRequireDefault(_mejs);
 
-					if (mejs.MediaFeatures.hasTouch && !t.options.alwaysShowControls) {
+var _i18n = _dereq_(5);
 
-						// for touch devices (iOS, Android)
-						// show/hide without animation on touch
+var _i18n2 = _interopRequireDefault(_i18n);
 
-						t.$media.bind('touchstart', function() {
+var _renderer = _dereq_(8);
 
-							// toggle controls
-							if (t.controlsAreVisible) {
-								t.hideControls(false);
-							} else {
-								if (t.controlsEnabled) {
-									t.showControls(false);
-								}
-							}
-						});
+var _general = _dereq_(27);
 
-					} else {
+var _constants = _dereq_(25);
 
-						// create callback here since it needs access to current
-						// MediaElement object
-						t.clickToPlayPauseCallback = function() {
-							//
+var _media = _dereq_(28);
 
-							if (t.options.clickToPlayPause) {
-								if (t.media.paused) {
-									t.play();
-								} else {
-									t.pause();
-								}
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-								var button = t.$media.closest('.mejs-container').find('.mejs-overlay-button'),
-									pressed = button.attr('aria-pressed');
-								button.attr('aria-pressed', !pressed);
-							}
-						};
+var PluginDetector = exports.PluginDetector = {
+	plugins: [],
 
-						// click to play/pause
-						t.media.addEventListener('click', t.clickToPlayPauseCallback, false);
+	hasPluginVersion: function hasPluginVersion(plugin, v) {
+		var pv = PluginDetector.plugins[plugin];
+		v[1] = v[1] || 0;
+		v[2] = v[2] || 0;
+		return pv[0] > v[0] || pv[0] === v[0] && pv[1] > v[1] || pv[0] === v[0] && pv[1] === v[1] && pv[2] >= v[2];
+	},
 
-						// show/hide controls
-						t.container
-							.bind('mouseenter', function () {
-								if (t.controlsEnabled) {
-									if (!t.options.alwaysShowControls ) {
-										t.killControlsTimer('enter');
-										t.showControls();
-										t.startControlsTimer(t.options.controlsTimeoutMouseEnter);
-									}
-								}
-							})
-							.bind('mousemove', function() {
-								if (t.controlsEnabled) {
-									if (!t.controlsAreVisible) {
-										t.showControls();
-									}
-									if (!t.options.alwaysShowControls) {
-										t.startControlsTimer(t.options.controlsTimeoutMouseEnter);
-									}
-								}
-							})
-							.bind('mouseleave', function () {
-								if (t.controlsEnabled) {
-									if (!t.media.paused && !t.options.alwaysShowControls) {
-										t.startControlsTimer(t.options.controlsTimeoutMouseLeave);
-									}
-								}
-							});
-					}
+	addPlugin: function addPlugin(p, pluginName, mimeType, activeX, axDetect) {
+		PluginDetector.plugins[p] = PluginDetector.detectPlugin(pluginName, mimeType, activeX, axDetect);
+	},
 
-					if(t.options.hideVideoControlsOnLoad) {
-						t.hideControls(false);
-					}
+	detectPlugin: function detectPlugin(pluginName, mimeType, activeX, axDetect) {
 
-					// check for autoplay
-					if (autoplay && !t.options.alwaysShowControls) {
-						t.hideControls();
-					}
+		var version = [0, 0, 0],
+		    description = void 0,
+		    ax = void 0;
 
-					// resizer
-					if (t.options.enableAutosize) {
-						t.media.addEventListener('loadedmetadata', function(e) {
-							// if the <video height> was not set and the options.videoHeight was not set
-							// then resize to the real dimensions
-							if (t.options.videoHeight <= 0 && t.domNode.getAttribute('height') === null && !isNaN(e.target.videoHeight)) {
-								t.setPlayerSize(e.target.videoWidth, e.target.videoHeight);
-								t.setControlsSize();
-								t.media.setVideoSize(e.target.videoWidth, e.target.videoHeight);
-							}
-						}, false);
-					}
+		if (_constants.NAV.plugins !== null && _constants.NAV.plugins !== undefined && _typeof(_constants.NAV.plugins[pluginName]) === 'object') {
+			description = _constants.NAV.plugins[pluginName].description;
+			if (description && !(typeof _constants.NAV.mimeTypes !== 'undefined' && _constants.NAV.mimeTypes[mimeType] && !_constants.NAV.mimeTypes[mimeType].enabledPlugin)) {
+				version = description.replace(pluginName, '').replace(/^\s+/, '').replace(/\sr/gi, '.').split('.');
+				for (var i = 0, total = version.length; i < total; i++) {
+					version[i] = parseInt(version[i].match(/\d+/), 10);
+				}
+			}
+		} else if (_window2.default.ActiveXObject !== undefined) {
+			try {
+				ax = new ActiveXObject(activeX);
+				if (ax) {
+					version = axDetect(ax);
 				}
+			} catch (e) {
+				
+			}
+		}
+		return version;
+	}
+};
 
-				// EVENTS
+PluginDetector.addPlugin('flash', 'Shockwave Flash', 'application/x-shockwave-flash', 'ShockwaveFlash.ShockwaveFlash', function (ax) {
+	var version = [],
+	    d = ax.GetVariable("$version");
 
-				// FOCUS: when a video starts playing, it takes focus from other players (possibly pausing them)
-				t.media.addEventListener('play', function() {
-					var playerIndex;
+	if (d) {
+		d = d.split(" ")[1].split(",");
+		version = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+	}
+	return version;
+});
 
-					// go through all other players
-					for (playerIndex in mejs.players) {
-						var p = mejs.players[playerIndex];
-						if (p.id != t.id && t.options.pauseOtherPlayers && !p.paused && !p.ended) {
-							p.pause();
+var FlashMediaElementRenderer = {
+	create: function create(mediaElement, options, mediaFiles) {
+
+		var flash = {};
+
+		flash.options = options;
+		flash.id = mediaElement.id + '_' + flash.options.prefix;
+		flash.mediaElement = mediaElement;
+		flash.flashState = {};
+		flash.flashApi = null;
+		flash.flashApiStack = [];
+
+		var props = _mejs2.default.html5media.properties,
+		    assignGettersSetters = function assignGettersSetters(propName) {
+			flash.flashState[propName] = null;
+
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+			flash['get' + capName] = function () {
+				if (flash.flashApi !== null) {
+					if (typeof flash.flashApi['get_' + propName] === 'function') {
+						var value = flash.flashApi['get_' + propName]();
+
+						if (propName === 'buffered') {
+							return {
+								start: function start() {
+									return 0;
+								},
+								end: function end() {
+									return value;
+								},
+								length: 1
+							};
 						}
-						p.hasFocus = false;
+						return value;
+					} else {
+						return null;
 					}
+				} else {
+					return null;
+				}
+			};
 
-					t.hasFocus = true;
-				},false);
+			flash['set' + capName] = function (value) {
+				if (propName === 'src') {
+					value = (0, _media.absolutizeUrl)(value);
+				}
 
+				if (flash.flashApi !== null && flash.flashApi['set_' + propName] !== undefined) {
+					try {
+						flash.flashApi['set_' + propName](value);
+					} catch (e) {
+						
+					}
+				} else {
+					flash.flashApiStack.push({
+						type: 'set',
+						propName: propName,
+						value: value
+					});
+				}
+			};
+		};
 
-				// ended for all
-				t.media.addEventListener('ended', function (e) {
-					if(t.options.autoRewind) {
-						try{
-							t.media.setCurrentTime(0);
-							// Fixing an Android stock browser bug, where "seeked" isn't fired correctly after ending the video and jumping to the beginning
-							window.setTimeout(function(){
-								$(t.container).find('.mejs-overlay-loading').parent().hide();
-							}, 20);
-						} catch (exp) {
+		for (var i = 0, total = props.length; i < total; i++) {
+			assignGettersSetters(props[i]);
+		}
 
+		var methods = _mejs2.default.html5media.methods,
+		    assignMethods = function assignMethods(methodName) {
+			flash[methodName] = function () {
+				if (flash.flashApi !== null) {
+					if (flash.flashApi['fire_' + methodName]) {
+						try {
+							flash.flashApi['fire_' + methodName]();
+						} catch (e) {
+							
 						}
-					}
-					if (t.media.pluginType === 'youtube') {
-						t.media.stop();
 					} else {
-						t.media.pause();
+						
 					}
+				} else {
+					flash.flashApiStack.push({
+						type: 'call',
+						methodName: methodName
+					});
+				}
+			};
+		};
+		methods.push('stop');
+		for (var _i = 0, _total = methods.length; _i < _total; _i++) {
+			assignMethods(methods[_i]);
+		}
 
-					if (t.setProgressRail) {
-						t.setProgressRail();
-					}
-					if (t.setCurrentRail) {
-						t.setCurrentRail();
-					}
+		var initEvents = ['rendererready'];
 
-					if (t.options.loop) {
-						t.play();
-					} else if (!t.options.alwaysShowControls && t.controlsEnabled) {
-						t.showControls();
-					}
-				}, false);
+		for (var _i2 = 0, _total2 = initEvents.length; _i2 < _total2; _i2++) {
+			var event = (0, _general.createEvent)(initEvents[_i2], flash);
+			mediaElement.dispatchEvent(event);
+		}
 
-				// resize on the first play
-				t.media.addEventListener('loadedmetadata', function() {
+		_window2.default['__ready__' + flash.id] = function () {
 
-					mejs.Utility.calculateTimeFormat(t.duration, t.options, t.options.framesPerSecond || 25);
+			flash.flashReady = true;
+			flash.flashApi = _document2.default.getElementById('__' + flash.id);
 
-					if (t.updateDuration) {
-						t.updateDuration();
-					}
-					if (t.updateCurrent) {
-						t.updateCurrent();
-					}
+			if (flash.flashApiStack.length) {
+				for (var _i3 = 0, _total3 = flash.flashApiStack.length; _i3 < _total3; _i3++) {
+					var stackItem = flash.flashApiStack[_i3];
 
-					if (!t.isFullScreen) {
-						t.setPlayerSize(t.width, t.height);
-						t.setControlsSize();
-					}
-				}, false);
+					if (stackItem.type === 'set') {
+						var propName = stackItem.propName,
+						    capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
 
-				// Only change the time format when necessary
-				var duration = null;
-				t.media.addEventListener('timeupdate',function() {
-					if (duration !== this.duration) {
-						duration = this.duration;
-						mejs.Utility.calculateTimeFormat(duration, t.options, t.options.framesPerSecond || 25);
-						
-						// make sure to fill in and resize the controls (e.g., 00:00 => 01:13:15
-						if (t.updateDuration) {
-							t.updateDuration();
-						}
-						if (t.updateCurrent) {
-							t.updateCurrent();
-						}
-						t.setControlsSize();
-						
+						flash['set' + capName](stackItem.value);
+					} else if (stackItem.type === 'call') {
+						flash[stackItem.methodName]();
 					}
-				}, false);
-
-				t.container.focusout(function (e) {
-					if( e.relatedTarget ) { //FF is working on supporting focusout https://bugzilla.mozilla.org/show_bug.cgi?id=687787
-						var $target = $(e.relatedTarget);
-						if (t.keyboardAction && $target.parents('.mejs-container').length === 0) {
-							t.keyboardAction = false;
-							if (t.isVideo && !t.options.alwaysShowControls) {
-								t.hideControls(true);
-							}
+				}
+			}
+		};
 
-						}
-					}
-				});
+		_window2.default['__event__' + flash.id] = function (eventName, message) {
+			var event = (0, _general.createEvent)(eventName, flash);
+			if (message) {
+				try {
+					event.data = JSON.parse(message);
+					event.details.data = JSON.parse(message);
+				} catch (e) {
+					event.message = message;
+				}
+			}
 
-				// webkit has trouble doing this without a delay
-				setTimeout(function () {
-					t.setPlayerSize(t.width, t.height);
-					t.setControlsSize();
-				}, 50);
+			flash.mediaElement.dispatchEvent(event);
+		};
 
-				// adjust controls whenever window sizes (used to be in fullscreen only)
-				t.globalBind('resize', function() {
+		flash.flashWrapper = _document2.default.createElement('div');
 
-					// don't resize for fullscreen mode
-					if ( !(t.isFullScreen || (mejs.MediaFeatures.hasTrueNativeFullScreen && document.webkitIsFullScreen)) ) {
-						t.setPlayerSize(t.width, t.height);
-					}
+		if (['always', 'sameDomain'].indexOf(flash.options.shimScriptAccess) === -1) {
+			flash.options.shimScriptAccess = 'sameDomain';
+		}
 
-					// always adjust controls
-					t.setControlsSize();
-				});
+		var autoplay = mediaElement.originalNode.autoplay,
+		    flashVars = ['uid=' + flash.id, 'autoplay=' + autoplay, 'allowScriptAccess=' + flash.options.shimScriptAccess, 'preload=' + (mediaElement.originalNode.getAttribute('preload') || '')],
+		    isVideo = mediaElement.originalNode !== null && mediaElement.originalNode.tagName.toLowerCase() === 'video',
+		    flashHeight = isVideo ? mediaElement.originalNode.height : 1,
+		    flashWidth = isVideo ? mediaElement.originalNode.width : 1;
 
-				// This is a work-around for a bug in the YouTube iFrame player, which means
-				//	we can't use the play() API for the initial playback on iOS or Android;
-				//	user has to start playback directly by tapping on the iFrame.
-				if (t.media.pluginType == 'youtube' && ( mf.isiOS || mf.isAndroid ) ) {
-					t.container.find('.mejs-overlay-play').hide();
-					t.container.find('.mejs-poster').hide();
-				}
-			}
+		if (mediaElement.originalNode.getAttribute('src')) {
+			flashVars.push('src=' + mediaElement.originalNode.getAttribute('src'));
+		}
+
+		if (flash.options.enablePseudoStreaming === true) {
+			flashVars.push('pseudostreamstart=' + flash.options.pseudoStreamingStartQueryParam);
+			flashVars.push('pseudostreamtype=' + flash.options.pseudoStreamingType);
+		}
+
+		mediaElement.appendChild(flash.flashWrapper);
+		mediaElement.originalNode.style.display = 'none';
 
-			// force autoplay for HTML5
-			if (autoplay && media.pluginType == 'native') {
-				t.play();
-			}
+		var settings = [];
 
+		if (_constants.IS_IE) {
+			var specialIEContainer = _document2.default.createElement('div');
+			flash.flashWrapper.appendChild(specialIEContainer);
 
-			if (t.options.success) {
+			settings = ['classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"', 'codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"', 'id="__' + flash.id + '"', 'width="' + flashWidth + '"', 'height="' + flashHeight + '"'];
 
-				if (typeof t.options.success == 'string') {
-					window[t.options.success](t.media, t.domNode, t);
-				} else {
-					t.options.success(t.media, t.domNode, t);
-				}
+			if (!isVideo) {
+				settings.push('style="clip: rect(0 0 0 0); position: absolute;"');
 			}
-		},
 
-		handleError: function(e) {
-			var t = this;
+			specialIEContainer.outerHTML = '<object ' + settings.join(' ') + '>' + ('<param name="movie" value="' + flash.options.pluginPath + flash.options.filename + '?x=' + new Date() + '" />') + ('<param name="flashvars" value="' + flashVars.join('&amp;') + '" />') + '<param name="quality" value="high" />' + '<param name="bgcolor" value="#000000" />' + '<param name="wmode" value="transparent" />' + ('<param name="allowScriptAccess" value="' + flash.options.shimScriptAccess + '" />') + '<param name="allowFullScreen" value="true" />' + ('<div>' + _i18n2.default.t('mejs.install-flash') + '</div>') + '</object>';
+		} else {
 
-			if (t.controls) {
-				t.controls.hide();
-			}
+			settings = ['id="__' + flash.id + '"', 'name="__' + flash.id + '"', 'play="true"', 'loop="false"', 'quality="high"', 'bgcolor="#000000"', 'wmode="transparent"', 'allowScriptAccess="' + flash.options.shimScriptAccess + '"', 'allowFullScreen="true"', 'type="application/x-shockwave-flash"', 'pluginspage="//www.macromedia.com/go/getflashplayer"', 'src="' + flash.options.pluginPath + flash.options.filename + '"', 'flashvars="' + flashVars.join('&') + '"', 'width="' + flashWidth + '"', 'height="' + flashHeight + '"'];
 
-			// Tell user that the file cannot be played
-			if (t.options.error) {
-				t.options.error(e);
+			if (!isVideo) {
+				settings.push('style="clip: rect(0 0 0 0); position: absolute;"');
 			}
-		},
 
-		setPlayerSize: function(width,height) {
-			var t = this;
+			flash.flashWrapper.innerHTML = '<embed ' + settings.join(' ') + '>';
+		}
 
-			if( !t.options.setDimensions ) {
-				return false;
-			}
+		flash.flashNode = flash.flashWrapper.lastChild;
 
-			if (typeof width != 'undefined') {
-				t.width = width;
+		flash.hide = function () {
+			if (isVideo) {
+				flash.flashNode.style.display = 'none';
+			}
+		};
+		flash.show = function () {
+			if (isVideo) {
+				flash.flashNode.style.display = '';
 			}
+		};
+		flash.setSize = function (width, height) {
+			flash.flashNode.style.width = width + 'px';
+			flash.flashNode.style.height = height + 'px';
 
-			if (typeof height != 'undefined') {
-				t.height = height;
+			if (flash.flashApi !== null && typeof flash.flashApi.fire_setSize === 'function') {
+				flash.flashApi.fire_setSize(width, height);
 			}
- 
-			// check stretching modes
-			switch (t.options.stretching) {
-				case 'fill':
-					// The 'fill' effect only makes sense on video; for audio we will set the dimensions
-					if (t.isVideo) {
-						this.setFillMode();
-					} else {
-						this.setDimensions(t.width, t.height);
-					}
-					break;
-				case 'responsive':
-					this.setResponsiveMode();
-					break;
-				case 'none':
-					this.setDimensions(t.width, t.height);
-					break;
-				// This is the 'auto' mode
-				default:
-					if (this.hasFluidMode() === true) {
-						this.setResponsiveMode();
-					} else {
-						this.setDimensions(t.width, t.height);
-					}
+		};
+
+		flash.destroy = function () {
+			flash.flashNode.remove();
+		};
+
+		if (mediaFiles && mediaFiles.length > 0) {
+			for (var _i4 = 0, _total4 = mediaFiles.length; _i4 < _total4; _i4++) {
+				if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i4].type)) {
+					flash.setSrc(mediaFiles[_i4].src);
 					break;
-			}
-		},
- 
-		hasFluidMode: function() {
-			var t = this;
-	 
-			// detect 100% mode - use currentStyle for IE since css() doesn't return percentages
-			return (t.height.toString().indexOf('%') > 0 || (t.$node.css('max-width') !== 'none' && t.$node.css('max-width') !== 't.width') || (t.$node[0].currentStyle && t.$node[0].currentStyle.maxWidth === '100%'));
-		},
- 
-		setResponsiveMode: function() {
-			var t = this;
-		
-			// do we have the native dimensions yet?
-			var nativeWidth = (function() {
-				if (t.isVideo) {
-					if (t.media.videoWidth && t.media.videoWidth > 0) {
-						return t.media.videoWidth;
-					} else if (t.media.getAttribute('width') !== null) {
-						return t.media.getAttribute('width');
-					} else {
-						return t.options.defaultVideoWidth;
-					}
-				} else {
-					return t.options.defaultAudioWidth;
-				}
-			})();
-		
-			var nativeHeight = (function() {
-				if (t.isVideo) {
-					if (t.media.videoHeight && t.media.videoHeight > 0) {
-						return t.media.videoHeight;
-					} else if (t.media.getAttribute('height') !== null) {
-						return t.media.getAttribute('height');
-					} else {
-						return t.options.defaultVideoHeight;
-					}
-				} else {
-					return t.options.defaultAudioHeight;
-				}
-			})();
-		
-			var parentWidth = t.container.parent().closest(':visible').width(),
-			parentHeight = t.container.parent().closest(':visible').height(),
-			newHeight = t.isVideo || !t.options.autosizeProgress ? parseInt(parentWidth * nativeHeight/nativeWidth, 10) : nativeHeight;
-			
-			// When we use percent, the newHeight can't be calculated so we get the container height
-			if (isNaN(newHeight) || ( parentHeight !== 0 && newHeight > parentHeight && parentHeight > nativeHeight)) {
-				newHeight = parentHeight;
-			}
-		
-			if (t.container.parent().length > 0 && t.container.parent()[0].tagName.toLowerCase() === 'body') { // && t.container.siblings().count == 0) {
-				parentWidth = $(window).width();
-				newHeight = $(window).height();
-			}
-		
-			if ( newHeight && parentWidth ) {
-			
-				// set outer container size
-				t.container
-					.width(parentWidth)
-					.height(newHeight);
-				
-				// set native <video> or <audio> and shims
-				t.$media.add(t.container.find('.mejs-shim'))
-					.width('100%')
-					.height('100%');
-				
-				// if shim is ready, send the size to the embeded plugin
-				if (t.isVideo) {
-					if (t.media.setVideoSize) {
-						t.media.setVideoSize(parentWidth, newHeight);
-					}
-				}
-		
-				// set the layers
-				t.layers.children('.mejs-layer')
-					.width('100%')
-					.height('100%');
-			}
-		},
- 
-		setFillMode: function() {
-			var t = this,
-				parent = t.outerContainer;
- 
-			if (!parent.width()) {
-				parent.height(t.$media.width());
-			}
- 
-			if (!parent.height()) {
-				parent.height(t.$media.height());
-			}
- 
-			var parentWidth = parent.width(),
-				parentHeight = parent.height();
-			
-			t.setDimensions('100%', '100%');
-			
-			// This prevents an issue when displaying poster
-			t.container.find('.mejs-poster img').css('display', 'block');
-			
-			targetElement = t.container.find('object, embed, iframe, video');
-			
-			// calculate new width and height
-			var initHeight = t.height,
-				initWidth = t.width,
-				// scale to the target width
-				scaleX1 = parentWidth,
-				scaleY1 = (initHeight * parentWidth) / initWidth,
-				// scale to the target height
-				scaleX2 = (initWidth * parentHeight) / initHeight,
-				scaleY2 = parentHeight,
-				// now figure out which one we should use
-				bScaleOnWidth = !(scaleX2 > parentWidth),
-				finalWidth = bScaleOnWidth ? Math.floor(scaleX1) : Math.floor(scaleX2),
-				finalHeight = bScaleOnWidth ? Math.floor(scaleY1) : Math.floor(scaleY2);
-			
-			if (bScaleOnWidth) {
-				targetElement.height(finalHeight).width(parentWidth);
-				if (t.media.setVideoSize) {
-					t.media.setVideoSize(parentWidth, finalHeight);
-				}
-			} else {
-				targetElement.height(parentHeight).width(finalWidth);
-				if (t.media.setVideoSize) {
-					t.media.setVideoSize(finalWidth, parentHeight);
 				}
 			}
-			
-			targetElement.css({
-				'margin-left': Math.floor((parentWidth - finalWidth) / 2),
-				'margin-top': 0
-			});
-		},
-	 
-		setDimensions: function(width, height) {
-			var t = this;
-			
-			t.container
-				.width(width)
-				.height(height);
-			
-			t.layers.children('.mejs-layer')
-				.width(width)
-				.height(height);
-		},
-
-		setControlsSize: function() {
-			var t = this,
-				usedWidth = 0,
-				railWidth = 0,
-				rail = t.controls.find('.mejs-time-rail'),
-				total = t.controls.find('.mejs-time-total'),
-				others = rail.siblings(),
-				lastControl = others.last(),
-				lastControlPosition = null,
-				avoidAutosizeProgress = t.options && !t.options.autosizeProgress;
-
-			// skip calculation if hidden
-			if (!t.container.is(':visible') || !rail.length || !rail.is(':visible')) {
-				return;
-			}
+		}
 
-			// allow the size to come from custom CSS
-			if (avoidAutosizeProgress) {
-				// Also, frontends devs can be more flexible
-				// due the opportunity of absolute positioning.
-				railWidth = parseInt(rail.css('width'), 10);
-			}
+		return flash;
+	}
+};
 
-			// attempt to autosize
-			if (railWidth === 0 || !railWidth) {
+var hasFlash = PluginDetector.hasPluginVersion('flash', [10, 0, 0]);
 
-				// find the size of all the other controls besides the rail
-				others.each(function() {
-					var $this = $(this);
-					if ($this.css('position') != 'absolute' && $this.is(':visible')) {
-						usedWidth += $(this).outerWidth(true);
-					}
-				});
+if (hasFlash) {
+	_media.typeChecks.push(function (url) {
+		url = url.toLowerCase();
 
-				// fit the rail into the remaining space
-				railWidth = t.controls.width() - usedWidth - (rail.outerWidth(true) - rail.width());
-			}
+		if (url.startsWith('rtmp')) {
+			if (~url.indexOf('.mp3')) {
+				return 'audio/rtmp';
+			} else {
+				return 'video/rtmp';
+			}
+		} else if (/\.og(a|g)/i.test(url)) {
+			return 'audio/ogg';
+		} else if (~url.indexOf('.m3u8')) {
+			return 'application/x-mpegURL';
+		} else if (~url.indexOf('.mpd')) {
+			return 'application/dash+xml';
+		} else if (~url.indexOf('.flv')) {
+			return 'video/flv';
+		} else {
+			return null;
+		}
+	});
 
-			// resize the rail,
-			// but then check if the last control (say, the fullscreen button) got pushed down
-			// this often happens when zoomed
-			do {
-				// outer area
-				// we only want to set an inline style with the width of the rail
-				// if we're trying to autosize.
-				if (!avoidAutosizeProgress) {
-					rail.width(railWidth);
-				}
+	var FlashMediaElementVideoRenderer = {
+		name: 'flash_video',
+		options: {
+			prefix: 'flash_video',
+			filename: 'mediaelement-flash-video.swf',
+			enablePseudoStreaming: false,
 
-				// dark space
-				total.width(railWidth - (total.outerWidth(true) - total.width()));
+			pseudoStreamingStartQueryParam: 'start',
 
-				if (lastControl.css('position') != 'absolute') {
-					lastControlPosition = lastControl.length ? lastControl.position() : null;
-					railWidth--;
-				}
-			} while (lastControlPosition !== null && lastControlPosition.top.toFixed(2) > 0 && railWidth > 0);
+			pseudoStreamingType: 'byte'
+		},
 
-			t.container.trigger('controlsresize');
+		canPlayType: function canPlayType(type) {
+			return ~['video/mp4', 'video/rtmp', 'audio/rtmp', 'rtmp/mp4', 'audio/mp4', 'video/flv', 'video/x-flv'].indexOf(type.toLowerCase());
 		},
 
+		create: FlashMediaElementRenderer.create
 
-		buildposter: function(player, controls, layers, media) {
-			var t = this,
-				poster =
-				$('<div class="mejs-poster mejs-layer">' +
-				'</div>')
-					.appendTo(layers),
-				posterUrl = player.$media.attr('poster');
-
-			// prioriy goes to option (this is useful if you need to support iOS 3.x (iOS completely fails with poster)
-			if (player.options.poster !== '') {
-				posterUrl = player.options.poster;
-			}
+	};
+	_renderer.renderer.add(FlashMediaElementVideoRenderer);
 
-			// second, try the real poster
-			if ( posterUrl ) {
-				t.setPoster(posterUrl);
-			} else {
-				poster.hide();
-			}
+	var FlashMediaElementHlsVideoRenderer = {
+		name: 'flash_hls',
+		options: {
+			prefix: 'flash_hls',
+			filename: 'mediaelement-flash-video-hls.swf'
+		},
 
-			media.addEventListener('play',function() {
-				poster.hide();
-			}, false);
+		canPlayType: function canPlayType(type) {
+			return ~['application/x-mpegurl', 'application/vnd.apple.mpegurl', 'audio/mpegurl', 'audio/hls', 'video/hls'].indexOf(type.toLowerCase());
+		},
 
-			if(player.options.showPosterWhenEnded && player.options.autoRewind){
-				media.addEventListener('ended',function() {
-					poster.show();
-				}, false);
-			}
+		create: FlashMediaElementRenderer.create
+	};
+	_renderer.renderer.add(FlashMediaElementHlsVideoRenderer);
+
+	var FlashMediaElementMdashVideoRenderer = {
+		name: 'flash_dash',
+		options: {
+			prefix: 'flash_dash',
+			filename: 'mediaelement-flash-video-mdash.swf'
 		},
 
-		setPoster: function(url) {
-			var t = this,
-				posterDiv = t.container.find('.mejs-poster'),
-				posterImg = posterDiv.find('img');
+		canPlayType: function canPlayType(type) {
+			return ~['application/dash+xml'].indexOf(type.toLowerCase());
+		},
 
-			if (posterImg.length === 0) {
-				posterImg = $('<img width="100%" height="100%" alt="" />').appendTo(posterDiv);
-			}
+		create: FlashMediaElementRenderer.create
+	};
+	_renderer.renderer.add(FlashMediaElementMdashVideoRenderer);
 
-			posterImg.attr('src', url);
-			posterDiv.css({'background-image' : 'url(' + url + ')'});
+	var FlashMediaElementAudioRenderer = {
+		name: 'flash_audio',
+		options: {
+			prefix: 'flash_audio',
+			filename: 'mediaelement-flash-audio.swf'
 		},
 
-		buildoverlays: function(player, controls, layers, media) {
-			var t = this;
-			if (!player.isVideo)
-				return;
+		canPlayType: function canPlayType(type) {
+			return ~['audio/mp3'].indexOf(type.toLowerCase());
+		},
 
-			var
-			loading =
-				$('<div class="mejs-overlay mejs-layer">'+
-					'<div class="mejs-overlay-loading"><span></span></div>'+
-				'</div>')
-				.hide() // start out hidden
-				.appendTo(layers),
-			error =
-				$('<div class="mejs-overlay mejs-layer">'+
-					'<div class="mejs-overlay-error"></div>'+
-				'</div>')
-				.hide() // start out hidden
-				.appendTo(layers),
-			// this needs to come last so it's on top
-			bigPlay =
-				$('<div class="mejs-overlay mejs-layer mejs-overlay-play">'+
-					'<div class="mejs-overlay-button" role="button" aria-label="' + mejs.i18n.t('mejs.play') + '" aria-pressed="false"></div>'+
-				'</div>')
-				.appendTo(layers)
-				.bind('click', function() {	 // Removed 'touchstart' due issues on Samsung Android devices where a tap on bigPlay started and immediately stopped the video
-					if (t.options.clickToPlayPause) {
-						if (media.paused) {
-							media.play();
-						}
+		create: FlashMediaElementRenderer.create
+	};
+	_renderer.renderer.add(FlashMediaElementAudioRenderer);
 
-						var button = $(this).find('.mejs-overlay-button'),
-							pressed = button.attr('aria-pressed');
-						button.attr('aria-pressed', !!pressed);
-					}
-				});
+	var FlashMediaElementAudioOggRenderer = {
+		name: 'flash_audio_ogg',
+		options: {
+			prefix: 'flash_audio_ogg',
+			filename: 'mediaelement-flash-audio-ogg.swf'
+		},
 
-			/*
-			if (mejs.MediaFeatures.isiOS || mejs.MediaFeatures.isAndroid) {
-				bigPlay.remove();
-				loading.remove();
-			}
-			*/
-
-
-			// show/hide big play button
-			media.addEventListener('play',function() {
-				bigPlay.hide();
-				loading.hide();
-				controls.find('.mejs-time-buffering').hide();
-				error.hide();
-			}, false);
-
-			media.addEventListener('playing', function() {
-				bigPlay.hide();
-				loading.hide();
-				controls.find('.mejs-time-buffering').hide();
-				error.hide();
-			}, false);
-
-			media.addEventListener('seeking', function() {
-				loading.show();
-				controls.find('.mejs-time-buffering').show();
-			}, false);
-
-			media.addEventListener('seeked', function() {
-				loading.hide();
-				controls.find('.mejs-time-buffering').hide();
-			}, false);
-
-			media.addEventListener('pause',function() {
-				if (!mejs.MediaFeatures.isiPhone) {
-					bigPlay.show();
-				}
-			}, false);
-
-			media.addEventListener('waiting', function() {
-				loading.show();
-				controls.find('.mejs-time-buffering').show();
-			}, false);
-
-
-			// show/hide loading
-			media.addEventListener('loadeddata',function() {
-				// for some reason Chrome is firing this event
-				//if (mejs.MediaFeatures.isChrome && media.getAttribute && media.getAttribute('preload') === 'none')
-				//	return;
-
-				loading.show();
-				controls.find('.mejs-time-buffering').show();
-				// Firing the 'canplay' event after a timeout which isn't getting fired on some Android 4.1 devices (https://github.com/johndyer/mediaelement/issues/1305)
-				if (mejs.MediaFeatures.isAndroid) {
-					media.canplayTimeout = window.setTimeout(
-						function() {
-							if (document.createEvent) {
-								var evt = document.createEvent('HTMLEvents');
-								evt.initEvent('canplay', true, true);
-								return media.dispatchEvent(evt);
-							}
-						}, 300
-					);
-				}
-			}, false);
-			media.addEventListener('canplay',function() {
-				loading.hide();
-				controls.find('.mejs-time-buffering').hide();
-				clearTimeout(media.canplayTimeout); // Clear timeout inside 'loadeddata' to prevent 'canplay' to fire twice
-			}, false);
-
-			// error handling
-			media.addEventListener('error',function(e) {
-				t.handleError(e);
-				loading.hide();
-				bigPlay.hide();
-				error.show();
-				error.find('.mejs-overlay-error').html("Error loading this resource");
-			}, false);
-
-			media.addEventListener('keydown', function(e) {
-				t.onkeydown(player, media, e);
-			}, false);
+		canPlayType: function canPlayType(type) {
+			return ~['audio/ogg', 'audio/oga', 'audio/ogv'].indexOf(type.toLowerCase());
 		},
 
-		buildkeyboard: function(player, controls, layers, media) {
+		create: FlashMediaElementRenderer.create
+	};
+	_renderer.renderer.add(FlashMediaElementAudioOggRenderer);
+}
 
-				var t = this;
+},{"2":2,"25":25,"27":27,"28":28,"3":3,"5":5,"7":7,"8":8}],21:[function(_dereq_,module,exports){
+'use strict';
 
-				t.container.keydown(function () {
-					t.keyboardAction = true;
-				});
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
 
-				// listen for key presses
-				t.globalBind('keydown', function(event) {
-					player.hasFocus = $(event.target).closest('.mejs-container').length !== 0
-						&& $(event.target).closest('.mejs-container').attr('id') === player.$media.closest('.mejs-container').attr('id');
-					return t.onkeydown(player, media, event);
-				});
+var _window = _dereq_(3);
 
+var _window2 = _interopRequireDefault(_window);
 
-				// check if someone clicked outside a player region, then kill its focus
-				t.globalBind('click', function(event) {
-					player.hasFocus = $(event.target).closest('.mejs-container').length !== 0;
-				});
+var _mejs = _dereq_(7);
 
-		},
-		onkeydown: function(player, media, e) {
-			if (player.hasFocus && player.options.enableKeyboard) {
-				// find a matching key
-				for (var i = 0, il = player.options.keyActions.length; i < il; i++) {
-					var keyAction = player.options.keyActions[i];
+var _mejs2 = _interopRequireDefault(_mejs);
 
-					for (var j = 0, jl = keyAction.keys.length; j < jl; j++) {
-						if (e.keyCode == keyAction.keys[j]) {
-							if (typeof(e.preventDefault) == "function") e.preventDefault();
-							keyAction.action(player, media, e.keyCode, e);
-							return false;
-						}
-					}
-				}
-			}
+var _renderer = _dereq_(8);
 
-			return true;
-		},
+var _general = _dereq_(27);
 
-		findTracks: function() {
-			var t = this,
-				tracktags = t.$media.find('track');
+var _constants = _dereq_(25);
 
-			// store for use by plugins
-			t.tracks = [];
-			tracktags.each(function(index, track) {
+var _media = _dereq_(28);
 
-				track = $(track);
+var _dom = _dereq_(26);
 
-				t.tracks.push({
-					srclang: (track.attr('srclang')) ? track.attr('srclang').toLowerCase() : '',
-					src: track.attr('src'),
-					kind: track.attr('kind'),
-					label: track.attr('label') || '',
-					entries: [],
-					isLoaded: false
-				});
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var NativeFlv = {
+
+	promise: null,
+
+	load: function load(settings) {
+		if (typeof flvjs !== 'undefined') {
+			NativeFlv.promise = new Promise(function (resolve) {
+				resolve();
+			}).then(function () {
+				NativeFlv._createPlayer(settings);
 			});
-		},
-		changeSkin: function(className) {
-			this.container[0].className = 'mejs-container ' + className;
-			this.setPlayerSize(this.width, this.height);
-			this.setControlsSize();
-		},
-		play: function() {
-			this.load();
-			this.media.play();
-		},
-		pause: function() {
-			try {
-				this.media.pause();
-			} catch (e) {}
-		},
-		load: function() {
-			if (!this.isLoaded) {
-				this.media.load();
-			}
+		} else {
+			settings.options.path = typeof settings.options.path === 'string' ? settings.options.path : 'https://cdnjs.cloudflare.com/ajax/libs/flv.js/1.3.2/flv.min.js';
 
-			this.isLoaded = true;
-		},
-		setMuted: function(muted) {
-			this.media.setMuted(muted);
-		},
-		setCurrentTime: function(time) {
-			this.media.setCurrentTime(time);
-		},
-		getCurrentTime: function() {
-			return this.media.currentTime;
-		},
-		setVolume: function(volume) {
-			this.media.setVolume(volume);
-		},
-		getVolume: function() {
-			return this.media.volume;
-		},
-		setSrc: function(src) {
-			var
-				t = this;
+			NativeFlv.promise = NativeFlv.promise || (0, _dom.loadScript)(settings.options.path);
+			NativeFlv.promise.then(function () {
+				NativeFlv._createPlayer(settings);
+			});
+		}
 
-			// If using YouTube, its API is different to load a specific source
-			if (t.media.pluginType === 'youtube') {
-				var videoId;
+		return NativeFlv.promise;
+	},
 
-				if (typeof src !== 'string') {
-					var i, media;
+	_createPlayer: function _createPlayer(settings) {
+		flvjs.LoggingControl.enableDebug = settings.options.debug;
+		flvjs.LoggingControl.enableVerbose = settings.options.debug;
+		var player = flvjs.createPlayer(settings.options);
+		_window2.default['__ready__' + settings.id](player);
+		return player;
+	}
+};
 
-					for (i=0; i<src.length; i++) {
-						media = src[i];
-						if (this.canPlayType(media.type)) {
-							src = media.src;
-							break;
-						}
-					}
-				}
+var FlvNativeRenderer = {
+	name: 'native_flv',
+	options: {
+		prefix: 'native_flv',
+		flv: {
+			path: 'https://cdnjs.cloudflare.com/ajax/libs/flv.js/1.3.2/flv.min.js',
 
-				// youtu.be url from share button
-				if (src.lastIndexOf('youtu.be') !== -1) {
-					videoId = src.substr(src.lastIndexOf('/') + 1);
+			cors: true,
+			debug: false
+		}
+	},
 
-					if (videoId.indexOf('?') !== -1) {
-						videoId = videoId.substr(0, videoId.indexOf('?'));
-					}
+	canPlayType: function canPlayType(type) {
+		return _constants.HAS_MSE && ['video/x-flv', 'video/flv'].indexOf(type.toLowerCase()) > -1;
+	},
 
-				} else {
-					// https://www.youtube.com/watch?v=
-					var videoIdMatch = src.match(/[?&]v=([^&#]+)|&|#|$/);
+	create: function create(mediaElement, options, mediaFiles) {
 
-					if (videoIdMatch) {
-						videoId = videoIdMatch[1];
-					}
-				}
+		var originalNode = mediaElement.originalNode,
+		    id = mediaElement.id + '_' + options.prefix;
 
-				if (t.media.getAttribute('autoplay') !== null) {
-					t.media.pluginApi.loadVideoById(videoId);
-				} else {
-					t.media.pluginApi.cueVideoById(videoId);
-				}
+		var node = null,
+		    flvPlayer = null;
 
-			}
-			else {
-				t.media.setSrc(src);
+		node = originalNode.cloneNode(true);
+		options = Object.assign(options, mediaElement.options);
+
+		var props = _mejs2.default.html5media.properties,
+		    events = _mejs2.default.html5media.events.concat(['click', 'mouseover', 'mouseout']),
+		    attachNativeEvents = function attachNativeEvents(e) {
+			if (e.type !== 'error') {
+				var _event = (0, _general.createEvent)(e.type, mediaElement);
+				mediaElement.dispatchEvent(_event);
 			}
 		},
-		remove: function() {
-			var t = this, featureIndex, feature;
+		    assignGettersSetters = function assignGettersSetters(propName) {
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
 
-			t.container.prev('.mejs-offscreen').remove();
+			node['get' + capName] = function () {
+				return flvPlayer !== null ? node[propName] : null;
+			};
 
-			// invoke features cleanup
-			for (featureIndex in t.options.features) {
-				feature = t.options.features[featureIndex];
-				if (t['clean' + feature]) {
-					try {
-						t['clean' + feature](t);
-					} catch (e) {
-						// TODO: report control error
-						//throw e;
-						//
-						//
+			node['set' + capName] = function (value) {
+				if (_mejs2.default.html5media.readOnlyProperties.indexOf(propName) === -1) {
+					if (propName === 'src') {
+						node[propName] = (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value.src ? value.src : value;
+						if (flvPlayer !== null) {
+							var _flvOptions = {};
+							_flvOptions.type = 'flv';
+							_flvOptions.url = value;
+							_flvOptions.cors = options.flv.cors;
+							_flvOptions.debug = options.flv.debug;
+							_flvOptions.path = options.flv.path;
+
+							flvPlayer.destroy();
+							for (var i = 0, total = events.length; i < total; i++) {
+								node.removeEventListener(events[i], attachNativeEvents);
+							}
+							flvPlayer = NativeFlv._createPlayer({
+								options: _flvOptions,
+								id: id
+							});
+							flvPlayer.attachMediaElement(node);
+							flvPlayer.load();
+						}
+					} else {
+						node[propName] = value;
 					}
 				}
-			}
+			};
+		};
 
-			// grab video and put it back in place
-			if (!t.isDynamic) {
-				t.$media.prop('controls', true);
-				// detach events from the video
-				// TODO: detach event listeners better than this;
-				//		 also detach ONLY the events attached by this plugin!
-				t.$node.clone().insertBefore(t.container).show();
-				t.$node.remove();
-			} else {
-				t.$node.insertBefore(t.container);
-			}
+		for (var i = 0, total = props.length; i < total; i++) {
+			assignGettersSetters(props[i]);
+		}
 
-			if (t.media.pluginType !== 'native') {
-				t.media.remove();
-			}
+		_window2.default['__ready__' + id] = function (_flvPlayer) {
+			mediaElement.flvPlayer = flvPlayer = _flvPlayer;
+
+			var flvEvents = flvjs.Events,
+			    assignEvents = function assignEvents(eventName) {
+				if (eventName === 'loadedmetadata') {
+					flvPlayer.unload();
+					flvPlayer.detachMediaElement();
+					flvPlayer.attachMediaElement(node);
+					flvPlayer.load();
+				}
 
-			// Remove the player from the mejs.players object so that pauseOtherPlayers doesn't blow up when trying to pause a non existance flash api.
-			delete mejs.players[t.id];
+				node.addEventListener(eventName, attachNativeEvents);
+			};
 
-			if (typeof t.container == 'object') {
-				t.container.remove();
+			for (var _i = 0, _total = events.length; _i < _total; _i++) {
+				assignEvents(events[_i]);
 			}
-			t.globalUnbind();
-			delete t.node.player;
-		},
-		rebuildtracks: function(){
-			var t = this;
-			t.findTracks();
-			t.buildtracks(t, t.controls, t.layers, t.media);
-		},
-		resetSize: function(){
-			var t = this;
-			// webkit has trouble doing this without a delay
-			setTimeout(function () {
-				//
-				t.setPlayerSize(t.width, t.height);
-				t.setControlsSize();
-			}, 50);
-		}
-	};
 
-	(function(){
-		var rwindow = /^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/;
+			var assignFlvEvents = function assignFlvEvents(name, data) {
+				if (name === 'error') {
+					var message = data[0] + ': ' + data[1] + ' ' + data[2].msg;
+					mediaElement.generateError(message, node.src);
+				} else {
+					var _event2 = (0, _general.createEvent)(name, mediaElement);
+					_event2.data = data;
+					mediaElement.dispatchEvent(_event2);
+				}
+			};
+
+			var _loop = function _loop(eventType) {
+				if (flvEvents.hasOwnProperty(eventType)) {
+					flvPlayer.on(flvEvents[eventType], function () {
+						for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+							args[_key] = arguments[_key];
+						}
 
-		function splitEvents(events, id) {
-			// add player ID as an event namespace so it's easier to unbind them all later
-			var ret = {d: [], w: []};
-			$.each((events || '').split(' '), function(k, v){
-				var eventname = v + '.' + id;
-				if (eventname.indexOf('.') === 0) {
-					ret.d.push(eventname);
-					ret.w.push(eventname);
+						return assignFlvEvents(flvEvents[eventType], args);
+					});
 				}
-				else {
-					ret[rwindow.test(v) ? 'w' : 'd'].push(eventname);
+			};
+
+			for (var eventType in flvEvents) {
+				_loop(eventType);
+			}
+		};
+
+		if (mediaFiles && mediaFiles.length > 0) {
+			for (var _i2 = 0, _total2 = mediaFiles.length; _i2 < _total2; _i2++) {
+				if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i2].type)) {
+					node.setAttribute('src', mediaFiles[_i2].src);
+					break;
 				}
-			});
-			ret.d = ret.d.join(' ');
-			ret.w = ret.w.join(' ');
-			return ret;
+			}
 		}
 
-		mejs.MediaElementPlayer.prototype.globalBind = function(events, data, callback) {
-			var t = this;
-			var doc = t.node ? t.node.ownerDocument : document;
+		node.setAttribute('id', id);
 
-			events = splitEvents(events, t.id);
-			if (events.d) $(doc).bind(events.d, data, callback);
-			if (events.w) $(window).bind(events.w, data, callback);
-		};
+		originalNode.parentNode.insertBefore(node, originalNode);
+		originalNode.autoplay = false;
+		originalNode.style.display = 'none';
 
-		mejs.MediaElementPlayer.prototype.globalUnbind = function(events, callback) {
-			var t = this;
-			var doc = t.node ? t.node.ownerDocument : document;
+		var flvOptions = {};
+		flvOptions.type = 'flv';
+		flvOptions.url = node.src;
+		flvOptions.cors = options.flv.cors;
+		flvOptions.debug = options.flv.debug;
+		flvOptions.path = options.flv.path;
 
-			events = splitEvents(events, t.id);
-			if (events.d) $(doc).unbind(events.d, callback);
-			if (events.w) $(window).unbind(events.w, callback);
+		node.setSize = function (width, height) {
+			node.style.width = width + 'px';
+			node.style.height = height + 'px';
+			return node;
 		};
-	})();
 
-	// turn into jQuery plugin
-	if (typeof $ != 'undefined') {
-		$.fn.mediaelementplayer = function (options) {
-			if (options === false) {
-				this.each(function () {
-					var player = $(this).data('mediaelementplayer');
-					if (player) {
-						player.remove();
-					}
-					$(this).removeData('mediaelementplayer');
-				});
+		node.hide = function () {
+			if (flvPlayer !== null) {
+				flvPlayer.pause();
 			}
-			else {
-				this.each(function () {
-					$(this).data('mediaelementplayer', new mejs.MediaElementPlayer(this, options));
-				});
+			node.style.display = 'none';
+			return node;
+		};
+
+		node.show = function () {
+			node.style.display = '';
+			return node;
+		};
+
+		node.destroy = function () {
+			if (flvPlayer !== null) {
+				flvPlayer.destroy();
 			}
-			return this;
 		};
 
+		var event = (0, _general.createEvent)('rendererready', node);
+		mediaElement.dispatchEvent(event);
 
-		$(document).ready(function() {
-			// auto enable using JSON attribute
-			$('.mejs-player').mediaelementplayer();
-		});
+		mediaElement.promises.push(NativeFlv.load({
+			options: flvOptions,
+			id: id
+		}));
+
+		return node;
 	}
+};
+
+_media.typeChecks.push(function (url) {
+	return ~url.toLowerCase().indexOf('.flv') ? 'video/flv' : null;
+});
+
+_renderer.renderer.add(FlvNativeRenderer);
+
+},{"25":25,"26":26,"27":27,"28":28,"3":3,"7":7,"8":8}],22:[function(_dereq_,module,exports){
+'use strict';
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _window = _dereq_(3);
+
+var _window2 = _interopRequireDefault(_window);
 
-	// push out to window
-	window.MediaElementPlayer = mejs.MediaElementPlayer;
+var _mejs = _dereq_(7);
 
-})(mejs.$);
+var _mejs2 = _interopRequireDefault(_mejs);
 
-(function($) {
+var _renderer = _dereq_(8);
 
-	$.extend(mejs.MepDefaults, {
-		playText: '',
-		pauseText: ''
-	});
+var _general = _dereq_(27);
 
+var _constants = _dereq_(25);
 
-	// PLAY/pause BUTTON
-	$.extend(MediaElementPlayer.prototype, {
-		buildplaypause: function(player, controls, layers, media) {
-			var 
-				t = this,
-				op = t.options,
-				playTitle = op.playText ? op.playText : mejs.i18n.t('mejs.play'),
-				pauseTitle = op.pauseText ? op.pauseText : mejs.i18n.t('mejs.pause'),
-				play =
-				$('<div class="mejs-button mejs-playpause-button mejs-play" >' +
-					'<button type="button" aria-controls="' + t.id + '" title="' + playTitle + '" aria-label="' + pauseTitle + '"></button>' +
-				'</div>')
-				.appendTo(controls)
-				.click(function(e) {
-					e.preventDefault();
-				
-					if (media.paused) {
-						media.play();
-					} else {
-						media.pause();
-					}
-					
-					return false;
-				}),
-				play_btn = play.find('button');
+var _media = _dereq_(28);
 
+var _dom = _dereq_(26);
 
-			function togglePlayPause(which) {
-				if ('play' === which) {
-					play.removeClass('mejs-play').addClass('mejs-pause');
-					play_btn.attr({
-						'title': pauseTitle,
-						'aria-label': pauseTitle
-					});
-				} else {
-					play.removeClass('mejs-pause').addClass('mejs-play');
-					play_btn.attr({
-						'title': playTitle,
-						'aria-label': playTitle
-					});
-				}
-			};
-			togglePlayPause('pse');
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
+var NativeHls = {
 
-			media.addEventListener('play',function() {
-				togglePlayPause('play');
-			}, false);
-			media.addEventListener('playing',function() {
-				togglePlayPause('play');
-			}, false);
+	promise: null,
 
+	load: function load(settings) {
+		if (typeof Hls !== 'undefined') {
+			NativeHls.promise = new Promise(function (resolve) {
+				resolve();
+			}).then(function () {
+				NativeHls._createPlayer(settings);
+			});
+		} else {
+			settings.options.path = typeof settings.options.path === 'string' ? settings.options.path : 'https://cdnjs.cloudflare.com/ajax/libs/hls.js/0.7.11/hls.min.js';
 
-			media.addEventListener('pause',function() {
-				togglePlayPause('pse');
-			}, false);
-			media.addEventListener('paused',function() {
-				togglePlayPause('pse');
-			}, false);
+			NativeHls.promise = NativeHls.promise || (0, _dom.loadScript)(settings.options.path);
+			NativeHls.promise.then(function () {
+				NativeHls._createPlayer(settings);
+			});
 		}
-	});
-	
-})(mejs.$);
 
-(function($) {
+		return NativeHls.promise;
+	},
 
-	$.extend(mejs.MepDefaults, {
-		stopText: 'Stop'
-	});
+	_createPlayer: function _createPlayer(settings) {
+		var player = new Hls(settings.options);
+		_window2.default['__ready__' + settings.id](player);
+		return player;
+	}
+};
 
-	// STOP BUTTON
-	$.extend(MediaElementPlayer.prototype, {
-		buildstop: function(player, controls, layers, media) {
-			var t = this;
+var HlsNativeRenderer = {
+	name: 'native_hls',
+	options: {
+		prefix: 'native_hls',
+		hls: {
+			path: 'https://cdnjs.cloudflare.com/ajax/libs/hls.js/0.7.11/hls.min.js',
 
-			$('<div class="mejs-button mejs-stop-button mejs-stop">' +
-					'<button type="button" aria-controls="' + t.id + '" title="' + t.options.stopText + '" aria-label="' + t.options.stopText + '"></button>' +
-				'</div>')
-				.appendTo(controls)
-				.click(function() {
-					if (!media.paused) {
-						media.pause();
-					}
-					if (media.currentTime > 0) {
-						media.setCurrentTime(0);
-                        media.pause();
-						controls.find('.mejs-time-current').width('0px');
-						controls.find('.mejs-time-handle').css('left', '0px');
-						controls.find('.mejs-time-float-current').html( mejs.Utility.secondsToTimeCode(0, player.options));
-						controls.find('.mejs-currenttime').html( mejs.Utility.secondsToTimeCode(0, player.options));
-						layers.find('.mejs-poster').show();
-					}
-				});
+			autoStartLoad: false,
+			debug: false
 		}
-	});
-	
-})(mejs.$);
+	},
 
-(function($) {
+	canPlayType: function canPlayType(type) {
+		return _constants.HAS_MSE && ['application/x-mpegurl', 'application/vnd.apple.mpegurl', 'audio/mpegurl', 'audio/hls', 'video/hls'].indexOf(type.toLowerCase()) > -1;
+	},
 
-	$.extend(mejs.MepDefaults, {
-		// Enable tooltip that shows time in progress bar
-		enableProgressTooltip: true,
-		progressHelpText: ''
-	});
+	create: function create(mediaElement, options, mediaFiles) {
 
-	// progress/loaded bar
-	$.extend(MediaElementPlayer.prototype, {
-		buildprogress: function(player, controls, layers, media) {
-
-			var
-				t = this,
-				mouseIsDown = false,
-				mouseIsOver = false,
-				lastKeyPressTime = 0,
-				startedPaused = false,
-				autoRewindInitial = player.options.autoRewind,
-				progressTitle = t.options.progressHelpText ? t.options.progressHelpText : mejs.i18n.t('mejs.time-help-text'),
-				tooltip = player.options.enableProgressTooltip ? '<span class="mejs-time-float">' +
-					'<span class="mejs-time-float-current">00:00</span>' +
-					'<span class="mejs-time-float-corner"></span>' +
-				'</span>' : "";
-
-			$('<div class="mejs-time-rail">' +
-				'<span  class="mejs-time-total mejs-time-slider">' +
-				//'<span class="mejs-offscreen">' + progressTitle + '</span>' +
-					'<span class="mejs-time-buffering"></span>' +
-					'<span class="mejs-time-loaded"></span>' +
-					'<span class="mejs-time-current"></span>' +
-					'<span class="mejs-time-handle"></span>' +
-					 tooltip +
-				'</span>' +
-			'</div>')
-				.appendTo(controls);
-			controls.find('.mejs-time-buffering').hide();
-
-			t.total = controls.find('.mejs-time-total');
-			t.loaded  = controls.find('.mejs-time-loaded');
-			t.current  = controls.find('.mejs-time-current');
-			t.handle  = controls.find('.mejs-time-handle');
-			t.timefloat  = controls.find('.mejs-time-float');
-			t.timefloatcurrent  = controls.find('.mejs-time-float-current');
-			t.slider = controls.find('.mejs-time-slider');
-
-			var handleMouseMove = function (e) {
-
-					var offset = t.total.offset(),
-						width = t.total.width(),
-						percentage = 0,
-						newTime = 0,
-						pos = 0,
-						x;
-
-					// mouse or touch position relative to the object
-					if (e.originalEvent && e.originalEvent.changedTouches) {
-						x = e.originalEvent.changedTouches[0].pageX;
-					} else if (e.changedTouches) { // for Zepto
-						x = e.changedTouches[0].pageX;
-					} else {
-						x = e.pageX;
-					}
+		var originalNode = mediaElement.originalNode,
+		    id = mediaElement.id + '_' + options.prefix,
+		    preload = originalNode.getAttribute('preload'),
+		    autoplay = originalNode.autoplay;
 
-					if (media.duration) {
-						if (x < offset.left) {
-							x = offset.left;
-						} else if (x > width + offset.left) {
-							x = width + offset.left;
-						}
+		var hlsPlayer = null,
+		    node = null;
 
-						pos = x - offset.left;
-						percentage = (pos / width);
-						newTime = (percentage <= 0.02) ? 0 : percentage * media.duration;
+		node = originalNode.cloneNode(true);
+		options = Object.assign(options, mediaElement.options);
+		options.hls.autoStartLoad = preload && preload !== 'none' || autoplay;
 
-						// seek to where the mouse is
-						if (mouseIsDown && newTime !== media.currentTime) {
-							media.setCurrentTime(newTime);
-						}
+		var props = _mejs2.default.html5media.properties,
+		    events = _mejs2.default.html5media.events.concat(['click', 'mouseover', 'mouseout']),
+		    attachNativeEvents = function attachNativeEvents(e) {
+			if (e.type !== 'error') {
+				var _event = (0, _general.createEvent)(e.type, mediaElement);
+				mediaElement.dispatchEvent(_event);
+			}
+		},
+		    assignGettersSetters = function assignGettersSetters(propName) {
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
 
-						// position floating time box
-						if (!mejs.MediaFeatures.hasTouch) {
-							t.timefloat.css('left', pos);
-							t.timefloatcurrent.html( mejs.Utility.secondsToTimeCode(newTime, player.options) );
-							t.timefloat.show();
-						}
-					}
-				},
-				// Accessibility for slider
-				updateSlider = function (e) {
-
-					var seconds = media.currentTime,
-						timeSliderText = mejs.i18n.t('mejs.time-slider'),
-						time = mejs.Utility.secondsToTimeCode(seconds, player.options),
-						duration = media.duration;
-
-					t.slider.attr({
-						'aria-label': timeSliderText,
-						'aria-valuemin': 0,
-						'aria-valuemax': duration,
-						'aria-valuenow': seconds,
-						'aria-valuetext': time,
-						'role': 'slider',
-						'tabindex': 0
-					});
+			node['get' + capName] = function () {
+				return hlsPlayer !== null ? node[propName] : null;
+			};
 
-				},
-				restartPlayer = function () {
-					var now = new Date();
-					if (now - lastKeyPressTime >= 1000) {
-						media.play();
+			node['set' + capName] = function (value) {
+				if (_mejs2.default.html5media.readOnlyProperties.indexOf(propName) === -1) {
+					if (propName === 'src') {
+						node[propName] = (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value.src ? value.src : value;
+						if (hlsPlayer !== null) {
+							hlsPlayer.destroy();
+							for (var i = 0, total = events.length; i < total; i++) {
+								node.removeEventListener(events[i], attachNativeEvents);
+							}
+							hlsPlayer = NativeHls._createPlayer({
+								options: options.hls,
+								id: id
+							});
+							hlsPlayer.loadSource(value);
+							hlsPlayer.attachMedia(node);
+						}
+					} else {
+						node[propName] = value;
 					}
-				};
+				}
+			};
+		};
 
-			t.slider.bind('focus', function (e) {
-				player.options.autoRewind = false;
-			});
+		for (var i = 0, total = props.length; i < total; i++) {
+			assignGettersSetters(props[i]);
+		}
 
-			t.slider.bind('blur', function (e) {
-				player.options.autoRewind = autoRewindInitial;
-			});
+		_window2.default['__ready__' + id] = function (_hlsPlayer) {
+			mediaElement.hlsPlayer = hlsPlayer = _hlsPlayer;
+			var hlsEvents = Hls.Events,
+			    assignEvents = function assignEvents(eventName) {
+				if (eventName === 'loadedmetadata') {
+					var url = mediaElement.originalNode.src;
+					hlsPlayer.detachMedia();
+					hlsPlayer.loadSource(url);
+					hlsPlayer.attachMedia(node);
+				}
 
-			t.slider.bind('keydown', function (e) {
+				node.addEventListener(eventName, attachNativeEvents);
+			};
 
-				if ((new Date() - lastKeyPressTime) >= 1000) {
-					startedPaused = media.paused;
+			for (var _i = 0, _total = events.length; _i < _total; _i++) {
+				assignEvents(events[_i]);
+			}
+
+			var recoverDecodingErrorDate = void 0,
+			    recoverSwapAudioCodecDate = void 0;
+			var assignHlsEvents = function assignHlsEvents(name, data) {
+				if (name === 'hlsError') {
+					console.warn(name, data);
+
+					if (data.fatal) {
+						switch (data.type) {
+							case 'mediaError':
+								var now = new Date().getTime();
+								if (!recoverDecodingErrorDate || now - recoverDecodingErrorDate > 3000) {
+									recoverDecodingErrorDate = new Date().getTime();
+									hlsPlayer.recoverMediaError();
+								} else if (!recoverSwapAudioCodecDate || now - recoverSwapAudioCodecDate > 3000) {
+									recoverSwapAudioCodecDate = new Date().getTime();
+									console.warn('Attempting to swap Audio Codec and recover from media error');
+									hlsPlayer.swapAudioCodec();
+									hlsPlayer.recoverMediaError();
+								} else {
+									var _message = 'Cannot recover, last media error recovery failed';
+									mediaElement.generateError(_message, node.src);
+									console.error(_message);
+								}
+								break;
+							case 'networkError':
+								var message = 'Network error';
+								mediaElement.generateError(message, node.src);
+								console.error(message);
+								break;
+							default:
+								hlsPlayer.destroy();
+								break;
+						}
+					}
+				} else {
+					var _event2 = (0, _general.createEvent)(name, mediaElement);
+					_event2.data = data;
+					mediaElement.dispatchEvent(_event2);
 				}
+			};
 
-				var keyCode = e.keyCode,
-					duration = media.duration,
-					seekTime = media.currentTime,
-					seekForward  = player.options.defaultSeekForwardInterval(media),
-					seekBackward = player.options.defaultSeekBackwardInterval(media);
+			var _loop = function _loop(eventType) {
+				if (hlsEvents.hasOwnProperty(eventType)) {
+					hlsPlayer.on(hlsEvents[eventType], function () {
+						for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+							args[_key] = arguments[_key];
+						}
 
-				switch (keyCode) {
-					case 37: // left
-					case 40: // Down
-						seekTime -= seekBackward;
-						break;
-					case 39: // Right
-					case 38: // Up
-						seekTime += seekForward;
-						break;
-					case 36: // Home
-						seekTime = 0;
-						break;
-					case 35: // end
-						seekTime = duration;
-						break;
-					case 32: // space
-					case 13: // enter
-						media.paused ? media.play() : media.pause();
-						return;
-					default:
-						return;
+						return assignHlsEvents(hlsEvents[eventType], args);
+					});
 				}
+			};
 
-				seekTime = seekTime < 0 ? 0 : (seekTime >= duration ? duration : Math.floor(seekTime));
-				lastKeyPressTime = new Date();
-				if (!startedPaused) {
-					media.pause();
-				}
+			for (var eventType in hlsEvents) {
+				_loop(eventType);
+			}
+		};
 
-				if (seekTime < media.duration && !startedPaused) {
-					setTimeout(restartPlayer, 1100);
+		if (mediaFiles && mediaFiles.length > 0) {
+			for (var _i2 = 0, _total2 = mediaFiles.length; _i2 < _total2; _i2++) {
+				if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i2].type)) {
+					node.setAttribute('src', mediaFiles[_i2].src);
+					break;
 				}
+			}
+		}
 
-				media.setCurrentTime(seekTime);
+		if (preload !== 'auto' && !autoplay) {
+			node.addEventListener('play', function () {
+				if (hlsPlayer !== null) {
+					hlsPlayer.startLoad();
+				}
+			});
 
-				e.preventDefault();
-				e.stopPropagation();
-				return false;
+			node.addEventListener('pause', function () {
+				if (hlsPlayer !== null) {
+					hlsPlayer.stopLoad();
+				}
 			});
+		}
 
+		node.setAttribute('id', id);
 
-			// handle clicks
-			//controls.find('.mejs-time-rail').delegate('span', 'click', handleMouseMove);
-			t.total
-				.bind('mousedown touchstart', function (e) {
-					// only handle left clicks or touch
-					if (e.which === 1 || e.which === 0) {
-						mouseIsDown = true;
-						handleMouseMove(e);
-						t.globalBind('mousemove.dur touchmove.dur', function(e) {
-							handleMouseMove(e);
-						});
-						t.globalBind('mouseup.dur touchend.dur', function (e) {
-							mouseIsDown = false;
-							if (typeof t.timefloat !== 'undefined') {
-								t.timefloat.hide();
-							}
-							t.globalUnbind('.dur');
-						});
-					}
-				})
-				.bind('mouseenter', function(e) {
-					mouseIsOver = true;
-					t.globalBind('mousemove.dur', function(e) {
-						handleMouseMove(e);
-					});
-					if (typeof t.timefloat !== 'undefined' && !mejs.MediaFeatures.hasTouch) {
-						t.timefloat.show();
-					}
-				})
-				.bind('mouseleave',function(e) {
-					mouseIsOver = false;
-					if (!mouseIsDown) {
-						t.globalUnbind('.dur');
-						if (typeof t.timefloat !== 'undefined') {
-							t.timefloat.hide();
-						}
-					}
-				});
+		originalNode.parentNode.insertBefore(node, originalNode);
+		originalNode.autoplay = false;
+		originalNode.style.display = 'none';
 
-			// loading
-			media.addEventListener('progress', function (e) {
-				player.setProgressRail(e);
-				player.setCurrentRail(e);
-			}, false);
+		node.setSize = function (width, height) {
+			node.style.width = width + 'px';
+			node.style.height = height + 'px';
+			return node;
+		};
 
-			// current time
-			media.addEventListener('timeupdate', function(e) {
-				player.setProgressRail(e);
-				player.setCurrentRail(e);
-				updateSlider(e);
-			}, false);
+		node.hide = function () {
+			node.pause();
+			node.style.display = 'none';
+			return node;
+		};
 
-			t.container.on('controlsresize', function(e) {
-				player.setProgressRail(e);
-				player.setCurrentRail(e);
-			});
-		},
-		setProgressRail: function(e) {
-
-			var
-				t = this,
-				target = (e !== undefined) ? e.target : t.media,
-				percent = null;
-
-			// newest HTML5 spec has buffered array (FF4, Webkit)
-			if (target && target.buffered && target.buffered.length > 0 && target.buffered.end && target.duration) {
-				// account for a real array with multiple values - always read the end of the last buffer
-				percent = target.buffered.end(target.buffered.length - 1) / target.duration;
-			} 
-			// Some browsers (e.g., FF3.6 and Safari 5) cannot calculate target.bufferered.end()
-			// to be anything other than 0. If the byte count is available we use this instead.
-			// Browsers that support the else if do not seem to have the bufferedBytes value and
-			// should skip to there. Tested in Safari 5, Webkit head, FF3.6, Chrome 6, IE 7/8.
-			else if (target && target.bytesTotal !== undefined && target.bytesTotal > 0 && target.bufferedBytes !== undefined) {
-				percent = target.bufferedBytes / target.bytesTotal;
-			}
-			// Firefox 3 with an Ogg file seems to go this way
-			else if (e && e.lengthComputable && e.total !== 0) {
-				percent = e.loaded / e.total;
-			}
+		node.show = function () {
+			node.style.display = '';
+			return node;
+		};
 
-			// finally update the progress bar
-			if (percent !== null) {
-				percent = Math.min(1, Math.max(0, percent));
-				// update loaded bar
-				if (t.loaded && t.total) {
-					t.loaded.width(t.total.width() * percent);
-				}
+		node.destroy = function () {
+			if (hlsPlayer !== null) {
+				hlsPlayer.stopLoad();
+				hlsPlayer.destroy();
 			}
-		},
-		setCurrentRail: function() {
+		};
 
-			var t = this;
-		
-			if (t.media.currentTime !== undefined && t.media.duration) {
+		var event = (0, _general.createEvent)('rendererready', node);
+		mediaElement.dispatchEvent(event);
 
-				// update bar and handle
-				if (t.total && t.handle) {
-					var 
-						newWidth = Math.round(t.total.width() * t.media.currentTime / t.media.duration),
-						handlePos = newWidth - Math.round(t.handle.outerWidth(true) / 2);
+		mediaElement.promises.push(NativeHls.load({
+			options: options.hls,
+			id: id
+		}));
 
-					t.current.width(newWidth);
-					t.handle.css('left', handlePos);
-				}
-			}
+		return node;
+	}
+};
 
-		}
-	});
-})(mejs.$);
-
-(function($) {
-	
-	// options
-	$.extend(mejs.MepDefaults, {
-		duration: -1,
-		timeAndDurationSeparator: '<span> | </span>'
-	});
+_media.typeChecks.push(function (url) {
+	return ~url.toLowerCase().indexOf('.m3u8') ? 'application/x-mpegURL' : null;
+});
 
+_renderer.renderer.add(HlsNativeRenderer);
 
-	// current and duration 00:00 / 00:00
-	$.extend(MediaElementPlayer.prototype, {
-		buildcurrent: function(player, controls, layers, media) {
-			var t = this;
-			
-			$('<div class="mejs-time" role="timer" aria-live="off">' +
-					'<span class="mejs-currenttime">' + 
-						mejs.Utility.secondsToTimeCode(0, player.options) +
-                    '</span>'+
-				'</div>')
-			.appendTo(controls);
-			
-			t.currenttime = t.controls.find('.mejs-currenttime');
-
-			media.addEventListener('timeupdate',function() {
-				if (t.controlsAreVisible) {
-					player.updateCurrent();
-				}
-
-			}, false);
-		},
+},{"25":25,"26":26,"27":27,"28":28,"3":3,"7":7,"8":8}],23:[function(_dereq_,module,exports){
+'use strict';
 
+var _window = _dereq_(3);
 
-		buildduration: function(player, controls, layers, media) {
-			var t = this;
-			
-			if (controls.children().last().find('.mejs-currenttime').length > 0) {
-				$(t.options.timeAndDurationSeparator +
-					'<span class="mejs-duration">' + 
-						mejs.Utility.secondsToTimeCode(t.options.duration, t.options) +
-					'</span>')
-					.appendTo(controls.find('.mejs-time'));
-			} else {
+var _window2 = _interopRequireDefault(_window);
 
-				// add class to current time
-				controls.find('.mejs-currenttime').parent().addClass('mejs-currenttime-container');
-				
-				$('<div class="mejs-time mejs-duration-container">'+
-					'<span class="mejs-duration">' + 
-						mejs.Utility.secondsToTimeCode(t.options.duration, t.options) +
-					'</span>' +
-				'</div>')
-				.appendTo(controls);
-			}
-			
-			t.durationD = t.controls.find('.mejs-duration');
+var _document = _dereq_(2);
 
-			media.addEventListener('timeupdate',function() {
-				if (t.controlsAreVisible) {
-					player.updateDuration();
-				}
-			}, false);
-		},
-		
-		updateCurrent:  function() {
-			var t = this;
-			
-			var currentTime = t.media.currentTime;
-			
-			if (isNaN(currentTime)) {
-				currentTime = 0;
-			}
+var _document2 = _interopRequireDefault(_document);
 
-			if (t.currenttime) {
-				t.currenttime.html(mejs.Utility.secondsToTimeCode(currentTime, t.options));
-			}
-		},
-		
-		updateDuration: function() {
-			var t = this;
-			
-			var duration = t.media.duration;
-			if (t.options.duration > 0) {
-				duration = t.options.duration;
-			}
-			
-			if (isNaN(duration)) {
-				duration = 0;
-			}
+var _mejs = _dereq_(7);
 
-			//Toggle the long video class if the video is longer than an hour.
-			t.container.toggleClass("mejs-long-video", duration > 3600);
-			
-			if (t.durationD && duration > 0) {
-				t.durationD.html(mejs.Utility.secondsToTimeCode(duration, t.options));
-			}		
-		}
-	});
+var _mejs2 = _interopRequireDefault(_mejs);
 
-})(mejs.$);
+var _renderer = _dereq_(8);
 
-(function ($) {
+var _general = _dereq_(27);
 
-	$.extend(mejs.MepDefaults, {
-		muteText: mejs.i18n.t('mejs.mute-toggle'),
-		allyVolumeControlText: mejs.i18n.t('mejs.volume-help-text'),
-		hideVolumeOnTouchDevices: true,
+var _constants = _dereq_(25);
 
-		audioVolume: 'horizontal',
-		videoVolume: 'vertical'
-	});
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-	$.extend(MediaElementPlayer.prototype, {
-		buildvolume: function (player, controls, layers, media) {
+var HtmlMediaElement = {
+	name: 'html5',
+	options: {
+		prefix: 'html5'
+	},
 
-			// Android and iOS don't support volume controls
-			if ((mejs.MediaFeatures.isAndroid || mejs.MediaFeatures.isiOS) && this.options.hideVolumeOnTouchDevices)
-				return;
+	canPlayType: function canPlayType(type) {
 
-			var t = this,
-				mode = (t.isVideo) ? t.options.videoVolume : t.options.audioVolume,
-				mute = (mode == 'horizontal') ?
-
-					// horizontal version
-					$('<div class="mejs-button mejs-volume-button mejs-mute">' +
-						'<button type="button" aria-controls="' + t.id +
-						'" title="' + t.options.muteText +
-						'" aria-label="' + t.options.muteText +
-						'"></button>' +
-						'</div>' +
-						'<a href="javascript:void(0);" class="mejs-horizontal-volume-slider">' + // outer background
-						'<span class="mejs-offscreen">' + t.options.allyVolumeControlText + '</span>' +
-						'<div class="mejs-horizontal-volume-total"></div>' + // line background
-						'<div class="mejs-horizontal-volume-current"></div>' + // current volume
-						'<div class="mejs-horizontal-volume-handle"></div>' + // handle
-						'</a>'
-					)
-					.appendTo(controls) :
-
-					// vertical version
-					$('<div class="mejs-button mejs-volume-button mejs-mute">' +
-						'<button type="button" aria-controls="' + t.id +
-						'" title="' + t.options.muteText +
-						'" aria-label="' + t.options.muteText +
-						'"></button>' +
-						'<a href="javascript:void(0);" class="mejs-volume-slider">' + // outer background
-						'<span class="mejs-offscreen">' + t.options.allyVolumeControlText + '</span>' +
-						'<div class="mejs-volume-total"></div>' + // line background
-						'<div class="mejs-volume-current"></div>' + // current volume
-						'<div class="mejs-volume-handle"></div>' + // handle
-						'</a>' +
-						'</div>')
-					.appendTo(controls),
-				volumeSlider = t.container.find('.mejs-volume-slider, .mejs-horizontal-volume-slider'),
-				volumeTotal = t.container.find('.mejs-volume-total, .mejs-horizontal-volume-total'),
-				volumeCurrent = t.container.find('.mejs-volume-current, .mejs-horizontal-volume-current'),
-				volumeHandle = t.container.find('.mejs-volume-handle, .mejs-horizontal-volume-handle'),
-
-				positionVolumeHandle = function (volume, secondTry) {
-
-					if (!volumeSlider.is(':visible') && typeof secondTry == 'undefined') {
-						volumeSlider.show();
-						positionVolumeHandle(volume, true);
-						volumeSlider.hide();
-						return;
-					}
+		var mediaElement = _document2.default.createElement('video');
 
-					// correct to 0-1
-					volume = Math.max(0, volume);
-					volume = Math.min(volume, 1);
+		if (_constants.IS_ANDROID && /\/mp(3|4)$/i.test(type) || ~['application/x-mpegurl', 'vnd.apple.mpegurl', 'audio/mpegurl', 'audio/hls', 'video/hls'].indexOf(type.toLowerCase()) && _constants.SUPPORTS_NATIVE_HLS) {
+			return 'yes';
+		} else if (mediaElement.canPlayType) {
+			return mediaElement.canPlayType(type.toLowerCase()).replace(/no/, '');
+		} else {
+			return '';
+		}
+	},
 
-					// adjust mute button style
-					if (volume === 0) {
-						mute.removeClass('mejs-mute').addClass('mejs-unmute');
-						mute.children('button').attr('title', mejs.i18n.t('mejs.unmute')).attr('aria-label', mejs.i18n.t('mejs.unmute'));
-					} else {
-						mute.removeClass('mejs-unmute').addClass('mejs-mute');
-						mute.children('button').attr('title', mejs.i18n.t('mejs.mute')).attr('aria-label', mejs.i18n.t('mejs.mute'));
-					}
+	create: function create(mediaElement, options, mediaFiles) {
 
-					// top/left of full size volume slider background
-					var totalPosition = volumeTotal.position();
-					// position slider
-					if (mode == 'vertical') {
-						var
-							// height of the full size volume slider background
-							totalHeight = volumeTotal.height(),
+		var id = mediaElement.id + '_' + options.prefix;
 
-							// the new top position based on the current volume
-							// 70% volume on 100px height == top:30px
-							newTop = totalHeight - (totalHeight * volume);
+		var node = null;
 
-						// handle
-						volumeHandle.css('top', Math.round(totalPosition.top + newTop - (volumeHandle.height() / 2)));
+		if (mediaElement.originalNode === undefined || mediaElement.originalNode === null) {
+			node = _document2.default.createElement('audio');
+			mediaElement.appendChild(node);
+		} else {
+			node = mediaElement.originalNode;
+		}
 
-						// show the current visibility
-						volumeCurrent.height(totalHeight - newTop);
-						volumeCurrent.css('top', totalPosition.top + newTop);
-					} else {
-						var
-							// height of the full size volume slider background
-							totalWidth = volumeTotal.width(),
+		node.setAttribute('id', id);
 
-							// the new left position based on the current volume
-							newLeft = totalWidth * volume;
+		var props = _mejs2.default.html5media.properties,
+		    assignGettersSetters = function assignGettersSetters(propName) {
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
 
-						// handle
-						volumeHandle.css('left', Math.round(totalPosition.left + newLeft - (volumeHandle.width() / 2)));
+			node['get' + capName] = function () {
+				return node[propName];
+			};
 
-						// rezize the current part of the volume bar
-						volumeCurrent.width(Math.round(newLeft));
-					}
-				},
-				handleVolumeMove = function (e) {
+			node['set' + capName] = function (value) {
+				if (_mejs2.default.html5media.readOnlyProperties.indexOf(propName) === -1) {
+					node[propName] = value;
+				}
+			};
+		};
 
-					var volume = null,
-						totalOffset = volumeTotal.offset();
+		for (var i = 0, total = props.length; i < total; i++) {
+			assignGettersSetters(props[i]);
+		}
 
-					// calculate the new volume based on the moust position
-					if (mode === 'vertical') {
+		var events = _mejs2.default.html5media.events.concat(['click', 'mouseover', 'mouseout']),
+		    assignEvents = function assignEvents(eventName) {
+			node.addEventListener(eventName, function (e) {
+				var event = (0, _general.createEvent)(e.type, mediaElement);
+				mediaElement.dispatchEvent(event);
+			});
+		};
 
-						var
-							railHeight = volumeTotal.height(),
-							newY = e.pageY - totalOffset.top;
+		for (var _i = 0, _total = events.length; _i < _total; _i++) {
+			assignEvents(events[_i]);
+		}
 
-						volume = (railHeight - newY) / railHeight;
+		node.setSize = function (width, height) {
+			node.style.width = width + 'px';
+			node.style.height = height + 'px';
+			return node;
+		};
 
-						// the controls just hide themselves (usually when mouse moves too far up)
-						if (totalOffset.top === 0 || totalOffset.left === 0) {
-							return;
-						}
+		node.hide = function () {
+			node.style.display = 'none';
 
-					} else {
-						var
-							railWidth = volumeTotal.width(),
-							newX = e.pageX - totalOffset.left;
+			return node;
+		};
 
-						volume = newX / railWidth;
-					}
+		node.show = function () {
+			node.style.display = '';
 
-					// ensure the volume isn't outside 0-1
-					volume = Math.max(0, volume);
-					volume = Math.min(volume, 1);
+			return node;
+		};
 
-					// position the slider and handle
-					positionVolumeHandle(volume);
+		if (mediaFiles && mediaFiles.length > 0) {
+			for (var _i2 = 0, _total2 = mediaFiles.length; _i2 < _total2; _i2++) {
+				if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i2].type)) {
+					node.setAttribute('src', mediaFiles[_i2].src);
+					break;
+				}
+			}
+		}
 
-					// set the media object (this will trigger the volumechanged event)
-					if (volume === 0) {
-						media.setMuted(true);
-					} else {
-						media.setMuted(false);
-					}
-					media.setVolume(volume);
-				},
-				mouseIsDown = false,
-				mouseIsOver = false;
+		var event = (0, _general.createEvent)('rendererready', node);
+		mediaElement.dispatchEvent(event);
 
-			// SLIDER
+		return node;
+	}
+};
 
-			mute
-			.hover(function () {
-				volumeSlider.show();
-				mouseIsOver = true;
-			}, function () {
-				mouseIsOver = false;
+_window2.default.HtmlMediaElement = _mejs2.default.HtmlMediaElement = HtmlMediaElement;
 
-				if (!mouseIsDown && mode == 'vertical') {
-					volumeSlider.hide();
-				}
-			});
+_renderer.renderer.add(HtmlMediaElement);
 
-			var updateVolumeSlider = function (e) {
+},{"2":2,"25":25,"27":27,"3":3,"7":7,"8":8}],24:[function(_dereq_,module,exports){
+'use strict';
 
-				var volume = Math.floor(media.volume * 100);
+var _window = _dereq_(3);
 
-				volumeSlider.attr({
-					'aria-label': mejs.i18n.t('mejs.volume-slider'),
-					'aria-valuemin': 0,
-					'aria-valuemax': 100,
-					'aria-valuenow': volume,
-					'aria-valuetext': volume + '%',
-					'role': 'slider',
-					'tabindex': 0
-				});
+var _window2 = _interopRequireDefault(_window);
 
-			};
+var _document = _dereq_(2);
 
-			volumeSlider
-			.bind('mouseover', function () {
-				mouseIsOver = true;
-			})
-			.bind('mousedown', function (e) {
-				handleVolumeMove(e);
-				t.globalBind('mousemove.vol', function (e) {
-					handleVolumeMove(e);
-				});
-				t.globalBind('mouseup.vol', function () {
-					mouseIsDown = false;
-					t.globalUnbind('.vol');
+var _document2 = _interopRequireDefault(_document);
 
-					if (!mouseIsOver && mode == 'vertical') {
-						volumeSlider.hide();
-					}
-				});
-				mouseIsDown = true;
+var _mejs = _dereq_(7);
 
-				return false;
-			})
-			.bind('keydown', function (e) {
-				var keyCode = e.keyCode;
-				var volume = media.volume;
-				switch (keyCode) {
-					case 38: // Up
-						volume = Math.min(volume + 0.1, 1);
-						break;
-					case 40: // Down
-						volume = Math.max(0, volume - 0.1);
-						break;
-					default:
-						return true;
-				}
+var _mejs2 = _interopRequireDefault(_mejs);
 
-				mouseIsDown = false;
-				positionVolumeHandle(volume);
-				media.setVolume(volume);
-				return false;
-			});
+var _renderer = _dereq_(8);
 
-			// MUTE button
-			mute.find('button').click(function () {
-				media.setMuted(!media.muted);
-			});
+var _general = _dereq_(27);
 
-			//Keyboard input
-			mute.find('button').bind('focus', function () {
-				volumeSlider.show();
-			});
+var _media = _dereq_(28);
 
-			// listen for volume change events from other sources
-			media.addEventListener('volumechange', function (e) {
-				if (!mouseIsDown) {
-					if (media.muted) {
-						positionVolumeHandle(0);
-						mute.removeClass('mejs-mute').addClass('mejs-unmute');
-					} else {
-						positionVolumeHandle(media.volume);
-						mute.removeClass('mejs-unmute').addClass('mejs-mute');
-					}
-				}
-				updateVolumeSlider(e);
-			}, false);
+var _dom = _dereq_(26);
 
-			// mutes the media and sets the volume icon muted if the initial volume is set to 0
-			if (player.options.startVolume === 0) {
-				media.setMuted(true);
-			}
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-			// shim gets the startvolume as a parameter, but we have to set it on the native <video> and <audio> elements
-			if (media.pluginType === 'native') {
-				media.setVolume(player.options.startVolume);
-			}
+var YouTubeApi = {
+	isIframeStarted: false,
 
-			t.container.on('controlsresize', function () {
-				if (media.muted) {
-					positionVolumeHandle(0);
-					mute.removeClass('mejs-mute').addClass('mejs-unmute');
-				} else {
-					positionVolumeHandle(media.volume);
-					mute.removeClass('mejs-unmute').addClass('mejs-mute');
-				}
-			});
+	isIframeLoaded: false,
+
+	iframeQueue: [],
+
+	enqueueIframe: function enqueueIframe(settings) {
+		YouTubeApi.isLoaded = typeof YT !== 'undefined' && YT.loaded;
+
+		if (YouTubeApi.isLoaded) {
+			YouTubeApi.createIframe(settings);
+		} else {
+			YouTubeApi.loadIframeApi();
+			YouTubeApi.iframeQueue.push(settings);
 		}
-	});
+	},
 
-})(mejs.$);
+	loadIframeApi: function loadIframeApi() {
+		if (!YouTubeApi.isIframeStarted) {
+			(0, _dom.loadScript)('https://www.youtube.com/player_api');
+			YouTubeApi.isIframeStarted = true;
+		}
+	},
 
-(function($) {
+	iFrameReady: function iFrameReady() {
 
-	$.extend(mejs.MepDefaults, {
-		usePluginFullScreen: true,
-		newWindowCallback: function() { return '';},
-		fullscreenText: ''
-	});
+		YouTubeApi.isLoaded = true;
+		YouTubeApi.isIframeLoaded = true;
 
-	$.extend(MediaElementPlayer.prototype, {
+		while (YouTubeApi.iframeQueue.length > 0) {
+			var settings = YouTubeApi.iframeQueue.pop();
+			YouTubeApi.createIframe(settings);
+		}
+	},
 
-		isFullScreen: false,
+	createIframe: function createIframe(settings) {
+		return new YT.Player(settings.containerId, settings);
+	},
 
-		isNativeFullScreen: false,
+	getYouTubeId: function getYouTubeId(url) {
 
-		isInIframe: false,
-							
-		// Possible modes
-		// (1) 'native-native' 	HTML5 video  + browser fullscreen (IE10+, etc.)
-		// (2) 'plugin-native' 	plugin video + browser fullscreen (fails in some versions of Firefox)
-		// (3) 'fullwindow' 	Full window (retains all UI)
-		// usePluginFullScreen = true
-		// (4) 'plugin-click' 	Flash 1 - click through with pointer events
-		// (5) 'plugin-hover' 	Flash 2 - hover popup in flash (IE6-8)		
-		fullscreenMode: '',
-
-		buildfullscreen: function(player, controls, layers, media) {
-
-			if (!player.isVideo)
-				return;
-				
-			player.isInIframe = (window.location != window.parent.location);	
-		
-			// detect on start
-			media.addEventListener('loadstart', function() { player.detectFullscreenMode(); });
-				
-			// build button
-			var t = this,
-				hideTimeout = null,
-				fullscreenTitle = t.options.fullscreenText ? t.options.fullscreenText : mejs.i18n.t('mejs.fullscreen'),
-				fullscreenBtn =
-					$('<div class="mejs-button mejs-fullscreen-button">' +
-						'<button type="button" aria-controls="' + t.id + '" title="' + fullscreenTitle + '" aria-label="' + fullscreenTitle + '"></button>' +
-					'</div>')
-					.appendTo(controls)
-					.on('click', function() {
-						
-						// toggle fullscreen
-						var isFullScreen = (mejs.MediaFeatures.hasTrueNativeFullScreen && mejs.MediaFeatures.isFullScreen()) || player.isFullScreen;
-	
-						if (isFullScreen) {
-							player.exitFullScreen();
-						} else {
-							player.enterFullScreen();
-						}
-					})										
-					.on('mouseover', function() {
-						
-						// very old browsers with a plugin
-						if (t.fullscreenMode == 'plugin-hover') {						
-							if (hideTimeout !== null) {
-								clearTimeout(hideTimeout);
-								delete hideTimeout;
-							}
-	
-							var buttonPos = fullscreenBtn.offset(),
-								containerPos = player.container.offset();
-	
-							media.positionFullscreenButton(buttonPos.left - containerPos.left, buttonPos.top - containerPos.top, true);
-						}
+		var youTubeId = '';
 
-					})
-					.on('mouseout', function() {
+		if (url.indexOf('?') > 0) {
+			youTubeId = YouTubeApi.getYouTubeIdFromParam(url);
 
-						if (t.fullscreenMode == 'plugin-hover') {						
-							if (hideTimeout !== null) {
-								clearTimeout(hideTimeout);
-								delete hideTimeout;
-							}
-	
-							hideTimeout = setTimeout(function() {
-								media.hideFullscreenButton();
-							}, 1500);
-						}
+			if (youTubeId === '') {
+				youTubeId = YouTubeApi.getYouTubeIdFromUrl(url);
+			}
+		} else {
+			youTubeId = YouTubeApi.getYouTubeIdFromUrl(url);
+		}
 
-					});
+		var id = youTubeId.substring(youTubeId.lastIndexOf('/') + 1);
+		youTubeId = id.split('?');
+		return youTubeId[0];
+	},
 
-					
+	getYouTubeIdFromParam: function getYouTubeIdFromParam(url) {
 
-			player.fullscreenBtn = fullscreenBtn;
+		if (url === undefined || url === null || !url.trim().length) {
+			return null;
+		}
 
-			t.globalBind('keydown',function (e) {
-				if (e.keyCode == 27 && ((mejs.MediaFeatures.hasTrueNativeFullScreen && mejs.MediaFeatures.isFullScreen()) || t.isFullScreen)) {
-					player.exitFullScreen();
-				}
-			});
-			
-			t.normalHeight = 0;
-			t.normalWidth = 0;					
-					
-			// setup native fullscreen event
-			if (mejs.MediaFeatures.hasTrueNativeFullScreen) {
-
-				// chrome doesn't alays fire this in an iframe
-				var fullscreenChanged = function(e) {
-					if (player.isFullScreen) {
-						if (mejs.MediaFeatures.isFullScreen()) {
-							player.isNativeFullScreen = true;
-							// reset the controls once we are fully in full screen
-							player.setControlsSize();
-						} else {
-							player.isNativeFullScreen = false;
-							// when a user presses ESC
-							// make sure to put the player back into place
-							player.exitFullScreen();
-						}
-					}
-				};
+		var parts = url.split('?'),
+		    parameters = parts[1].split('&');
 
-				player.globalBind(mejs.MediaFeatures.fullScreenEventName, fullscreenChanged);
-			}
+		var youTubeId = '';
 
-		},
-		
-		detectFullscreenMode: function() {
-			
-			var t = this,
-				mode = '',
-				features = mejs.MediaFeatures;
-			
-			if (features.hasTrueNativeFullScreen && t.media.pluginType === 'native') {
-				mode = 'native-native';
-			} else if (features.hasTrueNativeFullScreen && t.media.pluginType !== 'native' && !features.hasFirefoxPluginMovingProblem) {
-				mode = 'plugin-native';					
-			} else if (t.usePluginFullScreen) { 
-				if (mejs.MediaFeatures.supportsPointerEvents) {
-					mode = 'plugin-click';
-					// this needs some special setup
-					t.createPluginClickThrough();				
-				} else { 
-					mode = 'plugin-hover';
-				}
-				
-			} else {
-				mode = 'fullwindow';
+		for (var i = 0, total = parameters.length; i < total; i++) {
+			var paramParts = parameters[i].split('=');
+			if (paramParts[0] === 'v') {
+				youTubeId = paramParts[1];
+				break;
 			}
-			
-			
-			t.fullscreenMode = mode;		
-			return mode;
-		},
-		
-		isPluginClickThroughCreated: false,
-		
-		createPluginClickThrough: function() {
-				
-			var t = this;
-			
-			// don't build twice
-			if (t.isPluginClickThroughCreated) {
-				return;
-			}	
-
-			// allows clicking through the fullscreen button and controls down directly to Flash
-
-			/*
-			 When a user puts his mouse over the fullscreen button, we disable the controls so that mouse events can go down to flash (pointer-events)
-			 We then put a divs over the video and on either side of the fullscreen button
-			 to capture mouse movement and restore the controls once the mouse moves outside of the fullscreen button
-			*/
-
-			var fullscreenIsDisabled = false,
-				restoreControls = function() {
-					if (fullscreenIsDisabled) {
-						// hide the hovers
-						for (var i in hoverDivs) {
-							hoverDivs[i].hide();
-						}
+		}
 
-						// restore the control bar
-						t.fullscreenBtn.css('pointer-events', '');
-						t.controls.css('pointer-events', '');
+		return youTubeId;
+	},
 
-						// prevent clicks from pausing video
-						t.media.removeEventListener('click', t.clickToPlayPauseCallback);
+	getYouTubeIdFromUrl: function getYouTubeIdFromUrl(url) {
 
-						// store for later
-						fullscreenIsDisabled = false;
-					}
-				},
-				hoverDivs = {},
-				hoverDivNames = ['top', 'left', 'right', 'bottom'],
-				i, len,
-				positionHoverDivs = function() {
-					var fullScreenBtnOffsetLeft = fullscreenBtn.offset().left - t.container.offset().left,
-						fullScreenBtnOffsetTop = fullscreenBtn.offset().top - t.container.offset().top,
-						fullScreenBtnWidth = fullscreenBtn.outerWidth(true),
-						fullScreenBtnHeight = fullscreenBtn.outerHeight(true),
-						containerWidth = t.container.width(),
-						containerHeight = t.container.height();
-
-					for (i in hoverDivs) {
-						hoverDivs[i].css({position: 'absolute', top: 0, left: 0}); //, backgroundColor: '#f00'});
-					}
+		if (url === undefined || url === null || !url.trim().length) {
+			return null;
+		}
 
-					// over video, but not controls
-					hoverDivs['top']
-						.width( containerWidth )
-						.height( fullScreenBtnOffsetTop );
-
-					// over controls, but not the fullscreen button
-					hoverDivs['left']
-						.width( fullScreenBtnOffsetLeft )
-						.height( fullScreenBtnHeight )
-						.css({top: fullScreenBtnOffsetTop});
-
-					// after the fullscreen button
-					hoverDivs['right']
-						.width( containerWidth - fullScreenBtnOffsetLeft - fullScreenBtnWidth )
-						.height( fullScreenBtnHeight )
-						.css({top: fullScreenBtnOffsetTop,
-							 left: fullScreenBtnOffsetLeft + fullScreenBtnWidth});
-
-					// under the fullscreen button
-					hoverDivs['bottom']
-						.width( containerWidth )
-						.height( containerHeight - fullScreenBtnHeight - fullScreenBtnOffsetTop )
-						.css({top: fullScreenBtnOffsetTop + fullScreenBtnHeight});
-				};
+		var parts = url.split('?');
+		url = parts[0];
+		return url.substring(url.lastIndexOf('/') + 1);
+	},
 
-			t.globalBind('resize', function() {
-				positionHoverDivs();
-			});
+	getYouTubeNoCookieUrl: function getYouTubeNoCookieUrl(url) {
+		if (url === undefined || url === null || !url.trim().length || url.indexOf('//www.youtube') === -1) {
+			return url;
+		}
 
-			for (i = 0, len = hoverDivNames.length; i < len; i++) {
-				hoverDivs[hoverDivNames[i]] = $('<div class="mejs-fullscreen-hover" />').appendTo(t.container).mouseover(restoreControls).hide();
-			}
+		var parts = url.split('/');
+		parts[2] = parts[2].replace('.com', '-nocookie.com');
+		return parts.join('/');
+	}
+};
 
-			// on hover, kill the fullscreen button's HTML handling, allowing clicks down to Flash
-			fullscreenBtn.on('mouseover',function() {
+var YouTubeIframeRenderer = {
+	name: 'youtube_iframe',
 
-				if (!t.isFullScreen) {
+	options: {
+		prefix: 'youtube_iframe',
 
-					var buttonPos = fullscreenBtn.offset(),
-						containerPos = player.container.offset();
+		youtube: {
+			autoplay: 0,
+			controls: 0,
+			disablekb: 1,
+			end: 0,
+			loop: 0,
+			modestbranding: 0,
+			playsinline: 0,
+			rel: 0,
+			showinfo: 0,
+			start: 0,
+			iv_load_policy: 3,
 
-					// move the button in Flash into place
-					media.positionFullscreenButton(buttonPos.left - containerPos.left, buttonPos.top - containerPos.top, false);
+			nocookie: false,
 
-					// allows click through
-					t.fullscreenBtn.css('pointer-events', 'none');
-					t.controls.css('pointer-events', 'none');
+			imageQuality: null
+		}
+	},
 
-					// restore click-to-play
-					t.media.addEventListener('click', t.clickToPlayPauseCallback);
+	canPlayType: function canPlayType(type) {
+		return ~['video/youtube', 'video/x-youtube'].indexOf(type.toLowerCase());
+	},
 
-					// show the divs that will restore things
-					for (i in hoverDivs) {
-						hoverDivs[i].show();
+	create: function create(mediaElement, options, mediaFiles) {
+
+		var youtube = {},
+		    apiStack = [],
+		    readyState = 4;
+
+		var youTubeApi = null,
+		    paused = true,
+		    ended = false,
+		    youTubeIframe = null,
+		    volume = 1;
+
+		youtube.options = options;
+		youtube.id = mediaElement.id + '_' + options.prefix;
+		youtube.mediaElement = mediaElement;
+
+		var props = _mejs2.default.html5media.properties,
+		    assignGettersSetters = function assignGettersSetters(propName) {
+
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+			youtube['get' + capName] = function () {
+				if (youTubeApi !== null) {
+					var value = null;
+
+					switch (propName) {
+						case 'currentTime':
+							return youTubeApi.getCurrentTime();
+						case 'duration':
+							return youTubeApi.getDuration();
+						case 'volume':
+							volume = youTubeApi.getVolume() / 100;
+							return volume;
+						case 'paused':
+							return paused;
+						case 'ended':
+							return ended;
+						case 'muted':
+							return youTubeApi.isMuted();
+						case 'buffered':
+							var percentLoaded = youTubeApi.getVideoLoadedFraction(),
+							    duration = youTubeApi.getDuration();
+							return {
+								start: function start() {
+									return 0;
+								},
+								end: function end() {
+									return percentLoaded * duration;
+								},
+								length: 1
+							};
+						case 'src':
+							return youTubeApi.getVideoUrl();
+						case 'readyState':
+							return readyState;
 					}
 
-					positionHoverDivs();
-
-					fullscreenIsDisabled = true;
+					return value;
+				} else {
+					return null;
 				}
+			};
 
-			});
+			youtube['set' + capName] = function (value) {
+				if (youTubeApi !== null) {
+					switch (propName) {
+						case 'src':
+							var url = typeof value === 'string' ? value : value[0].src,
+							    _videoId = YouTubeApi.getYouTubeId(url);
 
-			// restore controls anytime the user enters or leaves fullscreen
-			media.addEventListener('fullscreenchange', function(e) {
-				t.isFullScreen = !t.isFullScreen;
-				// don't allow plugin click to pause video - messes with
-				// plugin's controls
-				if (t.isFullScreen) {
-					t.media.removeEventListener('click', t.clickToPlayPauseCallback);
+							if (mediaElement.originalNode.autoplay) {
+								youTubeApi.loadVideoById(_videoId);
+							} else {
+								youTubeApi.cueVideoById(_videoId);
+							}
+							break;
+						case 'currentTime':
+							youTubeApi.seekTo(value);
+							break;
+						case 'muted':
+							if (value) {
+								youTubeApi.mute();
+							} else {
+								youTubeApi.unMute();
+							}
+							setTimeout(function () {
+								var event = (0, _general.createEvent)('volumechange', youtube);
+								mediaElement.dispatchEvent(event);
+							}, 50);
+							break;
+						case 'volume':
+							volume = value;
+							youTubeApi.setVolume(value * 100);
+							setTimeout(function () {
+								var event = (0, _general.createEvent)('volumechange', youtube);
+								mediaElement.dispatchEvent(event);
+							}, 50);
+							break;
+						case 'readyState':
+							var event = (0, _general.createEvent)('canplay', youtube);
+							mediaElement.dispatchEvent(event);
+							break;
+						default:
+							
+							break;
+					}
 				} else {
-					t.media.addEventListener('click', t.clickToPlayPauseCallback);
+					apiStack.push({ type: 'set', propName: propName, value: value });
 				}
-				restoreControls();
-			});
+			};
+		};
 
+		for (var i = 0, total = props.length; i < total; i++) {
+			assignGettersSetters(props[i]);
+		}
+
+		var methods = _mejs2.default.html5media.methods,
+		    assignMethods = function assignMethods(methodName) {
+			youtube[methodName] = function () {
+				if (youTubeApi !== null) {
+					switch (methodName) {
+						case 'play':
+							paused = false;
+							return youTubeApi.playVideo();
+						case 'pause':
+							paused = true;
+							return youTubeApi.pauseVideo();
+						case 'load':
+							return null;
+					}
+				} else {
+					apiStack.push({ type: 'call', methodName: methodName });
+				}
+			};
+		};
 
-			// the mouseout event doesn't work on the fullscren button, because we already killed the pointer-events
-			// so we use the document.mousemove event to restore controls when the mouse moves outside the fullscreen button
+		for (var _i = 0, _total = methods.length; _i < _total; _i++) {
+			assignMethods(methods[_i]);
+		}
 
-			t.globalBind('mousemove', function(e) {
+		var youtubeContainer = _document2.default.createElement('div');
+		youtubeContainer.id = youtube.id;
 
-				// if the mouse is anywhere but the fullsceen button, then restore it all
-				if (fullscreenIsDisabled) {
+		if (youtube.options.youtube.nocookie) {
+			mediaElement.originalNode.src = YouTubeApi.getYouTubeNoCookieUrl(mediaFiles[0].src);
+		}
 
-					var fullscreenBtnPos = fullscreenBtn.offset();
+		mediaElement.originalNode.parentNode.insertBefore(youtubeContainer, mediaElement.originalNode);
+		mediaElement.originalNode.style.display = 'none';
+
+		var isAudio = mediaElement.originalNode.tagName.toLowerCase() === 'audio',
+		    height = isAudio ? '1' : mediaElement.originalNode.height,
+		    width = isAudio ? '1' : mediaElement.originalNode.width,
+		    videoId = YouTubeApi.getYouTubeId(mediaFiles[0].src),
+		    youtubeSettings = {
+			id: youtube.id,
+			containerId: youtubeContainer.id,
+			videoId: videoId,
+			height: height,
+			width: width,
+			playerVars: Object.assign({
+				controls: 0,
+				rel: 0,
+				disablekb: 1,
+				showinfo: 0,
+				modestbranding: 0,
+				html5: 1,
+				playsinline: 0,
+				start: 0,
+				end: 0,
+				iv_load_policy: 3
+			}, youtube.options.youtube),
+			origin: _window2.default.location.host,
+			events: {
+				onReady: function onReady(e) {
+					mediaElement.youTubeApi = youTubeApi = e.target;
+					mediaElement.youTubeState = {
+						paused: true,
+						ended: false
+					};
 
+					if (apiStack.length) {
+						for (var _i2 = 0, _total2 = apiStack.length; _i2 < _total2; _i2++) {
 
-					if (e.pageY < fullscreenBtnPos.top || e.pageY > fullscreenBtnPos.top + fullscreenBtn.outerHeight(true) ||
-						e.pageX < fullscreenBtnPos.left || e.pageX > fullscreenBtnPos.left + fullscreenBtn.outerWidth(true)
-						) {
+							var stackItem = apiStack[_i2];
 
-						fullscreenBtn.css('pointer-events', '');
-						t.controls.css('pointer-events', '');
+							if (stackItem.type === 'set') {
+								var propName = stackItem.propName,
+								    capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
 
-						fullscreenIsDisabled = false;
+								youtube['set' + capName](stackItem.value);
+							} else if (stackItem.type === 'call') {
+								youtube[stackItem.methodName]();
+							}
+						}
 					}
-				}
-			});
 
+					youTubeIframe = youTubeApi.getIframe();
 
-			t.isPluginClickThroughCreated = true;
-		},		
+					if (mediaElement.originalNode.getAttribute('muted')) {
+						youTubeApi.mute();
+					}
 
-		cleanfullscreen: function(player) {
-			player.exitFullScreen();
-		},
+					var events = ['mouseover', 'mouseout'],
+					    assignEvents = function assignEvents(e) {
+						var newEvent = (0, _general.createEvent)(e.type, youtube);
+						mediaElement.dispatchEvent(newEvent);
+					};
 
-        containerSizeTimeout: null,
+					for (var _i3 = 0, _total3 = events.length; _i3 < _total3; _i3++) {
+						youTubeIframe.addEventListener(events[_i3], assignEvents, false);
+					}
 
-		enterFullScreen: function() {
+					var initEvents = ['rendererready', 'loadedmetadata', 'loadeddata', 'canplay'];
 
-			var t = this;
+					for (var _i4 = 0, _total4 = initEvents.length; _i4 < _total4; _i4++) {
+						var event = (0, _general.createEvent)(initEvents[_i4], youtube);
+						mediaElement.dispatchEvent(event);
+					}
+				},
+				onStateChange: function onStateChange(e) {
+					var events = [];
+
+					switch (e.data) {
+						case -1:
+							events = ['loadedmetadata'];
+							paused = true;
+							ended = false;
+							break;
+						case 0:
+							events = ['ended'];
+							paused = false;
+							ended = !youtube.options.youtube.loop;
+							if (!youtube.options.youtube.loop) {
+								youtube.stopInterval();
+							}
+							break;
+						case 1:
+							events = ['play', 'playing'];
+							paused = false;
+							ended = false;
+							youtube.startInterval();
+							break;
+						case 2:
+							events = ['pause'];
+							paused = true;
+							ended = false;
+							youtube.stopInterval();
+							break;
+						case 3:
+							events = ['progress'];
+							ended = false;
+							break;
+						case 5:
+							events = ['loadeddata', 'loadedmetadata', 'canplay'];
+							paused = true;
+							ended = false;
+							break;
+					}
 
-			if (mejs.MediaFeatures.isiOS && mejs.MediaFeatures.hasiOSFullScreen && typeof t.media.webkitEnterFullscreen === 'function') {
-			    t.media.webkitEnterFullscreen();
-				return;
+					for (var _i5 = 0, _total5 = events.length; _i5 < _total5; _i5++) {
+						var event = (0, _general.createEvent)(events[_i5], youtube);
+						mediaElement.dispatchEvent(event);
+					}
+				},
+				onError: function onError(e) {
+					var event = (0, _general.createEvent)('error', youtube);
+					event.data = e.data;
+					mediaElement.dispatchEvent(event);
+				}
 			}
+		};
 
-			// set it to not show scroll bars so 100% will work
-            $(document.documentElement).addClass('mejs-fullscreen');
+		if (isAudio) {
+			youtubeSettings.playerVars.playsinline = 1;
+		}
 
-			// store sizing
-			t.normalHeight = t.container.height();
-			t.normalWidth = t.container.width();
+		if (mediaElement.originalNode.autoplay) {
+			youtubeSettings.playerVars.autoplay = 1;
+		}
 
+		if (mediaElement.originalNode.loop) {
+			youtubeSettings.playerVars.loop = 1;
+		}
 
+		YouTubeApi.enqueueIframe(youtubeSettings);
 
-			// attempt to do true fullscreen
-			if (t.fullscreenMode === 'native-native' || t.fullscreenMode === 'plugin-native') {
+		youtube.onEvent = function (eventName, player, _youTubeState) {
+			if (_youTubeState !== null && _youTubeState !== undefined) {
+				mediaElement.youTubeState = _youTubeState;
+			}
+		};
 
-				mejs.MediaFeatures.requestFullScreen(t.container[0]);
-				//return;
+		youtube.setSize = function (width, height) {
+			if (youTubeApi !== null) {
+				youTubeApi.setSize(width, height);
+			}
+		};
+		youtube.hide = function () {
+			youtube.stopInterval();
+			youtube.pause();
+			if (youTubeIframe) {
+				youTubeIframe.style.display = 'none';
+			}
+		};
+		youtube.show = function () {
+			if (youTubeIframe) {
+				youTubeIframe.style.display = '';
+			}
+		};
+		youtube.destroy = function () {
+			youTubeApi.destroy();
+		};
+		youtube.interval = null;
 
-				if (t.isInIframe) {
-					// sometimes exiting from fullscreen doesn't work
-					// notably in Chrome <iframe>. Fixed in version 17
-					setTimeout(function checkFullscreen() {
+		youtube.startInterval = function () {
+			youtube.interval = setInterval(function () {
+				var event = (0, _general.createEvent)('timeupdate', youtube);
+				mediaElement.dispatchEvent(event);
+			}, 250);
+		};
+		youtube.stopInterval = function () {
+			if (youtube.interval) {
+				clearInterval(youtube.interval);
+			}
+		};
+		youtube.getPosterUrl = function () {
+			var quality = options.youtube.imageQuality,
+			    resolutions = ['default', 'hqdefault', 'mqdefault', 'sddefault', 'maxresdefault'],
+			    id = YouTubeApi.getYouTubeId(mediaElement.originalNode.src);
+			return quality && resolutions.indexOf(quality) > -1 && id ? 'https://img.youtube.com/vi/' + id + '/' + quality + '.jpg' : '';
+		};
 
-						if (t.isNativeFullScreen) {
-							var percentErrorMargin = 0.002, // 0.2%
-								windowWidth = $(window).width(),
-								screenWidth = screen.width,
-								absDiff = Math.abs(screenWidth - windowWidth),
-								marginError = screenWidth * percentErrorMargin;
+		return youtube;
+	}
+};
 
-							// check if the video is suddenly not really fullscreen
-							if (absDiff > marginError) {
-								// manually exit
-								t.exitFullScreen();
-							} else {
-								// test again
-								setTimeout(checkFullscreen, 500);
-							}
-						}
-						
-					}, 1000);
-				}
-				
-			} else if (t.fullscreeMode == 'fullwindow') {				
-				// move into position
-				
-			}			
-			
-			// make full size
-			t.container
-				.addClass('mejs-container-fullscreen')
-				.width('100%')
-				.height('100%');
-				//.css({position: 'fixed', left: 0, top: 0, right: 0, bottom: 0, overflow: 'hidden', width: '100%', height: '100%', 'z-index': 1000});
-
-			// Only needed for safari 5.1 native full screen, can cause display issues elsewhere
-			// Actually, it seems to be needed for IE8, too
-			//if (mejs.MediaFeatures.hasTrueNativeFullScreen) {
-				t.containerSizeTimeout = setTimeout(function() {
-					t.container.css({width: '100%', height: '100%'});
-					t.setControlsSize();
-				}, 500);
-			//}
+_window2.default.onYouTubePlayerAPIReady = function () {
+	YouTubeApi.iFrameReady();
+};
 
-			if (t.media.pluginType === 'native') {
-				t.$media
-					.width('100%')
-					.height('100%');
-			} else {
-				t.container.find('.mejs-shim')
-					.width('100%')
-					.height('100%');	
-				
-				setTimeout(function() {
-					var win = $(window),
-						winW = win.width(),
-						winH = win.height();
-							
-					t.media.setVideoSize(winW,winH);			
-				}, 500);
-			}
+_media.typeChecks.push(function (url) {
+	return (/\/\/(www\.youtube|youtu\.?be)/i.test(url) ? 'video/x-youtube' : null
+	);
+});
 
-			t.layers.children('div')
-				.width('100%')
-				.height('100%');
+_renderer.renderer.add(YouTubeIframeRenderer);
 
-			if (t.fullscreenBtn) {
-				t.fullscreenBtn
-					.removeClass('mejs-fullscreen')
-					.addClass('mejs-unfullscreen');
-			}
+},{"2":2,"26":26,"27":27,"28":28,"3":3,"7":7,"8":8}],25:[function(_dereq_,module,exports){
+'use strict';
 
-			t.setControlsSize();
-			t.isFullScreen = true;
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
+exports.cancelFullScreen = exports.requestFullScreen = exports.isFullScreen = exports.FULLSCREEN_EVENT_NAME = exports.HAS_NATIVE_FULLSCREEN_ENABLED = exports.HAS_TRUE_NATIVE_FULLSCREEN = exports.HAS_IOS_FULLSCREEN = exports.HAS_MS_NATIVE_FULLSCREEN = exports.HAS_MOZ_NATIVE_FULLSCREEN = exports.HAS_WEBKIT_NATIVE_FULLSCREEN = exports.HAS_NATIVE_FULLSCREEN = exports.SUPPORTS_NATIVE_HLS = exports.SUPPORT_POINTER_EVENTS = exports.HAS_MSE = exports.IS_STOCK_ANDROID = exports.IS_SAFARI = exports.IS_FIREFOX = exports.IS_CHROME = exports.IS_EDGE = exports.IS_IE = exports.IS_ANDROID = exports.IS_IOS = exports.IS_IPOD = exports.IS_IPHONE = exports.IS_IPAD = exports.UA = exports.NAV = undefined;
 
-			var zoomFactor = Math.min(screen.width / t.width, screen.height / t.height);
-			t.container.find('.mejs-captions-text').css('font-size', zoomFactor * 100 + '%');
-			t.container.find('.mejs-captions-text').css('line-height', 'normal');
-			t.container.find('.mejs-captions-position').css('bottom', '45px');
+var _window = _dereq_(3);
 
-			t.container.trigger('enteredfullscreen');
-		},
+var _window2 = _interopRequireDefault(_window);
 
-		exitFullScreen: function() {
+var _document = _dereq_(2);
 
-			var t = this;
+var _document2 = _interopRequireDefault(_document);
 
-            // Prevent container from attempting to stretch a second time
-            clearTimeout(t.containerSizeTimeout);
+var _mejs = _dereq_(7);
 
-			// firefox can't adjust plugins
-			/*
-			if (t.media.pluginType !== 'native' && mejs.MediaFeatures.isFirefox) {
-				t.media.setFullscreen(false);
-				//player.isFullScreen = false;
-				return;
-			}
-			*/
+var _mejs2 = _interopRequireDefault(_mejs);
 
-			// come out of native fullscreen
-			if (mejs.MediaFeatures.hasTrueNativeFullScreen && (mejs.MediaFeatures.isFullScreen() || t.isFullScreen)) {
-				mejs.MediaFeatures.cancelFullScreen();
-			}
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-			// restore scroll bars to document
-            $(document.documentElement).removeClass('mejs-fullscreen');
+var NAV = exports.NAV = _window2.default.navigator;
+var UA = exports.UA = NAV.userAgent.toLowerCase();
+var IS_IPAD = exports.IS_IPAD = /ipad/i.test(UA) && !_window2.default.MSStream;
+var IS_IPHONE = exports.IS_IPHONE = /iphone/i.test(UA) && !_window2.default.MSStream;
+var IS_IPOD = exports.IS_IPOD = /ipod/i.test(UA) && !_window2.default.MSStream;
+var IS_IOS = exports.IS_IOS = /ipad|iphone|ipod/i.test(UA) && !_window2.default.MSStream;
+var IS_ANDROID = exports.IS_ANDROID = /android/i.test(UA);
+var IS_IE = exports.IS_IE = /(trident|microsoft)/i.test(NAV.appName);
+var IS_EDGE = exports.IS_EDGE = 'msLaunchUri' in NAV && !('documentMode' in _document2.default);
+var IS_CHROME = exports.IS_CHROME = /chrome/i.test(UA);
+var IS_FIREFOX = exports.IS_FIREFOX = /firefox/i.test(UA);
+var IS_SAFARI = exports.IS_SAFARI = /safari/i.test(UA) && !IS_CHROME;
+var IS_STOCK_ANDROID = exports.IS_STOCK_ANDROID = /^mozilla\/\d+\.\d+\s\(linux;\su;/i.test(UA);
+var HAS_MSE = exports.HAS_MSE = 'MediaSource' in _window2.default;
+var SUPPORT_POINTER_EVENTS = exports.SUPPORT_POINTER_EVENTS = function () {
+	var element = _document2.default.createElement('x'),
+	    documentElement = _document2.default.documentElement,
+	    getComputedStyle = _window2.default.getComputedStyle;
 
-			t.container
-				.removeClass('mejs-container-fullscreen')
-				.width(t.normalWidth)
-				.height(t.normalHeight);
+	if (!('pointerEvents' in element.style)) {
+		return false;
+	}
 
-			if (t.media.pluginType === 'native') {
-				t.$media
-					.width(t.normalWidth)
-					.height(t.normalHeight);
-			} else {
-				t.container.find('.mejs-shim')
-					.width(t.normalWidth)
-					.height(t.normalHeight);
+	element.style.pointerEvents = 'auto';
+	element.style.pointerEvents = 'x';
+	documentElement.appendChild(element);
+	var supports = getComputedStyle && getComputedStyle(element, '').pointerEvents === 'auto';
+	element.remove();
+	return !!supports;
+}();
 
-				t.media.setVideoSize(t.normalWidth, t.normalHeight);
-			}
+var html5Elements = ['source', 'track', 'audio', 'video'];
+var video = void 0;
 
-			t.layers.children('div')
-				.width(t.normalWidth)
-				.height(t.normalHeight);
+for (var i = 0, total = html5Elements.length; i < total; i++) {
+	video = _document2.default.createElement(html5Elements[i]);
+}
 
-			t.fullscreenBtn
-				.removeClass('mejs-unfullscreen')
-				.addClass('mejs-fullscreen');
+var SUPPORTS_NATIVE_HLS = exports.SUPPORTS_NATIVE_HLS = IS_SAFARI || IS_ANDROID && (IS_CHROME || IS_STOCK_ANDROID) || IS_IE && /edge/i.test(UA);
 
-			t.setControlsSize();
-			t.isFullScreen = false;
+var hasiOSFullScreen = video.webkitEnterFullscreen !== undefined;
 
-			t.container.find('.mejs-captions-text').css('font-size','');
-			t.container.find('.mejs-captions-text').css('line-height', '');
-			t.container.find('.mejs-captions-position').css('bottom', '');
+var hasNativeFullscreen = video.requestFullscreen !== undefined;
 
-			t.container.trigger('exitedfullscreen');
-		}
-	});
+if (hasiOSFullScreen && /mac os x 10_5/i.test(UA)) {
+	hasNativeFullscreen = false;
+	hasiOSFullScreen = false;
+}
 
-})(mejs.$);
+var hasWebkitNativeFullScreen = video.webkitRequestFullScreen !== undefined;
+var hasMozNativeFullScreen = video.mozRequestFullScreen !== undefined;
+var hasMsNativeFullScreen = video.msRequestFullscreen !== undefined;
+var hasTrueNativeFullScreen = hasWebkitNativeFullScreen || hasMozNativeFullScreen || hasMsNativeFullScreen;
+var nativeFullScreenEnabled = hasTrueNativeFullScreen;
+var fullScreenEventName = '';
+var isFullScreen = void 0,
+    requestFullScreen = void 0,
+    cancelFullScreen = void 0;
+
+if (hasMozNativeFullScreen) {
+	nativeFullScreenEnabled = _document2.default.mozFullScreenEnabled;
+} else if (hasMsNativeFullScreen) {
+	nativeFullScreenEnabled = _document2.default.msFullscreenEnabled;
+}
 
-(function($) {
+if (IS_CHROME) {
+	hasiOSFullScreen = false;
+}
 
-	// Speed
-	$.extend(mejs.MepDefaults, {
+if (hasTrueNativeFullScreen) {
+	if (hasWebkitNativeFullScreen) {
+		fullScreenEventName = 'webkitfullscreenchange';
+	} else if (hasMozNativeFullScreen) {
+		fullScreenEventName = 'mozfullscreenchange';
+	} else if (hasMsNativeFullScreen) {
+		fullScreenEventName = 'MSFullscreenChange';
+	}
 
-		// We also support to pass object like this:
-		// [{name: 'Slow', value: '0.75'}, {name: 'Normal', value: '1.00'}, ...]
-		speeds: ['2.00', '1.50', '1.25', '1.00', '0.75'],
+	exports.isFullScreen = isFullScreen = function isFullScreen() {
+		if (hasMozNativeFullScreen) {
+			return _document2.default.mozFullScreen;
+		} else if (hasWebkitNativeFullScreen) {
+			return _document2.default.webkitIsFullScreen;
+		} else if (hasMsNativeFullScreen) {
+			return _document2.default.msFullscreenElement !== null;
+		}
+	};
 
-		defaultSpeed: '1.00',
-		
-		speedChar: 'x'
+	exports.requestFullScreen = requestFullScreen = function requestFullScreen(el) {
+		if (hasWebkitNativeFullScreen) {
+			el.webkitRequestFullScreen();
+		} else if (hasMozNativeFullScreen) {
+			el.mozRequestFullScreen();
+		} else if (hasMsNativeFullScreen) {
+			el.msRequestFullscreen();
+		}
+	};
 
-	});
+	exports.cancelFullScreen = cancelFullScreen = function cancelFullScreen() {
+		if (hasWebkitNativeFullScreen) {
+			_document2.default.webkitCancelFullScreen();
+		} else if (hasMozNativeFullScreen) {
+			_document2.default.mozCancelFullScreen();
+		} else if (hasMsNativeFullScreen) {
+			_document2.default.msExitFullscreen();
+		}
+	};
+}
 
-	$.extend(MediaElementPlayer.prototype, {
+var HAS_NATIVE_FULLSCREEN = exports.HAS_NATIVE_FULLSCREEN = hasNativeFullscreen;
+var HAS_WEBKIT_NATIVE_FULLSCREEN = exports.HAS_WEBKIT_NATIVE_FULLSCREEN = hasWebkitNativeFullScreen;
+var HAS_MOZ_NATIVE_FULLSCREEN = exports.HAS_MOZ_NATIVE_FULLSCREEN = hasMozNativeFullScreen;
+var HAS_MS_NATIVE_FULLSCREEN = exports.HAS_MS_NATIVE_FULLSCREEN = hasMsNativeFullScreen;
+var HAS_IOS_FULLSCREEN = exports.HAS_IOS_FULLSCREEN = hasiOSFullScreen;
+var HAS_TRUE_NATIVE_FULLSCREEN = exports.HAS_TRUE_NATIVE_FULLSCREEN = hasTrueNativeFullScreen;
+var HAS_NATIVE_FULLSCREEN_ENABLED = exports.HAS_NATIVE_FULLSCREEN_ENABLED = nativeFullScreenEnabled;
+var FULLSCREEN_EVENT_NAME = exports.FULLSCREEN_EVENT_NAME = fullScreenEventName;
+exports.isFullScreen = isFullScreen;
+exports.requestFullScreen = requestFullScreen;
+exports.cancelFullScreen = cancelFullScreen;
+
+
+_mejs2.default.Features = _mejs2.default.Features || {};
+_mejs2.default.Features.isiPad = IS_IPAD;
+_mejs2.default.Features.isiPod = IS_IPOD;
+_mejs2.default.Features.isiPhone = IS_IPHONE;
+_mejs2.default.Features.isiOS = _mejs2.default.Features.isiPhone || _mejs2.default.Features.isiPad;
+_mejs2.default.Features.isAndroid = IS_ANDROID;
+_mejs2.default.Features.isIE = IS_IE;
+_mejs2.default.Features.isEdge = IS_EDGE;
+_mejs2.default.Features.isChrome = IS_CHROME;
+_mejs2.default.Features.isFirefox = IS_FIREFOX;
+_mejs2.default.Features.isSafari = IS_SAFARI;
+_mejs2.default.Features.isStockAndroid = IS_STOCK_ANDROID;
+_mejs2.default.Features.hasMSE = HAS_MSE;
+_mejs2.default.Features.supportsNativeHLS = SUPPORTS_NATIVE_HLS;
+_mejs2.default.Features.supportsPointerEvents = SUPPORT_POINTER_EVENTS;
+_mejs2.default.Features.hasiOSFullScreen = HAS_IOS_FULLSCREEN;
+_mejs2.default.Features.hasNativeFullscreen = HAS_NATIVE_FULLSCREEN;
+_mejs2.default.Features.hasWebkitNativeFullScreen = HAS_WEBKIT_NATIVE_FULLSCREEN;
+_mejs2.default.Features.hasMozNativeFullScreen = HAS_MOZ_NATIVE_FULLSCREEN;
+_mejs2.default.Features.hasMsNativeFullScreen = HAS_MS_NATIVE_FULLSCREEN;
+_mejs2.default.Features.hasTrueNativeFullScreen = HAS_TRUE_NATIVE_FULLSCREEN;
+_mejs2.default.Features.nativeFullScreenEnabled = HAS_NATIVE_FULLSCREEN_ENABLED;
+_mejs2.default.Features.fullScreenEventName = FULLSCREEN_EVENT_NAME;
+_mejs2.default.Features.isFullScreen = isFullScreen;
+_mejs2.default.Features.requestFullScreen = requestFullScreen;
+_mejs2.default.Features.cancelFullScreen = cancelFullScreen;
+
+},{"2":2,"3":3,"7":7}],26:[function(_dereq_,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
+exports.removeClass = exports.addClass = exports.hasClass = undefined;
+exports.loadScript = loadScript;
+exports.offset = offset;
+exports.toggleClass = toggleClass;
+exports.fadeOut = fadeOut;
+exports.fadeIn = fadeIn;
+exports.siblings = siblings;
+exports.visible = visible;
+exports.ajax = ajax;
 
-		buildspeed: function(player, controls, layers, media) {
-			var t = this;
+var _window = _dereq_(3);
 
-			if (t.media.pluginType == 'native') {
-				var 
-					speedButton = null,
-					speedSelector = null,
-					playbackSpeed = null,
-					inputId = null;
-
-				var speeds = [];
-				var defaultInArray = false;
-				for (var i=0, len=t.options.speeds.length; i < len; i++) {
-					var s = t.options.speeds[i];
-					if (typeof(s) === 'string'){
-						speeds.push({
-							name: s + t.options.speedChar,
-							value: s
-						});
-						if(s === t.options.defaultSpeed) {
-							defaultInArray = true;
-						}
-					}
-					else {
-						speeds.push(s);
-						if(s.value === t.options.defaultSpeed) {
-							defaultInArray = true;
-						}
-					}
-				}
+var _window2 = _interopRequireDefault(_window);
 
-				if (!defaultInArray) {
-					speeds.push({
-						name: t.options.defaultSpeed + t.options.speedChar,
-						value: t.options.defaultSpeed
-					});
-				}
+var _document = _dereq_(2);
 
-				speeds.sort(function(a, b) {
-					return parseFloat(b.value) - parseFloat(a.value);
-				});
+var _document2 = _interopRequireDefault(_document);
 
-				var getSpeedNameFromValue = function(value) {
-					for(i=0,len=speeds.length; i <len; i++) {
-						if (speeds[i].value === value) {
-							return speeds[i].name;
-						}
-					}
-				};
+var _mejs = _dereq_(7);
 
-				var html = '<div class="mejs-button mejs-speed-button">' +
-							'<button type="button">' + getSpeedNameFromValue(t.options.defaultSpeed) + '</button>' +
-							'<div class="mejs-speed-selector">' +
-							'<ul>';
-
-				for (i = 0, il = speeds.length; i<il; i++) {
-					inputId = t.id + '-speed-' + speeds[i].value;
-					html += '<li>' + 
-								'<input type="radio" name="speed" ' + 
-											'value="' + speeds[i].value + '" ' +
-											'id="' + inputId + '" ' +
-											(speeds[i].value === t.options.defaultSpeed ? ' checked' : '') +
-											' />' +
-								'<label for="' + inputId + '" ' +
-											(speeds[i].value === t.options.defaultSpeed ? ' class="mejs-speed-selected"' : '') +
-											'>' + speeds[i].name + '</label>' +
-							'</li>';
-				}
-				html += '</ul></div></div>';
-
-				speedButton = $(html).appendTo(controls);
-				speedSelector = speedButton.find('.mejs-speed-selector');
-
-				playbackSpeed = t.options.defaultSpeed;
-
-				media.addEventListener('loadedmetadata', function(e) {
-					if (playbackSpeed) {
-						media.playbackRate = parseFloat(playbackSpeed);
-					}
-				}, true);
-
-				speedSelector
-					.on('click', 'input[type="radio"]', function() {
-						var newSpeed = $(this).attr('value');
-						playbackSpeed = newSpeed;
-						media.playbackRate = parseFloat(newSpeed);
-						speedButton.find('button').html(getSpeedNameFromValue(newSpeed));
-						speedButton.find('.mejs-speed-selected').removeClass('mejs-speed-selected');
-						speedButton.find('input[type="radio"]:checked').next().addClass('mejs-speed-selected');
-					});
-				speedButton
-					.one( 'mouseenter focusin', function() {
-						speedSelector
-							.height(
-								speedButton.find('.mejs-speed-selector ul').outerHeight(true) +
-								speedButton.find('.mejs-speed-translations').outerHeight(true))
-							.css('top', (-1 * speedSelector.height()) + 'px');
-					});
-			}
-		}
+var _mejs2 = _interopRequireDefault(_mejs);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function loadScript(url) {
+	return new Promise(function (resolve, reject) {
+		var script = _document2.default.createElement('script');
+		script.src = url;
+		script.async = true;
+		script.onload = function () {
+			script.remove();
+			resolve();
+		};
+		script.onerror = function () {
+			script.remove();
+			reject();
+		};
+		_document2.default.head.appendChild(script);
 	});
+}
 
-})(mejs.$);
+function offset(el) {
+	var rect = el.getBoundingClientRect(),
+	    scrollLeft = _window2.default.pageXOffset || _document2.default.documentElement.scrollLeft,
+	    scrollTop = _window2.default.pageYOffset || _document2.default.documentElement.scrollTop;
+	return { top: rect.top + scrollTop, left: rect.left + scrollLeft };
+}
 
-(function($) {
+var hasClassMethod = void 0,
+    addClassMethod = void 0,
+    removeClassMethod = void 0;
 
-	// add extra default options
-	$.extend(mejs.MepDefaults, {
-		// this will automatically turn on a <track>
-		startLanguage: '',
+if ('classList' in _document2.default.documentElement) {
+	hasClassMethod = function hasClassMethod(el, className) {
+		return el.classList !== undefined && el.classList.contains(className);
+	};
+	addClassMethod = function addClassMethod(el, className) {
+		return el.classList.add(className);
+	};
+	removeClassMethod = function removeClassMethod(el, className) {
+		return el.classList.remove(className);
+	};
+} else {
+	hasClassMethod = function hasClassMethod(el, className) {
+		return new RegExp('\\b' + className + '\\b').test(el.className);
+	};
+	addClassMethod = function addClassMethod(el, className) {
+		if (!hasClass(el, className)) {
+			el.className += ' ' + className;
+		}
+	};
+	removeClassMethod = function removeClassMethod(el, className) {
+		el.className = el.className.replace(new RegExp('\\b' + className + '\\b', 'g'), '');
+	};
+}
 
-		tracksText: '',
+var hasClass = exports.hasClass = hasClassMethod;
+var addClass = exports.addClass = addClassMethod;
+var removeClass = exports.removeClass = removeClassMethod;
 
-		// By default, no WAI-ARIA live region - don't make a
-		// screen reader speak captions over an audio track.
-		tracksAriaLive: false,
+function toggleClass(el, className) {
+	hasClass(el, className) ? removeClass(el, className) : addClass(el, className);
+}
 
-		// option to remove the [cc] button when no <track kind="subtitles"> are present
-		hideCaptionsButtonWhenEmpty: true,
+function fadeOut(el) {
+	var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 400;
+	var callback = arguments[2];
 
-		// If true and we only have one track, change captions to popup
-		toggleCaptionsButtonWhenOnlyOne: false,
+	if (!el.style.opacity) {
+		el.style.opacity = 1;
+	}
 
-		// #id or .class
-		slidesSelector: ''
+	var start = null;
+	_window2.default.requestAnimationFrame(function animate(timestamp) {
+		start = start || timestamp;
+		var progress = timestamp - start;
+		var opacity = parseFloat(1 - progress / duration, 2);
+		el.style.opacity = opacity < 0 ? 0 : opacity;
+		if (progress > duration) {
+			if (callback && typeof callback === 'function') {
+				callback();
+			}
+		} else {
+			_window2.default.requestAnimationFrame(animate);
+		}
 	});
+}
 
-	$.extend(MediaElementPlayer.prototype, {
-
-		hasChapters: false,
+function fadeIn(el) {
+	var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 400;
+	var callback = arguments[2];
 
-		cleartracks: function(player, controls, layers, media){
-			if(player) {
-				if(player.captions) player.captions.remove();
-				if(player.chapters) player.chapters.remove();
-				if(player.captionsText) player.captionsText.remove();
-				if(player.captionsButton) player.captionsButton.remove();
-			}
-		},
-		buildtracks: function(player, controls, layers, media) {
-			if (player.tracks.length === 0)
-				return;
+	if (!el.style.opacity) {
+		el.style.opacity = 0;
+	}
 
-			var t = this,
-				attr = t.options.tracksAriaLive ?
-					'role="log" aria-live="assertive" aria-atomic="false"' : '',
-				tracksTitle = t.options.tracksText ? t.options.tracksText : mejs.i18n.t('mejs.captions-subtitles'),
-				i,
-				kind;
-
-			if (t.domNode.textTracks) { // if browser will do native captions, prefer mejs captions, loop through tracks and hide
-				for (i = t.domNode.textTracks.length - 1; i >= 0; i--) {
-					t.domNode.textTracks[i].mode = "hidden";
-				}
-			}
-			t.cleartracks(player, controls, layers, media);
-			player.chapters =
-					$('<div class="mejs-chapters mejs-layer"></div>')
-						.prependTo(layers).hide();
-			player.captions =
-					$('<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position mejs-captions-position-hover" ' +
-					attr + '><span class="mejs-captions-text"></span></div></div>')
-						.prependTo(layers).hide();
-			player.captionsText = player.captions.find('.mejs-captions-text');
-			player.captionsButton =
-					$('<div class="mejs-button mejs-captions-button">'+
-						'<button type="button" aria-controls="' + t.id + '" title="' + tracksTitle + '" aria-label="' + tracksTitle + '"></button>'+
-						'<div class="mejs-captions-selector">'+
-							'<ul>'+
-								'<li>'+
-									'<input type="radio" name="' + player.id + '_captions" id="' + player.id + '_captions_none" value="none" checked="checked" />' +
-									'<label for="' + player.id + '_captions_none">' + mejs.i18n.t('mejs.none') +'</label>'+
-								'</li>'	+
-							'</ul>'+
-						'</div>'+
-					'</div>')
-						.appendTo(controls);
-
-
-			var subtitleCount = 0;
-			for (i=0; i<player.tracks.length; i++) {
-				kind = player.tracks[i].kind;
-				if (kind === 'subtitles' || kind === 'captions') {
-					subtitleCount++;
-				}
+	var start = null;
+	_window2.default.requestAnimationFrame(function animate(timestamp) {
+		start = start || timestamp;
+		var progress = timestamp - start;
+		var opacity = parseFloat(progress / duration, 2);
+		el.style.opacity = opacity > 1 ? 1 : opacity;
+		if (progress > duration) {
+			if (callback && typeof callback === 'function') {
+				callback();
 			}
+		} else {
+			_window2.default.requestAnimationFrame(animate);
+		}
+	});
+}
 
-			// if only one language then just make the button a toggle
-			if (t.options.toggleCaptionsButtonWhenOnlyOne && subtitleCount == 1){
-				// click
-				player.captionsButton.on('click',function() {
-					if (player.selectedTrack === null) {
-						lang = player.tracks[0].srclang;
-					} else {
-						lang = 'none';
-					}
-					player.setTrack(lang);
-				});
-			} else {
-				// hover or keyboard focus
-				player.captionsButton.on( 'mouseenter focusin', function() {
-					$(this).find('.mejs-captions-selector').removeClass('mejs-offscreen');
-				})
-
-				// handle clicks to the language radio buttons
-				.on('click','input[type=radio]',function() {
-					lang = this.value;
-					player.setTrack(lang);
-				});
+function siblings(el, filter) {
+	var siblings = [];
+	el = el.parentNode.firstChild;
+	do {
+		if (!filter || filter(el)) {
+			siblings.push(el);
+		}
+	} while (el = el.nextSibling);
+	return siblings;
+}
 
-				player.captionsButton.on( 'mouseleave focusout', function() {
-					$(this).find(".mejs-captions-selector").addClass("mejs-offscreen");
-				});
+function visible(elem) {
+	return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);
+}
 
-			}
+function ajax(url, dataType, success, error) {
+	var xhr = _window2.default.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
+
+	var type = 'application/x-www-form-urlencoded; charset=UTF-8',
+	    completed = false,
+	    accept = '*/'.concat('*');
+
+	switch (dataType) {
+		case 'text':
+			type = 'text/plain';
+			break;
+		case 'json':
+			type = 'application/json, text/javascript';
+			break;
+		case 'html':
+			type = 'text/html';
+			break;
+		case 'xml':
+			type = 'application/xml, text/xml';
+			break;
+	}
 
-			if (!player.options.alwaysShowControls) {
-				// move with controls
-				player.container
-					.bind('controlsshown', function () {
-						// push captions above controls
-						player.container.find('.mejs-captions-position').addClass('mejs-captions-position-hover');
+	if (type !== 'application/x-www-form-urlencoded') {
+		accept = type + ', */*; q=0.01';
+	}
 
-					})
-					.bind('controlshidden', function () {
-						if (!media.paused) {
-							// move back to normal place
-							player.container.find('.mejs-captions-position').removeClass('mejs-captions-position-hover');
-						}
-					});
-			} else {
-				player.container.find('.mejs-captions-position').addClass('mejs-captions-position-hover');
+	if (xhr) {
+		xhr.open('GET', url, true);
+		xhr.setRequestHeader('Accept', accept);
+		xhr.onreadystatechange = function () {
+			if (completed) {
+				return;
 			}
 
-			player.trackToLoad = -1;
-			player.selectedTrack = null;
-			player.isLoadingTrack = false;
-
-			// add to list
-			for (i=0; i<player.tracks.length; i++) {
-				kind = player.tracks[i].kind;
-				if (kind === 'subtitles' || kind === 'captions') {
-					player.addTrackButton(player.tracks[i].srclang, player.tracks[i].label);
+			if (xhr.readyState === 4) {
+				if (xhr.status === 200) {
+					completed = true;
+					var data = void 0;
+					switch (dataType) {
+						case 'json':
+							data = JSON.parse(xhr.responseText);
+							break;
+						case 'xml':
+							data = xhr.responseXML;
+							break;
+						default:
+							data = xhr.responseText;
+							break;
+					}
+					success(data);
+				} else if (typeof error === 'function') {
+					error(xhr.status);
 				}
 			}
+		};
 
-			// start loading tracks
-			player.loadNextTrack();
+		xhr.send();
+	}
+}
 
-			media.addEventListener('timeupdate',function() {
-				player.displayCaptions();
-			}, false);
+_mejs2.default.Utils = _mejs2.default.Utils || {};
+_mejs2.default.Utils.offset = offset;
+_mejs2.default.Utils.hasClass = hasClass;
+_mejs2.default.Utils.addClass = addClass;
+_mejs2.default.Utils.removeClass = removeClass;
+_mejs2.default.Utils.toggleClass = toggleClass;
+_mejs2.default.Utils.fadeIn = fadeIn;
+_mejs2.default.Utils.fadeOut = fadeOut;
+_mejs2.default.Utils.siblings = siblings;
+_mejs2.default.Utils.visible = visible;
+_mejs2.default.Utils.ajax = ajax;
+_mejs2.default.Utils.loadScript = loadScript;
+
+},{"2":2,"3":3,"7":7}],27:[function(_dereq_,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
+exports.escapeHTML = escapeHTML;
+exports.debounce = debounce;
+exports.isObjectEmpty = isObjectEmpty;
+exports.splitEvents = splitEvents;
+exports.createEvent = createEvent;
+exports.isNodeAfter = isNodeAfter;
+exports.isString = isString;
 
-			if (player.options.slidesSelector !== '') {
-				player.slidesContainer = $(player.options.slidesSelector);
+var _mejs = _dereq_(7);
 
-				media.addEventListener('timeupdate',function() {
-					player.displaySlides();
-				}, false);
+var _mejs2 = _interopRequireDefault(_mejs);
 
-			}
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-			media.addEventListener('loadedmetadata', function() {
-				player.displayChapters();
-			}, false);
+function escapeHTML(input) {
 
-			player.container.hover(
-				function () {
-					// chapters
-					if (player.hasChapters) {
-						player.chapters.removeClass('mejs-offscreen');
-						player.chapters.fadeIn(200).height(player.chapters.find('.mejs-chapter').outerHeight());
-					}
-				},
-				function () {
-					if (player.hasChapters && !media.paused) {
-						player.chapters.fadeOut(200, function() {
-							$(this).addClass('mejs-offscreen');
-							$(this).css('display','block');
-						});
-					}
-				});
+	if (typeof input !== 'string') {
+		throw new Error('Argument passed must be a string');
+	}
 
-			t.container.on('controlsresize', function() {
-				t.adjustLanguageBox();
-			});
+	var map = {
+		'&': '&amp;',
+		'<': '&lt;',
+		'>': '&gt;',
+		'"': '&quot;'
+	};
 
-			// check for autoplay
-			if (player.node.getAttribute('autoplay') !== null) {
-				player.chapters.addClass('mejs-offscreen');
-			}
-		},
+	return input.replace(/[&<>"]/g, function (c) {
+		return map[c];
+	});
+}
 
-		setTrack: function(lang){
+function debounce(func, wait) {
+	var _this = this,
+	    _arguments = arguments;
 
-			var t = this,
-				i;
+	var immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
 
-			if (lang == 'none') {
-				t.selectedTrack = null;
-				t.captionsButton.removeClass('mejs-captions-enabled');
-			} else {
-				for (i=0; i<t.tracks.length; i++) {
-					if (t.tracks[i].srclang == lang) {
-						if (t.selectedTrack === null)
-							t.captionsButton.addClass('mejs-captions-enabled');
-						t.selectedTrack = t.tracks[i];
-						t.captions.attr('lang', t.selectedTrack.srclang);
-						t.displayCaptions();
-						break;
-					}
-				}
-			}
-		},
 
-		loadNextTrack: function() {
-			var t = this;
+	if (typeof func !== 'function') {
+		throw new Error('First argument must be a function');
+	}
 
-			t.trackToLoad++;
-			if (t.trackToLoad < t.tracks.length) {
-				t.isLoadingTrack = true;
-				t.loadTrack(t.trackToLoad);
-			} else {
-				// add done?
-				t.isLoadingTrack = false;
+	if (typeof wait !== 'number') {
+		throw new Error('Second argument must be a numeric value');
+	}
 
-				t.checkForTracks();
+	var timeout = void 0;
+	return function () {
+		var context = _this,
+		    args = _arguments;
+		var later = function later() {
+			timeout = null;
+			if (!immediate) {
+				func.apply(context, args);
 			}
-		},
+		};
+		var callNow = immediate && !timeout;
+		clearTimeout(timeout);
+		timeout = setTimeout(later, wait);
 
-		loadTrack: function(index){
-			var
-				t = this,
-				track = t.tracks[index],
-				after = function() {
+		if (callNow) {
+			func.apply(context, args);
+		}
+	};
+}
 
-					track.isLoaded = true;
+function isObjectEmpty(instance) {
+	return Object.getOwnPropertyNames(instance).length <= 0;
+}
 
-					t.enableTrackButton(track.srclang, track.label);
+function splitEvents(events, id) {
+	var rwindow = /^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/;
 
-					t.loadNextTrack();
+	var ret = { d: [], w: [] };
+	(events || '').split(' ').forEach(function (v) {
+		var eventName = '' + v + (id ? '.' + id : '');
 
-				};
+		if (eventName.startsWith('.')) {
+			ret.d.push(eventName);
+			ret.w.push(eventName);
+		} else {
+			ret[rwindow.test(v) ? 'w' : 'd'].push(eventName);
+		}
+	});
 
+	ret.d = ret.d.join(' ');
+	ret.w = ret.w.join(' ');
+	return ret;
+}
 
-			if (track.src !== undefined || track.src !== "") {
-				$.ajax({
-					url: track.src,
-					dataType: "text",
-					success: function(d) {
+function createEvent(eventName, target) {
 
-						// parse the loaded file
-						if (typeof d == "string" && (/<tt\s+xml/ig).exec(d)) {
-							track.entries = mejs.TrackFormatParser.dfxp.parse(d);
-						} else {
-							track.entries = mejs.TrackFormatParser.webvtt.parse(d);
-						}
+	if (typeof eventName !== 'string') {
+		throw new Error('Event name must be a string');
+	}
 
-						after();
+	var eventFrags = eventName.match(/([a-z]+\.([a-z]+))/i),
+	    detail = {
+		target: target
+	};
 
-						if (track.kind == 'chapters') {
-							t.media.addEventListener('play', function() {
-								if (t.media.duration > 0) {
-									t.displayChapters(track);
-								}
-							}, false);
-						}
+	if (eventFrags !== null) {
+		eventName = eventFrags[1];
+		detail.namespace = eventFrags[2];
+	}
 
-						if (track.kind == 'slides') {
-							t.setupSlides(track);
-						}
-					},
-					error: function() {
-						t.removeTrackButton(track.srclang);
-						t.loadNextTrack();
-					}
-				});
-			}
-		},
+	return new window.CustomEvent(eventName, {
+		detail: detail
+	});
+}
 
-		enableTrackButton: function(lang, label) {
-			var t = this;
+function isNodeAfter(sourceNode, targetNode) {
 
-			if (label === '') {
-				label = mejs.language.codes[lang] || lang;
-			}
+	return !!(sourceNode && targetNode && sourceNode.compareDocumentPosition(targetNode) & 2);
+}
 
-			t.captionsButton
-				.find('input[value=' + lang + ']')
-					.prop('disabled',false)
-				.siblings('label')
-					.html( label );
+function isString(value) {
+	return typeof value === 'string';
+}
 
-			// auto select
-			if (t.options.startLanguage == lang) {
-				$('#' + t.id + '_captions_' + lang).prop('checked', true).trigger('click');
-			}
+_mejs2.default.Utils = _mejs2.default.Utils || {};
+_mejs2.default.Utils.escapeHTML = escapeHTML;
+_mejs2.default.Utils.debounce = debounce;
+_mejs2.default.Utils.isObjectEmpty = isObjectEmpty;
+_mejs2.default.Utils.splitEvents = splitEvents;
+_mejs2.default.Utils.createEvent = createEvent;
+_mejs2.default.Utils.isNodeAfter = isNodeAfter;
+_mejs2.default.Utils.isString = isString;
 
-			t.adjustLanguageBox();
-		},
+},{"7":7}],28:[function(_dereq_,module,exports){
+'use strict';
 
-		removeTrackButton: function(lang) {
-			var t = this;
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
+exports.typeChecks = undefined;
+exports.absolutizeUrl = absolutizeUrl;
+exports.formatType = formatType;
+exports.getMimeFromType = getMimeFromType;
+exports.getTypeFromFile = getTypeFromFile;
+exports.getExtension = getExtension;
+exports.normalizeExtension = normalizeExtension;
 
-			t.captionsButton.find('input[value=' + lang + ']').closest('li').remove();
+var _mejs = _dereq_(7);
 
-			t.adjustLanguageBox();
-		},
+var _mejs2 = _interopRequireDefault(_mejs);
 
-		addTrackButton: function(lang, label) {
-			var t = this;
-			if (label === '') {
-				label = mejs.language.codes[lang] || lang;
-			}
+var _general = _dereq_(27);
 
-			t.captionsButton.find('ul').append(
-				$('<li>'+
-					'<input type="radio" name="' + t.id + '_captions" id="' + t.id + '_captions_' + lang + '" value="' + lang + '" disabled="disabled" />' +
-					'<label for="' + t.id + '_captions_' + lang + '">' + label + ' (loading)' + '</label>'+
-				'</li>')
-			);
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-			t.adjustLanguageBox();
+var typeChecks = exports.typeChecks = [];
 
-			// remove this from the dropdownlist (if it exists)
-			t.container.find('.mejs-captions-translations option[value=' + lang + ']').remove();
-		},
+function absolutizeUrl(url) {
 
-		adjustLanguageBox:function() {
-			var t = this;
-			// adjust the size of the outer box
-			t.captionsButton.find('.mejs-captions-selector').height(
-				t.captionsButton.find('.mejs-captions-selector ul').outerHeight(true) +
-				t.captionsButton.find('.mejs-captions-translations').outerHeight(true)
-			);
-		},
+	if (typeof url !== 'string') {
+		throw new Error('`url` argument must be a string');
+	}
 
-		checkForTracks: function() {
-			var
-				t = this,
-				hasSubtitles = false;
-
-			// check if any subtitles
-			if (t.options.hideCaptionsButtonWhenEmpty) {
-				for (var i=0; i<t.tracks.length; i++) {
-					var kind = t.tracks[i].kind;
-					if ((kind === 'subtitles' || kind === 'captions') && t.tracks[i].isLoaded) {
-						hasSubtitles = true;
-						break;
-					}
-				}
+	var el = document.createElement('div');
+	el.innerHTML = '<a href="' + (0, _general.escapeHTML)(url) + '">x</a>';
+	return el.firstChild.href;
+}
 
-				if (!hasSubtitles) {
-					t.captionsButton.hide();
-					t.setControlsSize();
-				}
-			}
-		},
+function formatType(url) {
+	var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
 
-		displayCaptions: function() {
+	return url && !type ? getTypeFromFile(url) : type;
+}
 
-			if (typeof this.tracks == 'undefined')
-				return;
+function getMimeFromType(type) {
 
-			var
-				t = this,
-				i,
-				track = t.selectedTrack;
-
-			if (track !== null && track.isLoaded) {
-				for (i=0; i<track.entries.times.length; i++) {
-					if (t.media.currentTime >= track.entries.times[i].start && t.media.currentTime <= track.entries.times[i].stop) {
-						// Set the line before the timecode as a class so the cue can be targeted if needed
-						t.captionsText.html(track.entries.text[i]).attr('class', 'mejs-captions-text ' + (track.entries.times[i].identifier || ''));
-						t.captions.show().height(0);
-						return; // exit out if one is visible;
-					}
-				}
-				t.captions.hide();
-			} else {
-				t.captions.hide();
-			}
-		},
+	if (typeof type !== 'string') {
+		throw new Error('`type` argument must be a string');
+	}
 
-		setupSlides: function(track) {
-			var t = this;
+	return type && type.indexOf(';') > -1 ? type.substr(0, type.indexOf(';')) : type;
+}
 
-			t.slides = track;
-			t.slides.entries.imgs = [t.slides.entries.text.length];
-			t.showSlide(0);
+function getTypeFromFile(url) {
 
-		},
+	if (typeof url !== 'string') {
+		throw new Error('`url` argument must be a string');
+	}
 
-		showSlide: function(index) {
-			if (typeof this.tracks == 'undefined' || typeof this.slidesContainer == 'undefined') {
-				return;
-			}
+	for (var i = 0, total = typeChecks.length; i < total; i++) {
+		var type = typeChecks[i](url);
 
-			var t = this,
-				url = t.slides.entries.text[index],
-				img = t.slides.entries.imgs[index];
+		if (type) {
+			return type;
+		}
+	}
 
-			if (typeof img == 'undefined' || typeof img.fadeIn == 'undefined') {
+	var ext = getExtension(url),
+	    normalizedExt = normalizeExtension(ext);
 
-				t.slides.entries.imgs[index] = img = $('<img src="' + url + '">')
-						.on('load', function() {
-							img.appendTo(t.slidesContainer)
-								.hide()
-								.fadeIn()
-								.siblings(':visible')
-									.fadeOut();
+	var mime = 'video/mp4';
 
-						});
+	if (normalizedExt) {
+		if (~['mp4', 'm4v', 'ogg', 'ogv', 'webm', 'flv', 'mpeg', 'mov'].indexOf(normalizedExt)) {
+			mime = 'video/' + normalizedExt;
+		} else if (~['mp3', 'oga', 'wav', 'mid', 'midi'].indexOf(normalizedExt)) {
+			mime = 'audio/' + normalizedExt;
+		}
+	}
 
-			} else {
+	return mime;
+}
 
-				if (!img.is(':visible') && !img.is(':animated')) {
+function getExtension(url) {
 
-					//
+	if (typeof url !== 'string') {
+		throw new Error('`url` argument must be a string');
+	}
 
-					img.fadeIn()
-						.siblings(':visible')
-							.fadeOut();
-				}
-			}
+	var baseUrl = url.split('?')[0],
+	    baseName = baseUrl.split('\\').pop().split('/').pop();
+	return ~baseName.indexOf('.') ? baseName.substring(baseName.lastIndexOf('.') + 1) : '';
+}
 
-		},
+function normalizeExtension(extension) {
 
-		displaySlides: function() {
+	if (typeof extension !== 'string') {
+		throw new Error('`extension` argument must be a string');
+	}
 
-			if (typeof this.slides == 'undefined')
-				return;
+	switch (extension) {
+		case 'mp4':
+		case 'm4v':
+			return 'mp4';
+		case 'webm':
+		case 'webma':
+		case 'webmv':
+			return 'webm';
+		case 'ogg':
+		case 'oga':
+		case 'ogv':
+			return 'ogg';
+		default:
+			return extension;
+	}
+}
 
-			var
-				t = this,
-				slides = t.slides,
-				i;
+_mejs2.default.Utils = _mejs2.default.Utils || {};
+_mejs2.default.Utils.typeChecks = typeChecks;
+_mejs2.default.Utils.absolutizeUrl = absolutizeUrl;
+_mejs2.default.Utils.formatType = formatType;
+_mejs2.default.Utils.getMimeFromType = getMimeFromType;
+_mejs2.default.Utils.getTypeFromFile = getTypeFromFile;
+_mejs2.default.Utils.getExtension = getExtension;
+_mejs2.default.Utils.normalizeExtension = normalizeExtension;
 
-			for (i=0; i<slides.entries.times.length; i++) {
-				if (t.media.currentTime >= slides.entries.times[i].start && t.media.currentTime <= slides.entries.times[i].stop){
+},{"27":27,"7":7}],29:[function(_dereq_,module,exports){
+'use strict';
 
-					t.showSlide(i);
+var _document = _dereq_(2);
 
-					return; // exit out if one is visible;
-				}
-			}
-		},
+var _document2 = _interopRequireDefault(_document);
 
-		displayChapters: function() {
-			var
-				t = this,
-				i;
+var _promisePolyfill = _dereq_(4);
 
-			for (i=0; i<t.tracks.length; i++) {
-				if (t.tracks[i].kind == 'chapters' && t.tracks[i].isLoaded) {
-					t.drawChapters(t.tracks[i]);
-					t.hasChapters = true;
-					break;
-				}
-			}
-		},
+var _promisePolyfill2 = _interopRequireDefault(_promisePolyfill);
 
-		drawChapters: function(chapters) {
-			var
-				t = this,
-				i,
-				dur,
-				//width,
-				//left,
-				percent = 0,
-				usedPercent = 0;
-
-			t.chapters.empty();
-
-			for (i=0; i<chapters.entries.times.length; i++) {
-				dur = chapters.entries.times[i].stop - chapters.entries.times[i].start;
-				percent = Math.floor(dur / t.media.duration * 100);
-				if (percent + usedPercent > 100 || // too large
-					i == chapters.entries.times.length-1 && percent + usedPercent < 100) // not going to fill it in
-					{
-					percent = 100 - usedPercent;
-				}
-				//width = Math.floor(t.width * dur / t.media.duration);
-				//left = Math.floor(t.width * chapters.entries.times[i].start / t.media.duration);
-				//if (left + width > t.width) {
-				//	width = t.width - left;
-				//}
-
-				t.chapters.append( $(
-					'<div class="mejs-chapter" rel="' + chapters.entries.times[i].start + '" style="left: ' + usedPercent.toString() + '%;width: ' + percent.toString() + '%;">' +
-						'<div class="mejs-chapter-block' + ((i==chapters.entries.times.length-1) ? ' mejs-chapter-block-last' : '') + '">' +
-							'<span class="ch-title">' + chapters.entries.text[i] + '</span>' +
-							'<span class="ch-time">' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].start, t.options) + '&ndash;' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].stop, t.options) + '</span>' +
-						'</div>' +
-					'</div>'));
-				usedPercent += percent;
-			}
-
-			t.chapters.find('div.mejs-chapter').click(function() {
-				t.media.setCurrentTime( parseFloat( $(this).attr('rel') ) );
-				if (t.media.paused) {
-					t.media.play();
-				}
-			});
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-			t.chapters.show();
+(function (arr) {
+	arr.forEach(function (item) {
+		if (item.hasOwnProperty('remove')) {
+			return;
 		}
+		Object.defineProperty(item, 'remove', {
+			configurable: true,
+			enumerable: true,
+			writable: true,
+			value: function remove() {
+				this.parentNode.removeChild(this);
+			}
+		});
 	});
+})([Element.prototype, CharacterData.prototype, DocumentType.prototype]);
+
+(function () {
+
+	if (typeof window.CustomEvent === 'function') {
+		return false;
+	}
+
+	function CustomEvent(event, params) {
+		params = params || { bubbles: false, cancelable: false, detail: undefined };
+		var evt = _document2.default.createEvent('CustomEvent');
+		evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
+		return evt;
+	}
 
+	CustomEvent.prototype = window.Event.prototype;
+	window.CustomEvent = CustomEvent;
+})();
 
+if (typeof Object.assign !== 'function') {
+	Object.assign = function (target) {
 
-	mejs.language = {
-		codes:  {
-			af:'Afrikaans',
-			sq:'Albanian',
-			ar:'Arabic',
-			be:'Belarusian',
-			bg:'Bulgarian',
-			ca:'Catalan',
-			zh:'Chinese',
-			'zh-cn':'Chinese Simplified',
-			'zh-tw':'Chinese Traditional',
-			hr:'Croatian',
-			cs:'Czech',
-			da:'Danish',
-			nl:'Dutch',
-			en:'English',
-			et:'Estonian',
-			fl:'Filipino',
-			fi:'Finnish',
-			fr:'French',
-			gl:'Galician',
-			de:'German',
-			el:'Greek',
-			ht:'Haitian Creole',
-			iw:'Hebrew',
-			hi:'Hindi',
-			hu:'Hungarian',
-			is:'Icelandic',
-			id:'Indonesian',
-			ga:'Irish',
-			it:'Italian',
-			ja:'Japanese',
-			ko:'Korean',
-			lv:'Latvian',
-			lt:'Lithuanian',
-			mk:'Macedonian',
-			ms:'Malay',
-			mt:'Maltese',
-			no:'Norwegian',
-			fa:'Persian',
-			pl:'Polish',
-			pt:'Portuguese',
-			// 'pt-pt':'Portuguese (Portugal)',
-			ro:'Romanian',
-			ru:'Russian',
-			sr:'Serbian',
-			sk:'Slovak',
-			sl:'Slovenian',
-			es:'Spanish',
-			sw:'Swahili',
-			sv:'Swedish',
-			tl:'Tagalog',
-			th:'Thai',
-			tr:'Turkish',
-			uk:'Ukrainian',
-			vi:'Vietnamese',
-			cy:'Welsh',
-			yi:'Yiddish'
+		if (target === null || target === undefined) {
+			throw new TypeError('Cannot convert undefined or null to object');
 		}
-	};
 
-	/*
-	Parses WebVTT format which should be formatted as
-	================================
-	WEBVTT
-
-	1
-	00:00:01,1 --> 00:00:05,000
-	A line of text
-
-	2
-	00:01:15,1 --> 00:02:05,000
-	A second line of text
-
-	===============================
-
-	Adapted from: http://www.delphiki.com/html5/playr
-	*/
-	mejs.TrackFormatParser = {
-		webvtt: {
-			pattern_timecode: /^((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/,
-
-			parse: function(trackText) {
-				var
-					i = 0,
-					lines = mejs.TrackFormatParser.split2(trackText, /\r?\n/),
-					entries = {text:[], times:[]},
-					timecode,
-					text,
-					identifier;
-				for(; i<lines.length; i++) {
-					timecode = this.pattern_timecode.exec(lines[i]);
-
-					if (timecode && i<lines.length) {
-						if ((i - 1) >= 0 && lines[i - 1] !== '') {
-							identifier = lines[i - 1];
-						}
-						i++;
-						// grab all the (possibly multi-line) text that follows
-						text = lines[i];
-						i++;
-						while(lines[i] !== '' && i<lines.length){
-							text = text + '\n' + lines[i];
-							i++;
-						}
-						text = $.trim(text).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>");
-						// Text is in a different array so I can use .join
-						entries.text.push(text);
-						entries.times.push(
-						{
-							identifier: identifier,
-							start: (mejs.Utility.convertSMPTEtoSeconds(timecode[1]) === 0) ? 0.200 : mejs.Utility.convertSMPTEtoSeconds(timecode[1]),
-							stop: mejs.Utility.convertSMPTEtoSeconds(timecode[3]),
-							settings: timecode[5]
-						});
-					}
-					identifier = '';
-				}
-				return entries;
-			}
-		},
-		// Thanks to Justin Capella: https://github.com/johndyer/mediaelement/pull/420
-		dfxp: {
-			parse: function(trackText) {
-				trackText = $(trackText).filter("tt");
-				var
-					i = 0,
-					container = trackText.children("div").eq(0),
-					lines = container.find("p"),
-					styleNode = trackText.find("#" + container.attr("style")),
-					styles,
-					text,
-					entries = {text:[], times:[]};
-
-
-				if (styleNode.length) {
-					var attributes = styleNode.removeAttr("id").get(0).attributes;
-					if (attributes.length) {
-						styles = {};
-						for (i = 0; i < attributes.length; i++) {
-							styles[attributes[i].name.split(":")[1]] = attributes[i].value;
-						}
-					}
-				}
+		var to = Object(target);
 
-				for(i = 0; i<lines.length; i++) {
-					var style;
-					var _temp_times = {
-						start: null,
-						stop: null,
-						style: null
-					};
-					if (lines.eq(i).attr("begin")) _temp_times.start = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i).attr("begin"));
-					if (!_temp_times.start && lines.eq(i-1).attr("end")) _temp_times.start = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i-1).attr("end"));
-					if (lines.eq(i).attr("end")) _temp_times.stop = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i).attr("end"));
-					if (!_temp_times.stop && lines.eq(i+1).attr("begin")) _temp_times.stop = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i+1).attr("begin"));
-					if (styles) {
-						style = "";
-						for (var _style in styles) {
-							style += _style + ":" + styles[_style] + ";";
-						}
+		for (var index = 1, total = arguments.length; index < total; index++) {
+			var nextSource = arguments[index];
+
+			if (nextSource !== null) {
+				for (var nextKey in nextSource) {
+					if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
+						to[nextKey] = nextSource[nextKey];
 					}
-					if (style) _temp_times.style = style;
-					if (_temp_times.start === 0) _temp_times.start = 0.200;
-					entries.times.push(_temp_times);
-					text = $.trim(lines.eq(i).html()).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>");
-					entries.text.push(text);
 				}
-				return entries;
 			}
-		},
-		split2: function (text, regex) {
-			// normal version for compliant browsers
-			// see below for IE fix
-			return text.split(regex);
 		}
+		return to;
+	};
+}
+
+if (!String.prototype.startsWith) {
+	String.prototype.startsWith = function (searchString, position) {
+		position = position || 0;
+		return this.substr(position, searchString.length) === searchString;
 	};
+}
 
-	// test for browsers with bad String.split method.
-	if ('x\n\ny'.split(/\n/gi).length != 3) {
-		// add super slow IE8 and below version
-		mejs.TrackFormatParser.split2 = function(text, regex) {
-			var
-				parts = [],
-				chunk = '',
-				i;
+if (!Element.prototype.matches) {
+	Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) {
+		var matches = (this.document || this.ownerDocument).querySelectorAll(s),
+		    i = matches.length - 1;
+		while (--i >= 0 && matches.item(i) !== this) {}
+		return i > -1;
+	};
+}
 
-			for (i=0; i<text.length; i++) {
-				chunk += text.substring(i,i+1);
-				if (regex.test(chunk)) {
-					parts.push(chunk.replace(regex, ''));
-					chunk = '';
-				}
-			}
-			parts.push(chunk);
-			return parts;
-		};
-	}
+if (window.Element && !Element.prototype.closest) {
+	Element.prototype.closest = function (s) {
+		var matches = (this.document || this.ownerDocument).querySelectorAll(s),
+		    i = void 0,
+		    el = this;
+		do {
+			i = matches.length;
+			while (--i >= 0 && matches.item(i) !== el) {}
+		} while (i < 0 && (el = el.parentElement));
+		return el;
+	};
+}
 
-})(mejs.$);
+(function () {
+	var lastTime = 0;
+	var vendors = ['ms', 'moz', 'webkit', 'o'];
+	for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
+		window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
+		window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
+	}
 
-// Source Chooser Plugin
-(function($) {
+	if (!window.requestAnimationFrame) window.requestAnimationFrame = function (callback) {
+		var currTime = new Date().getTime();
+		var timeToCall = Math.max(0, 16 - (currTime - lastTime));
+		var id = window.setTimeout(function () {
+			callback(currTime + timeToCall);
+		}, timeToCall);
+		lastTime = currTime + timeToCall;
+		return id;
+	};
 
-	$.extend(mejs.MepDefaults, {
-		sourcechooserText: ''
-	});
+	if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function (id) {
+		clearTimeout(id);
+	};
+})();
 
-	$.extend(MediaElementPlayer.prototype, {
-		buildsourcechooser: function(player, controls, layers, media) {
-
-			var
-				t = this,
-				sourceTitle = t.options.sourcechooserText ? t.options.sourcechooserText : mejs.i18n.t('mejs.source-chooser'),
-				hoverTimeout
-			;
-
-			player.sourcechooserButton =
-				$('<div class="mejs-button mejs-sourcechooser-button">'+
-						'<button type="button" role="button" aria-haspopup="true" aria-owns="' + t.id + '" title="' + sourceTitle + '" aria-label="' + sourceTitle + '"></button>'+
-						'<div class="mejs-sourcechooser-selector mejs-offscreen" role="menu" aria-expanded="false" aria-hidden="true">'+
-							'<ul>'+
-							'</ul>'+
-						'</div>'+
-					'</div>')
-					.appendTo(controls)
-
-					// hover
-					.hover(function() {
-						clearTimeout(hoverTimeout);
-						player.showSourcechooserSelector();
-					}, function() {
-						var self = $(this);
-						hoverTimeout = setTimeout(function () {
-						player.hideSourcechooserSelector();
-						}, 500);
-					})
-
-					// keyboard menu activation
-					.on('keydown', function (e) {
-						var keyCode = e.keyCode;
-
-						switch (keyCode) {
-							case 32: // space
-								if (!mejs.MediaFeatures.isFirefox) { // space sends the click event in Firefox
-									player.showSourcechooserSelector();
-								}
-								$(this).find('.mejs-sourcechooser-selector')
-									.find('input[type=radio]:checked').first().focus();
-								break;
-							case 13: // enter
-								player.showSourcechooserSelector();
-								$(this).find('.mejs-sourcechooser-selector')
-									.find('input[type=radio]:checked').first().focus();
-								break;
-							case 27: // esc
-								player.hideSourcechooserSelector();
-								$(this).find('button').focus();
-								break;
-							default:
-								return true;
-								}
-							})
-
-					// close menu when tabbing away
-					.on('focusout', mejs.Utility.debounce(function (e) { // Safari triggers focusout multiple times
-						// Firefox does NOT support e.relatedTarget to see which element
-						// just lost focus, so wait to find the next focused element
-						setTimeout(function () {
-							var parent = $(document.activeElement).closest('.mejs-sourcechooser-selector');
-							if (!parent.length) {
-								// focus is outside the control; close menu
-								player.hideSourcechooserSelector();
-							}
-						}, 0);
-					}, 100))
-
-					// handle clicks to the source radio buttons
-					.delegate('input[type=radio]', 'click', function() {
-						// set aria states
-						$(this).attr('aria-selected', true).attr('checked', 'checked');
-						$(this).closest('.mejs-sourcechooser-selector').find('input[type=radio]').not(this).attr('aria-selected', 'false').removeAttr('checked');
-
-						var src = this.value;
-
-						if (media.currentSrc != src) {
-							var currentTime = media.currentTime;
-							var paused = media.paused;
-							media.pause();
-							media.setSrc(src);
-
-							media.addEventListener('loadedmetadata', function(e) {
-								media.currentTime = currentTime;
-							}, true);
-
-							var canPlayAfterSourceSwitchHandler = function(e) {
-								if (!paused) {
-									media.play();
-								}
-								media.removeEventListener("canplay", canPlayAfterSourceSwitchHandler, true);
-							};
-							media.addEventListener('canplay', canPlayAfterSourceSwitchHandler, true);
-							media.load();
-						}
-					})
+if (/firefox/i.test(navigator.userAgent)) {
+	window.mediaElementJsOldGetComputedStyle = window.getComputedStyle;
+	window.getComputedStyle = function (el, pseudoEl) {
+		var t = window.mediaElementJsOldGetComputedStyle(el, pseudoEl);
+		return t === null ? { getPropertyValue: function getPropertyValue() {} } : t;
+	};
+}
 
-					// Handle click so that screen readers can toggle the menu
-					.delegate('button', 'click', function (e) {
-						if ($(this).siblings('.mejs-sourcechooser-selector').hasClass('mejs-offscreen')) {
-							player.showSourcechooserSelector();
-							$(this).siblings('.mejs-sourcechooser-selector').find('input[type=radio]:checked').first().focus();
-						} else {
-							player.hideSourcechooserSelector();
-						}
-					});
+if (!window.Promise) {
+	window.Promise = _promisePolyfill2.default;
+}
 
-			// add to list
-			for (var i in this.node.children) {
-				var src = this.node.children[i];
-				if (src.nodeName === 'SOURCE' && (media.canPlayType(src.type) == 'probably' || media.canPlayType(src.type) == 'maybe')) {
-					player.addSourceButton(src.src, src.title, src.type, media.src == src.src);
+(function (constructor) {
+	if (constructor && constructor.prototype && constructor.prototype.children === null) {
+		Object.defineProperty(constructor.prototype, 'children', {
+			get: function get() {
+				var i = 0,
+				    node = void 0,
+				    nodes = this.childNodes,
+				    children = [];
+				while (node = nodes[i++]) {
+					if (node.nodeType === 1) {
+						children.push(node);
+					}
 				}
+				return children;
 			}
-		},
+		});
+	}
+})(window.Node || window.Element);
 
-		addSourceButton: function(src, label, type, isCurrent) {
-			var t = this;
-			if (label === '' || label == undefined) {
-				label = src;
-			}
-			type = type.split('/')[1];
+},{"2":2,"4":4}],30:[function(_dereq_,module,exports){
+'use strict';
 
-			t.sourcechooserButton.find('ul').append(
-				$('<li>'+
-						'<input type="radio" name="' + t.id + '_sourcechooser" id="' + t.id + '_sourcechooser_' + label + type + '" role="menuitemradio" value="' + src + '" ' + (isCurrent ? 'checked="checked"' : '') + 'aria-selected="' + isCurrent + '"' + ' />'+
-						'<label for="' + t.id + '_sourcechooser_' + label + type + '" aria-hidden="true">' + label + ' (' + type + ')</label>'+
-					'</li>')
-			);
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
+exports.isDropFrame = isDropFrame;
+exports.secondsToTimeCode = secondsToTimeCode;
+exports.timeCodeToSeconds = timeCodeToSeconds;
+exports.calculateTimeFormat = calculateTimeFormat;
+exports.convertSMPTEtoSeconds = convertSMPTEtoSeconds;
 
-			t.adjustSourcechooserBox();
+var _mejs = _dereq_(7);
 
-		},
+var _mejs2 = _interopRequireDefault(_mejs);
 
-		adjustSourcechooserBox: function() {
-			var t = this;
-			// adjust the size of the outer box
-			t.sourcechooserButton.find('.mejs-sourcechooser-selector').height(
-				t.sourcechooserButton.find('.mejs-sourcechooser-selector ul').outerHeight(true)
-			);
-		},
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-		hideSourcechooserSelector: function () {
-			this.sourcechooserButton.find('.mejs-sourcechooser-selector')
-				.addClass('mejs-offscreen')
-				.attr('aria-expanded', 'false')
-				.attr('aria-hidden', 'true')
-				.find('input[type=radio]') // make radios not fucusable
-				.attr('tabindex', '-1');
-		},
+function isDropFrame() {
+	var fps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 25;
 
-		showSourcechooserSelector: function () {
-			this.sourcechooserButton.find('.mejs-sourcechooser-selector')
-				.removeClass('mejs-offscreen')
-				.attr('aria-expanded', 'true')
-				.attr('aria-hidden', 'false')
-				.find('input[type=radio]')
-				.attr('tabindex', '0');
+	return !(fps % 1 === 0);
+}
+function secondsToTimeCode(time) {
+	var forceHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+	var showFrameCount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+	var fps = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 25;
+	var secondsDecimalLength = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
+
+
+	time = !time || typeof time !== 'number' || time < 0 ? 0 : time;
+
+	var dropFrames = Math.round(fps * 0.066666),
+	    timeBase = Math.round(fps),
+	    framesPer24Hours = Math.round(fps * 3600) * 24,
+	    framesPer10Minutes = Math.round(fps * 600),
+	    frameSep = isDropFrame(fps) ? ';' : ':',
+	    hours = void 0,
+	    minutes = void 0,
+	    seconds = void 0,
+	    frames = void 0,
+	    f = Math.round(time * fps);
+
+	if (isDropFrame(fps)) {
+
+		if (f < 0) {
+			f = framesPer24Hours + f;
 		}
-	});
 
-})(mejs.$);
+		f = f % framesPer24Hours;
 
-/*
-* ContextMenu Plugin
-* 
-*
-*/
+		var d = Math.floor(f / framesPer10Minutes);
+		var m = f % framesPer10Minutes;
+		f = f + dropFrames * 9 * d;
+		if (m > dropFrames) {
+			f = f + dropFrames * Math.floor((m - dropFrames) / Math.round(timeBase * 60 - dropFrames));
+		}
 
-(function($) {
+		var timeBaseDivision = Math.floor(f / timeBase);
 
-$.extend(mejs.MepDefaults,
-	{ 'contextMenuItems': [
-		// demo of a fullscreen option
-		{ 
-			render: function(player) {
-				
-				// check for fullscreen plugin
-				if (typeof player.enterFullScreen == 'undefined')
-					return null;
-			
-				if (player.isFullScreen) {
-					return mejs.i18n.t('mejs.fullscreen-off');
-				} else {
-					return mejs.i18n.t('mejs.fullscreen-on');
-				}
-			},
-			click: function(player) {
-				if (player.isFullScreen) {
-					player.exitFullScreen();
-				} else {
-					player.enterFullScreen();
-				}
-			}
+		hours = Math.floor(Math.floor(timeBaseDivision / 60) / 60);
+		minutes = Math.floor(timeBaseDivision / 60) % 60;
+
+		if (showFrameCount) {
+			seconds = timeBaseDivision % 60;
+		} else {
+			seconds = (f / timeBase % 60).toFixed(secondsDecimalLength);
 		}
-		,
-		// demo of a mute/unmute button
-		{ 
-			render: function(player) {
-				if (player.media.muted) {
-					return mejs.i18n.t('mejs.unmute');
-				} else {
-					return mejs.i18n.t('mejs.mute');
-				}
-			},
-			click: function(player) {
-				if (player.media.muted) {
-					player.setMuted(false);
-				} else {
-					player.setMuted(true);
-				}
-			}
-		},
-		// separator
-		{
-			isSeparator: true
-		}
-		,
-		// demo of simple download video
-		{ 
-			render: function(player) {
-				return mejs.i18n.t('mejs.download-video');
-			},
-			click: function(player) {
-				window.location.href = player.media.currentSrc;
-			}
-		}	
-	]}
-);
-
-
-	$.extend(MediaElementPlayer.prototype, {
-		buildcontextmenu: function(player, controls, layers, media) {
-			
-			// create context menu
-			player.contextMenu = $('<div class="mejs-contextmenu"></div>')
-								.appendTo($('body'))
-								.hide();
-			
-			// create events for showing context menu
-			player.container.bind('contextmenu', function(e) {
-				if (player.isContextMenuEnabled) {
-					e.preventDefault();
-					player.renderContextMenu(e.clientX-1, e.clientY-1);
-					return false;
-				}
-			});
-			player.container.bind('click', function() {
-				player.contextMenu.hide();
-			});	
-			player.contextMenu.bind('mouseleave', function() {
+	} else {
+		hours = Math.floor(time / 3600) % 24;
+		minutes = Math.floor(time / 60) % 60;
+		if (showFrameCount) {
+			seconds = Math.floor(time % 60);
+		} else {
+			seconds = (time % 60).toFixed(secondsDecimalLength);
+		}
+	}
+	hours = hours <= 0 ? 0 : hours;
+	minutes = minutes <= 0 ? 0 : minutes;
+	seconds = seconds <= 0 ? 0 : seconds;
+
+	var result = forceHours || hours > 0 ? (hours < 10 ? '0' + hours : hours) + ':' : '';
+	result += (minutes < 10 ? '0' + minutes : minutes) + ':';
+	result += '' + (seconds < 10 ? '0' + seconds : seconds);
+
+	if (showFrameCount) {
+		frames = (f % timeBase).toFixed(0);
+		frames = frames <= 0 ? 0 : frames;
+		result += frames < 10 ? frameSep + '0' + frames : '' + frameSep + frames;
+	}
 
-				//
-				player.startContextMenuTimer();
-				
-			});		
-		},
+	return result;
+}
 
-		cleancontextmenu: function(player) {
-			player.contextMenu.remove();
-		},
-		
-		isContextMenuEnabled: true,
-		enableContextMenu: function() {
-			this.isContextMenuEnabled = true;
-		},
-		disableContextMenu: function() {
-			this.isContextMenuEnabled = false;
-		},
-		
-		contextMenuTimeout: null,
-		startContextMenuTimer: function() {
-			//
-			
-			var t = this;
-			
-			t.killContextMenuTimer();
-			
-			t.contextMenuTimer = setTimeout(function() {
-				t.hideContextMenu();
-				t.killContextMenuTimer();
-			}, 750);
-		},
-		killContextMenuTimer: function() {
-			var timer = this.contextMenuTimer;
-			
-			//
-			
-			if (timer != null) {				
-				clearTimeout(timer);
-				delete timer;
-				timer = null;
-			}
-		},		
-		
-		hideContextMenu: function() {
-			this.contextMenu.hide();
-		},
-		
-		renderContextMenu: function(x,y) {
-			
-			// alway re-render the items so that things like "turn fullscreen on" and "turn fullscreen off" are always written correctly
-			var t = this,
-				html = '',
-				items = t.options.contextMenuItems;
-			
-			for (var i=0, il=items.length; i<il; i++) {
-				
-				if (items[i].isSeparator) {
-					html += '<div class="mejs-contextmenu-separator"></div>';
-				} else {
-				
-					var rendered = items[i].render(t);
-				
-					// render can return null if the item doesn't need to be used at the moment
-					if (rendered != null) {
-						html += '<div class="mejs-contextmenu-item" data-itemindex="' + i + '" id="element-' + (Math.random()*1000000) + '">' + rendered + '</div>';
-					}
-				}
-			}
-			
-			// position and show the context menu
-			t.contextMenu
-				.empty()
-				.append($(html))
-				.css({top:y, left:x})
-				.show();
-				
-			// bind events
-			t.contextMenu.find('.mejs-contextmenu-item').each(function() {
-							
-				// which one is this?
-				var $dom = $(this),
-					itemIndex = parseInt( $dom.data('itemindex'), 10 ),
-					item = t.options.contextMenuItems[itemIndex];
-				
-				// bind extra functionality?
-				if (typeof item.show != 'undefined')
-					item.show( $dom , t);
-				
-				// bind click action
-				$dom.click(function() {			
-					// perform click action
-					if (typeof item.click != 'undefined')
-						item.click(t);
-					
-					// close
-					t.contextMenu.hide();				
-				});				
-			});	
-			
-			// stop the controls from hiding
-			setTimeout(function() {
-				t.killControlsTimer('rev3');	
-			}, 100);
-						
-		}
-	});
-	
-})(mejs.$);
-(function($) {
-	// skip back button
-
-	$.extend(mejs.MepDefaults, {
-		skipBackInterval: 30,
-		// %1 will be replaced with skipBackInterval in this string
-		skipBackText: ''
-	});
+function timeCodeToSeconds(time) {
+	var fps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 25;
 
-	$.extend(MediaElementPlayer.prototype, {
-		buildskipback: function(player, controls, layers, media) {
-			var
-				t = this,
-				defaultTitle = mejs.i18n.t('mejs.time-skip-back', t.options.skipBackInterval),
-				skipTitle = t.options.skipBackText ? t.options.skipBackText : defaultTitle,
-				// create the loop button
-				loop =
-				$('<div class="mejs-button mejs-skip-back-button">' +
-					'<button type="button" aria-controls="' + t.id + '" title="' + skipTitle + '" aria-label="' + skipTitle + '">' + t.options.skipBackInterval + '</button>' +
-				'</div>')
-				// append it to the toolbar
-				.appendTo(controls)
-				// add a click toggle event
-				.click(function() {
-					media.setCurrentTime(Math.max(media.currentTime - t.options.skipBackInterval, 0));
-					$(this).find('button').blur();
-				});
-		}
-	});
 
-})(mejs.$);
+	if (typeof time !== 'string') {
+		throw new TypeError('Time must be a string');
+	}
 
-/**
- * Postroll plugin
- */
-(function($) {
+	if (time.indexOf(';') > 0) {
+		time = time.replace(';', ':');
+	}
 
-	$.extend(mejs.MepDefaults, {
-		postrollCloseText: ''
-	});
+	if (!/\d{2}(\:\d{2}){0,3}/i.test(time)) {
+		throw new TypeError('Time code must have the format `00:00:00`');
+	}
 
-	// Postroll
-	$.extend(MediaElementPlayer.prototype, {
-		buildpostroll: function(player, controls, layers, media) {
-			var
-				t = this,
-				postrollTitle = t.options.postrollCloseText ? t.options.postrollCloseText : mejs.i18n.t('mejs.close'),
-				postrollLink = t.container.find('link[rel="postroll"]').attr('href');
-
-			if (typeof postrollLink !== 'undefined') {
-				player.postroll =
-					$('<div class="mejs-postroll-layer mejs-layer"><a class="mejs-postroll-close" onclick="$(this).parent().hide();return false;">' + postrollTitle + '</a><div class="mejs-postroll-layer-content"></div></div>').prependTo(layers).hide();
-
-				t.media.addEventListener('ended', function (e) {
-					$.ajax({
-						dataType: 'html',
-						url: postrollLink,
-						success: function (data, textStatus) {
-							layers.find('.mejs-postroll-layer-content').html(data);
-						}
-					});
-					player.postroll.show();
-				}, false);
+	var parts = time.split(':');
+
+	var output = void 0,
+	    hours = 0,
+	    minutes = 0,
+	    seconds = 0,
+	    frames = 0,
+	    totalMinutes = 0,
+	    dropFrames = Math.round(fps * 0.066666),
+	    timeBase = Math.round(fps),
+	    hFrames = timeBase * 3600,
+	    mFrames = timeBase * 60;
+
+	switch (parts.length) {
+		default:
+		case 1:
+			seconds = parseInt(parts[0], 10);
+			break;
+		case 2:
+			minutes = parseInt(parts[0], 10);
+			seconds = parseInt(parts[1], 10);
+			break;
+		case 3:
+			hours = parseInt(parts[0], 10);
+			minutes = parseInt(parts[1], 10);
+			seconds = parseInt(parts[2], 10);
+			break;
+		case 4:
+			hours = parseInt(parts[0], 10);
+			minutes = parseInt(parts[1], 10);
+			seconds = parseInt(parts[2], 10);
+			frames = parseInt(parts[3], 10);
+			break;
+	}
+
+	if (isDropFrame(fps)) {
+		totalMinutes = 60 * hours + minutes;
+		output = hFrames * hours + mFrames * minutes + timeBase * seconds + frames - dropFrames * (totalMinutes - Math.floor(totalMinutes / 10));
+	} else {
+		output = (hFrames * hours + mFrames * minutes + fps * seconds + frames) / fps;
+	}
+
+	return parseFloat(output.toFixed(3));
+}
+
+function calculateTimeFormat(time, options) {
+	var fps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 25;
+
+
+	time = !time || typeof time !== 'number' || time < 0 ? 0 : time;
+
+	var hours = Math.floor(time / 3600) % 24,
+	    minutes = Math.floor(time / 60) % 60,
+	    seconds = Math.floor(time % 60),
+	    frames = Math.floor((time % 1 * fps).toFixed(3)),
+	    lis = [[frames, 'f'], [seconds, 's'], [minutes, 'm'], [hours, 'h']];
+
+	var format = options.timeFormat,
+	    firstTwoPlaces = format[1] === format[0],
+	    separatorIndex = firstTwoPlaces ? 2 : 1,
+	    separator = format.length < separatorIndex ? format[separatorIndex] : ':',
+	    firstChar = format[0],
+	    required = false;
+
+	for (var i = 0, len = lis.length; i < len; i++) {
+		if (~format.indexOf(lis[i][1])) {
+			required = true;
+		} else if (required) {
+			var hasNextValue = false;
+			for (var j = i; j < len; j++) {
+				if (lis[j][0] > 0) {
+					hasNextValue = true;
+					break;
+				}
+			}
+
+			if (!hasNextValue) {
+				break;
+			}
+
+			if (!firstTwoPlaces) {
+				format = firstChar + format;
+			}
+			format = lis[i][1] + separator + format;
+			if (firstTwoPlaces) {
+				format = lis[i][1] + format;
 			}
+			firstChar = lis[i][1];
 		}
-	});
+	}
 
-})(mejs.$);
-/*
-MediaElement-Markers is a MediaElement.js plugin that lets you add Visual Cues in the progress time rail. 
-This plugin also lets you register a custom callback function that will be called everytime the play position reaches a marker. 
-Marker position and a reference to the MediaElement Player object is passed to the registered callback function for any post processing. Marker color is configurable.
+	options.currentTimeFormat = format;
+}
 
-*/
+function convertSMPTEtoSeconds(SMPTE) {
 
-(function ($) {
-    // markers
+	if (typeof SMPTE !== 'string') {
+		throw new TypeError('Argument must be a string value');
+	}
 
-    $.extend(mejs.MepDefaults, {
-        markerColor: '#E9BC3D', //default marker color
-        markers: [],
-        markerCallback: function () {
+	SMPTE = SMPTE.replace(',', '.');
 
-        }
-    });
+	var decimalLen = ~SMPTE.indexOf('.') ? SMPTE.split('.')[1].length : 0;
 
-    $.extend(MediaElementPlayer.prototype, {
-        buildmarkers: function (player, controls, layers, media) {
-            var t = this,
-                i = 0,
-                currentPos = -1,
-                currentMarker = -1,
-                lastPlayPos = -1, //Track backward seek
-                lastMarkerCallBack = -1; //Prevents successive firing of callbacks
-
-            for (i = 0; i < player.options.markers.length; ++i) {
-                controls.find('.mejs-time-total').append('<span class="mejs-time-marker"></span>');
-            }
+	var secs = 0,
+	    multiplier = 1;
 
-            media.addEventListener('durationchange', function (e) {
-                player.setmarkers(controls);
-            });
-            media.addEventListener('timeupdate', function (e) {
-                currentPos = Math.floor(media.currentTime);
-                if (lastPlayPos > currentPos) {
-                    if (lastMarkerCallBack > currentPos) {
-                        lastMarkerCallBack = -1;
-                    }
-                } else {
-                    lastPlayPos = currentPos;
-                }
-
-                for (i = 0; i < player.options.markers.length; ++i) {
-                    currentMarker = Math.floor(player.options.markers[i]); 
-                    if (currentPos === currentMarker && currentMarker !== lastMarkerCallBack) {
-                        player.options.markerCallback(media, media.currentTime); //Fires the callback function
-                        lastMarkerCallBack = currentMarker;
-                    }
-                }
-
-            }, false);
-
-        },
-        setmarkers: function (controls) {
-            var t = this,
-                i = 0,
-                left;
-
-            for (i = 0; i < t.options.markers.length; ++i) {
-                if (Math.floor(t.options.markers[i]) <= t.media.duration && Math.floor(t.options.markers[i]) >= 0) {
-                    left = 100 * Math.floor(t.options.markers[i]) / t.media.duration;
-                    $(controls.find('.mejs-time-marker')[i]).css({
-                        "width": "1px",
-                        "left": left+"%",
-                        "background": t.options.markerColor
-                    });
-                }
-            }
+	SMPTE = SMPTE.split(':').reverse();
 
-        }
-    });
-})(mejs.$);
+	for (var i = 0, total = SMPTE.length; i < total; i++) {
+		multiplier = 1;
+		if (i > 0) {
+			multiplier = Math.pow(60, i);
+		}
+		secs += Number(SMPTE[i]) * multiplier;
+	}
+	return Number(secs.toFixed(decimalLen));
+}
+
+_mejs2.default.Utils = _mejs2.default.Utils || {};
+_mejs2.default.Utils.secondsToTimeCode = secondsToTimeCode;
+_mejs2.default.Utils.timeCodeToSeconds = timeCodeToSeconds;
+_mejs2.default.Utils.calculateTimeFormat = calculateTimeFormat;
+_mejs2.default.Utils.convertSMPTEtoSeconds = convertSMPTEtoSeconds;
+
+},{"7":7}]},{},[29,6,5,15,23,20,19,21,22,24,16,18,17,9,10,11,12,13,14]);

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 12
app/Resources/public/assets/mediaelement/build/mediaelement-and-player.min.js


BIN
app/Resources/public/assets/mediaelement/build/mediaelement-flash-audio-ogg.swf


BIN
app/Resources/public/assets/mediaelement/build/mediaelement-flash-audio.swf


BIN
app/Resources/public/assets/mediaelement/build/mediaelement-flash-video-hls.swf


BIN
app/Resources/public/assets/mediaelement/build/mediaelement-flash-video-mdash.swf


BIN
app/Resources/public/assets/mediaelement/build/mediaelement-flash-video.swf


+ 3661 - 2254
app/Resources/public/assets/mediaelement/build/mediaelement.js

@@ -1,2441 +1,3848 @@
 /*!
- *
  * MediaElement.js
- * HTML5 <video> and <audio> shim and player
- * http://mediaelementjs.com/
+ * http://www.mediaelementjs.com/
  *
- * Creates a JavaScript object that mimics HTML5 MediaElement API
- * for browsers that don't understand HTML5 or can't play the provided codec
- * Can play MP4 (H.264), Ogg, WebM, FLV, WMV, WMA, ACC, and MP3
+ * Wrapper that mimics native HTML5 MediaElement (audio and video)
+ * using a variety of technologies (pure JavaScript, Flash, iframe)
  *
- * Copyright 2010-2014, John Dyer (http://j.hn)
+ * Copyright 2010-2017, John Dyer (http://j.hn/)
  * License: MIT
  *
- */
-// Namespace
-var mejs = mejs || {};
-
-// version number
-mejs.version = '2.23.5';
-
-
-// player number (for missing, same id attr)
-mejs.meIndex = 0;
-
-// media types accepted by plugins
-mejs.plugins = {
-	silverlight: [
-		{version: [3,0], types: ['video/mp4','video/m4v','video/mov','video/wmv','audio/wma','audio/m4a','audio/mp3','audio/wav','audio/mpeg']}
-	],
-	flash: [
-		{version: [9,0,124], types: ['video/mp4','video/m4v','video/mov','video/flv','video/rtmp','video/x-flv','audio/flv','audio/x-flv','audio/mp3','audio/m4a', 'audio/mp4', 'audio/mpeg', 'video/dailymotion', 'video/x-dailymotion', 'application/x-mpegURL', 'audio/ogg']}
-		// 'video/youtube', 'video/x-youtube', 
-		// ,{version: [12,0], types: ['video/webm']} // for future reference (hopefully!)
-	],
-	youtube: [
-		{version: null, types: ['video/youtube', 'video/x-youtube', 'audio/youtube', 'audio/x-youtube']}
-	],
-	vimeo: [
-		{version: null, types: ['video/vimeo', 'video/x-vimeo']}
-	]
-};
+ */(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){
 
-/*
-Utility methods
-*/
-mejs.Utility = {
-	encodeUrl: function(url) {
-		return encodeURIComponent(url); //.replace(/\?/gi,'%3F').replace(/=/gi,'%3D').replace(/&/gi,'%26');
-	},
-	escapeHTML: function(s) {
-		return s.toString().split('&').join('&amp;').split('<').join('&lt;').split('"').join('&quot;');
-	},
-	absolutizeUrl: function(url) {
-		var el = document.createElement('div');
-		el.innerHTML = '<a href="' + this.escapeHTML(url) + '">x</a>';
-		return el.firstChild.href;
-	},
-	getScriptPath: function(scriptNames) {
-		var
-			i = 0,
-			j,
-			codePath = '',
-			testname = '',
-			slashPos,
-			filenamePos,
-			scriptUrl,
-			scriptPath,			
-			scriptFilename,
-			scripts = document.getElementsByTagName('script'),
-			il = scripts.length,
-			jl = scriptNames.length;
-			
-		// go through all <script> tags
-		for (; i < il; i++) {
-			scriptUrl = scripts[i].src;
-			slashPos = scriptUrl.lastIndexOf('/');
-			if (slashPos > -1) {
-				scriptFilename = scriptUrl.substring(slashPos + 1);
-				scriptPath = scriptUrl.substring(0, slashPos + 1);
-			} else {
-				scriptFilename = scriptUrl;
-				scriptPath = '';			
-			}
-			
-			// see if any <script> tags have a file name that matches the 
-			for (j = 0; j < jl; j++) {
-				testname = scriptNames[j];
-				filenamePos = scriptFilename.indexOf(testname);
-				if (filenamePos > -1) {
-					codePath = scriptPath;
-					break;
-				}
-			}
-			
-			// if we found a path, then break and return it
-			if (codePath !== '') {
-				break;
-			}
-		}
-		
-		// send the best path back
-		return codePath;
-	},
-	/*
-	 * Calculate the time format to use. We have a default format set in the
-	 * options but it can be imcomplete. We ajust it according to the media
-	 * duration.
-	 *
-	 * We support format like 'hh:mm:ss:ff'.
-	 */
-	calculateTimeFormat: function(time, options, fps) {
-		if (time < 0) {
-			time = 0;
-		}
-
-		if(typeof fps == 'undefined') {
-		    fps = 25;
-		}
-
-		var format = options.timeFormat,
-			firstChar = format[0],
-			firstTwoPlaces = (format[1] == format[0]),
-			separatorIndex = firstTwoPlaces? 2: 1,
-			separator = ':',
-			hours = Math.floor(time / 3600) % 24,
-			minutes = Math.floor(time / 60) % 60,
-			seconds = Math.floor(time % 60),
-			frames = Math.floor(((time % 1)*fps).toFixed(3)),
-			lis = [
-				[frames, 'f'],
-				[seconds, 's'],
-				[minutes, 'm'],
-				[hours, 'h']
-			];
-
-		// Try to get the separator from the format
-		if (format.length < separatorIndex) {
-			separator = format[separatorIndex];
-		}
-
-		var required = false;
-
-		for (var i=0, len=lis.length; i < len; i++) {
-			if (format.indexOf(lis[i][1]) !== -1) {
-				required=true;
-			}
-			else if (required) {
-				var hasNextValue = false;
-				for (var j=i; j < len; j++) {
-					if (lis[j][0] > 0) {
-						hasNextValue = true;
-						break;
-					}
-				}
+},{}],2:[function(_dereq_,module,exports){
+(function (global){
+var topLevel = typeof global !== 'undefined' ? global :
+    typeof window !== 'undefined' ? window : {}
+var minDoc = _dereq_(1);
 
-				if (! hasNextValue) {
-					break;
-				}
+var doccy;
 
-				if (!firstTwoPlaces) {
-					format = firstChar + format;
-				}
-				format = lis[i][1] + separator + format;
-				if (firstTwoPlaces) {
-					format = lis[i][1] + format;
-				}
-				firstChar = lis[i][1];
-			}
-		}
-		options.currentTimeFormat = format;
-	},
-	/*
-	 * Prefix the given number by zero if it is lower than 10.
-	 */
-	twoDigitsString: function(n) {
-		if (n < 10) {
-			return '0' + n;
-		}
-		return String(n);
-	},
-	secondsToTimeCode: function(time, options) {
-		if (time < 0) {
-			time = 0;
-		}
+if (typeof document !== 'undefined') {
+    doccy = document;
+} else {
+    doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];
 
-		// Maintain backward compatibility with method signature before v2.18.
-		if (typeof options !== 'object') {
-			var format = 'm:ss';
-			format = arguments[1] ? 'hh:mm:ss' : format; // forceHours
-			format = arguments[2] ? format + ':ff' : format; // showFrameCount
+    if (!doccy) {
+        doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;
+    }
+}
 
-			options = {
-				currentTimeFormat: format,
-				framesPerSecond: arguments[3] || 25
-			};
-		}
+module.exports = doccy;
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"1":1}],3:[function(_dereq_,module,exports){
+(function (global){
+var win;
+
+if (typeof window !== "undefined") {
+    win = window;
+} else if (typeof global !== "undefined") {
+    win = global;
+} else if (typeof self !== "undefined"){
+    win = self;
+} else {
+    win = {};
+}
 
-		var fps = options.framesPerSecond;
-		if(typeof fps === 'undefined') {
-			fps = 25;
-		}
+module.exports = win;
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],4:[function(_dereq_,module,exports){
+(function (root) {
+
+  // Store setTimeout reference so promise-polyfill will be unaffected by
+  // other code modifying setTimeout (like sinon.useFakeTimers())
+  var setTimeoutFunc = setTimeout;
+
+  function noop() {}
+  
+  // Polyfill for Function.prototype.bind
+  function bind(fn, thisArg) {
+    return function () {
+      fn.apply(thisArg, arguments);
+    };
+  }
+
+  function Promise(fn) {
+    if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new');
+    if (typeof fn !== 'function') throw new TypeError('not a function');
+    this._state = 0;
+    this._handled = false;
+    this._value = undefined;
+    this._deferreds = [];
+
+    doResolve(fn, this);
+  }
+
+  function handle(self, deferred) {
+    while (self._state === 3) {
+      self = self._value;
+    }
+    if (self._state === 0) {
+      self._deferreds.push(deferred);
+      return;
+    }
+    self._handled = true;
+    Promise._immediateFn(function () {
+      var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
+      if (cb === null) {
+        (self._state === 1 ? resolve : reject)(deferred.promise, self._value);
+        return;
+      }
+      var ret;
+      try {
+        ret = cb(self._value);
+      } catch (e) {
+        reject(deferred.promise, e);
+        return;
+      }
+      resolve(deferred.promise, ret);
+    });
+  }
+
+  function resolve(self, newValue) {
+    try {
+      // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
+      if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.');
+      if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
+        var then = newValue.then;
+        if (newValue instanceof Promise) {
+          self._state = 3;
+          self._value = newValue;
+          finale(self);
+          return;
+        } else if (typeof then === 'function') {
+          doResolve(bind(then, newValue), self);
+          return;
+        }
+      }
+      self._state = 1;
+      self._value = newValue;
+      finale(self);
+    } catch (e) {
+      reject(self, e);
+    }
+  }
+
+  function reject(self, newValue) {
+    self._state = 2;
+    self._value = newValue;
+    finale(self);
+  }
+
+  function finale(self) {
+    if (self._state === 2 && self._deferreds.length === 0) {
+      Promise._immediateFn(function() {
+        if (!self._handled) {
+          Promise._unhandledRejectionFn(self._value);
+        }
+      });
+    }
+
+    for (var i = 0, len = self._deferreds.length; i < len; i++) {
+      handle(self, self._deferreds[i]);
+    }
+    self._deferreds = null;
+  }
+
+  function Handler(onFulfilled, onRejected, promise) {
+    this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
+    this.onRejected = typeof onRejected === 'function' ? onRejected : null;
+    this.promise = promise;
+  }
+
+  /**
+   * Take a potentially misbehaving resolver function and make sure
+   * onFulfilled and onRejected are only called once.
+   *
+   * Makes no guarantees about asynchrony.
+   */
+  function doResolve(fn, self) {
+    var done = false;
+    try {
+      fn(function (value) {
+        if (done) return;
+        done = true;
+        resolve(self, value);
+      }, function (reason) {
+        if (done) return;
+        done = true;
+        reject(self, reason);
+      });
+    } catch (ex) {
+      if (done) return;
+      done = true;
+      reject(self, ex);
+    }
+  }
+
+  Promise.prototype['catch'] = function (onRejected) {
+    return this.then(null, onRejected);
+  };
+
+  Promise.prototype.then = function (onFulfilled, onRejected) {
+    var prom = new (this.constructor)(noop);
+
+    handle(this, new Handler(onFulfilled, onRejected, prom));
+    return prom;
+  };
+
+  Promise.all = function (arr) {
+    var args = Array.prototype.slice.call(arr);
+
+    return new Promise(function (resolve, reject) {
+      if (args.length === 0) return resolve([]);
+      var remaining = args.length;
+
+      function res(i, val) {
+        try {
+          if (val && (typeof val === 'object' || typeof val === 'function')) {
+            var then = val.then;
+            if (typeof then === 'function') {
+              then.call(val, function (val) {
+                res(i, val);
+              }, reject);
+              return;
+            }
+          }
+          args[i] = val;
+          if (--remaining === 0) {
+            resolve(args);
+          }
+        } catch (ex) {
+          reject(ex);
+        }
+      }
+
+      for (var i = 0; i < args.length; i++) {
+        res(i, args[i]);
+      }
+    });
+  };
+
+  Promise.resolve = function (value) {
+    if (value && typeof value === 'object' && value.constructor === Promise) {
+      return value;
+    }
+
+    return new Promise(function (resolve) {
+      resolve(value);
+    });
+  };
+
+  Promise.reject = function (value) {
+    return new Promise(function (resolve, reject) {
+      reject(value);
+    });
+  };
+
+  Promise.race = function (values) {
+    return new Promise(function (resolve, reject) {
+      for (var i = 0, len = values.length; i < len; i++) {
+        values[i].then(resolve, reject);
+      }
+    });
+  };
+
+  // Use polyfill for setImmediate for performance gains
+  Promise._immediateFn = (typeof setImmediate === 'function' && function (fn) { setImmediate(fn); }) ||
+    function (fn) {
+      setTimeoutFunc(fn, 0);
+    };
+
+  Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {
+    if (typeof console !== 'undefined' && console) {
+      console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console
+    }
+  };
+
+  /**
+   * Set the immediate function to execute callbacks
+   * @param fn {function} Function to execute
+   * @deprecated
+   */
+  Promise._setImmediateFn = function _setImmediateFn(fn) {
+    Promise._immediateFn = fn;
+  };
+
+  /**
+   * Change the function to execute on unhandled rejection
+   * @param {function} fn Function to execute on unhandled rejection
+   * @deprecated
+   */
+  Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {
+    Promise._unhandledRejectionFn = fn;
+  };
+  
+  if (typeof module !== 'undefined' && module.exports) {
+    module.exports = Promise;
+  } else if (!root.Promise) {
+    root.Promise = Promise;
+  }
+
+})(this);
+
+},{}],5:[function(_dereq_,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
 
-		var format = options.currentTimeFormat,
-			hours = Math.floor(time / 3600) % 24,
-			minutes = Math.floor(time / 60) % 60,
-			seconds = Math.floor(time % 60),
-			frames = Math.floor(((time % 1)*fps).toFixed(3));
-			lis = [
-				[frames, 'f'],
-				[seconds, 's'],
-				[minutes, 'm'],
-				[hours, 'h']
-			];
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
 
-		var res = format;
-		for (i=0,len=lis.length; i < len; i++) {
-			res = res.replace(lis[i][1]+lis[i][1], this.twoDigitsString(lis[i][0]));
-			res = res.replace(lis[i][1], lis[i][0]);
+var _mejs = _dereq_(7);
+
+var _mejs2 = _interopRequireDefault(_mejs);
+
+var _en = _dereq_(9);
+
+var _general = _dereq_(18);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var i18n = { lang: 'en', en: _en.EN };
+
+i18n.language = function () {
+	for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+		args[_key] = arguments[_key];
+	}
+
+	if (args !== null && args !== undefined && args.length) {
+
+		if (typeof args[0] !== 'string') {
+			throw new TypeError('Language code must be a string value');
 		}
-		return res;
-	},
-	
-	timeCodeToSeconds: function(hh_mm_ss_ff, forceHours, showFrameCount, fps){
-		if (typeof showFrameCount == 'undefined') {
-		    showFrameCount=false;
-		} else if(typeof fps == 'undefined') {
-		    fps = 25;
-		}
-	
-		var tc_array = hh_mm_ss_ff.split(":"),
-			tc_hh = parseInt(tc_array[0], 10),
-			tc_mm = parseInt(tc_array[1], 10),
-			tc_ss = parseInt(tc_array[2], 10),
-			tc_ff = 0,
-			tc_in_seconds = 0;
-		
-		if (showFrameCount) {
-		    tc_ff = parseInt(tc_array[3])/fps;
-		}
-		
-		tc_in_seconds = ( tc_hh * 3600 ) + ( tc_mm * 60 ) + tc_ss + tc_ff;
-		
-		return tc_in_seconds;
-	},
-	
-
-	convertSMPTEtoSeconds: function (SMPTE) {
-		if (typeof SMPTE != 'string') 
-			return false;
-
-		SMPTE = SMPTE.replace(',', '.');
-		
-		var secs = 0,
-			decimalLen = (SMPTE.indexOf('.') != -1) ? SMPTE.split('.')[1].length : 0,
-			multiplier = 1;
-		
-		SMPTE = SMPTE.split(':').reverse();
-		
-		for (var i = 0; i < SMPTE.length; i++) {
-			multiplier = 1;
-			if (i > 0) {
-				multiplier = Math.pow(60, i); 
-			}
-			secs += Number(SMPTE[i]) * multiplier;
-		}
-		return Number(secs.toFixed(decimalLen));
-	},	
-	
-	/* borrowed from SWFObject: http://code.google.com/p/swfobject/source/browse/trunk/swfobject/src/swfobject.js#474 */
-	removeSwf: function(id) {
-		var obj = document.getElementById(id);
-		if (obj && /object|embed/i.test(obj.nodeName)) {
-			if (mejs.MediaFeatures.isIE) {
-				obj.style.display = "none";
-				(function(){
-					if (obj.readyState == 4) {
-						mejs.Utility.removeObjectInIE(id);
-					} else {
-						setTimeout(arguments.callee, 10);
-					}
-				})();
-			} else {
-				obj.parentNode.removeChild(obj);
-			}
+
+		if (!/^[a-z]{2}(\-[a-z]{2})?$/i.test(args[0])) {
+			throw new TypeError('Language code must have format `xx` or `xx-xx`');
 		}
-	},
-	removeObjectInIE: function(id) {
-		var obj = document.getElementById(id);
-		if (obj) {
-			for (var i in obj) {
-				if (typeof obj[i] == "function") {
-					obj[i] = null;
-				}
-			}
-			obj.parentNode.removeChild(obj);
-		}		
-	},
-    determineScheme: function(url) {
-        if (url && url.indexOf("://") != -1) {
-            return url.substr(0, url.indexOf("://")+3);
-        }
-        return "//"; // let user agent figure this out
-    },
-
-	// taken from underscore
-	debounce: function(func, wait, immediate) {
-		var timeout;
-		return function() {
-			var context = this, args = arguments;
-			var later = function() {
-				timeout = null;
-				if (!immediate) func.apply(context, args);
-			};
-			var callNow = immediate && !timeout;
-			clearTimeout(timeout);
-			timeout = setTimeout(later, wait);
-			if (callNow) func.apply(context, args);
-		};
-	},
 
-	/**
-	* Returns true if targetNode appears after sourceNode in the dom.
-	* @param {HTMLElement} sourceNode - the source node for comparison
-	* @param {HTMLElement} targetNode - the node to compare against sourceNode
-	*/
-	isNodeAfter: function(sourceNode, targetNode) {
-		return !!(
-			sourceNode &&
-			targetNode &&
-			typeof sourceNode.compareDocumentPosition === 'function' &&
-			sourceNode.compareDocumentPosition(targetNode) & Node.DOCUMENT_POSITION_PRECEDING
-		);
+		i18n.lang = args[0];
+
+		if (i18n[args[0]] === undefined) {
+			args[1] = args[1] !== null && args[1] !== undefined && _typeof(args[1]) === 'object' ? args[1] : {};
+			i18n[args[0]] = !(0, _general.isObjectEmpty)(args[1]) ? args[1] : _en.EN;
+		} else if (args[1] !== null && args[1] !== undefined && _typeof(args[1]) === 'object') {
+			i18n[args[0]] = args[1];
+		}
 	}
+
+	return i18n.lang;
 };
 
+i18n.t = function (message) {
+	var pluralParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
 
-// Core detector, plugins are added below
-mejs.PluginDetector = {
 
-	// main public function to test a plug version number PluginDetector.hasPluginVersion('flash',[9,0,125]);
-	hasPluginVersion: function(plugin, v) {
-		var pv = this.plugins[plugin];
-		v[1] = v[1] || 0;
-		v[2] = v[2] || 0;
-		return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
-	},
+	if (typeof message === 'string' && message.length) {
 
-	// cached values
-	nav: window.navigator,
-	ua: window.navigator.userAgent.toLowerCase(),
+		var str = void 0,
+		    pluralForm = void 0;
 
-	// stored version numbers
-	plugins: [],
+		var language = i18n.language();
 
-	// runs detectPlugin() and stores the version number
-	addPlugin: function(p, pluginName, mimeType, activeX, axDetect) {
-		this.plugins[p] = this.detectPlugin(pluginName, mimeType, activeX, axDetect);
-	},
+		var _plural = function _plural(input, number, form) {
+
+			if ((typeof input === 'undefined' ? 'undefined' : _typeof(input)) !== 'object' || typeof number !== 'number' || typeof form !== 'number') {
+				return input;
+			}
 
-	// get the version number from the mimetype (all but IE) or ActiveX (IE)
-	detectPlugin: function(pluginName, mimeType, activeX, axDetect) {
+			var _pluralForms = function () {
+				return [function () {
+					return arguments.length <= 1 ? undefined : arguments[1];
+				}, function () {
+					return (arguments.length <= 0 ? undefined : arguments[0]) === 1 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2];
+				}, function () {
+					return (arguments.length <= 0 ? undefined : arguments[0]) === 0 || (arguments.length <= 0 ? undefined : arguments[0]) === 1 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2];
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 !== 11) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) !== 0) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1 || (arguments.length <= 0 ? undefined : arguments[0]) === 11) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2 || (arguments.length <= 0 ? undefined : arguments[0]) === 12) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) > 2 && (arguments.length <= 0 ? undefined : arguments[0]) < 20) {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					} else {
+						return arguments.length <= 4 ? undefined : arguments[4];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 0 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 > 0 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 < 20) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 !== 11) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return [3];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 !== 11) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 <= 4 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) <= 4) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 <= 4 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 === 1) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 === 2) {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 === 3 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 === 4) {
+						return arguments.length <= 4 ? undefined : arguments[4];
+					} else {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) > 2 && (arguments.length <= 0 ? undefined : arguments[0]) < 7) {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) > 6 && (arguments.length <= 0 ? undefined : arguments[0]) < 11) {
+						return arguments.length <= 4 ? undefined : arguments[4];
+					} else {
+						return arguments.length <= 5 ? undefined : arguments[5];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 0) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 3 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 <= 10) {
+						return arguments.length <= 4 ? undefined : arguments[4];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 11) {
+						return arguments.length <= 5 ? undefined : arguments[5];
+					} else {
+						return arguments.length <= 6 ? undefined : arguments[6];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 0 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 > 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 < 11) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 > 10 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 < 20) {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					} else {
+						return arguments.length <= 4 ? undefined : arguments[4];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 2) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					}
+				}, function () {
+					return (arguments.length <= 0 ? undefined : arguments[0]) !== 11 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2];
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 <= 4 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) !== 8 && (arguments.length <= 0 ? undefined : arguments[0]) !== 11) {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					} else {
+						return arguments.length <= 4 ? undefined : arguments[4];
+					}
+				}, function () {
+					return (arguments.length <= 0 ? undefined : arguments[0]) === 0 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2];
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 3) {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					} else {
+						return arguments.length <= 4 ? undefined : arguments[4];
+					}
+				}, function () {
+					if ((arguments.length <= 0 ? undefined : arguments[0]) === 0) {
+						return arguments.length <= 1 ? undefined : arguments[1];
+					} else if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) {
+						return arguments.length <= 2 ? undefined : arguments[2];
+					} else {
+						return arguments.length <= 3 ? undefined : arguments[3];
+					}
+				}];
+			}();
 
-		var version = [0,0,0],
-			description,
-			i,
-			ax;
+			return _pluralForms[form].apply(null, [number].concat(input));
+		};
 
-		// Firefox, Webkit, Opera
-		if (typeof(this.nav.plugins) != 'undefined' && typeof this.nav.plugins[pluginName] == 'object') {
-			description = this.nav.plugins[pluginName].description;
-			if (description && !(typeof this.nav.mimeTypes != 'undefined' && this.nav.mimeTypes[mimeType] && !this.nav.mimeTypes[mimeType].enabledPlugin)) {
-				version = description.replace(pluginName, '').replace(/^\s+/,'').replace(/\sr/gi,'.').split('.');
-				for (i=0; i<version.length; i++) {
-					version[i] = parseInt(version[i].match(/\d+/), 10);
-				}
+		if (i18n[language] !== undefined) {
+			str = i18n[language][message];
+			if (pluralParam !== null && typeof pluralParam === 'number') {
+				pluralForm = i18n[language]['mejs.plural-form'];
+				str = _plural.apply(null, [str, pluralParam, pluralForm]);
 			}
-		// Internet Explorer / ActiveX
-		} else if (typeof(window.ActiveXObject) != 'undefined') {
-			try {
-				ax = new ActiveXObject(activeX);
-				if (ax) {
-					version = axDetect(ax);
-				}
+		}
+
+		if (!str && i18n.en) {
+			str = i18n.en[message];
+			if (pluralParam !== null && typeof pluralParam === 'number') {
+				pluralForm = i18n.en['mejs.plural-form'];
+				str = _plural.apply(null, [str, pluralParam, pluralForm]);
 			}
-			catch (e) { }
 		}
-		return version;
+
+		str = str || message;
+
+		if (pluralParam !== null && typeof pluralParam === 'number') {
+			str = str.replace('%1', pluralParam);
+		}
+
+		return (0, _general.escapeHTML)(str);
 	}
+
+	return message;
 };
 
-// Add Flash detection
-mejs.PluginDetector.addPlugin('flash','Shockwave Flash','application/x-shockwave-flash','ShockwaveFlash.ShockwaveFlash', function(ax) {
-	// adapted from SWFObject
-	var version = [],
-		d = ax.GetVariable("$version");
-	if (d) {
-		d = d.split(" ")[1].split(",");
-		version = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
-	}
-	return version;
-});
+_mejs2.default.i18n = i18n;
 
-// Add Silverlight detection
-mejs.PluginDetector.addPlugin('silverlight','Silverlight Plug-In','application/x-silverlight-2','AgControl.AgControl', function (ax) {
-	// Silverlight cannot report its version number to IE
-	// but it does have a isVersionSupported function, so we have to loop through it to get a version number.
-	// adapted from http://www.silverlightversion.com/
-	var v = [0,0,0,0],
-		loopMatch = function(ax, v, i, n) {
-			while(ax.isVersionSupported(v[0]+ "."+ v[1] + "." + v[2] + "." + v[3])){
-				v[i]+=n;
-			}
-			v[i] -= n;
-		};
-	loopMatch(ax, v, 0, 1);
-	loopMatch(ax, v, 1, 1);
-	loopMatch(ax, v, 2, 10000); // the third place in the version number is usually 5 digits (4.0.xxxxx)
-	loopMatch(ax, v, 2, 1000);
-	loopMatch(ax, v, 2, 100);
-	loopMatch(ax, v, 2, 10);
-	loopMatch(ax, v, 2, 1);
-	loopMatch(ax, v, 3, 1);
-
-	return v;
-});
-// add adobe acrobat
-/*
-PluginDetector.addPlugin('acrobat','Adobe Acrobat','application/pdf','AcroPDF.PDF', function (ax) {
-	var version = [],
-		d = ax.GetVersions().split(',')[0].split('=')[1].split('.');
+if (typeof mejsL10n !== 'undefined') {
+	_mejs2.default.i18n.language(mejsL10n.language, mejsL10n.strings);
+}
 
-	if (d) {
-		version = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
-	}
-	return version;
+exports.default = i18n;
+
+},{"18":18,"7":7,"9":9}],6:[function(_dereq_,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+	value: true
 });
-*/
-// necessary detection (fixes for <IE9)
-mejs.MediaFeatures = {
-	init: function() {
-		var
-			t = this,
-			d = document,
-			nav = mejs.PluginDetector.nav,
-			ua = mejs.PluginDetector.ua.toLowerCase(),
-			i,
-			v,
-			html5Elements = ['source','track','audio','video'];
-
-		// detect browsers (only the ones that have some kind of quirk we need to work around)
-		t.isiPad = (ua.match(/ipad/i) !== null);
-		t.isiPhone = (ua.match(/iphone/i) !== null);
-		t.isiOS = t.isiPhone || t.isiPad;
-		t.isAndroid = (ua.match(/android/i) !== null);
-		t.isBustedAndroid = (ua.match(/android 2\.[12]/) !== null);
-		t.isBustedNativeHTTPS = (location.protocol === 'https:' && (ua.match(/android [12]\./) !== null || ua.match(/macintosh.* version.* safari/) !== null));
-		t.isIE = (nav.appName.toLowerCase().indexOf("microsoft") != -1 || nav.appName.toLowerCase().match(/trident/gi) !== null);
-		t.isChrome = (ua.match(/chrome/gi) !== null);
-		t.isChromium = (ua.match(/chromium/gi) !== null);
-		t.isFirefox = (ua.match(/firefox/gi) !== null);
-		t.isWebkit = (ua.match(/webkit/gi) !== null);
-		t.isGecko = (ua.match(/gecko/gi) !== null) && !t.isWebkit && !t.isIE;
-		t.isOpera = (ua.match(/opera/gi) !== null);
-		t.hasTouch = ('ontouchstart' in window); //  && window.ontouchstart != null); // this breaks iOS 7
-
-		// Borrowed from `Modernizr.svgasimg`, sources:
-		// - https://github.com/Modernizr/Modernizr/issues/687
-		// - https://github.com/Modernizr/Modernizr/pull/1209/files
-		t.svgAsImg = !!document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#Image', '1.1');
-
-		// create HTML5 media elements for IE before 9, get a <video> element for fullscreen detection
-		for (i=0; i<html5Elements.length; i++) {
-			v = document.createElement(html5Elements[i]);
-		}
-
-		t.supportsMediaTag = (typeof v.canPlayType !== 'undefined' || t.isBustedAndroid);
-
-		// Fix for IE9 on Windows 7N / Windows 7KN (Media Player not installer)
-		try{
-			v.canPlayType("video/mp4");
-		}catch(e){
-			t.supportsMediaTag = false;
-		}
-
-		t.supportsPointerEvents = (function() {
-			// TAKEN FROM MODERNIZR
-			var element = document.createElement('x'),
-				documentElement = document.documentElement,
-				getComputedStyle = window.getComputedStyle,
-				supports;
-			if(!('pointerEvents' in element.style)){
-				return false;
-			}
-			element.style.pointerEvents = 'auto';
-			element.style.pointerEvents = 'x';
-			documentElement.appendChild(element);
-			supports = getComputedStyle &&
-				getComputedStyle(element, '').pointerEvents === 'auto';
-			documentElement.removeChild(element);
-			return !!supports;
-		})();
 
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
 
-		 // Older versions of Firefox can't move plugins around without it resetting,
-		t.hasFirefoxPluginMovingProblem = false;
+var _window = _dereq_(3);
 
-		// detect native JavaScript fullscreen (Safari/Firefox only, Chrome still fails)
+var _window2 = _interopRequireDefault(_window);
 
-		// iOS
-		t.hasiOSFullScreen = (typeof v.webkitEnterFullscreen !== 'undefined');
+var _document = _dereq_(2);
 
-		// W3C
-		t.hasNativeFullscreen = (typeof v.requestFullscreen !== 'undefined');
+var _document2 = _interopRequireDefault(_document);
 
-		// webkit/firefox/IE11+
-		t.hasWebkitNativeFullScreen = (typeof v.webkitRequestFullScreen !== 'undefined');
-		t.hasMozNativeFullScreen = (typeof v.mozRequestFullScreen !== 'undefined');
-		t.hasMsNativeFullScreen = (typeof v.msRequestFullscreen !== 'undefined');
+var _mejs = _dereq_(7);
 
-		t.hasTrueNativeFullScreen = (t.hasWebkitNativeFullScreen || t.hasMozNativeFullScreen || t.hasMsNativeFullScreen);
-		t.nativeFullScreenEnabled = t.hasTrueNativeFullScreen;
+var _mejs2 = _interopRequireDefault(_mejs);
 
-		// Enabled?
-		if (t.hasMozNativeFullScreen) {
-			t.nativeFullScreenEnabled = document.mozFullScreenEnabled;
-		} else if (t.hasMsNativeFullScreen) {
-			t.nativeFullScreenEnabled = document.msFullscreenEnabled;
-		}
+var _general = _dereq_(18);
 
-		if (t.isChrome) {
-			t.hasiOSFullScreen = false;
-		}
+var _media2 = _dereq_(19);
 
-		if (t.hasTrueNativeFullScreen) {
+var _renderer = _dereq_(8);
 
-			t.fullScreenEventName = '';
-			if (t.hasWebkitNativeFullScreen) {
-				t.fullScreenEventName = 'webkitfullscreenchange';
+var _constants = _dereq_(16);
 
-			} else if (t.hasMozNativeFullScreen) {
-				t.fullScreenEventName = 'mozfullscreenchange';
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-			} else if (t.hasMsNativeFullScreen) {
-				t.fullScreenEventName = 'MSFullscreenChange';
-			}
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 
-			t.isFullScreen = function() {
-				if (t.hasMozNativeFullScreen) {
-					return d.mozFullScreen;
+var MediaElement = function MediaElement(idOrNode, options, sources) {
+	var _this = this;
 
-				} else if (t.hasWebkitNativeFullScreen) {
-					return d.webkitIsFullScreen;
+	_classCallCheck(this, MediaElement);
 
-				} else if (t.hasMsNativeFullScreen) {
-					return d.msFullscreenElement !== null;
-				}
-			}
+	var t = this;
 
-			t.requestFullScreen = function(el) {
+	sources = Array.isArray(sources) ? sources : null;
 
-				if (t.hasWebkitNativeFullScreen) {
-					el.webkitRequestFullScreen();
+	t.defaults = {
+		renderers: [],
 
-				} else if (t.hasMozNativeFullScreen) {
-					el.mozRequestFullScreen();
+		fakeNodeName: 'mediaelementwrapper',
 
-				} else if (t.hasMsNativeFullScreen) {
-					el.msRequestFullscreen();
+		pluginPath: 'build/',
 
-				}
-			}
+		shimScriptAccess: 'sameDomain'
+	};
 
-			t.cancelFullScreen = function() {
-				if (t.hasWebkitNativeFullScreen) {
-					document.webkitCancelFullScreen();
+	options = Object.assign(t.defaults, options);
 
-				} else if (t.hasMozNativeFullScreen) {
-					document.mozCancelFullScreen();
+	t.mediaElement = _document2.default.createElement(options.fakeNodeName);
 
-				} else if (t.hasMsNativeFullScreen) {
-					document.msExitFullscreen();
+	var id = idOrNode,
+	    error = false;
 
-				}
-			}
+	if (typeof idOrNode === 'string') {
+		t.mediaElement.originalNode = _document2.default.getElementById(idOrNode);
+	} else {
+		t.mediaElement.originalNode = idOrNode;
+		id = idOrNode.id;
+	}
 
-		}
+	if (t.mediaElement.originalNode === undefined || t.mediaElement.originalNode === null) {
+		return null;
+	}
 
+	t.mediaElement.options = options;
+	id = id || 'mejs_' + Math.random().toString().slice(2);
 
-		// OS X 10.5 can't do this even if it says it can :(
-		if (t.hasiOSFullScreen && ua.match(/mac os x 10_5/i)) {
-			t.hasNativeFullScreen = false;
-			t.hasiOSFullScreen = false;
-		}
+	t.mediaElement.originalNode.setAttribute('id', id + '_from_mejs');
 
+	var tagName = t.mediaElement.originalNode.tagName.toLowerCase();
+	if (['video', 'audio'].indexOf(tagName) > -1 && !t.mediaElement.originalNode.getAttribute('preload')) {
+		t.mediaElement.originalNode.setAttribute('preload', 'none');
 	}
-};
-mejs.MediaFeatures.init();
 
-/*
-extension methods to <video> or <audio> object to bring it into parity with PluginMediaElement (see below)
-*/
-mejs.HtmlMediaElement = {
-	pluginType: 'native',
-	isFullScreen: false,
+	t.mediaElement.originalNode.parentNode.insertBefore(t.mediaElement, t.mediaElement.originalNode);
 
-	setCurrentTime: function (time) {
-		this.currentTime = time;
-	},
+	t.mediaElement.appendChild(t.mediaElement.originalNode);
 
-	setMuted: function (muted) {
-		this.muted = muted;
-	},
+	var processURL = function processURL(url, type) {
+		if (_window2.default.location.protocol === 'https:' && url.indexOf('http:') === 0 && _constants.IS_IOS && _mejs2.default.html5media.mediaTypes.indexOf(type) > -1) {
+			var xhr = new XMLHttpRequest();
+			xhr.onreadystatechange = function () {
+				if (this.readyState === 4 && this.status === 200) {
+					var _url = _window2.default.URL || _window2.default.webkitURL,
+					    blobUrl = _url.createObjectURL(this.response);
+					t.mediaElement.originalNode.setAttribute('src', blobUrl);
+					return blobUrl;
+				}
+				return url;
+			};
+			xhr.open('GET', url);
+			xhr.responseType = 'blob';
+			xhr.send();
+		}
 
-	setVolume: function (volume) {
-		this.volume = volume;
-	},
+		return url;
+	};
 
-	// for parity with the plugin versions
-	stop: function () {
-		this.pause();
-	},
+	var mediaFiles = void 0;
 
-	// This can be a url string
-	// or an array [{src:'file.mp4',type:'video/mp4'},{src:'file.webm',type:'video/webm'}]
-	setSrc: function (url) {
-		
-		// Fix for IE9 which can't set .src when there are <source> elements. Awesome, right?
-		var 
-			existingSources = this.getElementsByTagName('source');
-		while (existingSources.length > 0){
-			this.removeChild(existingSources[0]);
-		}
-	
-		if (typeof url == 'string') {
-			this.src = url;
-		} else {
-			var i, media;
+	if (sources !== null) {
+		mediaFiles = sources;
+	} else if (t.mediaElement.originalNode !== null) {
 
-			for (i=0; i<url.length; i++) {
-				media = url[i];
-				if (this.canPlayType(media.type)) {
-					this.src = media.src;
-					break;
+		mediaFiles = [];
+
+		switch (t.mediaElement.originalNode.nodeName.toLowerCase()) {
+			case 'iframe':
+				mediaFiles.push({
+					type: '',
+					src: t.mediaElement.originalNode.getAttribute('src')
+				});
+				break;
+			case 'audio':
+			case 'video':
+				var _sources = t.mediaElement.originalNode.children.length,
+				    nodeSource = t.mediaElement.originalNode.getAttribute('src');
+
+				if (nodeSource) {
+					var node = t.mediaElement.originalNode,
+					    type = (0, _media2.formatType)(nodeSource, node.getAttribute('type'));
+					mediaFiles.push({
+						type: type,
+						src: processURL(nodeSource, type)
+					});
 				}
-			}
-		}
-	},
 
-	setVideoSize: function (width, height) {
-		this.width = width;
-		this.height = height;
+				for (var i = 0; i < _sources; i++) {
+					var n = t.mediaElement.originalNode.children[i];
+					if (n.tagName.toLowerCase() === 'source') {
+						var src = n.getAttribute('src'),
+						    _type = (0, _media2.formatType)(src, n.getAttribute('type'));
+						mediaFiles.push({ type: _type, src: processURL(src, _type) });
+					}
+				}
+				break;
+		}
 	}
-};
 
-/*
-Mimics the <video/audio> element by calling Flash's External Interface or Silverlights [ScriptableMember]
-*/
-mejs.PluginMediaElement = function (pluginid, pluginType, mediaUrl) {
-	this.id = pluginid;
-	this.pluginType = pluginType;
-	this.src = mediaUrl;
-	this.events = {};
-	this.attributes = {};
-};
+	t.mediaElement.id = id;
+	t.mediaElement.renderers = {};
+	t.mediaElement.events = {};
+	t.mediaElement.promises = [];
+	t.mediaElement.renderer = null;
+	t.mediaElement.rendererName = null;
 
-// JavaScript values and ExternalInterface methods that match HTML5 video properties methods
-// http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/fl/video/FLVPlayback.html
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html
-mejs.PluginMediaElement.prototype = {
-
-	// special
-	pluginElement: null,
-	pluginType: '',
-	isFullScreen: false,
-
-	// not implemented :(
-	playbackRate: -1,
-	defaultPlaybackRate: -1,
-	seekable: [],
-	played: [],
-
-	// HTML5 read-only properties
-	paused: true,
-	ended: false,
-	seeking: false,
-	duration: 0,
-	error: null,
-	tagName: '',
-
-	// HTML5 get/set properties, but only set (updated by event handlers)
-	muted: false,
-	volume: 1,
-	currentTime: 0,
-
-	// HTML5 methods
-	play: function () {
-		if (this.pluginApi != null) {
-			if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') {
-				this.pluginApi.playVideo();
-			} else {
-				this.pluginApi.playMedia();
+	t.mediaElement.changeRenderer = function (rendererName, mediaFiles) {
+
+		var t = _this,
+		    media = Object.keys(mediaFiles[0]).length > 2 ? mediaFiles[0] : mediaFiles[0].src;
+
+		if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null && t.mediaElement.renderer.name === rendererName) {
+			t.mediaElement.renderer.pause();
+			if (t.mediaElement.renderer.stop) {
+				t.mediaElement.renderer.stop();
 			}
-			this.paused = false;
+			t.mediaElement.renderer.show();
+			t.mediaElement.renderer.setSrc(media);
+			return true;
 		}
-	},
-	load: function () {
-		if (this.pluginApi != null) {
-			if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') {
-			} else {
-				this.pluginApi.loadMedia();
+
+		if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null) {
+			t.mediaElement.renderer.pause();
+			if (t.mediaElement.renderer.stop) {
+				t.mediaElement.renderer.stop();
 			}
-			
-			this.paused = false;
-		}
-	},
-	pause: function () {
-		if (this.pluginApi != null) {
-			if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') {
-		        if( this.pluginApi.getPlayerState() == 1 ) {
-				    this.pluginApi.pauseVideo();
-                }
-			} else {
-				this.pluginApi.pauseMedia();
-			}			
-			
-			
-			this.paused = true;
+			t.mediaElement.renderer.hide();
 		}
-	},
-	stop: function () {
-		if (this.pluginApi != null) {
-			if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') {
-				this.pluginApi.stopVideo();
-			} else {
-				this.pluginApi.stopMedia();
-			}	
-			this.paused = true;
+
+		var newRenderer = t.mediaElement.renderers[rendererName],
+		    newRendererType = null;
+
+		if (newRenderer !== undefined && newRenderer !== null) {
+			newRenderer.show();
+			newRenderer.setSrc(media);
+			t.mediaElement.renderer = newRenderer;
+			t.mediaElement.rendererName = rendererName;
+			return true;
 		}
-	},
-	canPlayType: function(type) {
-		var i,
-			j,
-			pluginInfo,
-			pluginVersions = mejs.plugins[this.pluginType];
-
-		for (i=0; i<pluginVersions.length; i++) {
-			pluginInfo = pluginVersions[i];
-
-			// test if user has the correct plugin version
-			if (mejs.PluginDetector.hasPluginVersion(this.pluginType, pluginInfo.version)) {
-
-				// test for plugin playback types
-				for (j=0; j<pluginInfo.types.length; j++) {
-					// find plugin that can play the type
-					if (type == pluginInfo.types[j]) {
-						return 'probably';
-					}
-				}
+
+		var rendererArray = t.mediaElement.options.renderers.length ? t.mediaElement.options.renderers : _renderer.renderer.order;
+
+		for (var _i = 0, total = rendererArray.length; _i < total; _i++) {
+			var index = rendererArray[_i];
+
+			if (index === rendererName) {
+				var rendererList = _renderer.renderer.renderers;
+				newRendererType = rendererList[index];
+
+				var renderOptions = Object.assign(newRendererType.options, t.mediaElement.options);
+				newRenderer = newRendererType.create(t.mediaElement, renderOptions, mediaFiles);
+				newRenderer.name = rendererName;
+
+				t.mediaElement.renderers[newRendererType.name] = newRenderer;
+				t.mediaElement.renderer = newRenderer;
+				t.mediaElement.rendererName = rendererName;
+				newRenderer.show();
+				return true;
 			}
 		}
 
-		return '';
-	},
-	
-	positionFullscreenButton: function(x,y,visibleAndAbove) {
-		if (this.pluginApi != null && this.pluginApi.positionFullscreenButton) {
-			this.pluginApi.positionFullscreenButton(Math.floor(x),Math.floor(y),visibleAndAbove);
+		return false;
+	};
+
+	t.mediaElement.setSize = function (width, height) {
+		if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null) {
+			t.mediaElement.renderer.setSize(width, height);
 		}
+	};
+
+	t.mediaElement.generateError = function (message, urlList) {
+		message = message || '';
+		urlList = Array.isArray(urlList) ? urlList : [];
+		var event = (0, _general.createEvent)('error', t.mediaElement);
+		event.message = message;
+		event.urls = urlList;
+		t.mediaElement.dispatchEvent(event);
+		error = true;
+	};
+
+	var props = _mejs2.default.html5media.properties,
+	    methods = _mejs2.default.html5media.methods,
+	    addProperty = function addProperty(obj, name, onGet, onSet) {
+		var oldValue = obj[name];
+		var getFn = function getFn() {
+			return onGet.apply(obj, [oldValue]);
+		},
+		    setFn = function setFn(newValue) {
+			oldValue = onSet.apply(obj, [newValue]);
+			return oldValue;
+		};
+
+		Object.defineProperty(obj, name, {
+			get: getFn,
+			set: setFn
+		});
 	},
-	
-	hideFullscreenButton: function() {
-		if (this.pluginApi != null && this.pluginApi.hideFullscreenButton) {
-			this.pluginApi.hideFullscreenButton();
-		}		
-	},	
-	
-
-	// custom methods since not all JavaScript implementations support get/set
-
-	// This can be a url string
-	// or an array [{src:'file.mp4',type:'video/mp4'},{src:'file.webm',type:'video/webm'}]
-	setSrc: function (url) {
-		if (typeof url == 'string') {
-			this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(url));
-			this.src = mejs.Utility.absolutizeUrl(url);
-		} else {
-			var i, media;
+	    assignGettersSetters = function assignGettersSetters(propName) {
+		if (propName !== 'src') {
 
-			for (i=0; i<url.length; i++) {
-				media = url[i];
-				if (this.canPlayType(media.type)) {
-					this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(media.src));
-					this.src = mejs.Utility.absolutizeUrl(media.src);
-					break;
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1),
+			    getFn = function getFn() {
+				return t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null && typeof t.mediaElement.renderer['get' + capName] === 'function' ? t.mediaElement.renderer['get' + capName]() : null;
+			},
+			    setFn = function setFn(value) {
+				if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null && typeof t.mediaElement.renderer['set' + capName] === 'function') {
+					t.mediaElement.renderer['set' + capName](value);
 				}
-			}
-		}
+			};
 
-	},
-	setCurrentTime: function (time) {
-		if (this.pluginApi != null) {
-			if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') {
-				this.pluginApi.seekTo(time);
-			} else {
-				this.pluginApi.setCurrentTime(time);
-			}				
-			
-			
-			
-			this.currentTime = time;
+			addProperty(t.mediaElement, propName, getFn, setFn);
+			t.mediaElement['get' + capName] = getFn;
+			t.mediaElement['set' + capName] = setFn;
 		}
 	},
-	setVolume: function (volume) {
-		if (this.pluginApi != null) {
-			// same on YouTube and MEjs
-			if (this.pluginType == 'youtube') {
-				this.pluginApi.setVolume(volume * 100);
-			} else {
-				this.pluginApi.setVolume(volume);
-			}
-			this.volume = volume;
-		}
+	    getSrc = function getSrc() {
+		return t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null ? t.mediaElement.renderer.getSrc() : null;
 	},
-	setMuted: function (muted) {
-		if (this.pluginApi != null) {
-			if (this.pluginType == 'youtube') {
-				if (muted) {
-					this.pluginApi.mute();
-				} else {
-					this.pluginApi.unMute();
-				}
-				this.muted = muted;
-				this.dispatchEvent({type:'volumechange'});
-			} else {
-				this.pluginApi.setMuted(muted);
+	    setSrc = function setSrc(value) {
+		var mediaFiles = [];
+
+		if (typeof value === 'string') {
+			mediaFiles.push({
+				src: value,
+				type: value ? (0, _media2.getTypeFromFile)(value) : ''
+			});
+		} else if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value.src !== undefined) {
+			var _src = (0, _media2.absolutizeUrl)(value.src),
+			    _type2 = value.type,
+			    media = Object.assign(value, {
+				src: _src,
+				type: (_type2 === '' || _type2 === null || _type2 === undefined) && _src ? (0, _media2.getTypeFromFile)(_src) : _type2
+			});
+			mediaFiles.push(media);
+		} else if (Array.isArray(value)) {
+			for (var _i2 = 0, total = value.length; _i2 < total; _i2++) {
+
+				var _src2 = (0, _media2.absolutizeUrl)(value[_i2].src),
+				    _type3 = value[_i2].type,
+				    _media = Object.assign(value[_i2], {
+					src: _src2,
+					type: (_type3 === '' || _type3 === null || _type3 === undefined) && _src2 ? (0, _media2.getTypeFromFile)(_src2) : _type3
+				});
+
+				mediaFiles.push(_media);
 			}
-			this.muted = muted;
 		}
-	},
 
-	// additional non-HTML5 methods
-	setVideoSize: function (width, height) {
-		
-		//if (this.pluginType == 'flash' || this.pluginType == 'silverlight') {
-			if (this.pluginElement && this.pluginElement.style) {
-				this.pluginElement.style.width = width + 'px';
-				this.pluginElement.style.height = height + 'px';
-			}
-			if (this.pluginApi != null && this.pluginApi.setVideoSize) {
-				this.pluginApi.setVideoSize(width, height);
-			}
-		//}
-	},
+		var renderInfo = _renderer.renderer.select(mediaFiles, t.mediaElement.options.renderers.length ? t.mediaElement.options.renderers : []),
+		    event = void 0;
 
-	setFullscreen: function (fullscreen) {
-		if (this.pluginApi != null && this.pluginApi.setFullscreen) {
-			this.pluginApi.setFullscreen(fullscreen);
+		if (!t.mediaElement.paused) {
+			t.mediaElement.pause();
+			event = (0, _general.createEvent)('pause', t.mediaElement);
+			t.mediaElement.dispatchEvent(event);
 		}
-	},
-	
-	enterFullScreen: function() {
-		if (this.pluginApi != null && this.pluginApi.setFullscreen) {
-			this.setFullscreen(true);
-		}		
-		
-	},
-	
-	exitFullScreen: function() {
-		if (this.pluginApi != null && this.pluginApi.setFullscreen) {
-			this.setFullscreen(false);
+		t.mediaElement.originalNode.src = mediaFiles[0].src || '';
+
+		if (renderInfo === null && mediaFiles[0].src) {
+			t.mediaElement.generateError('No renderer found', mediaFiles);
+			return;
 		}
-	},	
 
-	// start: fake events
-	addEventListener: function (eventName, callback, bubble) {
-		this.events[eventName] = this.events[eventName] || [];
-		this.events[eventName].push(callback);
+		return mediaFiles[0].src ? t.mediaElement.changeRenderer(renderInfo.rendererName, mediaFiles) : null;
 	},
-	removeEventListener: function (eventName, callback) {
-		if (!eventName) { this.events = {}; return true; }
-		var callbacks = this.events[eventName];
-		if (!callbacks) return true;
-		if (!callback) { this.events[eventName] = []; return true; }
-		for (var i = 0; i < callbacks.length; i++) {
-			if (callbacks[i] === callback) {
-				this.events[eventName].splice(i, 1);
-				return true;
+	    triggerAction = function triggerAction(methodName, args) {
+		try {
+			if (methodName === 'play' && t.mediaElement.rendererName === 'native_dash') {
+				setTimeout(function () {
+					t.mediaElement.renderer[methodName](args);
+				}, 100);
+			} else {
+				t.mediaElement.renderer[methodName](args);
 			}
+		} catch (e) {
+			t.mediaElement.generateError(e, mediaFiles);
 		}
-		return false;
-	},	
-	dispatchEvent: function (event) {
-		var i,
-			args,
-			callbacks = this.events[event.type];
+	},
+	    assignMethods = function assignMethods(methodName) {
+		t.mediaElement[methodName] = function () {
+			for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+				args[_key] = arguments[_key];
+			}
 
-		if (callbacks) {
-			for (i = 0; i < callbacks.length; i++) {
-				callbacks[i].apply(this, [event]);
+			if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null && typeof t.mediaElement.renderer[methodName] === 'function') {
+				if (t.mediaElement.promises.length) {
+					Promise.all(t.mediaElement.promises).then(function () {
+						triggerAction(methodName, args);
+					}).catch(function (e) {
+						t.mediaElement.generateError(e, mediaFiles);
+					});
+				} else {
+					triggerAction(methodName, args);
+				}
 			}
-		}
-	},
-	// end: fake events
-	
-	// fake DOM attribute methods
-	hasAttribute: function(name){
-		return (name in this.attributes);  
-	},
-	removeAttribute: function(name){
-		delete this.attributes[name];
-	},
-	getAttribute: function(name){
-		if (this.hasAttribute(name)) {
-			return this.attributes[name];
-		}
-		return null;
-	},
-	setAttribute: function(name, value){
-		this.attributes[name] = value;
-	},
+			return null;
+		};
+	};
+
+	addProperty(t.mediaElement, 'src', getSrc, setSrc);
+	t.mediaElement.getSrc = getSrc;
+	t.mediaElement.setSrc = setSrc;
 
-	remove: function() {
-		mejs.Utility.removeSwf(this.pluginElement.id);
+	for (var _i3 = 0, total = props.length; _i3 < total; _i3++) {
+		assignGettersSetters(props[_i3]);
 	}
-};
 
-/*
-Default options
-*/
-mejs.MediaElementDefaults = {
-	// allows testing on HTML5, flash, silverlight
-	// auto: attempts to detect what the browser can do
-	// auto_plugin: prefer plugins and then attempt native HTML5
-	// native: forces HTML5 playback
-	// shim: disallows HTML5, will attempt either Flash or Silverlight
-	// none: forces fallback view
-	mode: 'auto',
-	// remove or reorder to change plugin priority and availability
-	plugins: ['flash','silverlight','youtube','vimeo'],
-	// shows debug errors on screen
-	enablePluginDebug: false,
-	// use plugin for browsers that have trouble with Basic Authentication on HTTPS sites
-	httpsBasicAuthSite: false,
-	// overrides the type specified, useful for dynamic instantiation
-	type: '',
-	// path to Flash and Silverlight plugins
-	pluginPath: mejs.Utility.getScriptPath(['mediaelement.js','mediaelement.min.js','mediaelement-and-player.js','mediaelement-and-player.min.js']),
-	// name of flash file
-	flashName: 'flashmediaelement.swf',
-	// streamer for RTMP streaming
-	flashStreamer: '',
-	// set to 'always' for CDN version
-	flashScriptAccess: 'sameDomain',	
-	// turns on the smoothing filter in Flash
-	enablePluginSmoothing: false,
-	// enabled pseudo-streaming (seek) on .mp4 files
-	enablePseudoStreaming: false,
-	// start query parameter sent to server for pseudo-streaming
-	pseudoStreamingStartQueryParam: 'start',
-	// name of silverlight file
-	silverlightName: 'silverlightmediaelement.xap',
-	// default if the <video width> is not specified
-	defaultVideoWidth: 480,
-	// default if the <video height> is not specified
-	defaultVideoHeight: 270,
-	// overrides <video width>
-	pluginWidth: -1,
-	// overrides <video height>
-	pluginHeight: -1,
-	// additional plugin variables in 'key=value' form
-	pluginVars: [],	
-	// rate in milliseconds for Flash and Silverlight to fire the timeupdate event
-	// larger number is less accurate, but less strain on plugin->JavaScript bridge
-	timerRate: 250,
-	// initial volume for player
-	startVolume: 0.8,
-	// custom error message in case media cannot be played; otherwise, Download File
-	// link will be displayed
-	customError: "",
-	success: function () { },
-	error: function () { }
-};
+	for (var _i4 = 0, _total = methods.length; _i4 < _total; _i4++) {
+		assignMethods(methods[_i4]);
+	}
 
-/*
-Determines if a browser supports the <video> or <audio> element
-and returns either the native element or a Flash/Silverlight version that
-mimics HTML5 MediaElement
-*/
-mejs.MediaElement = function (el, o) {
-	return mejs.HtmlMediaElementShim.create(el,o);
-};
+	t.mediaElement.addEventListener = function (eventName, callback) {
+		t.mediaElement.events[eventName] = t.mediaElement.events[eventName] || [];
 
-mejs.HtmlMediaElementShim = {
-
-	create: function(el, o) {
-		var
-			options = {},
-			htmlMediaElement = (typeof(el) == 'string') ? document.getElementById(el) : el,
-			tagName = htmlMediaElement.tagName.toLowerCase(),
-			isMediaTag = (tagName === 'audio' || tagName === 'video'),
-			src = (isMediaTag) ? htmlMediaElement.getAttribute('src') : htmlMediaElement.getAttribute('href'),
-			poster = htmlMediaElement.getAttribute('poster'),
-			autoplay =  htmlMediaElement.getAttribute('autoplay'),
-			preload =  htmlMediaElement.getAttribute('preload'),
-			controls =  htmlMediaElement.getAttribute('controls'),
-			playback,
-			prop;
-
-		// extend options
-		for (prop in mejs.MediaElementDefaults) {
-			options[prop] = mejs.MediaElementDefaults[prop];
-		}
-		for (prop in o) {
-			options[prop] = o[prop];
-		}		
-		
-
-		// clean up attributes
-		src = 		(typeof src == 'undefined' 	|| src === null || src == '') ? null : src;		
-		poster =	(typeof poster == 'undefined' 	|| poster === null) ? '' : poster;
-		preload = 	(typeof preload == 'undefined' 	|| preload === null || preload === 'false') ? 'none' : preload;
-		autoplay = 	!(typeof autoplay == 'undefined' || autoplay === null || autoplay === 'false');
-		controls = 	!(typeof controls == 'undefined' || controls === null || controls === 'false');
-
-		// test for HTML5 and plugin capabilities
-		playback = this.determinePlayback(htmlMediaElement, options, mejs.MediaFeatures.supportsMediaTag, isMediaTag, src);
-		playback.url = (playback.url !== null) ? mejs.Utility.absolutizeUrl(playback.url) : '';
-        	playback.scheme = mejs.Utility.determineScheme(playback.url);
-
-		if (playback.method == 'native') {
-			// second fix for android
-			if (mejs.MediaFeatures.isBustedAndroid) {
-				htmlMediaElement.src = playback.url;
-				htmlMediaElement.addEventListener('click', function() {
-					htmlMediaElement.play();
-				}, false);
-			}
-		
-			// add methods to native HTMLMediaElement
-			return this.updateNative(playback, options, autoplay, preload);
-		} else if (playback.method !== '') {
-			// create plugin to mimic HTMLMediaElement
-			
-			return this.createPlugin( playback,  options, poster, autoplay, preload, controls);
-		} else {
-			// boo, no HTML5, no Flash, no Silverlight.
-			this.createErrorMessage( playback, options, poster );
-			
-			return this;
+		t.mediaElement.events[eventName].push(callback);
+	};
+	t.mediaElement.removeEventListener = function (eventName, callback) {
+		if (!eventName) {
+			t.mediaElement.events = {};
+			return true;
 		}
-	},
-	
-	determinePlayback: function(htmlMediaElement, options, supportsMediaTag, isMediaTag, src) {
-		var
-			mediaFiles = [],
-			i,
-			j,
-			k,
-			l,
-			n,
-			type,
-			result = { method: '', url: '', htmlMediaElement: htmlMediaElement, isVideo: (htmlMediaElement.tagName.toLowerCase() !== 'audio'), scheme: ''},
-			pluginName,
-			pluginVersions,
-			pluginInfo,
-			dummy,
-			media;
-			
-		// STEP 1: Get URL and type from <video src> or <source src>
-
-		// supplied type overrides <video type> and <source type>
-		if (typeof options.type != 'undefined' && options.type !== '') {
-			
-			// accept either string or array of types
-			if (typeof options.type == 'string') {
-				mediaFiles.push({type:options.type, url:src});
-			} else {
-				
-				for (i=0; i<options.type.length; i++) {
-					mediaFiles.push({type:options.type[i], url:src});
-				}
-			}
 
-		// test for src attribute first
-		} else if (src !== null) {
-			type = this.formatType(src, htmlMediaElement.getAttribute('type'));
-			mediaFiles.push({type:type, url:src});
+		var callbacks = t.mediaElement.events[eventName];
 
-		// then test for <source> elements
-		} else {
-			// test <source> types to see if they are usable
-			for (i = 0; i < htmlMediaElement.childNodes.length; i++) {
-				n = htmlMediaElement.childNodes[i];
-				if (n.nodeType == 1 && n.tagName.toLowerCase() == 'source') {
-					src = n.getAttribute('src');
-					type = this.formatType(src, n.getAttribute('type'));
-					media = n.getAttribute('media');
-
-					if (!media || !window.matchMedia || (window.matchMedia && window.matchMedia(media).matches)) {
-						mediaFiles.push({type:type, url:src});
-					}
-				}
-			}
+		if (!callbacks) {
+			return true;
 		}
-		
-		// in the case of dynamicly created players
-		// check for audio types
-		if (!isMediaTag && mediaFiles.length > 0 && mediaFiles[0].url !== null && this.getTypeFromFile(mediaFiles[0].url).indexOf('audio') > -1) {
-			result.isVideo = false;
-		}
-		
 
-		// STEP 2: Test for playback method
-		
-		// special case for Android which sadly doesn't implement the canPlayType function (always returns '')
-		if (result.isVideo && mejs.MediaFeatures.isBustedAndroid) {
-			htmlMediaElement.canPlayType = function(type) {
-				return (type.match(/video\/(mp4|m4v)/gi) !== null) ? 'maybe' : '';
-			};
-		}		
-		
-		// special case for Chromium to specify natively supported video codecs (i.e. WebM and Theora) 
-		if (result.isVideo && mejs.MediaFeatures.isChromium) {
-			htmlMediaElement.canPlayType = function(type) { 
-				return (type.match(/video\/(webm|ogv|ogg)/gi) !== null) ? 'maybe' : '';
-			}; 
+		if (!callback) {
+			t.mediaElement.events[eventName] = [];
+			return true;
 		}
 
-		// test for native playback first
-		if (supportsMediaTag && (options.mode === 'auto' || options.mode === 'auto_plugin' || options.mode === 'native')  && !(mejs.MediaFeatures.isBustedNativeHTTPS && options.httpsBasicAuthSite === true)) {
-						
-			if (!isMediaTag) {
-
-				// create a real HTML5 Media Element 
-				dummy = document.createElement( result.isVideo ? 'video' : 'audio');			
-				htmlMediaElement.parentNode.insertBefore(dummy, htmlMediaElement);
-				htmlMediaElement.style.display = 'none';
-				
-				// use this one from now on
-				result.htmlMediaElement = htmlMediaElement = dummy;
-			}
-				
-			for (i=0; i<mediaFiles.length; i++) {
-				// normal check
-				if (mediaFiles[i].type == "video/m3u8" || htmlMediaElement.canPlayType(mediaFiles[i].type).replace(/no/, '') !== ''
-					// special case for Mac/Safari 5.0.3 which answers '' to canPlayType('audio/mp3') but 'maybe' to canPlayType('audio/mpeg')
-					|| htmlMediaElement.canPlayType(mediaFiles[i].type.replace(/mp3/,'mpeg')).replace(/no/, '') !== ''
-					// special case for m4a supported by detecting mp4 support
-					|| htmlMediaElement.canPlayType(mediaFiles[i].type.replace(/m4a/,'mp4')).replace(/no/, '') !== '') {
-					result.method = 'native';
-					result.url = mediaFiles[i].url;
-					break;
-				}
-			}			
-			
-			if (result.method === 'native') {
-				if (result.url !== null) {
-					htmlMediaElement.src = result.url;
-				}
-			
-				// if `auto_plugin` mode, then cache the native result but try plugins.
-				if (options.mode !== 'auto_plugin') {
-					return result;
-				}
+		for (var _i5 = 0; _i5 < callbacks.length; _i5++) {
+			if (callbacks[_i5] === callback) {
+				t.mediaElement.events[eventName].splice(_i5, 1);
+				return true;
 			}
 		}
+		return false;
+	};
 
-		// if native playback didn't work, then test plugins
-		if (options.mode === 'auto' || options.mode === 'auto_plugin' || options.mode === 'shim') {
-			for (i=0; i<mediaFiles.length; i++) {
-				type = mediaFiles[i].type;
+	t.mediaElement.dispatchEvent = function (event) {
+		var callbacks = t.mediaElement.events[event.type];
+		if (callbacks) {
+			for (var _i6 = 0; _i6 < callbacks.length; _i6++) {
+				callbacks[_i6].apply(null, [event]);
+			}
+		}
+	};
 
-				// test all plugins in order of preference [silverlight, flash]
-				for (j=0; j<options.plugins.length; j++) {
+	if (mediaFiles.length) {
+		t.mediaElement.src = mediaFiles;
+	}
 
-					pluginName = options.plugins[j];
-			
-					// test version of plugin (for future features)
-					pluginVersions = mejs.plugins[pluginName];				
-					
-					for (k=0; k<pluginVersions.length; k++) {
-						pluginInfo = pluginVersions[k];
-					
-						// test if user has the correct plugin version
-						
-						// for youtube/vimeo
-						if (pluginInfo.version == null || 
-							
-							mejs.PluginDetector.hasPluginVersion(pluginName, pluginInfo.version)) {
-
-							// test for plugin playback types
-							for (l=0; l<pluginInfo.types.length; l++) {
-								// find plugin that can play the type
-								if (type.toLowerCase() == pluginInfo.types[l].toLowerCase()) {
-									result.method = pluginName;
-									result.url = mediaFiles[i].url;
-									return result;
-								}
-							}
-						}
-					}
-				}
+	if (t.mediaElement.promises.length) {
+		Promise.all(t.mediaElement.promises).then(function () {
+			if (t.mediaElement.options.success) {
+				t.mediaElement.options.success(t.mediaElement, t.mediaElement.originalNode);
 			}
-		}
-		
-		// at this point, being in 'auto_plugin' mode implies that we tried plugins but failed.
-		// if we have native support then return that.
-		if (options.mode === 'auto_plugin' && result.method === 'native') {
-			return result;
+		}).catch(function () {
+			if (error && t.mediaElement.options.error) {
+				t.mediaElement.options.error(t.mediaElement, t.mediaElement.originalNode);
+			}
+		});
+	} else {
+		if (t.mediaElement.options.success) {
+			t.mediaElement.options.success(t.mediaElement, t.mediaElement.originalNode);
 		}
 
-		// what if there's nothing to play? just grab the first available
-		if (result.method === '' && mediaFiles.length > 0) {
-			result.url = mediaFiles[0].url;
+		if (error && t.mediaElement.options.error) {
+			t.mediaElement.options.error(t.mediaElement, t.mediaElement.originalNode);
 		}
+	}
 
-		return result;
-	},
+	return t.mediaElement;
+};
 
-	formatType: function(url, type) {
-		// if no type is supplied, fake it with the extension
-		if (url && !type) {		
-			return this.getTypeFromFile(url);
-		} else {
-			// only return the mime part of the type in case the attribute contains the codec
-			// see http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html#the-source-element
-			// `video/mp4; codecs="avc1.42E01E, mp4a.40.2"` becomes `video/mp4`
-			
-			if (type && ~type.indexOf(';')) {
-				return type.substr(0, type.indexOf(';')); 
-			} else {
-				return type;
-			}
-		}
-	},
-	
-	getTypeFromFile: function(url) {
-		url = url.split('?')[0];
-		var
-			ext = url.substring(url.lastIndexOf('.') + 1).toLowerCase(),
-			av = /(mp4|m4v|ogg|ogv|m3u8|webm|webmv|flv|wmv|mpeg|mov)/gi.test(ext) ? 'video/' : 'audio/';
-		return this.getTypeFromExtension(ext, av);
-	},
-	
-	getTypeFromExtension: function(ext, av) {
-		av = av || '';
-		
-		switch (ext) {
-			case 'mp4':
-			case 'm4v':
-			case 'm4a':
-			case 'f4v':
-			case 'f4a':
-				return av + 'mp4';
-			case 'flv':
-				return av + 'x-flv';
-			case 'webm':
-			case 'webma':
-			case 'webmv':	
-				return av + 'webm';
-			case 'ogg':
-			case 'oga':
-			case 'ogv':	
-				return av + 'ogg';
-			case 'm3u8':
-				return 'application/x-mpegurl';
-			case 'ts':
-				return av + 'mp2t';
-			default:
-				return av + ext;
-		}
-	},
+_window2.default.MediaElement = MediaElement;
 
-	createErrorMessage: function(playback, options, poster) {
-		var 
-			htmlMediaElement = playback.htmlMediaElement,
-			errorContainer = document.createElement('div'),
-			errorContent = options.customError;
-			
-		errorContainer.className = 'me-cannotplay';
+exports.default = MediaElement;
 
-		try {
-			errorContainer.style.width = htmlMediaElement.width + 'px';
-			errorContainer.style.height = htmlMediaElement.height + 'px';
-		} catch (e) {}
+},{"16":16,"18":18,"19":19,"2":2,"3":3,"7":7,"8":8}],7:[function(_dereq_,module,exports){
+'use strict';
 
-		if (!errorContent) {
-			errorContent = '<a href="' + playback.url + '">';
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
 
-			if (poster !== '') {
-				errorContent += '<img src="' + poster + '" width="100%" height="100%" alt="" />';
-			}
+var _window = _dereq_(3);
 
-			errorContent += '<span>' + mejs.i18n.t('mejs.download-file') + '</span></a>';
-		}
+var _window2 = _interopRequireDefault(_window);
 
-		errorContainer.innerHTML = errorContent;
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-		htmlMediaElement.parentNode.insertBefore(errorContainer, htmlMediaElement);
-		htmlMediaElement.style.display = 'none';
+var mejs = {};
 
-		options.error(htmlMediaElement);
-	},
+mejs.version = '4.2.5';
 
-	createPlugin:function(playback, options, poster, autoplay, preload, controls) {
-		var 
-			htmlMediaElement = playback.htmlMediaElement,
-			width = 1,
-			height = 1,
-			pluginid = 'me_' + playback.method + '_' + (mejs.meIndex++),
-			pluginMediaElement = new mejs.PluginMediaElement(pluginid, playback.method, playback.url),
-			container = document.createElement('div'),
-			specialIEContainer,
-			node,
-			initVars;
-
-		// copy tagName from html media element
-		pluginMediaElement.tagName = htmlMediaElement.tagName;
-
-		// copy attributes from html media element to plugin media element
-		for (var i = 0; i < htmlMediaElement.attributes.length; i++) {
-			var attribute = htmlMediaElement.attributes[i];
-			if (attribute.specified) {
-				pluginMediaElement.setAttribute(attribute.name, attribute.value);
-			}
-		}
+mejs.html5media = {
+	properties: ['volume', 'src', 'currentTime', 'muted', 'duration', 'paused', 'ended', 'buffered', 'error', 'networkState', 'readyState', 'seeking', 'seekable', 'currentSrc', 'preload', 'bufferedBytes', 'bufferedTime', 'initialTime', 'startOffsetTime', 'defaultPlaybackRate', 'playbackRate', 'played', 'autoplay', 'loop', 'controls'],
+	readOnlyProperties: ['duration', 'paused', 'ended', 'buffered', 'error', 'networkState', 'readyState', 'seeking', 'seekable'],
 
-		// check for placement inside a <p> tag (sometimes WYSIWYG editors do this)
-		node = htmlMediaElement.parentNode;
+	methods: ['load', 'play', 'pause', 'canPlayType'],
 
-		while (node !== null && node.tagName != null && node.tagName.toLowerCase() !== 'body' && 
-				node.parentNode != null && node.parentNode.tagName != null && node.parentNode.constructor != null && node.parentNode.constructor.name === "ShadowRoot") {
-			if (node.parentNode.tagName.toLowerCase() === 'p') {
-				node.parentNode.parentNode.insertBefore(node, node.parentNode);
-				break;
-			}
-			node = node.parentNode;
-		}
+	events: ['loadstart', 'durationchange', 'loadedmetadata', 'loadeddata', 'progress', 'canplay', 'canplaythrough', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'play', 'playing', 'pause', 'waiting', 'seeking', 'seeked', 'timeupdate', 'ended', 'ratechange', 'volumechange'],
 
-		if (playback.isVideo) {
-			width = (options.pluginWidth > 0) ? options.pluginWidth : (options.videoWidth > 0) ? options.videoWidth : (htmlMediaElement.getAttribute('width') !== null) ? htmlMediaElement.getAttribute('width') : options.defaultVideoWidth;
-			height = (options.pluginHeight > 0) ? options.pluginHeight : (options.videoHeight > 0) ? options.videoHeight : (htmlMediaElement.getAttribute('height') !== null) ? htmlMediaElement.getAttribute('height') : options.defaultVideoHeight;
-		
-			// in case of '%' make sure it's encoded
-			width = mejs.Utility.encodeUrl(width);
-			height = mejs.Utility.encodeUrl(height);
-		
-		} else {
-			if (options.enablePluginDebug) {
-				width = 320;
-				height = 240;
-			}
-		}
+	mediaTypes: ['audio/mp3', 'audio/ogg', 'audio/oga', 'audio/wav', 'audio/x-wav', 'audio/wave', 'audio/x-pn-wav', 'audio/mpeg', 'audio/mp4', 'video/mp4', 'video/webm', 'video/ogg', 'video/ogv']
+};
 
-		// register plugin
-		pluginMediaElement.success = options.success;
-		
-		// add container (must be added to DOM before inserting HTML for IE)
-		container.className = 'me-plugin';
-		container.id = pluginid + '_container';
-		
-		if (playback.isVideo) {
-				htmlMediaElement.parentNode.insertBefore(container, htmlMediaElement);
-		} else {
-				document.body.insertBefore(container, document.body.childNodes[0]);
-		}
-		
-		if (playback.method === 'flash' || playback.method === 'silverlight') {
+_window2.default.mejs = mejs;
 
-			var canPlayVideo = htmlMediaElement.getAttribute('type') === 'audio/mp4',
-				childrenSources = htmlMediaElement.getElementsByTagName('source');
+exports.default = mejs;
 
-			if (childrenSources && !canPlayVideo) {
-				for (var i = 0, total = childrenSources.length; i < total; i++) {
-					if (childrenSources[i].getAttribute('type') === 'audio/mp4') {
-						canPlayVideo = true;
-					}
-				}
-			}
+},{"3":3}],8:[function(_dereq_,module,exports){
+'use strict';
 
-			// flash/silverlight vars
-			initVars = [
-				'id=' + pluginid,
-				'isvideo=' + ((playback.isVideo || canPlayVideo) ? "true" : "false"),
-				'autoplay=' + ((autoplay) ? "true" : "false"),
-				'preload=' + preload,
-				'width=' + width,
-				'startvolume=' + options.startVolume,
-				'timerrate=' + options.timerRate,
-				'flashstreamer=' + options.flashStreamer,
-				'height=' + height,
-				'pseudostreamstart=' + options.pseudoStreamingStartQueryParam];
-	
-			if (playback.url !== null) {
-				if (playback.method == 'flash') {
-					initVars.push('file=' + mejs.Utility.encodeUrl(playback.url));
-				} else {
-					initVars.push('file=' + playback.url);
-				}
-			}
-			if (options.enablePluginDebug) {
-				initVars.push('debug=true');
-			}
-			if (options.enablePluginSmoothing) {
-				initVars.push('smoothing=true');
-			}
-			if (options.enablePseudoStreaming) {
-				initVars.push('pseudostreaming=true');
-			}
-			if (controls) {
-				initVars.push('controls=true'); // shows controls in the plugin if desired
-			}
-			if (options.pluginVars) {
-				initVars = initVars.concat(options.pluginVars);
-			}		
-			
-			// call from plugin
-			window[pluginid + '_init'] = function() {
-				switch (pluginMediaElement.pluginType) {
-					case 'flash':
-						pluginMediaElement.pluginElement = pluginMediaElement.pluginApi = document.getElementById(pluginid);
-						break;
-					case 'silverlight':
-						pluginMediaElement.pluginElement = document.getElementById(pluginMediaElement.id);
-						pluginMediaElement.pluginApi = pluginMediaElement.pluginElement.Content.MediaElementJS;
-						break;
-				}
-	
-				if (pluginMediaElement.pluginApi != null && pluginMediaElement.success) {
-					pluginMediaElement.success(pluginMediaElement, htmlMediaElement);
-				}
-			};
-			
-			// event call from plugin
-			window[pluginid + '_event'] = function(eventName, values) {
-		
-				var
-					e,
-					i,
-					bufferedTime;
-		        
-				// fake event object to mimic real HTML media event.
-				e = {
-					type: eventName,
-					target: pluginMediaElement
-				};
-		
-				// attach all values to element and event object
-				for (i in values) {
-					pluginMediaElement[i] = values[i];
-					e[i] = values[i];
-				}
-		
-				// fake the newer W3C buffered TimeRange (loaded and total have been removed)
-				bufferedTime = values.bufferedTime || 0;
-		
-				e.target.buffered = e.buffered = {
-					start: function(index) {
-						return 0;
-					},
-					end: function (index) {
-						return bufferedTime;
-					},
-					length: 1
-				};
-		
-				pluginMediaElement.dispatchEvent(e);
-			}			
-			
-			
-		}
-
-		switch (playback.method) {
-			case 'silverlight':
-				container.innerHTML =
-'<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" id="' + pluginid + '" name="' + pluginid + '" width="' + width + '" height="' + height + '" class="mejs-shim">' +
-'<param name="initParams" value="' + initVars.join(',') + '" />' +
-'<param name="windowless" value="true" />' +
-'<param name="background" value="black" />' +
-'<param name="minRuntimeVersion" value="3.0.0.0" />' +
-'<param name="autoUpgrade" value="true" />' +
-'<param name="source" value="' + options.pluginPath + options.silverlightName + '" />' +
-'</object>';
-					break;
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
+exports.renderer = undefined;
 
-			case 'flash':
-
-				if (mejs.MediaFeatures.isIE) {
-					specialIEContainer = document.createElement('div');
-					container.appendChild(specialIEContainer);
-					specialIEContainer.outerHTML =
-'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" ' +
-'id="' + pluginid + '" width="' + width + '" height="' + height + '" class="mejs-shim">' +
-'<param name="movie" value="' + options.pluginPath + options.flashName + '?' + (new Date().getTime()) + '" />' +
-'<param name="flashvars" value="' + initVars.join('&amp;') + '" />' +
-'<param name="quality" value="high" />' +
-'<param name="bgcolor" value="#000000" />' +
-'<param name="wmode" value="transparent" />' +
-'<param name="allowScriptAccess" value="' + options.flashScriptAccess + '" />' +
-'<param name="allowFullScreen" value="true" />' +
-'<param name="scale" value="default" />' + 
-'</object>';
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
 
-				} else {
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
 
-					container.innerHTML =
-'<embed id="' + pluginid + '" name="' + pluginid + '" ' +
-'play="true" ' +
-'loop="false" ' +
-'quality="high" ' +
-'bgcolor="#000000" ' +
-'wmode="transparent" ' +
-'allowScriptAccess="' + options.flashScriptAccess + '" ' +
-'allowFullScreen="true" ' +
-'type="application/x-shockwave-flash" pluginspage="//www.macromedia.com/go/getflashplayer" ' +
-'src="' + options.pluginPath + options.flashName + '" ' +
-'flashvars="' + initVars.join('&') + '" ' +
-'width="' + width + '" ' +
-'height="' + height + '" ' +
-'scale="default"' + 
-'class="mejs-shim"></embed>';
-				}
-				break;
-			
-			case 'youtube':
-			
-				
-				var videoId;
-				// youtu.be url from share button
-				if (playback.url.lastIndexOf("youtu.be") != -1) {
-					videoId = playback.url.substr(playback.url.lastIndexOf('/')+1);
-					if (videoId.indexOf('?') != -1) {
-						videoId = videoId.substr(0, videoId.indexOf('?'));
-					}
-				}
-				else {
-					// https://www.youtube.com/watch?v=
-					var videoIdMatch = playback.url.match( /[?&]v=([^&#]+)|&|#|$/ );
-					if ( videoIdMatch ) {
-						videoId = videoIdMatch[1];
-					}
-				}
-				youtubeSettings = {
-						container: container,
-						containerId: container.id,
-						pluginMediaElement: pluginMediaElement,
-						pluginId: pluginid,
-						videoId: videoId,
-						height: height,
-						width: width,
-                        scheme: playback.scheme,
-						variables: options.youtubeIframeVars
-					};				
-				
-				// favor iframe version of YouTube
-				if (window.postMessage) {
-					mejs.YouTubeApi.enqueueIframe(youtubeSettings);		
-				} else if (mejs.PluginDetector.hasPluginVersion('flash', [10,0,0]) ) {
-					mejs.YouTubeApi.createFlash(youtubeSettings, options);
-				}
-				break;
-			
-			// DEMO Code. Does NOT work.
-			case 'vimeo':
-				var player_id = pluginid + "_player";
-				pluginMediaElement.vimeoid = playback.url.substr(playback.url.lastIndexOf('/')+1);
-				
-				container.innerHTML ='<iframe src="' + playback.scheme + 'player.vimeo.com/video/' + pluginMediaElement.vimeoid + '?api=1&portrait=0&byline=0&title=0&player_id=' + player_id + '" width="' + width +'" height="' + height +'" frameborder="0" class="mejs-shim" id="' + player_id + '" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>';
-				if (typeof($f) == 'function') { // froogaloop available
-					var player = $f(container.childNodes[0]),
-						playerState = -1;
-					
-					player.addEvent('ready', function() {
-		
-						player.playVideo = function() {
-							player.api( 'play' );
-						};
-						player.stopVideo = function() {
-							player.api( 'unload' );
-						};
-						player.pauseVideo = function() {
-							player.api( 'pause' );
-						};
-						player.seekTo = function( seconds ) {
-							player.api( 'seekTo', seconds );
-						};
-						player.setVolume = function( volume ) {
-							player.api( 'setVolume', volume );
-						};
-						player.setMuted = function( muted ) {
-							if( muted ) {
-								player.lastVolume = player.api( 'getVolume' );
-								player.api( 'setVolume', 0 );
-							} else {
-								player.api( 'setVolume', player.lastVolume );
-								delete player.lastVolume;
-							}
-						};
-						// parity with YT player
-						player.getPlayerState = function() {
-							return playerState;
-						};
-
-						function createEvent(player, pluginMediaElement, eventName, e) {
-							var event = {
-								type: eventName,
-								target: pluginMediaElement
-							};
-							if (eventName == 'timeupdate') {
-								pluginMediaElement.currentTime = event.currentTime = e.seconds;
-								pluginMediaElement.duration = event.duration = e.duration;
-							}
-							pluginMediaElement.dispatchEvent(event);
-						}
+var _mejs = _dereq_(7);
 
-						player.addEvent('play', function() {
-							playerState = 1;
-							createEvent(player, pluginMediaElement, 'play');
-							createEvent(player, pluginMediaElement, 'playing');
-						});
-
-						player.addEvent('pause', function() {
-							playerState = 2;							
-							createEvent(player, pluginMediaElement, 'pause');
-						});
-
-						player.addEvent('finish', function() {
-							playerState = 0;							
-							createEvent(player, pluginMediaElement, 'ended');
-						});
-
-						player.addEvent('playProgress', function(e) {
-							createEvent(player, pluginMediaElement, 'timeupdate', e);
-						});
-						
-						player.addEvent('seek', function(e) {
-							playerState = 3;
-							createEvent(player, pluginMediaElement, 'seeked', e);
-						});	
-						
-						player.addEvent('loadProgress', function(e) {
-							playerState = 3;
-							createEvent(player, pluginMediaElement, 'progress', e);
-						});												
+var _mejs2 = _interopRequireDefault(_mejs);
 
-						pluginMediaElement.pluginElement = container;
-						pluginMediaElement.pluginApi = player;
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-						pluginMediaElement.success(pluginMediaElement, pluginMediaElement.pluginElement);						
-					});
-				}
-				else {
-					console.warn("You need to include froogaloop for vimeo to work");
-				}
-				break;			
-		}
-		// hide original element
-		htmlMediaElement.style.display = 'none';
-		// prevent browser from autoplaying when using a plugin
-		htmlMediaElement.removeAttribute('autoplay');
-		
-		return pluginMediaElement;
-	},
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 
-	updateNative: function(playback, options, autoplay, preload) {
-		
-		var htmlMediaElement = playback.htmlMediaElement,
-			m;
-		
-		
-		// add methods to video object to bring it into parity with Flash Object
-		for (m in mejs.HtmlMediaElement) {
-			htmlMediaElement[m] = mejs.HtmlMediaElement[m];
-		}
-
-		/*
-		Chrome now supports preload="none"
-		if (mejs.MediaFeatures.isChrome) {
-		
-			// special case to enforce preload attribute (Chrome doesn't respect this)
-			if (preload === 'none' && !autoplay) {
-			
-				// forces the browser to stop loading (note: fails in IE9)
-				htmlMediaElement.src = '';
-				htmlMediaElement.load();
-				htmlMediaElement.canceledPreload = true;
-
-				htmlMediaElement.addEventListener('play',function() {
-					if (htmlMediaElement.canceledPreload) {
-						htmlMediaElement.src = playback.url;
-						htmlMediaElement.load();
-						htmlMediaElement.play();
-						htmlMediaElement.canceledPreload = false;
-					}
-				}, false);
-			// for some reason Chrome forgets how to autoplay sometimes.
-			} else if (autoplay) {
-				htmlMediaElement.load();
-				htmlMediaElement.play();
-			}
-		}
-		*/
+var Renderer = function () {
+	function Renderer() {
+		_classCallCheck(this, Renderer);
 
-		// fire success code
-		options.success(htmlMediaElement, htmlMediaElement);
-		
-		return htmlMediaElement;
+		this.renderers = {};
+		this.order = [];
 	}
-};
 
-/*
- - test on IE (object vs. embed)
- - determine when to use iframe (Firefox, Safari, Mobile) vs. Flash (Chrome, IE)
- - fullscreen?
-*/
+	_createClass(Renderer, [{
+		key: 'add',
+		value: function add(renderer) {
+			if (renderer.name === undefined) {
+				throw new TypeError('renderer must contain at least `name` property');
+			}
 
-// YouTube Flash and Iframe API
-mejs.YouTubeApi = {
-	isIframeStarted: false,
-	isIframeLoaded: false,
-	loadIframeApi: function(yt) {
-		if (!this.isIframeStarted) {
-			var tag = document.createElement('script');
-			tag.src = yt.scheme + "www.youtube.com/player_api";
-			var firstScriptTag = document.getElementsByTagName('script')[0];
-			firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
-			this.isIframeStarted = true;
+			this.renderers[renderer.name] = renderer;
+			this.order.push(renderer.name);
 		}
-	},
-	iframeQueue: [],
-	enqueueIframe: function(yt) {
-		
-		if (this.isLoaded) {
-			this.createIframe(yt);
-		} else {
-			this.loadIframeApi(yt);
-			this.iframeQueue.push(yt);
-		}
-	},
-	createIframe: function(settings) {
-
-		var
-		pluginMediaElement = settings.pluginMediaElement,
-		defaultVars = {controls:0, wmode:'transparent'},
-		player = new YT.Player(settings.containerId, {
-			height: settings.height,
-			width: settings.width,
-			videoId: settings.videoId,
-			playerVars: mejs.$.extend({}, defaultVars, settings.variables),
-			events: {
-				'onReady': function(e) {
-					
-					// wrapper to match
-					player.setVideoSize = function(width, height) {
-						player.setSize(width, height);
-					};
-					
-					// hook up iframe object to MEjs
-					settings.pluginMediaElement.pluginApi = player;
-					settings.pluginMediaElement.pluginElement = document.getElementById(settings.containerId);
-					
-					// init mejs
-					pluginMediaElement.success(pluginMediaElement, pluginMediaElement.pluginElement);
-
-					mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'canplay');
-					
-					// create timer
-					setInterval(function() {
-						mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'timeupdate');
-					}, 250);
-
-					if (typeof pluginMediaElement.attributes.autoplay !== 'undefined') {
-						player.playVideo();
+	}, {
+		key: 'select',
+		value: function select(mediaFiles) {
+			var renderers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
+
+			var renderersLength = renderers.length;
+
+			renderers = renderers.length ? renderers : this.order;
+
+			if (!renderersLength) {
+				var rendererIndicator = [/^(html5|native)/i, /^flash/i, /iframe$/i],
+				    rendererRanking = function rendererRanking(renderer) {
+					for (var i = 0, total = rendererIndicator.length; i < total; i++) {
+						if (rendererIndicator[i].test(renderer)) {
+							return i;
+						}
 					}
-				},
-				'onStateChange': function(e) {
-					
-					mejs.YouTubeApi.handleStateChange(e.data, player, pluginMediaElement);
-					
-				}
+					return rendererIndicator.length;
+				};
+
+				renderers.sort(function (a, b) {
+					return rendererRanking(a) - rendererRanking(b);
+				});
 			}
-		});
-	},
-	
-	createEvent: function (player, pluginMediaElement, eventName) {
-		var event = {
-			type: eventName,
-			target: pluginMediaElement
-		};
 
-		if (player && player.getDuration) {
-			
-			// time 
-			pluginMediaElement.currentTime = event.currentTime = player.getCurrentTime();
-			pluginMediaElement.duration = event.duration = player.getDuration();
-			
-			// state
-			event.paused = pluginMediaElement.paused;
-			event.ended = pluginMediaElement.ended;			
-			
-			// sound
-			event.muted = player.isMuted();
-			event.volume = player.getVolume() / 100;
-			
-			// progress
-			event.bytesTotal = player.getVideoBytesTotal();
-			event.bufferedBytes = player.getVideoBytesLoaded();
-			
-			// fake the W3C buffered TimeRange
-			var bufferedTime = event.bufferedBytes / event.bytesTotal * event.duration;
-			
-			event.target.buffered = event.buffered = {
-				start: function(index) {
-					return 0;
-				},
-				end: function (index) {
-					return bufferedTime;
-				},
-				length: 1
-			};
+			for (var i = 0, total = renderers.length; i < total; i++) {
+				var key = renderers[i],
+				    _renderer = this.renderers[key];
+
+				if (_renderer !== null && _renderer !== undefined) {
+					for (var j = 0, jl = mediaFiles.length; j < jl; j++) {
+						if (typeof _renderer.canPlayType === 'function' && typeof mediaFiles[j].type === 'string' && _renderer.canPlayType(mediaFiles[j].type)) {
+							return {
+								rendererName: _renderer.name,
+								src: mediaFiles[j].src
+							};
+						}
+					}
+				}
+			}
 
+			return null;
 		}
-		
-		// send event up the chain
-		pluginMediaElement.dispatchEvent(event);
-	},	
-	
-	iFrameReady: function() {
-		
-		this.isLoaded = true;
-		this.isIframeLoaded = true;
-		
-		while (this.iframeQueue.length > 0) {
-			var settings = this.iframeQueue.pop();
-			this.createIframe(settings);
-		}	
-	},
-	
-	// FLASH!
-	flashPlayers: {},
-	createFlash: function(settings) {
-		
-		this.flashPlayers[settings.pluginId] = settings;
-		
-		/*
-		settings.container.innerHTML =
-			'<object type="application/x-shockwave-flash" id="' + settings.pluginId + '" data="' + settings.scheme + 'www.youtube.com/apiplayer?enablejsapi=1&amp;playerapiid=' + settings.pluginId  + '&amp;version=3&amp;autoplay=0&amp;controls=0&amp;modestbranding=1&loop=0" ' +
-				'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; " class="mejs-shim">' +
-				'<param name="allowScriptAccess" value="sameDomain">' +
-				'<param name="wmode" value="transparent">' +
-			'</object>';
-		*/
-
-		var specialIEContainer,
-			youtubeUrl = settings.scheme + 'www.youtube.com/apiplayer?enablejsapi=1&amp;playerapiid=' + settings.pluginId  + '&amp;version=3&amp;autoplay=0&amp;controls=0&amp;modestbranding=1&loop=0';
-			
-		if (mejs.MediaFeatures.isIE) {
-			
-			specialIEContainer = document.createElement('div');
-			settings.container.appendChild(specialIEContainer);
-			specialIEContainer.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="' + settings.scheme + 'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" ' +
-'id="' + settings.pluginId + '" width="' + settings.width + '" height="' + settings.height + '" class="mejs-shim">' +
-	'<param name="movie" value="' + youtubeUrl + '" />' +
-	'<param name="wmode" value="transparent" />' +
-	'<param name="allowScriptAccess" value="' + options.flashScriptAccess + '" />' +
-	'<param name="allowFullScreen" value="true" />' +
-'</object>';
-		} else {
-		settings.container.innerHTML =
-			'<object type="application/x-shockwave-flash" id="' + settings.pluginId + '" data="' + youtubeUrl + '" ' +
-				'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; " class="mejs-shim">' +
-				'<param name="allowScriptAccess" value="' + options.flashScriptAccess + '">' +
-				'<param name="wmode" value="transparent">' +
-			'</object>';
-		}		
-		
-	},
-	
-	flashReady: function(id) {
-		var
-			settings = this.flashPlayers[id],
-			player = document.getElementById(id),
-			pluginMediaElement = settings.pluginMediaElement;
-		
-		// hook up and return to MediaELementPlayer.success	
-		pluginMediaElement.pluginApi = 
-		pluginMediaElement.pluginElement = player;
-		
-		settings.success(pluginMediaElement, pluginMediaElement.pluginElement);
-		
-		// load the youtube video
-		player.cueVideoById(settings.videoId);
-		
-		var callbackName = settings.containerId + '_callback';
-		
-		window[callbackName] = function(e) {
-			mejs.YouTubeApi.handleStateChange(e, player, pluginMediaElement);
-		};
-		
-		player.addEventListener('onStateChange', callbackName);
-		
-		setInterval(function() {
-			mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'timeupdate');
-		}, 250);
-		
-		mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'canplay');
-	},
-	
-	handleStateChange: function(youTubeState, player, pluginMediaElement) {
-		switch (youTubeState) {
-			case -1: // not started
-				pluginMediaElement.paused = true;
-				pluginMediaElement.ended = true;
-				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'loadedmetadata');
-				//createYouTubeEvent(player, pluginMediaElement, 'loadeddata');
-				break;
-			case 0:
-				pluginMediaElement.paused = false;
-				pluginMediaElement.ended = true;
-				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'ended');
-				break;
-			case 1:
-				pluginMediaElement.paused = false;
-				pluginMediaElement.ended = false;				
-				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'play');
-				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'playing');
-				break;
-			case 2:
-				pluginMediaElement.paused = true;
-				pluginMediaElement.ended = false;				
-				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'pause');
-				break;
-			case 3: // buffering
-				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'progress');
-				break;
-			case 5:
-				// cued?
-				break;						
-			
-		}			
-		
-	}
-}
-// IFRAME
-window.onYouTubePlayerAPIReady = function() {
-	mejs.YouTubeApi.iFrameReady();
-};
-// FLASH
-window.onYouTubePlayerReady = function(id) {
-	mejs.YouTubeApi.flashReady(id);
-};
+	}, {
+		key: 'order',
+		set: function set(order) {
+			if (!Array.isArray(order)) {
+				throw new TypeError('order must be an array of strings.');
+			}
 
-window.mejs = mejs;
-window.MediaElement = mejs.MediaElement;
+			this._order = order;
+		},
+		get: function get() {
+			return this._order;
+		}
+	}, {
+		key: 'renderers',
+		set: function set(renderers) {
+			if (renderers !== null && (typeof renderers === 'undefined' ? 'undefined' : _typeof(renderers)) !== 'object') {
+				throw new TypeError('renderers must be an array of objects.');
+			}
 
-/**
- * Localize strings
- *
- * Include translations from JS files and method to pluralize properly strings.
- *
- */
-(function (doc, win, mejs, undefined) {
-
-	var i18n = {
-		/**
-		 * @type {String}
-		 */
-		'default': 'en',
-
-		/**
-		 * @type {String[]}
-		 */
-		locale: {
-			language: (mejs.i18n && mejs.i18n.locale.language) || '',
-			strings: (mejs.i18n && mejs.i18n.locale.strings) || {}
+			this._renderers = renderers;
 		},
+		get: function get() {
+			return this._renderers;
+		}
+	}]);
 
-		/**
-		 * Filters for available languages.
-		 *
-		 * This plural forms are grouped in family groups based on
-		 * https://developer.mozilla.org/en-US/docs/Mozilla/Localization/Localization_and_Plurals#List_of_Plural_Rules
-		 * with some additions and corrections according to the Localization Guide list
-		 * (http://localization-guide.readthedocs.io/en/latest/l10n/pluralforms.html)
-		 *
-		 * Arguments are dynamic following the structure:
-		 * - argument1 : Number to determine form
-		 * - argument2...argumentN: Possible matches
-		 *
-		 * @type {Function[]}
-		 */
-		pluralForms: [
-			// 0: Chinese, Japanese, Korean, Persian, Turkish, Thai, Lao, Aymará,
-			// Tibetan, Chiga, Dzongkha, Indonesian, Lojban, Georgian, Kazakh, Khmer, Kyrgyz, Malay,
-			// Burmese, Yakut, Sundanese, Tatar, Uyghur, Vietnamese, Wolof
-			function () {
-				return arguments[1];
-			},
-			// 1: Danish, Dutch, English, Faroese, Frisian, German, Norwegian, Swedish, Estonian, Finnish,
-			// Hungarian, Basque, Greek, Hebrew, Italian, Portuguese, Spanish, Catalan, Afrikaans,
-			// Angika, Assamese, Asturian, Azerbaijani, Bulgarian, Bengali, Bodo, Aragonese, Dogri,
-			// Esperanto, Argentinean Spanish, Fulah, Friulian, Galician, Gujarati, Hausa,
-			// Hindi, Chhattisgarhi, Armenian, Interlingua, Greenlandic, Kannada, Kurdish, Letzeburgesch,
-			// Maithili, Malayalam, Mongolian, Manipuri, Marathi, Nahuatl, Neapolitan, Norwegian Bokmal,
-			// Nepali, Norwegian Nynorsk, Norwegian (old code), Northern Sotho, Oriya, Punjabi, Papiamento,
-			// Piemontese, Pashto, Romansh, Kinyarwanda, Santali, Scots, Sindhi, Northern Sami, Sinhala,
-			// Somali, Songhay, Albanian, Swahili, Tamil, Telugu, Turkmen, Urdu, Yoruba
-			function () {
-				var args = arguments;
-				if (args[0] === 1) {
-					return args[1];
-				} else {
-					return args[2];
-				}
-			},
-			// 2: French, Brazilian Portuguese, Acholi, Akan, Amharic, Mapudungun, Breton, Filipino,
-			// Gun, Lingala, Mauritian Creole, Malagasy, Maori, Occitan, Tajik, Tigrinya, Uzbek, Walloon
-			function () {
-				var args = arguments;
-				if ([0, 1].indexOf(args[0]) > -1) {
-					return args[1];
-				} else {
-					return args[2];
-				}
-			},
-			// 3: Latvian
-			function () {
-				var args = arguments;
-				if (args[0] % 10 === 1 && args[0] % 100 !== 11) {
-					return args[1];
-				} else if (args[0] !== 0) {
-					return args[2];
-				} else {
-					return args[3];
-				}
-			},
-			// 4: Scottish Gaelic
-			function () {
-				var args = arguments;
-				if (args[0] === 1 || args[0] === 11) {
-					return args[1];
-				} else if (args[0] === 2 || args[0] === 12) {
-					return args[2];
-				} else if (args[0] > 2 && args[0] < 20) {
-					return args[3];
-				} else {
-					return args[4];
-				}
-			},
-			// 5:  Romanian
-			function () {
-				if (args[0] === 1) {
-					return args[1];
-				} else if (args[0] === 0 || (args[0] % 100 > 0 && args[0] % 100 < 20)) {
-					return args[2];
-				} else {
-					return args[3];
-				}
-			},
-			// 6: Lithuanian
-			function () {
-				var args = arguments;
-				if (args[0] % 10 === 1 && args[0] % 100 !== 11) {
-					return args[1];
-				} else if (args[0] % 10 >= 2 && (args[0] % 100 < 10 || args[0] % 100 >= 20)) {
-					return args[2];
-				} else {
-					return [3];
-				}
-			},
-			// 7: Belarusian, Bosnian, Croatian, Serbian, Russian, Ukrainian
-			function () {
-				var args = arguments;
-				if (args[0] % 10 === 1 && args[0] % 100 !== 11) {
-					return args[1];
-				} else if (args[0] % 10 >= 2 && args[0] % 10 <= 4 && (args[0] % 100 < 10 || args[0] % 100 >= 20)) {
-					return args[2];
-				} else {
-					return args[3];
-				}
-			},
-			// 8:  Slovak, Czech
-			function () {
-				var args = arguments;
-				if (args[0] === 1) {
-					return args[1];
-				} else if (args[0] >= 2 && args[0] <= 4) {
-					return args[2];
-				} else {
-					return args[3];
-				}
-			},
-			// 9: Polish
-			function () {
-				var args = arguments;
-				if (args[0] === 1) {
-					return args[1];
-				} else if (args[0] % 10 >= 2 && args[0] % 10 <= 4 && (args[0] % 100 < 10 || args[0] % 100 >= 20)) {
-					return args[2];
-				} else {
-					return args[3];
-				}
-			},
-			// 10: Slovenian
-			function () {
-				var args = arguments;
-				if (args[0] % 100 === 1) {
-					return args[2];
-				} else if (args[0] % 100 === 2) {
-					return args[3];
-				} else if (args[0] % 100 === 3 || args[0] % 100 === 4) {
-					return args[4];
-				} else {
-					return args[1];
-				}
-			},
-			// 11: Irish Gaelic
-			function () {
-				var args = arguments;
-				if (args[0] === 1) {
-					return args[1];
-				} else if (args[0] === 2) {
-					return args[2];
-				} else if (args[0] > 2 && args[0] < 7) {
-					return args[3];
-				} else if (args[0] > 6 && args[0] < 11) {
-					return args[4];
-				} else {
-					return args[5];
-				}
-			},
-			// 12: Arabic
-			function () {
-				var args = arguments;
-				if (args[0] === 0) {
-					return args[1];
-				} else if (args[0] === 1) {
-					return args[2];
-				} else if (args[0] === 2) {
-					return args[3];
-				} else if (args[0] % 100 >= 3 && args[0] % 100 <= 10) {
-					return args[4];
-				} else if (args[0] % 100 >= 11) {
-					return args[5];
-				} else {
-					return args[6];
-				}
-			},
-			// 13: Maltese
-			function () {
-				var args = arguments;
-				if (args[0] === 1) {
-					return args[1];
-				} else if (args[0] === 0 || (args[0] % 100 > 1 && args[0] % 100 < 11)) {
-					return args[2];
-				} else if (args[0] % 100 > 10 && args[0] % 100 < 20) {
-					return args[3];
-				} else {
-					return args[4];
-				}
+	return Renderer;
+}();
 
-			},
-			// 14: Macedonian
-			function () {
-				var args = arguments;
-				if (args[0] % 10 === 1) {
-					return args[1];
-				} else if (args[0] % 10 === 2) {
-					return args[2];
-				} else {
-					return args[3];
-				}
-			},
-			// 15:  Icelandic
-			function () {
-				var args = arguments;
-				if (args[0] !== 11 && args[0] % 10 === 1) {
-					return args[1];
-				} else {
-					return args[2];
-				}
-			},
-			// New additions
-
-			// 16:  Kashubian
-			// Note: in https://developer.mozilla.org/en-US/docs/Mozilla/Localization/Localization_and_Plurals#List_of_Plural_Rules
-			// Breton is listed as #16 but in the Localization Guide it belongs to the group 2
-			function () {
-				var args = arguments;
-				if (args[0] === 1) {
-					return args[1];
-				} else if (args[0] % 10 >= 2 && args[0] % 10 <= 4 && (args[0] % 100 < 10 || args[0] % 100 >= 20)) {
-					return args[2];
-				} else {
-					return args[3];
-				}
-			},
-			// 17:  Welsh
-			function () {
-				var args = arguments;
-				if (args[0] === 1) {
-					return args[1];
-				} else if (args[0] === 2) {
-					return args[2];
-				} else if (args[0] !== 8 && args[0] !== 11) {
-					return args[3];
-				} else {
-					return args[4];
-				}
-			},
-			// 18:  Javanese
-			function () {
-				var args = arguments;
-				if (args[0] === 0) {
-					return args[1];
-				} else {
-					return args[2];
-				}
-			},
-			// 19:  Cornish
-			function () {
-				var args = arguments;
-				if (args[0] === 1) {
-					return args[1];
-				} else if (args[0] === 2) {
-					return args[2];
-				} else if (args[0] === 3) {
-					return args[3];
-				} else {
-					return args[4];
-				}
-			},
-			// 20:  Mandinka
-			function () {
-				var args = arguments;
-				if (args[0] === 0) {
-					return args[1];
-				} else if (args[0] === 1) {
-					return args[2];
-				} else {
-					return args[3];
-				}
-			}
-		],
-		/**
-		 * Get specified language
-		 *
-		 */
-		getLanguage: function () {
-			var language = i18n.locale.language || i18n['default'];
-			return /^(x\-)?[a-z]{2,}(\-\w{2,})?(\-\w{2,})?$/.exec(language) ? language : i18n['default'];
-		},
+var renderer = exports.renderer = new Renderer();
 
-		/**
-		 * Translate a string to a specified language, including optionally a number to pluralize translation
-		 *
-		 * @param {String} message
-		 * @param {Number} pluralParam
-		 * @return {String}
-		 */
-		t: function (message, pluralParam) {
-
-			if (typeof message === 'string' && message.length) {
-
-				var
-					language = i18n.getLanguage(),
-					str,
-					pluralForm,
-					/**
-					 * Modify string using algorithm to detect plural forms.
-					 *
-					 * @private
-					 * @see http://stackoverflow.com/questions/1353408/messageformat-in-javascript-parameters-in-localized-ui-strings
-					 * @param {String|String[]} input   - String or array of strings to pick the plural form
-					 * @param {Number} number           - Number to determine the proper plural form
-					 * @param {Number} form             - Number of language family to apply plural form
-					 * @return {String}
-					 */
-					plural = function (input, number, form) {
-
-						if (typeof input !== 'object' || typeof number !== 'number' || typeof form !== 'number') {
-							return input;
-						}
+_mejs2.default.Renderers = renderer;
 
-						if (typeof input === 'string') {
-							return input;
-						}
+},{"7":7}],9:[function(_dereq_,module,exports){
+'use strict';
 
-						// Perform plural form or return original text
-						return i18n.pluralForms[form].apply(null, [number].concat(input));
-					},
-					/**
-					 *
-					 * @param {String} input
-					 * @return {String}
-					 */
-					escapeHTML = function (input) {
-						var map = {
-							'&': '&amp;',
-							'<': '&lt;',
-							'>': '&gt;',
-							'"': '&quot;'
-						};
-
-						return input.replace(/[&<>"]/g, function(c) {
-							return map[c];
-						});
-					}
-				;
-
-				// Fetch the localized version of the string
-				if (i18n.locale.strings && i18n.locale.strings[language]) {
-					str = i18n.locale.strings[language][message];
-					if (typeof pluralParam === 'number') {
-						pluralForm = i18n.locale.strings[language]['mejs.plural-form'];
-						str = plural.apply(null, [str, pluralParam, pluralForm]);
-					}
-				}
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
+var EN = exports.EN = {
+	'mejs.plural-form': 1,
+
+	'mejs.download-file': 'Download File',
+
+	'mejs.install-flash': 'You are using a browser that does not have Flash player enabled or installed. Please turn on your Flash player plugin or download the latest version from https://get.adobe.com/flashplayer/',
+
+	'mejs.fullscreen': 'Fullscreen',
+
+	'mejs.play': 'Play',
+	'mejs.pause': 'Pause',
+
+	'mejs.time-slider': 'Time Slider',
+	'mejs.time-help-text': 'Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.',
+	'mejs.live-broadcast': 'Live Broadcast',
+
+	'mejs.volume-help-text': 'Use Up/Down Arrow keys to increase or decrease volume.',
+	'mejs.unmute': 'Unmute',
+	'mejs.mute': 'Mute',
+	'mejs.volume-slider': 'Volume Slider',
+
+	'mejs.video-player': 'Video Player',
+	'mejs.audio-player': 'Audio Player',
+
+	'mejs.captions-subtitles': 'Captions/Subtitles',
+	'mejs.captions-chapters': 'Chapters',
+	'mejs.none': 'None',
+	'mejs.afrikaans': 'Afrikaans',
+	'mejs.albanian': 'Albanian',
+	'mejs.arabic': 'Arabic',
+	'mejs.belarusian': 'Belarusian',
+	'mejs.bulgarian': 'Bulgarian',
+	'mejs.catalan': 'Catalan',
+	'mejs.chinese': 'Chinese',
+	'mejs.chinese-simplified': 'Chinese (Simplified)',
+	'mejs.chinese-traditional': 'Chinese (Traditional)',
+	'mejs.croatian': 'Croatian',
+	'mejs.czech': 'Czech',
+	'mejs.danish': 'Danish',
+	'mejs.dutch': 'Dutch',
+	'mejs.english': 'English',
+	'mejs.estonian': 'Estonian',
+	'mejs.filipino': 'Filipino',
+	'mejs.finnish': 'Finnish',
+	'mejs.french': 'French',
+	'mejs.galician': 'Galician',
+	'mejs.german': 'German',
+	'mejs.greek': 'Greek',
+	'mejs.haitian-creole': 'Haitian Creole',
+	'mejs.hebrew': 'Hebrew',
+	'mejs.hindi': 'Hindi',
+	'mejs.hungarian': 'Hungarian',
+	'mejs.icelandic': 'Icelandic',
+	'mejs.indonesian': 'Indonesian',
+	'mejs.irish': 'Irish',
+	'mejs.italian': 'Italian',
+	'mejs.japanese': 'Japanese',
+	'mejs.korean': 'Korean',
+	'mejs.latvian': 'Latvian',
+	'mejs.lithuanian': 'Lithuanian',
+	'mejs.macedonian': 'Macedonian',
+	'mejs.malay': 'Malay',
+	'mejs.maltese': 'Maltese',
+	'mejs.norwegian': 'Norwegian',
+	'mejs.persian': 'Persian',
+	'mejs.polish': 'Polish',
+	'mejs.portuguese': 'Portuguese',
+	'mejs.romanian': 'Romanian',
+	'mejs.russian': 'Russian',
+	'mejs.serbian': 'Serbian',
+	'mejs.slovak': 'Slovak',
+	'mejs.slovenian': 'Slovenian',
+	'mejs.spanish': 'Spanish',
+	'mejs.swahili': 'Swahili',
+	'mejs.swedish': 'Swedish',
+	'mejs.tagalog': 'Tagalog',
+	'mejs.thai': 'Thai',
+	'mejs.turkish': 'Turkish',
+	'mejs.ukrainian': 'Ukrainian',
+	'mejs.vietnamese': 'Vietnamese',
+	'mejs.welsh': 'Welsh',
+	'mejs.yiddish': 'Yiddish'
+};
 
-				// Fallback to default language if requested uid is not translated
-				if (!str && i18n.locale.strings && i18n.locale.strings[i18n['default']]) {
-					str = i18n.locale.strings[i18n['default']][message];
-					if (typeof pluralParam === 'number') {
-						pluralForm = i18n.locale.strings[i18n['default']]['mejs.plural-form'];
-						str = plural.apply(null, [str, pluralParam, pluralForm]);
+},{}],10:[function(_dereq_,module,exports){
+'use strict';
 
-					}
-				}
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
 
-				// As a last resort, use the requested uid, to mimic original behavior of i18n utils (in which uid was the english text)
-				str = str || message;
+var _window = _dereq_(3);
 
-				// Replace token
-				if (typeof pluralParam === 'number') {
-					str = str.replace('%1', pluralParam);
-				}
+var _window2 = _interopRequireDefault(_window);
 
-				return escapeHTML(str);
+var _mejs = _dereq_(7);
 
-			}
+var _mejs2 = _interopRequireDefault(_mejs);
 
-			return message;
-		}
+var _renderer = _dereq_(8);
 
-	};
+var _general = _dereq_(18);
 
-	// i18n fixes for compatibility with WordPress
-	if (typeof mejsL10n !== 'undefined') {
-		i18n.locale.language = mejsL10n.language;
-	}
+var _media = _dereq_(19);
 
-	// Register variable
-	mejs.i18n = i18n;
+var _constants = _dereq_(16);
 
+var _dom = _dereq_(17);
 
-}(document, window, mejs));
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-// i18n fixes for compatibility with WordPress
-;(function (mejs, undefined) {
+var NativeDash = {
 
-	"use strict";
+	promise: null,
 
-	if (typeof mejsL10n !== 'undefined') {
-		mejs[mejsL10n.language] = mejsL10n.strings;
-	}
+	load: function load(settings) {
+		if (typeof dashjs !== 'undefined') {
+			NativeDash.promise = new Promise(function (resolve) {
+				resolve();
+			}).then(function () {
+				NativeDash._createPlayer(settings);
+			});
+		} else {
+			settings.options.path = typeof settings.options.path === 'string' ? settings.options.path : 'https://cdn.dashjs.org/latest/dash.all.min.js';
 
-}(mejs.i18n.locale.strings));
-/*!
- * This is a i18n.locale language object.
- *
- * English; This can serve as a template for other languages to translate
- *
- * @author
- *   TBD
- *   Sascha Greuel (Twitter: @SoftCreatR)
- *
- * @see
- *   me-i18n.js
- *
- * @params
- *  - exports - CommonJS, window ..
- */
-(function (exports) {
-    "use strict";
-
-    if (exports.en === undefined) {
-        exports.en = {
-            "mejs.plural-form": 1,
-
-            // me-shim
-            "mejs.download-file": "Download File",
-
-            // mep-feature-contextmenu
-            "mejs.fullscreen-off": "Turn off Fullscreen",
-            "mejs.fullscreen-on": "Go Fullscreen",
-            "mejs.download-video": "Download Video",
-
-            // mep-feature-fullscreen
-            "mejs.fullscreen": "Fullscreen",
-
-            // mep-feature-jumpforward
-            "mejs.time-jump-forward": ["Jump forward 1 second", "Jump forward %1 seconds"],
-
-            // mep-feature-playpause
-            "mejs.play": "Play",
-            "mejs.pause": "Pause",
-
-            // mep-feature-postroll
-            "mejs.close": "Close",
-
-            // mep-feature-progress
-            "mejs.time-slider": "Time Slider",
-            "mejs.time-help-text": "Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.",
-
-            // mep-feature-skipback
-            "mejs.time-skip-back": ["Skip back 1 second", "Skip back %1 seconds"],
-
-            // mep-feature-tracks
-            "mejs.captions-subtitles": "Captions/Subtitles",
-            "mejs.none": "None",
-
-            // mep-feature-volume
-            "mejs.mute-toggle": "Mute Toggle",
-            "mejs.volume-help-text": "Use Up/Down Arrow keys to increase or decrease volume.",
-            "mejs.unmute": "Unmute",
-            "mejs.mute": "Mute",
-            "mejs.volume-slider": "Volume Slider",
-
-            // mep-player
-            "mejs.video-player": "Video Player",
-            "mejs.audio-player": "Audio Player",
-
-            // mep-feature-ads
-            "mejs.ad-skip": "Skip ad",
-            "mejs.ad-skip-info": ["Skip in 1 second", "Skip in %1 seconds"],
-
-            // mep-feature-sourcechooser
-            "mejs.source-chooser": "Source Chooser"
-        };
-    }
-}(mejs.i18n.locale.strings));
+			NativeDash.promise = NativeDash.promise || (0, _dom.loadScript)(settings.options.path);
+			NativeDash.promise.then(function () {
+				NativeDash._createPlayer(settings);
+			});
+		}
+
+		return NativeDash.promise;
+	},
+
+	_createPlayer: function _createPlayer(settings) {
+		var player = dashjs.MediaPlayer().create();
+		_window2.default['__ready__' + settings.id](player);
+		return player;
+	}
+};
+
+var DashNativeRenderer = {
+	name: 'native_dash',
+	options: {
+		prefix: 'native_dash',
+		dash: {
+			path: 'https://cdn.dashjs.org/latest/dash.all.min.js',
+			debug: false,
+			drm: {},
+
+			robustnessLevel: ''
+		}
+	},
+
+	canPlayType: function canPlayType(type) {
+		return _constants.HAS_MSE && ['application/dash+xml'].indexOf(type.toLowerCase()) > -1;
+	},
+
+	create: function create(mediaElement, options, mediaFiles) {
+
+		var originalNode = mediaElement.originalNode,
+		    id = mediaElement.id + '_' + options.prefix,
+		    autoplay = originalNode.autoplay,
+		    children = originalNode.children;
+
+		var node = null,
+		    dashPlayer = null;
+
+		originalNode.removeAttribute('type');
+		for (var i = 0, total = children.length; i < total; i++) {
+			children[i].removeAttribute('type');
+		}
+
+		node = originalNode.cloneNode(true);
+		options = Object.assign(options, mediaElement.options);
+
+		var props = _mejs2.default.html5media.properties,
+		    events = _mejs2.default.html5media.events.concat(['click', 'mouseover', 'mouseout']),
+		    attachNativeEvents = function attachNativeEvents(e) {
+			if (e.type !== 'error') {
+				var _event = (0, _general.createEvent)(e.type, mediaElement);
+				mediaElement.dispatchEvent(_event);
+			}
+		},
+		    assignGettersSetters = function assignGettersSetters(propName) {
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+			node['get' + capName] = function () {
+				return dashPlayer !== null ? node[propName] : null;
+			};
+
+			node['set' + capName] = function (value) {
+				if (_mejs2.default.html5media.readOnlyProperties.indexOf(propName) === -1) {
+					if (propName === 'src') {
+						var source = (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value.src ? value.src : value;
+						node[propName] = source;
+						if (dashPlayer !== null) {
+							dashPlayer.reset();
+							for (var _i = 0, _total = events.length; _i < _total; _i++) {
+								node.removeEventListener(events[_i], attachNativeEvents);
+							}
+							dashPlayer = NativeDash._createPlayer({
+								options: options.dash,
+								id: id
+							});
+
+							if (value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && _typeof(value.drm) === 'object') {
+								dashPlayer.setProtectionData(value.drm);
+								if ((0, _general.isString)(options.dash.robustnessLevel) && options.dash.robustnessLevel) {
+									dashPlayer.getProtectionController().setRobustnessLevel(options.dash.robustnessLevel);
+								}
+							}
+							dashPlayer.attachSource(source);
+							if (autoplay) {
+								dashPlayer.play();
+							}
+						}
+					} else {
+						node[propName] = value;
+					}
+				}
+			};
+		};
+
+		for (var _i2 = 0, _total2 = props.length; _i2 < _total2; _i2++) {
+			assignGettersSetters(props[_i2]);
+		}
+
+		_window2.default['__ready__' + id] = function (_dashPlayer) {
+			mediaElement.dashPlayer = dashPlayer = _dashPlayer;
+
+			var dashEvents = dashjs.MediaPlayer.events,
+			    assignEvents = function assignEvents(eventName) {
+				if (eventName === 'loadedmetadata') {
+					dashPlayer.getDebug().setLogToBrowserConsole(options.dash.debug);
+					dashPlayer.initialize();
+					dashPlayer.setScheduleWhilePaused(false);
+					dashPlayer.setFastSwitchEnabled(true);
+					dashPlayer.attachView(node);
+					dashPlayer.setAutoPlay(false);
+
+					if (_typeof(options.dash.drm) === 'object' && !_mejs2.default.Utils.isObjectEmpty(options.dash.drm)) {
+						dashPlayer.setProtectionData(options.dash.drm);
+						if ((0, _general.isString)(options.dash.robustnessLevel) && options.dash.robustnessLevel) {
+							dashPlayer.getProtectionController().setRobustnessLevel(options.dash.robustnessLevel);
+						}
+					}
+					dashPlayer.attachSource(node.getSrc());
+				}
+
+				node.addEventListener(eventName, attachNativeEvents);
+			};
+
+			for (var _i3 = 0, _total3 = events.length; _i3 < _total3; _i3++) {
+				assignEvents(events[_i3]);
+			}
+
+			var assignMdashEvents = function assignMdashEvents(name, data) {
+				if (name.toLowerCase() === 'error') {
+					mediaElement.generateError(data.message, node.src);
+					console.error(data);
+				} else {
+					var _event2 = (0, _general.createEvent)(name, mediaElement);
+					_event2.data = data;
+					mediaElement.dispatchEvent(_event2);
+				}
+			};
+
+			for (var eventType in dashEvents) {
+				if (dashEvents.hasOwnProperty(eventType)) {
+					dashPlayer.on(dashEvents[eventType], function (e) {
+						for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+							args[_key - 1] = arguments[_key];
+						}
+
+						return assignMdashEvents(e.type, args);
+					});
+				}
+			}
+		};
+
+		if (mediaFiles && mediaFiles.length > 0) {
+			for (var _i4 = 0, _total4 = mediaFiles.length; _i4 < _total4; _i4++) {
+				if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i4].type)) {
+					node.setAttribute('src', mediaFiles[_i4].src);
+					if (typeof mediaFiles[_i4].drm !== 'undefined') {
+						options.dash.drm = mediaFiles[_i4].drm;
+					}
+					break;
+				}
+			}
+		}
+
+		node.setAttribute('id', id);
+
+		originalNode.parentNode.insertBefore(node, originalNode);
+		originalNode.autoplay = false;
+		originalNode.style.display = 'none';
+
+		node.setSize = function (width, height) {
+			node.style.width = width + 'px';
+			node.style.height = height + 'px';
+			return node;
+		};
+
+		node.hide = function () {
+			node.pause();
+			node.style.display = 'none';
+			return node;
+		};
+
+		node.show = function () {
+			node.style.display = '';
+			return node;
+		};
+
+		node.destroy = function () {
+			if (dashPlayer !== null) {
+				dashPlayer.reset();
+			}
+		};
+
+		var event = (0, _general.createEvent)('rendererready', node);
+		mediaElement.dispatchEvent(event);
+
+		mediaElement.promises.push(NativeDash.load({
+			options: options.dash,
+			id: id
+		}));
+
+		return node;
+	}
+};
+
+_media.typeChecks.push(function (url) {
+	return ~url.toLowerCase().indexOf('.mpd') ? 'application/dash+xml' : null;
+});
+
+_renderer.renderer.add(DashNativeRenderer);
+
+},{"16":16,"17":17,"18":18,"19":19,"3":3,"7":7,"8":8}],11:[function(_dereq_,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
+exports.PluginDetector = undefined;
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _window = _dereq_(3);
+
+var _window2 = _interopRequireDefault(_window);
+
+var _document = _dereq_(2);
+
+var _document2 = _interopRequireDefault(_document);
+
+var _mejs = _dereq_(7);
+
+var _mejs2 = _interopRequireDefault(_mejs);
+
+var _i18n = _dereq_(5);
+
+var _i18n2 = _interopRequireDefault(_i18n);
+
+var _renderer = _dereq_(8);
+
+var _general = _dereq_(18);
+
+var _constants = _dereq_(16);
+
+var _media = _dereq_(19);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var PluginDetector = exports.PluginDetector = {
+	plugins: [],
+
+	hasPluginVersion: function hasPluginVersion(plugin, v) {
+		var pv = PluginDetector.plugins[plugin];
+		v[1] = v[1] || 0;
+		v[2] = v[2] || 0;
+		return pv[0] > v[0] || pv[0] === v[0] && pv[1] > v[1] || pv[0] === v[0] && pv[1] === v[1] && pv[2] >= v[2];
+	},
+
+	addPlugin: function addPlugin(p, pluginName, mimeType, activeX, axDetect) {
+		PluginDetector.plugins[p] = PluginDetector.detectPlugin(pluginName, mimeType, activeX, axDetect);
+	},
+
+	detectPlugin: function detectPlugin(pluginName, mimeType, activeX, axDetect) {
+
+		var version = [0, 0, 0],
+		    description = void 0,
+		    ax = void 0;
+
+		if (_constants.NAV.plugins !== null && _constants.NAV.plugins !== undefined && _typeof(_constants.NAV.plugins[pluginName]) === 'object') {
+			description = _constants.NAV.plugins[pluginName].description;
+			if (description && !(typeof _constants.NAV.mimeTypes !== 'undefined' && _constants.NAV.mimeTypes[mimeType] && !_constants.NAV.mimeTypes[mimeType].enabledPlugin)) {
+				version = description.replace(pluginName, '').replace(/^\s+/, '').replace(/\sr/gi, '.').split('.');
+				for (var i = 0, total = version.length; i < total; i++) {
+					version[i] = parseInt(version[i].match(/\d+/), 10);
+				}
+			}
+		} else if (_window2.default.ActiveXObject !== undefined) {
+			try {
+				ax = new ActiveXObject(activeX);
+				if (ax) {
+					version = axDetect(ax);
+				}
+			} catch (e) {
+				
+			}
+		}
+		return version;
+	}
+};
+
+PluginDetector.addPlugin('flash', 'Shockwave Flash', 'application/x-shockwave-flash', 'ShockwaveFlash.ShockwaveFlash', function (ax) {
+	var version = [],
+	    d = ax.GetVariable("$version");
+
+	if (d) {
+		d = d.split(" ")[1].split(",");
+		version = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+	}
+	return version;
+});
+
+var FlashMediaElementRenderer = {
+	create: function create(mediaElement, options, mediaFiles) {
+
+		var flash = {};
+
+		flash.options = options;
+		flash.id = mediaElement.id + '_' + flash.options.prefix;
+		flash.mediaElement = mediaElement;
+		flash.flashState = {};
+		flash.flashApi = null;
+		flash.flashApiStack = [];
+
+		var props = _mejs2.default.html5media.properties,
+		    assignGettersSetters = function assignGettersSetters(propName) {
+			flash.flashState[propName] = null;
+
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+			flash['get' + capName] = function () {
+				if (flash.flashApi !== null) {
+					if (typeof flash.flashApi['get_' + propName] === 'function') {
+						var value = flash.flashApi['get_' + propName]();
+
+						if (propName === 'buffered') {
+							return {
+								start: function start() {
+									return 0;
+								},
+								end: function end() {
+									return value;
+								},
+								length: 1
+							};
+						}
+						return value;
+					} else {
+						return null;
+					}
+				} else {
+					return null;
+				}
+			};
+
+			flash['set' + capName] = function (value) {
+				if (propName === 'src') {
+					value = (0, _media.absolutizeUrl)(value);
+				}
+
+				if (flash.flashApi !== null && flash.flashApi['set_' + propName] !== undefined) {
+					try {
+						flash.flashApi['set_' + propName](value);
+					} catch (e) {
+						
+					}
+				} else {
+					flash.flashApiStack.push({
+						type: 'set',
+						propName: propName,
+						value: value
+					});
+				}
+			};
+		};
+
+		for (var i = 0, total = props.length; i < total; i++) {
+			assignGettersSetters(props[i]);
+		}
+
+		var methods = _mejs2.default.html5media.methods,
+		    assignMethods = function assignMethods(methodName) {
+			flash[methodName] = function () {
+				if (flash.flashApi !== null) {
+					if (flash.flashApi['fire_' + methodName]) {
+						try {
+							flash.flashApi['fire_' + methodName]();
+						} catch (e) {
+							
+						}
+					} else {
+						
+					}
+				} else {
+					flash.flashApiStack.push({
+						type: 'call',
+						methodName: methodName
+					});
+				}
+			};
+		};
+		methods.push('stop');
+		for (var _i = 0, _total = methods.length; _i < _total; _i++) {
+			assignMethods(methods[_i]);
+		}
+
+		var initEvents = ['rendererready'];
+
+		for (var _i2 = 0, _total2 = initEvents.length; _i2 < _total2; _i2++) {
+			var event = (0, _general.createEvent)(initEvents[_i2], flash);
+			mediaElement.dispatchEvent(event);
+		}
+
+		_window2.default['__ready__' + flash.id] = function () {
+
+			flash.flashReady = true;
+			flash.flashApi = _document2.default.getElementById('__' + flash.id);
+
+			if (flash.flashApiStack.length) {
+				for (var _i3 = 0, _total3 = flash.flashApiStack.length; _i3 < _total3; _i3++) {
+					var stackItem = flash.flashApiStack[_i3];
+
+					if (stackItem.type === 'set') {
+						var propName = stackItem.propName,
+						    capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+						flash['set' + capName](stackItem.value);
+					} else if (stackItem.type === 'call') {
+						flash[stackItem.methodName]();
+					}
+				}
+			}
+		};
+
+		_window2.default['__event__' + flash.id] = function (eventName, message) {
+			var event = (0, _general.createEvent)(eventName, flash);
+			if (message) {
+				try {
+					event.data = JSON.parse(message);
+					event.details.data = JSON.parse(message);
+				} catch (e) {
+					event.message = message;
+				}
+			}
+
+			flash.mediaElement.dispatchEvent(event);
+		};
+
+		flash.flashWrapper = _document2.default.createElement('div');
+
+		if (['always', 'sameDomain'].indexOf(flash.options.shimScriptAccess) === -1) {
+			flash.options.shimScriptAccess = 'sameDomain';
+		}
+
+		var autoplay = mediaElement.originalNode.autoplay,
+		    flashVars = ['uid=' + flash.id, 'autoplay=' + autoplay, 'allowScriptAccess=' + flash.options.shimScriptAccess, 'preload=' + (mediaElement.originalNode.getAttribute('preload') || '')],
+		    isVideo = mediaElement.originalNode !== null && mediaElement.originalNode.tagName.toLowerCase() === 'video',
+		    flashHeight = isVideo ? mediaElement.originalNode.height : 1,
+		    flashWidth = isVideo ? mediaElement.originalNode.width : 1;
+
+		if (mediaElement.originalNode.getAttribute('src')) {
+			flashVars.push('src=' + mediaElement.originalNode.getAttribute('src'));
+		}
+
+		if (flash.options.enablePseudoStreaming === true) {
+			flashVars.push('pseudostreamstart=' + flash.options.pseudoStreamingStartQueryParam);
+			flashVars.push('pseudostreamtype=' + flash.options.pseudoStreamingType);
+		}
+
+		mediaElement.appendChild(flash.flashWrapper);
+		mediaElement.originalNode.style.display = 'none';
+
+		var settings = [];
+
+		if (_constants.IS_IE) {
+			var specialIEContainer = _document2.default.createElement('div');
+			flash.flashWrapper.appendChild(specialIEContainer);
+
+			settings = ['classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"', 'codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"', 'id="__' + flash.id + '"', 'width="' + flashWidth + '"', 'height="' + flashHeight + '"'];
+
+			if (!isVideo) {
+				settings.push('style="clip: rect(0 0 0 0); position: absolute;"');
+			}
+
+			specialIEContainer.outerHTML = '<object ' + settings.join(' ') + '>' + ('<param name="movie" value="' + flash.options.pluginPath + flash.options.filename + '?x=' + new Date() + '" />') + ('<param name="flashvars" value="' + flashVars.join('&amp;') + '" />') + '<param name="quality" value="high" />' + '<param name="bgcolor" value="#000000" />' + '<param name="wmode" value="transparent" />' + ('<param name="allowScriptAccess" value="' + flash.options.shimScriptAccess + '" />') + '<param name="allowFullScreen" value="true" />' + ('<div>' + _i18n2.default.t('mejs.install-flash') + '</div>') + '</object>';
+		} else {
+
+			settings = ['id="__' + flash.id + '"', 'name="__' + flash.id + '"', 'play="true"', 'loop="false"', 'quality="high"', 'bgcolor="#000000"', 'wmode="transparent"', 'allowScriptAccess="' + flash.options.shimScriptAccess + '"', 'allowFullScreen="true"', 'type="application/x-shockwave-flash"', 'pluginspage="//www.macromedia.com/go/getflashplayer"', 'src="' + flash.options.pluginPath + flash.options.filename + '"', 'flashvars="' + flashVars.join('&') + '"', 'width="' + flashWidth + '"', 'height="' + flashHeight + '"'];
+
+			if (!isVideo) {
+				settings.push('style="clip: rect(0 0 0 0); position: absolute;"');
+			}
+
+			flash.flashWrapper.innerHTML = '<embed ' + settings.join(' ') + '>';
+		}
+
+		flash.flashNode = flash.flashWrapper.lastChild;
+
+		flash.hide = function () {
+			if (isVideo) {
+				flash.flashNode.style.display = 'none';
+			}
+		};
+		flash.show = function () {
+			if (isVideo) {
+				flash.flashNode.style.display = '';
+			}
+		};
+		flash.setSize = function (width, height) {
+			flash.flashNode.style.width = width + 'px';
+			flash.flashNode.style.height = height + 'px';
+
+			if (flash.flashApi !== null && typeof flash.flashApi.fire_setSize === 'function') {
+				flash.flashApi.fire_setSize(width, height);
+			}
+		};
+
+		flash.destroy = function () {
+			flash.flashNode.remove();
+		};
+
+		if (mediaFiles && mediaFiles.length > 0) {
+			for (var _i4 = 0, _total4 = mediaFiles.length; _i4 < _total4; _i4++) {
+				if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i4].type)) {
+					flash.setSrc(mediaFiles[_i4].src);
+					break;
+				}
+			}
+		}
+
+		return flash;
+	}
+};
+
+var hasFlash = PluginDetector.hasPluginVersion('flash', [10, 0, 0]);
+
+if (hasFlash) {
+	_media.typeChecks.push(function (url) {
+		url = url.toLowerCase();
+
+		if (url.startsWith('rtmp')) {
+			if (~url.indexOf('.mp3')) {
+				return 'audio/rtmp';
+			} else {
+				return 'video/rtmp';
+			}
+		} else if (/\.og(a|g)/i.test(url)) {
+			return 'audio/ogg';
+		} else if (~url.indexOf('.m3u8')) {
+			return 'application/x-mpegURL';
+		} else if (~url.indexOf('.mpd')) {
+			return 'application/dash+xml';
+		} else if (~url.indexOf('.flv')) {
+			return 'video/flv';
+		} else {
+			return null;
+		}
+	});
+
+	var FlashMediaElementVideoRenderer = {
+		name: 'flash_video',
+		options: {
+			prefix: 'flash_video',
+			filename: 'mediaelement-flash-video.swf',
+			enablePseudoStreaming: false,
+
+			pseudoStreamingStartQueryParam: 'start',
+
+			pseudoStreamingType: 'byte'
+		},
+
+		canPlayType: function canPlayType(type) {
+			return ~['video/mp4', 'video/rtmp', 'audio/rtmp', 'rtmp/mp4', 'audio/mp4', 'video/flv', 'video/x-flv'].indexOf(type.toLowerCase());
+		},
+
+		create: FlashMediaElementRenderer.create
+
+	};
+	_renderer.renderer.add(FlashMediaElementVideoRenderer);
+
+	var FlashMediaElementHlsVideoRenderer = {
+		name: 'flash_hls',
+		options: {
+			prefix: 'flash_hls',
+			filename: 'mediaelement-flash-video-hls.swf'
+		},
+
+		canPlayType: function canPlayType(type) {
+			return ~['application/x-mpegurl', 'application/vnd.apple.mpegurl', 'audio/mpegurl', 'audio/hls', 'video/hls'].indexOf(type.toLowerCase());
+		},
+
+		create: FlashMediaElementRenderer.create
+	};
+	_renderer.renderer.add(FlashMediaElementHlsVideoRenderer);
+
+	var FlashMediaElementMdashVideoRenderer = {
+		name: 'flash_dash',
+		options: {
+			prefix: 'flash_dash',
+			filename: 'mediaelement-flash-video-mdash.swf'
+		},
+
+		canPlayType: function canPlayType(type) {
+			return ~['application/dash+xml'].indexOf(type.toLowerCase());
+		},
+
+		create: FlashMediaElementRenderer.create
+	};
+	_renderer.renderer.add(FlashMediaElementMdashVideoRenderer);
+
+	var FlashMediaElementAudioRenderer = {
+		name: 'flash_audio',
+		options: {
+			prefix: 'flash_audio',
+			filename: 'mediaelement-flash-audio.swf'
+		},
+
+		canPlayType: function canPlayType(type) {
+			return ~['audio/mp3'].indexOf(type.toLowerCase());
+		},
+
+		create: FlashMediaElementRenderer.create
+	};
+	_renderer.renderer.add(FlashMediaElementAudioRenderer);
+
+	var FlashMediaElementAudioOggRenderer = {
+		name: 'flash_audio_ogg',
+		options: {
+			prefix: 'flash_audio_ogg',
+			filename: 'mediaelement-flash-audio-ogg.swf'
+		},
+
+		canPlayType: function canPlayType(type) {
+			return ~['audio/ogg', 'audio/oga', 'audio/ogv'].indexOf(type.toLowerCase());
+		},
+
+		create: FlashMediaElementRenderer.create
+	};
+	_renderer.renderer.add(FlashMediaElementAudioOggRenderer);
+}
+
+},{"16":16,"18":18,"19":19,"2":2,"3":3,"5":5,"7":7,"8":8}],12:[function(_dereq_,module,exports){
+'use strict';
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _window = _dereq_(3);
+
+var _window2 = _interopRequireDefault(_window);
+
+var _mejs = _dereq_(7);
+
+var _mejs2 = _interopRequireDefault(_mejs);
+
+var _renderer = _dereq_(8);
+
+var _general = _dereq_(18);
+
+var _constants = _dereq_(16);
+
+var _media = _dereq_(19);
+
+var _dom = _dereq_(17);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var NativeFlv = {
+
+	promise: null,
+
+	load: function load(settings) {
+		if (typeof flvjs !== 'undefined') {
+			NativeFlv.promise = new Promise(function (resolve) {
+				resolve();
+			}).then(function () {
+				NativeFlv._createPlayer(settings);
+			});
+		} else {
+			settings.options.path = typeof settings.options.path === 'string' ? settings.options.path : 'https://cdnjs.cloudflare.com/ajax/libs/flv.js/1.3.2/flv.min.js';
+
+			NativeFlv.promise = NativeFlv.promise || (0, _dom.loadScript)(settings.options.path);
+			NativeFlv.promise.then(function () {
+				NativeFlv._createPlayer(settings);
+			});
+		}
+
+		return NativeFlv.promise;
+	},
+
+	_createPlayer: function _createPlayer(settings) {
+		flvjs.LoggingControl.enableDebug = settings.options.debug;
+		flvjs.LoggingControl.enableVerbose = settings.options.debug;
+		var player = flvjs.createPlayer(settings.options);
+		_window2.default['__ready__' + settings.id](player);
+		return player;
+	}
+};
+
+var FlvNativeRenderer = {
+	name: 'native_flv',
+	options: {
+		prefix: 'native_flv',
+		flv: {
+			path: 'https://cdnjs.cloudflare.com/ajax/libs/flv.js/1.3.2/flv.min.js',
+
+			cors: true,
+			debug: false
+		}
+	},
+
+	canPlayType: function canPlayType(type) {
+		return _constants.HAS_MSE && ['video/x-flv', 'video/flv'].indexOf(type.toLowerCase()) > -1;
+	},
+
+	create: function create(mediaElement, options, mediaFiles) {
+
+		var originalNode = mediaElement.originalNode,
+		    id = mediaElement.id + '_' + options.prefix;
+
+		var node = null,
+		    flvPlayer = null;
+
+		node = originalNode.cloneNode(true);
+		options = Object.assign(options, mediaElement.options);
+
+		var props = _mejs2.default.html5media.properties,
+		    events = _mejs2.default.html5media.events.concat(['click', 'mouseover', 'mouseout']),
+		    attachNativeEvents = function attachNativeEvents(e) {
+			if (e.type !== 'error') {
+				var _event = (0, _general.createEvent)(e.type, mediaElement);
+				mediaElement.dispatchEvent(_event);
+			}
+		},
+		    assignGettersSetters = function assignGettersSetters(propName) {
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+			node['get' + capName] = function () {
+				return flvPlayer !== null ? node[propName] : null;
+			};
+
+			node['set' + capName] = function (value) {
+				if (_mejs2.default.html5media.readOnlyProperties.indexOf(propName) === -1) {
+					if (propName === 'src') {
+						node[propName] = (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value.src ? value.src : value;
+						if (flvPlayer !== null) {
+							var _flvOptions = {};
+							_flvOptions.type = 'flv';
+							_flvOptions.url = value;
+							_flvOptions.cors = options.flv.cors;
+							_flvOptions.debug = options.flv.debug;
+							_flvOptions.path = options.flv.path;
+
+							flvPlayer.destroy();
+							for (var i = 0, total = events.length; i < total; i++) {
+								node.removeEventListener(events[i], attachNativeEvents);
+							}
+							flvPlayer = NativeFlv._createPlayer({
+								options: _flvOptions,
+								id: id
+							});
+							flvPlayer.attachMediaElement(node);
+							flvPlayer.load();
+						}
+					} else {
+						node[propName] = value;
+					}
+				}
+			};
+		};
+
+		for (var i = 0, total = props.length; i < total; i++) {
+			assignGettersSetters(props[i]);
+		}
+
+		_window2.default['__ready__' + id] = function (_flvPlayer) {
+			mediaElement.flvPlayer = flvPlayer = _flvPlayer;
+
+			var flvEvents = flvjs.Events,
+			    assignEvents = function assignEvents(eventName) {
+				if (eventName === 'loadedmetadata') {
+					flvPlayer.unload();
+					flvPlayer.detachMediaElement();
+					flvPlayer.attachMediaElement(node);
+					flvPlayer.load();
+				}
+
+				node.addEventListener(eventName, attachNativeEvents);
+			};
+
+			for (var _i = 0, _total = events.length; _i < _total; _i++) {
+				assignEvents(events[_i]);
+			}
+
+			var assignFlvEvents = function assignFlvEvents(name, data) {
+				if (name === 'error') {
+					var message = data[0] + ': ' + data[1] + ' ' + data[2].msg;
+					mediaElement.generateError(message, node.src);
+				} else {
+					var _event2 = (0, _general.createEvent)(name, mediaElement);
+					_event2.data = data;
+					mediaElement.dispatchEvent(_event2);
+				}
+			};
+
+			var _loop = function _loop(eventType) {
+				if (flvEvents.hasOwnProperty(eventType)) {
+					flvPlayer.on(flvEvents[eventType], function () {
+						for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+							args[_key] = arguments[_key];
+						}
+
+						return assignFlvEvents(flvEvents[eventType], args);
+					});
+				}
+			};
+
+			for (var eventType in flvEvents) {
+				_loop(eventType);
+			}
+		};
+
+		if (mediaFiles && mediaFiles.length > 0) {
+			for (var _i2 = 0, _total2 = mediaFiles.length; _i2 < _total2; _i2++) {
+				if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i2].type)) {
+					node.setAttribute('src', mediaFiles[_i2].src);
+					break;
+				}
+			}
+		}
+
+		node.setAttribute('id', id);
+
+		originalNode.parentNode.insertBefore(node, originalNode);
+		originalNode.autoplay = false;
+		originalNode.style.display = 'none';
+
+		var flvOptions = {};
+		flvOptions.type = 'flv';
+		flvOptions.url = node.src;
+		flvOptions.cors = options.flv.cors;
+		flvOptions.debug = options.flv.debug;
+		flvOptions.path = options.flv.path;
+
+		node.setSize = function (width, height) {
+			node.style.width = width + 'px';
+			node.style.height = height + 'px';
+			return node;
+		};
+
+		node.hide = function () {
+			if (flvPlayer !== null) {
+				flvPlayer.pause();
+			}
+			node.style.display = 'none';
+			return node;
+		};
+
+		node.show = function () {
+			node.style.display = '';
+			return node;
+		};
+
+		node.destroy = function () {
+			if (flvPlayer !== null) {
+				flvPlayer.destroy();
+			}
+		};
+
+		var event = (0, _general.createEvent)('rendererready', node);
+		mediaElement.dispatchEvent(event);
+
+		mediaElement.promises.push(NativeFlv.load({
+			options: flvOptions,
+			id: id
+		}));
+
+		return node;
+	}
+};
+
+_media.typeChecks.push(function (url) {
+	return ~url.toLowerCase().indexOf('.flv') ? 'video/flv' : null;
+});
+
+_renderer.renderer.add(FlvNativeRenderer);
+
+},{"16":16,"17":17,"18":18,"19":19,"3":3,"7":7,"8":8}],13:[function(_dereq_,module,exports){
+'use strict';
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _window = _dereq_(3);
+
+var _window2 = _interopRequireDefault(_window);
+
+var _mejs = _dereq_(7);
+
+var _mejs2 = _interopRequireDefault(_mejs);
+
+var _renderer = _dereq_(8);
+
+var _general = _dereq_(18);
+
+var _constants = _dereq_(16);
+
+var _media = _dereq_(19);
+
+var _dom = _dereq_(17);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var NativeHls = {
+
+	promise: null,
+
+	load: function load(settings) {
+		if (typeof Hls !== 'undefined') {
+			NativeHls.promise = new Promise(function (resolve) {
+				resolve();
+			}).then(function () {
+				NativeHls._createPlayer(settings);
+			});
+		} else {
+			settings.options.path = typeof settings.options.path === 'string' ? settings.options.path : 'https://cdnjs.cloudflare.com/ajax/libs/hls.js/0.7.11/hls.min.js';
+
+			NativeHls.promise = NativeHls.promise || (0, _dom.loadScript)(settings.options.path);
+			NativeHls.promise.then(function () {
+				NativeHls._createPlayer(settings);
+			});
+		}
+
+		return NativeHls.promise;
+	},
+
+	_createPlayer: function _createPlayer(settings) {
+		var player = new Hls(settings.options);
+		_window2.default['__ready__' + settings.id](player);
+		return player;
+	}
+};
+
+var HlsNativeRenderer = {
+	name: 'native_hls',
+	options: {
+		prefix: 'native_hls',
+		hls: {
+			path: 'https://cdnjs.cloudflare.com/ajax/libs/hls.js/0.7.11/hls.min.js',
+
+			autoStartLoad: false,
+			debug: false
+		}
+	},
+
+	canPlayType: function canPlayType(type) {
+		return _constants.HAS_MSE && ['application/x-mpegurl', 'application/vnd.apple.mpegurl', 'audio/mpegurl', 'audio/hls', 'video/hls'].indexOf(type.toLowerCase()) > -1;
+	},
+
+	create: function create(mediaElement, options, mediaFiles) {
+
+		var originalNode = mediaElement.originalNode,
+		    id = mediaElement.id + '_' + options.prefix,
+		    preload = originalNode.getAttribute('preload'),
+		    autoplay = originalNode.autoplay;
+
+		var hlsPlayer = null,
+		    node = null;
+
+		node = originalNode.cloneNode(true);
+		options = Object.assign(options, mediaElement.options);
+		options.hls.autoStartLoad = preload && preload !== 'none' || autoplay;
+
+		var props = _mejs2.default.html5media.properties,
+		    events = _mejs2.default.html5media.events.concat(['click', 'mouseover', 'mouseout']),
+		    attachNativeEvents = function attachNativeEvents(e) {
+			if (e.type !== 'error') {
+				var _event = (0, _general.createEvent)(e.type, mediaElement);
+				mediaElement.dispatchEvent(_event);
+			}
+		},
+		    assignGettersSetters = function assignGettersSetters(propName) {
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+			node['get' + capName] = function () {
+				return hlsPlayer !== null ? node[propName] : null;
+			};
+
+			node['set' + capName] = function (value) {
+				if (_mejs2.default.html5media.readOnlyProperties.indexOf(propName) === -1) {
+					if (propName === 'src') {
+						node[propName] = (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value.src ? value.src : value;
+						if (hlsPlayer !== null) {
+							hlsPlayer.destroy();
+							for (var i = 0, total = events.length; i < total; i++) {
+								node.removeEventListener(events[i], attachNativeEvents);
+							}
+							hlsPlayer = NativeHls._createPlayer({
+								options: options.hls,
+								id: id
+							});
+							hlsPlayer.loadSource(value);
+							hlsPlayer.attachMedia(node);
+						}
+					} else {
+						node[propName] = value;
+					}
+				}
+			};
+		};
+
+		for (var i = 0, total = props.length; i < total; i++) {
+			assignGettersSetters(props[i]);
+		}
+
+		_window2.default['__ready__' + id] = function (_hlsPlayer) {
+			mediaElement.hlsPlayer = hlsPlayer = _hlsPlayer;
+			var hlsEvents = Hls.Events,
+			    assignEvents = function assignEvents(eventName) {
+				if (eventName === 'loadedmetadata') {
+					var url = mediaElement.originalNode.src;
+					hlsPlayer.detachMedia();
+					hlsPlayer.loadSource(url);
+					hlsPlayer.attachMedia(node);
+				}
+
+				node.addEventListener(eventName, attachNativeEvents);
+			};
+
+			for (var _i = 0, _total = events.length; _i < _total; _i++) {
+				assignEvents(events[_i]);
+			}
+
+			var recoverDecodingErrorDate = void 0,
+			    recoverSwapAudioCodecDate = void 0;
+			var assignHlsEvents = function assignHlsEvents(name, data) {
+				if (name === 'hlsError') {
+					console.warn(name, data);
+
+					if (data.fatal) {
+						switch (data.type) {
+							case 'mediaError':
+								var now = new Date().getTime();
+								if (!recoverDecodingErrorDate || now - recoverDecodingErrorDate > 3000) {
+									recoverDecodingErrorDate = new Date().getTime();
+									hlsPlayer.recoverMediaError();
+								} else if (!recoverSwapAudioCodecDate || now - recoverSwapAudioCodecDate > 3000) {
+									recoverSwapAudioCodecDate = new Date().getTime();
+									console.warn('Attempting to swap Audio Codec and recover from media error');
+									hlsPlayer.swapAudioCodec();
+									hlsPlayer.recoverMediaError();
+								} else {
+									var _message = 'Cannot recover, last media error recovery failed';
+									mediaElement.generateError(_message, node.src);
+									console.error(_message);
+								}
+								break;
+							case 'networkError':
+								var message = 'Network error';
+								mediaElement.generateError(message, node.src);
+								console.error(message);
+								break;
+							default:
+								hlsPlayer.destroy();
+								break;
+						}
+					}
+				} else {
+					var _event2 = (0, _general.createEvent)(name, mediaElement);
+					_event2.data = data;
+					mediaElement.dispatchEvent(_event2);
+				}
+			};
+
+			var _loop = function _loop(eventType) {
+				if (hlsEvents.hasOwnProperty(eventType)) {
+					hlsPlayer.on(hlsEvents[eventType], function () {
+						for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+							args[_key] = arguments[_key];
+						}
+
+						return assignHlsEvents(hlsEvents[eventType], args);
+					});
+				}
+			};
+
+			for (var eventType in hlsEvents) {
+				_loop(eventType);
+			}
+		};
+
+		if (mediaFiles && mediaFiles.length > 0) {
+			for (var _i2 = 0, _total2 = mediaFiles.length; _i2 < _total2; _i2++) {
+				if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i2].type)) {
+					node.setAttribute('src', mediaFiles[_i2].src);
+					break;
+				}
+			}
+		}
+
+		if (preload !== 'auto' && !autoplay) {
+			node.addEventListener('play', function () {
+				if (hlsPlayer !== null) {
+					hlsPlayer.startLoad();
+				}
+			});
+
+			node.addEventListener('pause', function () {
+				if (hlsPlayer !== null) {
+					hlsPlayer.stopLoad();
+				}
+			});
+		}
+
+		node.setAttribute('id', id);
+
+		originalNode.parentNode.insertBefore(node, originalNode);
+		originalNode.autoplay = false;
+		originalNode.style.display = 'none';
+
+		node.setSize = function (width, height) {
+			node.style.width = width + 'px';
+			node.style.height = height + 'px';
+			return node;
+		};
+
+		node.hide = function () {
+			node.pause();
+			node.style.display = 'none';
+			return node;
+		};
+
+		node.show = function () {
+			node.style.display = '';
+			return node;
+		};
+
+		node.destroy = function () {
+			if (hlsPlayer !== null) {
+				hlsPlayer.stopLoad();
+				hlsPlayer.destroy();
+			}
+		};
+
+		var event = (0, _general.createEvent)('rendererready', node);
+		mediaElement.dispatchEvent(event);
+
+		mediaElement.promises.push(NativeHls.load({
+			options: options.hls,
+			id: id
+		}));
+
+		return node;
+	}
+};
+
+_media.typeChecks.push(function (url) {
+	return ~url.toLowerCase().indexOf('.m3u8') ? 'application/x-mpegURL' : null;
+});
+
+_renderer.renderer.add(HlsNativeRenderer);
+
+},{"16":16,"17":17,"18":18,"19":19,"3":3,"7":7,"8":8}],14:[function(_dereq_,module,exports){
+'use strict';
+
+var _window = _dereq_(3);
+
+var _window2 = _interopRequireDefault(_window);
+
+var _document = _dereq_(2);
+
+var _document2 = _interopRequireDefault(_document);
+
+var _mejs = _dereq_(7);
+
+var _mejs2 = _interopRequireDefault(_mejs);
+
+var _renderer = _dereq_(8);
+
+var _general = _dereq_(18);
+
+var _constants = _dereq_(16);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var HtmlMediaElement = {
+	name: 'html5',
+	options: {
+		prefix: 'html5'
+	},
+
+	canPlayType: function canPlayType(type) {
+
+		var mediaElement = _document2.default.createElement('video');
+
+		if (_constants.IS_ANDROID && /\/mp(3|4)$/i.test(type) || ~['application/x-mpegurl', 'vnd.apple.mpegurl', 'audio/mpegurl', 'audio/hls', 'video/hls'].indexOf(type.toLowerCase()) && _constants.SUPPORTS_NATIVE_HLS) {
+			return 'yes';
+		} else if (mediaElement.canPlayType) {
+			return mediaElement.canPlayType(type.toLowerCase()).replace(/no/, '');
+		} else {
+			return '';
+		}
+	},
+
+	create: function create(mediaElement, options, mediaFiles) {
+
+		var id = mediaElement.id + '_' + options.prefix;
+
+		var node = null;
+
+		if (mediaElement.originalNode === undefined || mediaElement.originalNode === null) {
+			node = _document2.default.createElement('audio');
+			mediaElement.appendChild(node);
+		} else {
+			node = mediaElement.originalNode;
+		}
+
+		node.setAttribute('id', id);
+
+		var props = _mejs2.default.html5media.properties,
+		    assignGettersSetters = function assignGettersSetters(propName) {
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+			node['get' + capName] = function () {
+				return node[propName];
+			};
+
+			node['set' + capName] = function (value) {
+				if (_mejs2.default.html5media.readOnlyProperties.indexOf(propName) === -1) {
+					node[propName] = value;
+				}
+			};
+		};
+
+		for (var i = 0, total = props.length; i < total; i++) {
+			assignGettersSetters(props[i]);
+		}
+
+		var events = _mejs2.default.html5media.events.concat(['click', 'mouseover', 'mouseout']),
+		    assignEvents = function assignEvents(eventName) {
+			node.addEventListener(eventName, function (e) {
+				var event = (0, _general.createEvent)(e.type, mediaElement);
+				mediaElement.dispatchEvent(event);
+			});
+		};
+
+		for (var _i = 0, _total = events.length; _i < _total; _i++) {
+			assignEvents(events[_i]);
+		}
+
+		node.setSize = function (width, height) {
+			node.style.width = width + 'px';
+			node.style.height = height + 'px';
+			return node;
+		};
+
+		node.hide = function () {
+			node.style.display = 'none';
+
+			return node;
+		};
+
+		node.show = function () {
+			node.style.display = '';
+
+			return node;
+		};
+
+		if (mediaFiles && mediaFiles.length > 0) {
+			for (var _i2 = 0, _total2 = mediaFiles.length; _i2 < _total2; _i2++) {
+				if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i2].type)) {
+					node.setAttribute('src', mediaFiles[_i2].src);
+					break;
+				}
+			}
+		}
+
+		var event = (0, _general.createEvent)('rendererready', node);
+		mediaElement.dispatchEvent(event);
+
+		return node;
+	}
+};
+
+_window2.default.HtmlMediaElement = _mejs2.default.HtmlMediaElement = HtmlMediaElement;
+
+_renderer.renderer.add(HtmlMediaElement);
+
+},{"16":16,"18":18,"2":2,"3":3,"7":7,"8":8}],15:[function(_dereq_,module,exports){
+'use strict';
+
+var _window = _dereq_(3);
+
+var _window2 = _interopRequireDefault(_window);
+
+var _document = _dereq_(2);
+
+var _document2 = _interopRequireDefault(_document);
+
+var _mejs = _dereq_(7);
+
+var _mejs2 = _interopRequireDefault(_mejs);
+
+var _renderer = _dereq_(8);
+
+var _general = _dereq_(18);
+
+var _media = _dereq_(19);
+
+var _dom = _dereq_(17);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var YouTubeApi = {
+	isIframeStarted: false,
+
+	isIframeLoaded: false,
+
+	iframeQueue: [],
+
+	enqueueIframe: function enqueueIframe(settings) {
+		YouTubeApi.isLoaded = typeof YT !== 'undefined' && YT.loaded;
+
+		if (YouTubeApi.isLoaded) {
+			YouTubeApi.createIframe(settings);
+		} else {
+			YouTubeApi.loadIframeApi();
+			YouTubeApi.iframeQueue.push(settings);
+		}
+	},
+
+	loadIframeApi: function loadIframeApi() {
+		if (!YouTubeApi.isIframeStarted) {
+			(0, _dom.loadScript)('https://www.youtube.com/player_api');
+			YouTubeApi.isIframeStarted = true;
+		}
+	},
+
+	iFrameReady: function iFrameReady() {
+
+		YouTubeApi.isLoaded = true;
+		YouTubeApi.isIframeLoaded = true;
+
+		while (YouTubeApi.iframeQueue.length > 0) {
+			var settings = YouTubeApi.iframeQueue.pop();
+			YouTubeApi.createIframe(settings);
+		}
+	},
+
+	createIframe: function createIframe(settings) {
+		return new YT.Player(settings.containerId, settings);
+	},
+
+	getYouTubeId: function getYouTubeId(url) {
+
+		var youTubeId = '';
+
+		if (url.indexOf('?') > 0) {
+			youTubeId = YouTubeApi.getYouTubeIdFromParam(url);
+
+			if (youTubeId === '') {
+				youTubeId = YouTubeApi.getYouTubeIdFromUrl(url);
+			}
+		} else {
+			youTubeId = YouTubeApi.getYouTubeIdFromUrl(url);
+		}
+
+		var id = youTubeId.substring(youTubeId.lastIndexOf('/') + 1);
+		youTubeId = id.split('?');
+		return youTubeId[0];
+	},
+
+	getYouTubeIdFromParam: function getYouTubeIdFromParam(url) {
+
+		if (url === undefined || url === null || !url.trim().length) {
+			return null;
+		}
+
+		var parts = url.split('?'),
+		    parameters = parts[1].split('&');
+
+		var youTubeId = '';
+
+		for (var i = 0, total = parameters.length; i < total; i++) {
+			var paramParts = parameters[i].split('=');
+			if (paramParts[0] === 'v') {
+				youTubeId = paramParts[1];
+				break;
+			}
+		}
+
+		return youTubeId;
+	},
+
+	getYouTubeIdFromUrl: function getYouTubeIdFromUrl(url) {
+
+		if (url === undefined || url === null || !url.trim().length) {
+			return null;
+		}
+
+		var parts = url.split('?');
+		url = parts[0];
+		return url.substring(url.lastIndexOf('/') + 1);
+	},
+
+	getYouTubeNoCookieUrl: function getYouTubeNoCookieUrl(url) {
+		if (url === undefined || url === null || !url.trim().length || url.indexOf('//www.youtube') === -1) {
+			return url;
+		}
+
+		var parts = url.split('/');
+		parts[2] = parts[2].replace('.com', '-nocookie.com');
+		return parts.join('/');
+	}
+};
+
+var YouTubeIframeRenderer = {
+	name: 'youtube_iframe',
+
+	options: {
+		prefix: 'youtube_iframe',
+
+		youtube: {
+			autoplay: 0,
+			controls: 0,
+			disablekb: 1,
+			end: 0,
+			loop: 0,
+			modestbranding: 0,
+			playsinline: 0,
+			rel: 0,
+			showinfo: 0,
+			start: 0,
+			iv_load_policy: 3,
+
+			nocookie: false,
+
+			imageQuality: null
+		}
+	},
+
+	canPlayType: function canPlayType(type) {
+		return ~['video/youtube', 'video/x-youtube'].indexOf(type.toLowerCase());
+	},
+
+	create: function create(mediaElement, options, mediaFiles) {
+
+		var youtube = {},
+		    apiStack = [],
+		    readyState = 4;
+
+		var youTubeApi = null,
+		    paused = true,
+		    ended = false,
+		    youTubeIframe = null,
+		    volume = 1;
+
+		youtube.options = options;
+		youtube.id = mediaElement.id + '_' + options.prefix;
+		youtube.mediaElement = mediaElement;
+
+		var props = _mejs2.default.html5media.properties,
+		    assignGettersSetters = function assignGettersSetters(propName) {
+
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+			youtube['get' + capName] = function () {
+				if (youTubeApi !== null) {
+					var value = null;
+
+					switch (propName) {
+						case 'currentTime':
+							return youTubeApi.getCurrentTime();
+						case 'duration':
+							return youTubeApi.getDuration();
+						case 'volume':
+							volume = youTubeApi.getVolume() / 100;
+							return volume;
+						case 'paused':
+							return paused;
+						case 'ended':
+							return ended;
+						case 'muted':
+							return youTubeApi.isMuted();
+						case 'buffered':
+							var percentLoaded = youTubeApi.getVideoLoadedFraction(),
+							    duration = youTubeApi.getDuration();
+							return {
+								start: function start() {
+									return 0;
+								},
+								end: function end() {
+									return percentLoaded * duration;
+								},
+								length: 1
+							};
+						case 'src':
+							return youTubeApi.getVideoUrl();
+						case 'readyState':
+							return readyState;
+					}
+
+					return value;
+				} else {
+					return null;
+				}
+			};
+
+			youtube['set' + capName] = function (value) {
+				if (youTubeApi !== null) {
+					switch (propName) {
+						case 'src':
+							var url = typeof value === 'string' ? value : value[0].src,
+							    _videoId = YouTubeApi.getYouTubeId(url);
+
+							if (mediaElement.originalNode.autoplay) {
+								youTubeApi.loadVideoById(_videoId);
+							} else {
+								youTubeApi.cueVideoById(_videoId);
+							}
+							break;
+						case 'currentTime':
+							youTubeApi.seekTo(value);
+							break;
+						case 'muted':
+							if (value) {
+								youTubeApi.mute();
+							} else {
+								youTubeApi.unMute();
+							}
+							setTimeout(function () {
+								var event = (0, _general.createEvent)('volumechange', youtube);
+								mediaElement.dispatchEvent(event);
+							}, 50);
+							break;
+						case 'volume':
+							volume = value;
+							youTubeApi.setVolume(value * 100);
+							setTimeout(function () {
+								var event = (0, _general.createEvent)('volumechange', youtube);
+								mediaElement.dispatchEvent(event);
+							}, 50);
+							break;
+						case 'readyState':
+							var event = (0, _general.createEvent)('canplay', youtube);
+							mediaElement.dispatchEvent(event);
+							break;
+						default:
+							
+							break;
+					}
+				} else {
+					apiStack.push({ type: 'set', propName: propName, value: value });
+				}
+			};
+		};
+
+		for (var i = 0, total = props.length; i < total; i++) {
+			assignGettersSetters(props[i]);
+		}
+
+		var methods = _mejs2.default.html5media.methods,
+		    assignMethods = function assignMethods(methodName) {
+			youtube[methodName] = function () {
+				if (youTubeApi !== null) {
+					switch (methodName) {
+						case 'play':
+							paused = false;
+							return youTubeApi.playVideo();
+						case 'pause':
+							paused = true;
+							return youTubeApi.pauseVideo();
+						case 'load':
+							return null;
+					}
+				} else {
+					apiStack.push({ type: 'call', methodName: methodName });
+				}
+			};
+		};
+
+		for (var _i = 0, _total = methods.length; _i < _total; _i++) {
+			assignMethods(methods[_i]);
+		}
+
+		var youtubeContainer = _document2.default.createElement('div');
+		youtubeContainer.id = youtube.id;
+
+		if (youtube.options.youtube.nocookie) {
+			mediaElement.originalNode.src = YouTubeApi.getYouTubeNoCookieUrl(mediaFiles[0].src);
+		}
+
+		mediaElement.originalNode.parentNode.insertBefore(youtubeContainer, mediaElement.originalNode);
+		mediaElement.originalNode.style.display = 'none';
+
+		var isAudio = mediaElement.originalNode.tagName.toLowerCase() === 'audio',
+		    height = isAudio ? '1' : mediaElement.originalNode.height,
+		    width = isAudio ? '1' : mediaElement.originalNode.width,
+		    videoId = YouTubeApi.getYouTubeId(mediaFiles[0].src),
+		    youtubeSettings = {
+			id: youtube.id,
+			containerId: youtubeContainer.id,
+			videoId: videoId,
+			height: height,
+			width: width,
+			playerVars: Object.assign({
+				controls: 0,
+				rel: 0,
+				disablekb: 1,
+				showinfo: 0,
+				modestbranding: 0,
+				html5: 1,
+				playsinline: 0,
+				start: 0,
+				end: 0,
+				iv_load_policy: 3
+			}, youtube.options.youtube),
+			origin: _window2.default.location.host,
+			events: {
+				onReady: function onReady(e) {
+					mediaElement.youTubeApi = youTubeApi = e.target;
+					mediaElement.youTubeState = {
+						paused: true,
+						ended: false
+					};
+
+					if (apiStack.length) {
+						for (var _i2 = 0, _total2 = apiStack.length; _i2 < _total2; _i2++) {
+
+							var stackItem = apiStack[_i2];
+
+							if (stackItem.type === 'set') {
+								var propName = stackItem.propName,
+								    capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+								youtube['set' + capName](stackItem.value);
+							} else if (stackItem.type === 'call') {
+								youtube[stackItem.methodName]();
+							}
+						}
+					}
+
+					youTubeIframe = youTubeApi.getIframe();
+
+					if (mediaElement.originalNode.getAttribute('muted')) {
+						youTubeApi.mute();
+					}
+
+					var events = ['mouseover', 'mouseout'],
+					    assignEvents = function assignEvents(e) {
+						var newEvent = (0, _general.createEvent)(e.type, youtube);
+						mediaElement.dispatchEvent(newEvent);
+					};
+
+					for (var _i3 = 0, _total3 = events.length; _i3 < _total3; _i3++) {
+						youTubeIframe.addEventListener(events[_i3], assignEvents, false);
+					}
+
+					var initEvents = ['rendererready', 'loadedmetadata', 'loadeddata', 'canplay'];
+
+					for (var _i4 = 0, _total4 = initEvents.length; _i4 < _total4; _i4++) {
+						var event = (0, _general.createEvent)(initEvents[_i4], youtube);
+						mediaElement.dispatchEvent(event);
+					}
+				},
+				onStateChange: function onStateChange(e) {
+					var events = [];
+
+					switch (e.data) {
+						case -1:
+							events = ['loadedmetadata'];
+							paused = true;
+							ended = false;
+							break;
+						case 0:
+							events = ['ended'];
+							paused = false;
+							ended = !youtube.options.youtube.loop;
+							if (!youtube.options.youtube.loop) {
+								youtube.stopInterval();
+							}
+							break;
+						case 1:
+							events = ['play', 'playing'];
+							paused = false;
+							ended = false;
+							youtube.startInterval();
+							break;
+						case 2:
+							events = ['pause'];
+							paused = true;
+							ended = false;
+							youtube.stopInterval();
+							break;
+						case 3:
+							events = ['progress'];
+							ended = false;
+							break;
+						case 5:
+							events = ['loadeddata', 'loadedmetadata', 'canplay'];
+							paused = true;
+							ended = false;
+							break;
+					}
+
+					for (var _i5 = 0, _total5 = events.length; _i5 < _total5; _i5++) {
+						var event = (0, _general.createEvent)(events[_i5], youtube);
+						mediaElement.dispatchEvent(event);
+					}
+				},
+				onError: function onError(e) {
+					var event = (0, _general.createEvent)('error', youtube);
+					event.data = e.data;
+					mediaElement.dispatchEvent(event);
+				}
+			}
+		};
+
+		if (isAudio) {
+			youtubeSettings.playerVars.playsinline = 1;
+		}
+
+		if (mediaElement.originalNode.autoplay) {
+			youtubeSettings.playerVars.autoplay = 1;
+		}
+
+		if (mediaElement.originalNode.loop) {
+			youtubeSettings.playerVars.loop = 1;
+		}
+
+		YouTubeApi.enqueueIframe(youtubeSettings);
+
+		youtube.onEvent = function (eventName, player, _youTubeState) {
+			if (_youTubeState !== null && _youTubeState !== undefined) {
+				mediaElement.youTubeState = _youTubeState;
+			}
+		};
+
+		youtube.setSize = function (width, height) {
+			if (youTubeApi !== null) {
+				youTubeApi.setSize(width, height);
+			}
+		};
+		youtube.hide = function () {
+			youtube.stopInterval();
+			youtube.pause();
+			if (youTubeIframe) {
+				youTubeIframe.style.display = 'none';
+			}
+		};
+		youtube.show = function () {
+			if (youTubeIframe) {
+				youTubeIframe.style.display = '';
+			}
+		};
+		youtube.destroy = function () {
+			youTubeApi.destroy();
+		};
+		youtube.interval = null;
+
+		youtube.startInterval = function () {
+			youtube.interval = setInterval(function () {
+				var event = (0, _general.createEvent)('timeupdate', youtube);
+				mediaElement.dispatchEvent(event);
+			}, 250);
+		};
+		youtube.stopInterval = function () {
+			if (youtube.interval) {
+				clearInterval(youtube.interval);
+			}
+		};
+		youtube.getPosterUrl = function () {
+			var quality = options.youtube.imageQuality,
+			    resolutions = ['default', 'hqdefault', 'mqdefault', 'sddefault', 'maxresdefault'],
+			    id = YouTubeApi.getYouTubeId(mediaElement.originalNode.src);
+			return quality && resolutions.indexOf(quality) > -1 && id ? 'https://img.youtube.com/vi/' + id + '/' + quality + '.jpg' : '';
+		};
+
+		return youtube;
+	}
+};
+
+_window2.default.onYouTubePlayerAPIReady = function () {
+	YouTubeApi.iFrameReady();
+};
+
+_media.typeChecks.push(function (url) {
+	return (/\/\/(www\.youtube|youtu\.?be)/i.test(url) ? 'video/x-youtube' : null
+	);
+});
+
+_renderer.renderer.add(YouTubeIframeRenderer);
+
+},{"17":17,"18":18,"19":19,"2":2,"3":3,"7":7,"8":8}],16:[function(_dereq_,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
+exports.cancelFullScreen = exports.requestFullScreen = exports.isFullScreen = exports.FULLSCREEN_EVENT_NAME = exports.HAS_NATIVE_FULLSCREEN_ENABLED = exports.HAS_TRUE_NATIVE_FULLSCREEN = exports.HAS_IOS_FULLSCREEN = exports.HAS_MS_NATIVE_FULLSCREEN = exports.HAS_MOZ_NATIVE_FULLSCREEN = exports.HAS_WEBKIT_NATIVE_FULLSCREEN = exports.HAS_NATIVE_FULLSCREEN = exports.SUPPORTS_NATIVE_HLS = exports.SUPPORT_POINTER_EVENTS = exports.HAS_MSE = exports.IS_STOCK_ANDROID = exports.IS_SAFARI = exports.IS_FIREFOX = exports.IS_CHROME = exports.IS_EDGE = exports.IS_IE = exports.IS_ANDROID = exports.IS_IOS = exports.IS_IPOD = exports.IS_IPHONE = exports.IS_IPAD = exports.UA = exports.NAV = undefined;
+
+var _window = _dereq_(3);
+
+var _window2 = _interopRequireDefault(_window);
+
+var _document = _dereq_(2);
+
+var _document2 = _interopRequireDefault(_document);
+
+var _mejs = _dereq_(7);
+
+var _mejs2 = _interopRequireDefault(_mejs);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var NAV = exports.NAV = _window2.default.navigator;
+var UA = exports.UA = NAV.userAgent.toLowerCase();
+var IS_IPAD = exports.IS_IPAD = /ipad/i.test(UA) && !_window2.default.MSStream;
+var IS_IPHONE = exports.IS_IPHONE = /iphone/i.test(UA) && !_window2.default.MSStream;
+var IS_IPOD = exports.IS_IPOD = /ipod/i.test(UA) && !_window2.default.MSStream;
+var IS_IOS = exports.IS_IOS = /ipad|iphone|ipod/i.test(UA) && !_window2.default.MSStream;
+var IS_ANDROID = exports.IS_ANDROID = /android/i.test(UA);
+var IS_IE = exports.IS_IE = /(trident|microsoft)/i.test(NAV.appName);
+var IS_EDGE = exports.IS_EDGE = 'msLaunchUri' in NAV && !('documentMode' in _document2.default);
+var IS_CHROME = exports.IS_CHROME = /chrome/i.test(UA);
+var IS_FIREFOX = exports.IS_FIREFOX = /firefox/i.test(UA);
+var IS_SAFARI = exports.IS_SAFARI = /safari/i.test(UA) && !IS_CHROME;
+var IS_STOCK_ANDROID = exports.IS_STOCK_ANDROID = /^mozilla\/\d+\.\d+\s\(linux;\su;/i.test(UA);
+var HAS_MSE = exports.HAS_MSE = 'MediaSource' in _window2.default;
+var SUPPORT_POINTER_EVENTS = exports.SUPPORT_POINTER_EVENTS = function () {
+	var element = _document2.default.createElement('x'),
+	    documentElement = _document2.default.documentElement,
+	    getComputedStyle = _window2.default.getComputedStyle;
+
+	if (!('pointerEvents' in element.style)) {
+		return false;
+	}
+
+	element.style.pointerEvents = 'auto';
+	element.style.pointerEvents = 'x';
+	documentElement.appendChild(element);
+	var supports = getComputedStyle && getComputedStyle(element, '').pointerEvents === 'auto';
+	element.remove();
+	return !!supports;
+}();
+
+var html5Elements = ['source', 'track', 'audio', 'video'];
+var video = void 0;
+
+for (var i = 0, total = html5Elements.length; i < total; i++) {
+	video = _document2.default.createElement(html5Elements[i]);
+}
+
+var SUPPORTS_NATIVE_HLS = exports.SUPPORTS_NATIVE_HLS = IS_SAFARI || IS_ANDROID && (IS_CHROME || IS_STOCK_ANDROID) || IS_IE && /edge/i.test(UA);
+
+var hasiOSFullScreen = video.webkitEnterFullscreen !== undefined;
+
+var hasNativeFullscreen = video.requestFullscreen !== undefined;
+
+if (hasiOSFullScreen && /mac os x 10_5/i.test(UA)) {
+	hasNativeFullscreen = false;
+	hasiOSFullScreen = false;
+}
+
+var hasWebkitNativeFullScreen = video.webkitRequestFullScreen !== undefined;
+var hasMozNativeFullScreen = video.mozRequestFullScreen !== undefined;
+var hasMsNativeFullScreen = video.msRequestFullscreen !== undefined;
+var hasTrueNativeFullScreen = hasWebkitNativeFullScreen || hasMozNativeFullScreen || hasMsNativeFullScreen;
+var nativeFullScreenEnabled = hasTrueNativeFullScreen;
+var fullScreenEventName = '';
+var isFullScreen = void 0,
+    requestFullScreen = void 0,
+    cancelFullScreen = void 0;
+
+if (hasMozNativeFullScreen) {
+	nativeFullScreenEnabled = _document2.default.mozFullScreenEnabled;
+} else if (hasMsNativeFullScreen) {
+	nativeFullScreenEnabled = _document2.default.msFullscreenEnabled;
+}
+
+if (IS_CHROME) {
+	hasiOSFullScreen = false;
+}
+
+if (hasTrueNativeFullScreen) {
+	if (hasWebkitNativeFullScreen) {
+		fullScreenEventName = 'webkitfullscreenchange';
+	} else if (hasMozNativeFullScreen) {
+		fullScreenEventName = 'mozfullscreenchange';
+	} else if (hasMsNativeFullScreen) {
+		fullScreenEventName = 'MSFullscreenChange';
+	}
+
+	exports.isFullScreen = isFullScreen = function isFullScreen() {
+		if (hasMozNativeFullScreen) {
+			return _document2.default.mozFullScreen;
+		} else if (hasWebkitNativeFullScreen) {
+			return _document2.default.webkitIsFullScreen;
+		} else if (hasMsNativeFullScreen) {
+			return _document2.default.msFullscreenElement !== null;
+		}
+	};
+
+	exports.requestFullScreen = requestFullScreen = function requestFullScreen(el) {
+		if (hasWebkitNativeFullScreen) {
+			el.webkitRequestFullScreen();
+		} else if (hasMozNativeFullScreen) {
+			el.mozRequestFullScreen();
+		} else if (hasMsNativeFullScreen) {
+			el.msRequestFullscreen();
+		}
+	};
+
+	exports.cancelFullScreen = cancelFullScreen = function cancelFullScreen() {
+		if (hasWebkitNativeFullScreen) {
+			_document2.default.webkitCancelFullScreen();
+		} else if (hasMozNativeFullScreen) {
+			_document2.default.mozCancelFullScreen();
+		} else if (hasMsNativeFullScreen) {
+			_document2.default.msExitFullscreen();
+		}
+	};
+}
+
+var HAS_NATIVE_FULLSCREEN = exports.HAS_NATIVE_FULLSCREEN = hasNativeFullscreen;
+var HAS_WEBKIT_NATIVE_FULLSCREEN = exports.HAS_WEBKIT_NATIVE_FULLSCREEN = hasWebkitNativeFullScreen;
+var HAS_MOZ_NATIVE_FULLSCREEN = exports.HAS_MOZ_NATIVE_FULLSCREEN = hasMozNativeFullScreen;
+var HAS_MS_NATIVE_FULLSCREEN = exports.HAS_MS_NATIVE_FULLSCREEN = hasMsNativeFullScreen;
+var HAS_IOS_FULLSCREEN = exports.HAS_IOS_FULLSCREEN = hasiOSFullScreen;
+var HAS_TRUE_NATIVE_FULLSCREEN = exports.HAS_TRUE_NATIVE_FULLSCREEN = hasTrueNativeFullScreen;
+var HAS_NATIVE_FULLSCREEN_ENABLED = exports.HAS_NATIVE_FULLSCREEN_ENABLED = nativeFullScreenEnabled;
+var FULLSCREEN_EVENT_NAME = exports.FULLSCREEN_EVENT_NAME = fullScreenEventName;
+exports.isFullScreen = isFullScreen;
+exports.requestFullScreen = requestFullScreen;
+exports.cancelFullScreen = cancelFullScreen;
+
+
+_mejs2.default.Features = _mejs2.default.Features || {};
+_mejs2.default.Features.isiPad = IS_IPAD;
+_mejs2.default.Features.isiPod = IS_IPOD;
+_mejs2.default.Features.isiPhone = IS_IPHONE;
+_mejs2.default.Features.isiOS = _mejs2.default.Features.isiPhone || _mejs2.default.Features.isiPad;
+_mejs2.default.Features.isAndroid = IS_ANDROID;
+_mejs2.default.Features.isIE = IS_IE;
+_mejs2.default.Features.isEdge = IS_EDGE;
+_mejs2.default.Features.isChrome = IS_CHROME;
+_mejs2.default.Features.isFirefox = IS_FIREFOX;
+_mejs2.default.Features.isSafari = IS_SAFARI;
+_mejs2.default.Features.isStockAndroid = IS_STOCK_ANDROID;
+_mejs2.default.Features.hasMSE = HAS_MSE;
+_mejs2.default.Features.supportsNativeHLS = SUPPORTS_NATIVE_HLS;
+_mejs2.default.Features.supportsPointerEvents = SUPPORT_POINTER_EVENTS;
+_mejs2.default.Features.hasiOSFullScreen = HAS_IOS_FULLSCREEN;
+_mejs2.default.Features.hasNativeFullscreen = HAS_NATIVE_FULLSCREEN;
+_mejs2.default.Features.hasWebkitNativeFullScreen = HAS_WEBKIT_NATIVE_FULLSCREEN;
+_mejs2.default.Features.hasMozNativeFullScreen = HAS_MOZ_NATIVE_FULLSCREEN;
+_mejs2.default.Features.hasMsNativeFullScreen = HAS_MS_NATIVE_FULLSCREEN;
+_mejs2.default.Features.hasTrueNativeFullScreen = HAS_TRUE_NATIVE_FULLSCREEN;
+_mejs2.default.Features.nativeFullScreenEnabled = HAS_NATIVE_FULLSCREEN_ENABLED;
+_mejs2.default.Features.fullScreenEventName = FULLSCREEN_EVENT_NAME;
+_mejs2.default.Features.isFullScreen = isFullScreen;
+_mejs2.default.Features.requestFullScreen = requestFullScreen;
+_mejs2.default.Features.cancelFullScreen = cancelFullScreen;
+
+},{"2":2,"3":3,"7":7}],17:[function(_dereq_,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
+exports.removeClass = exports.addClass = exports.hasClass = undefined;
+exports.loadScript = loadScript;
+exports.offset = offset;
+exports.toggleClass = toggleClass;
+exports.fadeOut = fadeOut;
+exports.fadeIn = fadeIn;
+exports.siblings = siblings;
+exports.visible = visible;
+exports.ajax = ajax;
+
+var _window = _dereq_(3);
+
+var _window2 = _interopRequireDefault(_window);
+
+var _document = _dereq_(2);
+
+var _document2 = _interopRequireDefault(_document);
+
+var _mejs = _dereq_(7);
+
+var _mejs2 = _interopRequireDefault(_mejs);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function loadScript(url) {
+	return new Promise(function (resolve, reject) {
+		var script = _document2.default.createElement('script');
+		script.src = url;
+		script.async = true;
+		script.onload = function () {
+			script.remove();
+			resolve();
+		};
+		script.onerror = function () {
+			script.remove();
+			reject();
+		};
+		_document2.default.head.appendChild(script);
+	});
+}
+
+function offset(el) {
+	var rect = el.getBoundingClientRect(),
+	    scrollLeft = _window2.default.pageXOffset || _document2.default.documentElement.scrollLeft,
+	    scrollTop = _window2.default.pageYOffset || _document2.default.documentElement.scrollTop;
+	return { top: rect.top + scrollTop, left: rect.left + scrollLeft };
+}
+
+var hasClassMethod = void 0,
+    addClassMethod = void 0,
+    removeClassMethod = void 0;
+
+if ('classList' in _document2.default.documentElement) {
+	hasClassMethod = function hasClassMethod(el, className) {
+		return el.classList !== undefined && el.classList.contains(className);
+	};
+	addClassMethod = function addClassMethod(el, className) {
+		return el.classList.add(className);
+	};
+	removeClassMethod = function removeClassMethod(el, className) {
+		return el.classList.remove(className);
+	};
+} else {
+	hasClassMethod = function hasClassMethod(el, className) {
+		return new RegExp('\\b' + className + '\\b').test(el.className);
+	};
+	addClassMethod = function addClassMethod(el, className) {
+		if (!hasClass(el, className)) {
+			el.className += ' ' + className;
+		}
+	};
+	removeClassMethod = function removeClassMethod(el, className) {
+		el.className = el.className.replace(new RegExp('\\b' + className + '\\b', 'g'), '');
+	};
+}
+
+var hasClass = exports.hasClass = hasClassMethod;
+var addClass = exports.addClass = addClassMethod;
+var removeClass = exports.removeClass = removeClassMethod;
+
+function toggleClass(el, className) {
+	hasClass(el, className) ? removeClass(el, className) : addClass(el, className);
+}
+
+function fadeOut(el) {
+	var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 400;
+	var callback = arguments[2];
+
+	if (!el.style.opacity) {
+		el.style.opacity = 1;
+	}
+
+	var start = null;
+	_window2.default.requestAnimationFrame(function animate(timestamp) {
+		start = start || timestamp;
+		var progress = timestamp - start;
+		var opacity = parseFloat(1 - progress / duration, 2);
+		el.style.opacity = opacity < 0 ? 0 : opacity;
+		if (progress > duration) {
+			if (callback && typeof callback === 'function') {
+				callback();
+			}
+		} else {
+			_window2.default.requestAnimationFrame(animate);
+		}
+	});
+}
+
+function fadeIn(el) {
+	var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 400;
+	var callback = arguments[2];
+
+	if (!el.style.opacity) {
+		el.style.opacity = 0;
+	}
+
+	var start = null;
+	_window2.default.requestAnimationFrame(function animate(timestamp) {
+		start = start || timestamp;
+		var progress = timestamp - start;
+		var opacity = parseFloat(progress / duration, 2);
+		el.style.opacity = opacity > 1 ? 1 : opacity;
+		if (progress > duration) {
+			if (callback && typeof callback === 'function') {
+				callback();
+			}
+		} else {
+			_window2.default.requestAnimationFrame(animate);
+		}
+	});
+}
+
+function siblings(el, filter) {
+	var siblings = [];
+	el = el.parentNode.firstChild;
+	do {
+		if (!filter || filter(el)) {
+			siblings.push(el);
+		}
+	} while (el = el.nextSibling);
+	return siblings;
+}
+
+function visible(elem) {
+	return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);
+}
+
+function ajax(url, dataType, success, error) {
+	var xhr = _window2.default.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
+
+	var type = 'application/x-www-form-urlencoded; charset=UTF-8',
+	    completed = false,
+	    accept = '*/'.concat('*');
+
+	switch (dataType) {
+		case 'text':
+			type = 'text/plain';
+			break;
+		case 'json':
+			type = 'application/json, text/javascript';
+			break;
+		case 'html':
+			type = 'text/html';
+			break;
+		case 'xml':
+			type = 'application/xml, text/xml';
+			break;
+	}
+
+	if (type !== 'application/x-www-form-urlencoded') {
+		accept = type + ', */*; q=0.01';
+	}
+
+	if (xhr) {
+		xhr.open('GET', url, true);
+		xhr.setRequestHeader('Accept', accept);
+		xhr.onreadystatechange = function () {
+			if (completed) {
+				return;
+			}
+
+			if (xhr.readyState === 4) {
+				if (xhr.status === 200) {
+					completed = true;
+					var data = void 0;
+					switch (dataType) {
+						case 'json':
+							data = JSON.parse(xhr.responseText);
+							break;
+						case 'xml':
+							data = xhr.responseXML;
+							break;
+						default:
+							data = xhr.responseText;
+							break;
+					}
+					success(data);
+				} else if (typeof error === 'function') {
+					error(xhr.status);
+				}
+			}
+		};
+
+		xhr.send();
+	}
+}
+
+_mejs2.default.Utils = _mejs2.default.Utils || {};
+_mejs2.default.Utils.offset = offset;
+_mejs2.default.Utils.hasClass = hasClass;
+_mejs2.default.Utils.addClass = addClass;
+_mejs2.default.Utils.removeClass = removeClass;
+_mejs2.default.Utils.toggleClass = toggleClass;
+_mejs2.default.Utils.fadeIn = fadeIn;
+_mejs2.default.Utils.fadeOut = fadeOut;
+_mejs2.default.Utils.siblings = siblings;
+_mejs2.default.Utils.visible = visible;
+_mejs2.default.Utils.ajax = ajax;
+_mejs2.default.Utils.loadScript = loadScript;
+
+},{"2":2,"3":3,"7":7}],18:[function(_dereq_,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
+exports.escapeHTML = escapeHTML;
+exports.debounce = debounce;
+exports.isObjectEmpty = isObjectEmpty;
+exports.splitEvents = splitEvents;
+exports.createEvent = createEvent;
+exports.isNodeAfter = isNodeAfter;
+exports.isString = isString;
+
+var _mejs = _dereq_(7);
+
+var _mejs2 = _interopRequireDefault(_mejs);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function escapeHTML(input) {
+
+	if (typeof input !== 'string') {
+		throw new Error('Argument passed must be a string');
+	}
+
+	var map = {
+		'&': '&amp;',
+		'<': '&lt;',
+		'>': '&gt;',
+		'"': '&quot;'
+	};
+
+	return input.replace(/[&<>"]/g, function (c) {
+		return map[c];
+	});
+}
+
+function debounce(func, wait) {
+	var _this = this,
+	    _arguments = arguments;
+
+	var immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+
+	if (typeof func !== 'function') {
+		throw new Error('First argument must be a function');
+	}
+
+	if (typeof wait !== 'number') {
+		throw new Error('Second argument must be a numeric value');
+	}
+
+	var timeout = void 0;
+	return function () {
+		var context = _this,
+		    args = _arguments;
+		var later = function later() {
+			timeout = null;
+			if (!immediate) {
+				func.apply(context, args);
+			}
+		};
+		var callNow = immediate && !timeout;
+		clearTimeout(timeout);
+		timeout = setTimeout(later, wait);
+
+		if (callNow) {
+			func.apply(context, args);
+		}
+	};
+}
+
+function isObjectEmpty(instance) {
+	return Object.getOwnPropertyNames(instance).length <= 0;
+}
+
+function splitEvents(events, id) {
+	var rwindow = /^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/;
+
+	var ret = { d: [], w: [] };
+	(events || '').split(' ').forEach(function (v) {
+		var eventName = '' + v + (id ? '.' + id : '');
+
+		if (eventName.startsWith('.')) {
+			ret.d.push(eventName);
+			ret.w.push(eventName);
+		} else {
+			ret[rwindow.test(v) ? 'w' : 'd'].push(eventName);
+		}
+	});
+
+	ret.d = ret.d.join(' ');
+	ret.w = ret.w.join(' ');
+	return ret;
+}
+
+function createEvent(eventName, target) {
+
+	if (typeof eventName !== 'string') {
+		throw new Error('Event name must be a string');
+	}
+
+	var eventFrags = eventName.match(/([a-z]+\.([a-z]+))/i),
+	    detail = {
+		target: target
+	};
+
+	if (eventFrags !== null) {
+		eventName = eventFrags[1];
+		detail.namespace = eventFrags[2];
+	}
+
+	return new window.CustomEvent(eventName, {
+		detail: detail
+	});
+}
+
+function isNodeAfter(sourceNode, targetNode) {
+
+	return !!(sourceNode && targetNode && sourceNode.compareDocumentPosition(targetNode) & 2);
+}
+
+function isString(value) {
+	return typeof value === 'string';
+}
+
+_mejs2.default.Utils = _mejs2.default.Utils || {};
+_mejs2.default.Utils.escapeHTML = escapeHTML;
+_mejs2.default.Utils.debounce = debounce;
+_mejs2.default.Utils.isObjectEmpty = isObjectEmpty;
+_mejs2.default.Utils.splitEvents = splitEvents;
+_mejs2.default.Utils.createEvent = createEvent;
+_mejs2.default.Utils.isNodeAfter = isNodeAfter;
+_mejs2.default.Utils.isString = isString;
+
+},{"7":7}],19:[function(_dereq_,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+	value: true
+});
+exports.typeChecks = undefined;
+exports.absolutizeUrl = absolutizeUrl;
+exports.formatType = formatType;
+exports.getMimeFromType = getMimeFromType;
+exports.getTypeFromFile = getTypeFromFile;
+exports.getExtension = getExtension;
+exports.normalizeExtension = normalizeExtension;
+
+var _mejs = _dereq_(7);
+
+var _mejs2 = _interopRequireDefault(_mejs);
+
+var _general = _dereq_(18);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var typeChecks = exports.typeChecks = [];
+
+function absolutizeUrl(url) {
+
+	if (typeof url !== 'string') {
+		throw new Error('`url` argument must be a string');
+	}
+
+	var el = document.createElement('div');
+	el.innerHTML = '<a href="' + (0, _general.escapeHTML)(url) + '">x</a>';
+	return el.firstChild.href;
+}
+
+function formatType(url) {
+	var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+
+	return url && !type ? getTypeFromFile(url) : type;
+}
+
+function getMimeFromType(type) {
+
+	if (typeof type !== 'string') {
+		throw new Error('`type` argument must be a string');
+	}
+
+	return type && type.indexOf(';') > -1 ? type.substr(0, type.indexOf(';')) : type;
+}
+
+function getTypeFromFile(url) {
+
+	if (typeof url !== 'string') {
+		throw new Error('`url` argument must be a string');
+	}
+
+	for (var i = 0, total = typeChecks.length; i < total; i++) {
+		var type = typeChecks[i](url);
+
+		if (type) {
+			return type;
+		}
+	}
+
+	var ext = getExtension(url),
+	    normalizedExt = normalizeExtension(ext);
+
+	var mime = 'video/mp4';
+
+	if (normalizedExt) {
+		if (~['mp4', 'm4v', 'ogg', 'ogv', 'webm', 'flv', 'mpeg', 'mov'].indexOf(normalizedExt)) {
+			mime = 'video/' + normalizedExt;
+		} else if (~['mp3', 'oga', 'wav', 'mid', 'midi'].indexOf(normalizedExt)) {
+			mime = 'audio/' + normalizedExt;
+		}
+	}
+
+	return mime;
+}
+
+function getExtension(url) {
+
+	if (typeof url !== 'string') {
+		throw new Error('`url` argument must be a string');
+	}
+
+	var baseUrl = url.split('?')[0],
+	    baseName = baseUrl.split('\\').pop().split('/').pop();
+	return ~baseName.indexOf('.') ? baseName.substring(baseName.lastIndexOf('.') + 1) : '';
+}
+
+function normalizeExtension(extension) {
+
+	if (typeof extension !== 'string') {
+		throw new Error('`extension` argument must be a string');
+	}
+
+	switch (extension) {
+		case 'mp4':
+		case 'm4v':
+			return 'mp4';
+		case 'webm':
+		case 'webma':
+		case 'webmv':
+			return 'webm';
+		case 'ogg':
+		case 'oga':
+		case 'ogv':
+			return 'ogg';
+		default:
+			return extension;
+	}
+}
+
+_mejs2.default.Utils = _mejs2.default.Utils || {};
+_mejs2.default.Utils.typeChecks = typeChecks;
+_mejs2.default.Utils.absolutizeUrl = absolutizeUrl;
+_mejs2.default.Utils.formatType = formatType;
+_mejs2.default.Utils.getMimeFromType = getMimeFromType;
+_mejs2.default.Utils.getTypeFromFile = getTypeFromFile;
+_mejs2.default.Utils.getExtension = getExtension;
+_mejs2.default.Utils.normalizeExtension = normalizeExtension;
+
+},{"18":18,"7":7}],20:[function(_dereq_,module,exports){
+'use strict';
+
+var _document = _dereq_(2);
+
+var _document2 = _interopRequireDefault(_document);
+
+var _promisePolyfill = _dereq_(4);
+
+var _promisePolyfill2 = _interopRequireDefault(_promisePolyfill);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(function (arr) {
+	arr.forEach(function (item) {
+		if (item.hasOwnProperty('remove')) {
+			return;
+		}
+		Object.defineProperty(item, 'remove', {
+			configurable: true,
+			enumerable: true,
+			writable: true,
+			value: function remove() {
+				this.parentNode.removeChild(this);
+			}
+		});
+	});
+})([Element.prototype, CharacterData.prototype, DocumentType.prototype]);
+
+(function () {
+
+	if (typeof window.CustomEvent === 'function') {
+		return false;
+	}
+
+	function CustomEvent(event, params) {
+		params = params || { bubbles: false, cancelable: false, detail: undefined };
+		var evt = _document2.default.createEvent('CustomEvent');
+		evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
+		return evt;
+	}
+
+	CustomEvent.prototype = window.Event.prototype;
+	window.CustomEvent = CustomEvent;
+})();
+
+if (typeof Object.assign !== 'function') {
+	Object.assign = function (target) {
+
+		if (target === null || target === undefined) {
+			throw new TypeError('Cannot convert undefined or null to object');
+		}
+
+		var to = Object(target);
+
+		for (var index = 1, total = arguments.length; index < total; index++) {
+			var nextSource = arguments[index];
+
+			if (nextSource !== null) {
+				for (var nextKey in nextSource) {
+					if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
+						to[nextKey] = nextSource[nextKey];
+					}
+				}
+			}
+		}
+		return to;
+	};
+}
+
+if (!String.prototype.startsWith) {
+	String.prototype.startsWith = function (searchString, position) {
+		position = position || 0;
+		return this.substr(position, searchString.length) === searchString;
+	};
+}
+
+if (!Element.prototype.matches) {
+	Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) {
+		var matches = (this.document || this.ownerDocument).querySelectorAll(s),
+		    i = matches.length - 1;
+		while (--i >= 0 && matches.item(i) !== this) {}
+		return i > -1;
+	};
+}
+
+if (window.Element && !Element.prototype.closest) {
+	Element.prototype.closest = function (s) {
+		var matches = (this.document || this.ownerDocument).querySelectorAll(s),
+		    i = void 0,
+		    el = this;
+		do {
+			i = matches.length;
+			while (--i >= 0 && matches.item(i) !== el) {}
+		} while (i < 0 && (el = el.parentElement));
+		return el;
+	};
+}
+
+(function () {
+	var lastTime = 0;
+	var vendors = ['ms', 'moz', 'webkit', 'o'];
+	for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
+		window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
+		window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
+	}
+
+	if (!window.requestAnimationFrame) window.requestAnimationFrame = function (callback) {
+		var currTime = new Date().getTime();
+		var timeToCall = Math.max(0, 16 - (currTime - lastTime));
+		var id = window.setTimeout(function () {
+			callback(currTime + timeToCall);
+		}, timeToCall);
+		lastTime = currTime + timeToCall;
+		return id;
+	};
+
+	if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function (id) {
+		clearTimeout(id);
+	};
+})();
+
+if (/firefox/i.test(navigator.userAgent)) {
+	window.mediaElementJsOldGetComputedStyle = window.getComputedStyle;
+	window.getComputedStyle = function (el, pseudoEl) {
+		var t = window.mediaElementJsOldGetComputedStyle(el, pseudoEl);
+		return t === null ? { getPropertyValue: function getPropertyValue() {} } : t;
+	};
+}
+
+if (!window.Promise) {
+	window.Promise = _promisePolyfill2.default;
+}
+
+(function (constructor) {
+	if (constructor && constructor.prototype && constructor.prototype.children === null) {
+		Object.defineProperty(constructor.prototype, 'children', {
+			get: function get() {
+				var i = 0,
+				    node = void 0,
+				    nodes = this.childNodes,
+				    children = [];
+				while (node = nodes[i++]) {
+					if (node.nodeType === 1) {
+						children.push(node);
+					}
+				}
+				return children;
+			}
+		});
+	}
+})(window.Node || window.Element);
+
+},{"2":2,"4":4}]},{},[20,6,5,9,14,11,10,12,13,15]);

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 4 - 7
app/Resources/public/assets/mediaelement/build/mediaelement.min.js


+ 771 - 0
app/Resources/public/assets/mediaelement/build/mediaelementplayer-legacy.css

@@ -0,0 +1,771 @@
+/* Accessibility: hide screen reader texts (and prefer "top" for RTL languages).
+Reference: http://blog.rrwd.nl/2015/04/04/the-screen-reader-text-class-why-and-how/ */
+.mejs-offscreen {
+    border: 0;
+    clip: rect( 1px, 1px, 1px, 1px );
+    -webkit-clip-path: inset( 50% );
+            clip-path: inset( 50% );
+    height: 1px;
+    margin: -1px;
+    overflow: hidden;
+    padding: 0;
+    position: absolute;
+    width: 1px;
+    word-wrap: normal;
+}
+
+.mejs-container {
+    background: #000;
+    box-sizing: border-box;
+    font-family: 'Helvetica', Arial, serif;
+    position: relative;
+    text-align: left;
+    text-indent: 0;
+    vertical-align: top;
+}
+
+.mejs-container * {
+    box-sizing: border-box;
+}
+
+/* Hide native play button and control bar from iOS to favor plugin button */
+.mejs-container video::-webkit-media-controls,
+.mejs-container video::-webkit-media-controls-panel,
+.mejs-container video::-webkit-media-controls-panel-container,
+.mejs-container video::-webkit-media-controls-start-playback-button {
+    -webkit-appearance: none;
+    display: none !important;
+}
+
+.mejs-fill-container,
+.mejs-fill-container .mejs-container {
+    height: 100%;
+    width: 100%;
+}
+
+.mejs-fill-container {
+    background: transparent;
+    margin: 0 auto;
+    overflow: hidden;
+    position: relative;
+}
+
+.mejs-container:focus {
+    outline: none;
+}
+
+.mejs-iframe-overlay {
+    height: 100%;
+    position: absolute;
+    width: 100%;
+}
+
+.mejs-embed,
+.mejs-embed body {
+    background: #000;
+    height: 100%;
+    margin: 0;
+    overflow: hidden;
+    padding: 0;
+    width: 100%;
+}
+
+.mejs-fullscreen {
+    overflow: hidden !important;
+}
+
+.mejs-container-fullscreen {
+    bottom: 0;
+    left: 0;
+    overflow: hidden;
+    position: fixed;
+    right: 0;
+    top: 0;
+    z-index: 1000;
+}
+
+.mejs-container-fullscreen .mejs-mediaelement,
+.mejs-container-fullscreen video {
+    height: 100% !important;
+    width: 100% !important;
+}
+
+/* Start: LAYERS */
+.mejs-background {
+    left: 0;
+    position: absolute;
+    top: 0;
+}
+
+.mejs-mediaelement {
+    height: 100%;
+    left: 0;
+    position: absolute;
+    top: 0;
+    width: 100%;
+    z-index: 0;
+}
+
+.mejs-poster {
+    background-position: 50% 50%;
+    background-repeat: no-repeat;
+    background-size: cover;
+    left: 0;
+    position: absolute;
+    top: 0;
+    z-index: 1;
+}
+
+:root .mejs-poster-img {
+    display: none;
+}
+
+.mejs-poster-img {
+    border: 0;
+    padding: 0;
+}
+
+.mejs-overlay {
+    -webkit-box-align: center;
+    -webkit-align-items: center;
+        -ms-flex-align: center;
+            align-items: center;
+    display: -webkit-box;
+    display: -webkit-flex;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-pack: center;
+    -webkit-justify-content: center;
+        -ms-flex-pack: center;
+            justify-content: center;
+    left: 0;
+    position: absolute;
+    top: 0;
+}
+
+.mejs-layer {
+    z-index: 1;
+}
+
+.mejs-overlay-play {
+    cursor: pointer;
+}
+
+.mejs-overlay-button {
+    background: url('mejs-controls.svg') no-repeat;
+    background-position: 0 -39px;
+    height: 80px;
+    width: 80px;
+}
+
+.mejs-overlay:hover > .mejs-overlay-button {
+    background-position: -80px -39px;
+}
+
+.mejs-overlay-loading {
+    height: 80px;
+    width: 80px;
+}
+
+.mejs-overlay-loading-bg-img {
+    -webkit-animation: mejs-loading-spinner 1s linear infinite;
+            animation: mejs-loading-spinner 1s linear infinite;
+    background: transparent url('mejs-controls.svg') -160px -40px no-repeat;
+    display: block;
+    height: 80px;
+    width: 80px;
+    z-index: 1;
+}
+
+@-webkit-keyframes mejs-loading-spinner {
+    100% {
+        -webkit-transform: rotate(360deg);
+                transform: rotate(360deg);
+    }
+}
+
+@keyframes mejs-loading-spinner {
+    100% {
+        -webkit-transform: rotate(360deg);
+                transform: rotate(360deg);
+    }
+}
+
+/* End: LAYERS */
+
+/* Start: CONTROL BAR */
+.mejs-controls {
+    bottom: 0;
+    display: -webkit-box;
+    display: -webkit-flex;
+    display: -ms-flexbox;
+    display: flex;
+    height: 40px;
+    left: 0;
+    list-style-type: none;
+    margin: 0;
+    padding: 0 10px;
+    position: absolute;
+    width: 100%;
+    z-index: 3;
+}
+
+.mejs-controls:not([style*='display: none']) {
+    background: rgba(255, 0, 0, 0.7);
+    background: -webkit-linear-gradient(transparent, rgba(0, 0, 0, 0.35));
+    background: linear-gradient(transparent, rgba(0, 0, 0, 0.35));
+}
+
+.mejs-button,
+.mejs-time,
+.mejs-time-rail {
+    font-size: 10px;
+    height: 40px;
+    line-height: 10px;
+    margin: 0;
+    width: 32px;
+}
+
+.mejs-button > button {
+    background: transparent url('mejs-controls.svg');
+    border: 0;
+    cursor: pointer;
+    display: block;
+    font-size: 0;
+    height: 20px;
+    line-height: 0;
+    margin: 10px 6px;
+    overflow: hidden;
+    padding: 0;
+    position: absolute;
+    text-decoration: none;
+    width: 20px;
+}
+
+/* :focus for accessibility */
+.mejs-button > button:focus {
+    outline: dotted 1px #999;
+}
+
+.mejs-container-keyboard-inactive a,
+.mejs-container-keyboard-inactive a:focus,
+.mejs-container-keyboard-inactive button,
+.mejs-container-keyboard-inactive button:focus,
+.mejs-container-keyboard-inactive [role=slider],
+.mejs-container-keyboard-inactive [role=slider]:focus {
+    outline: 0;
+}
+
+/* End: CONTROL BAR */
+
+/* Start: Time (Current / Duration) */
+.mejs-time {
+    box-sizing: content-box;
+    color: #fff;
+    font-size: 11px;
+    font-weight: bold;
+    height: 24px;
+    overflow: hidden;
+    padding: 16px 6px 0;
+    text-align: center;
+    width: auto;
+}
+
+/* End: Time (Current / Duration) */
+
+/* Start: Play/Pause/Stop */
+.mejs-play > button {
+    background-position: 0 0;
+}
+
+.mejs-pause > button {
+    background-position: -20px 0;
+}
+
+.mejs-replay > button {
+    background-position: -160px 0;
+}
+
+/* End: Play/Pause/Stop */
+
+/* Start: Progress Bar */
+.mejs-time-rail {
+    direction: ltr;
+    -webkit-box-flex: 1;
+    -webkit-flex-grow: 1;
+        -ms-flex-positive: 1;
+            flex-grow: 1;
+    height: 40px;
+    margin: 0 10px;
+    padding-top: 10px;
+    position: relative;
+}
+
+.mejs-time-total,
+.mejs-time-buffering,
+.mejs-time-loaded,
+.mejs-time-current,
+.mejs-time-float,
+.mejs-time-hovered,
+.mejs-time-float-current,
+.mejs-time-float-corner,
+.mejs-time-marker {
+    border-radius: 2px;
+    cursor: pointer;
+    display: block;
+    height: 10px;
+    position: absolute;
+}
+
+.mejs-time-total {
+    background: rgba(255, 255, 255, 0.3);
+    margin: 5px 0 0;
+    width: 100%;
+}
+
+.mejs-time-buffering {
+    -webkit-animation: buffering-stripes 2s linear infinite;
+            animation: buffering-stripes 2s linear infinite;
+    background: -webkit-linear-gradient(135deg, rgba(255, 255, 255, 0.4) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.4) 50%, rgba(255, 255, 255, 0.4) 75%, transparent 75%, transparent);
+    background: linear-gradient(-45deg, rgba(255, 255, 255, 0.4) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.4) 50%, rgba(255, 255, 255, 0.4) 75%, transparent 75%, transparent);
+    background-size: 15px 15px;
+    width: 100%;
+}
+
+@-webkit-keyframes buffering-stripes {
+    from {
+        background-position: 0 0;
+    }
+    to {
+        background-position: 30px 0;
+    }
+}
+
+@keyframes buffering-stripes {
+    from {
+        background-position: 0 0;
+    }
+    to {
+        background-position: 30px 0;
+    }
+}
+
+.mejs-time-loaded {
+    background: rgba(255, 255, 255, 0.3);
+}
+
+.mejs-time-current,
+.mejs-time-handle-content {
+    background: rgba(255, 255, 255, 0.9);
+}
+
+.mejs-time-hovered {
+    background: rgba(255, 255, 255, 0.5);
+    z-index: 10;
+}
+
+.mejs-time-hovered.negative {
+    background: rgba(0, 0, 0, 0.2);
+}
+
+.mejs-time-current,
+.mejs-time-buffering,
+.mejs-time-loaded,
+.mejs-time-hovered {
+    left: 0;
+    -webkit-transform: scaleX(0);
+        -ms-transform: scaleX(0);
+            transform: scaleX(0);
+    -webkit-transform-origin: 0 0;
+        -ms-transform-origin: 0 0;
+            transform-origin: 0 0;
+    -webkit-transition: 0.15s ease-in all;
+    transition: 0.15s ease-in all;
+    width: 100%;
+}
+
+.mejs-time-buffering {
+    -webkit-transform: scaleX(1);
+        -ms-transform: scaleX(1);
+            transform: scaleX(1);
+}
+
+.mejs-time-hovered {
+    -webkit-transition: height 0.1s cubic-bezier(0.44, 0, 1, 1);
+    transition: height 0.1s cubic-bezier(0.44, 0, 1, 1);
+}
+
+.mejs-time-hovered.no-hover {
+    -webkit-transform: scaleX(0) !important;
+        -ms-transform: scaleX(0) !important;
+            transform: scaleX(0) !important;
+}
+
+.mejs-time-handle,
+.mejs-time-handle-content {
+    border: 4px solid transparent;
+    cursor: pointer;
+    left: 0;
+    position: absolute;
+    -webkit-transform: translateX(0);
+        -ms-transform: translateX(0);
+            transform: translateX(0);
+    z-index: 11;
+}
+
+.mejs-time-handle-content {
+    border: 4px solid rgba(255, 255, 255, 0.9);
+    border-radius: 50%;
+    height: 10px;
+    left: -7px;
+    top: -4px;
+    -webkit-transform: scale(0);
+        -ms-transform: scale(0);
+            transform: scale(0);
+    width: 10px;
+}
+
+.mejs-time-rail:hover .mejs-time-handle-content,
+.mejs-time-rail .mejs-time-handle-content:focus,
+.mejs-time-rail .mejs-time-handle-content:active {
+    -webkit-transform: scale(1);
+        -ms-transform: scale(1);
+            transform: scale(1);
+}
+
+.mejs-time-float {
+    background: #eee;
+    border: solid 1px #333;
+    bottom: 100%;
+    color: #111;
+    display: none;
+    height: 17px;
+    margin-bottom: 9px;
+    position: absolute;
+    text-align: center;
+    -webkit-transform: translateX(-50%);
+        -ms-transform: translateX(-50%);
+            transform: translateX(-50%);
+    width: 36px;
+}
+
+.mejs-time-float-current {
+    display: block;
+    left: 0;
+    margin: 2px;
+    text-align: center;
+    width: 30px;
+}
+
+.mejs-time-float-corner {
+    border: solid 5px #eee;
+    border-color: #eee transparent transparent;
+    border-radius: 0;
+    display: block;
+    height: 0;
+    left: 50%;
+    line-height: 0;
+    position: absolute;
+    top: 100%;
+    -webkit-transform: translateX(-50%);
+        -ms-transform: translateX(-50%);
+            transform: translateX(-50%);
+    width: 0;
+}
+
+.mejs-long-video .mejs-time-float {
+    margin-left: -23px;
+    width: 64px;
+}
+
+.mejs-long-video .mejs-time-float-current {
+    width: 60px;
+}
+
+.mejs-broadcast {
+    color: #fff;
+    height: 10px;
+    position: absolute;
+    top: 15px;
+    width: 100%;
+}
+
+/* End: Progress Bar */
+
+/* Start: Fullscreen */
+.mejs-fullscreen-button > button {
+    background-position: -80px 0;
+}
+
+.mejs-unfullscreen > button {
+    background-position: -100px 0;
+}
+
+/* End: Fullscreen */
+
+/* Start: Mute/Volume */
+.mejs-mute > button {
+    background-position: -60px 0;
+}
+
+.mejs-unmute > button {
+    background-position: -40px 0;
+}
+
+.mejs-volume-button {
+    position: relative;
+}
+
+.mejs-volume-button > .mejs-volume-slider {
+    background: rgba(50, 50, 50, 0.7);
+    border-radius: 0;
+    bottom: 100%;
+    display: none;
+    height: 115px;
+    left: 50%;
+    margin: 0;
+    position: absolute;
+    -webkit-transform: translateX(-50%);
+        -ms-transform: translateX(-50%);
+            transform: translateX(-50%);
+    width: 25px;
+    z-index: 1;
+}
+
+.mejs-volume-button:hover {
+    border-radius: 0 0 4px 4px;
+}
+
+.mejs-volume-total {
+    background: rgba(255, 255, 255, 0.5);
+    height: 100px;
+    left: 50%;
+    margin: 0;
+    position: absolute;
+    top: 8px;
+    -webkit-transform: translateX(-50%);
+        -ms-transform: translateX(-50%);
+            transform: translateX(-50%);
+    width: 2px;
+}
+
+.mejs-volume-current {
+    background: rgba(255, 255, 255, 0.9);
+    left: 0;
+    margin: 0;
+    position: absolute;
+    width: 100%;
+}
+
+.mejs-volume-handle {
+    background: rgba(255, 255, 255, 0.9);
+    border-radius: 1px;
+    cursor: ns-resize;
+    height: 6px;
+    left: 50%;
+    position: absolute;
+    -webkit-transform: translateX(-50%);
+        -ms-transform: translateX(-50%);
+            transform: translateX(-50%);
+    width: 16px;
+}
+
+.mejs-horizontal-volume-slider {
+    display: block;
+    height: 36px;
+    position: relative;
+    vertical-align: middle;
+    width: 56px;
+}
+
+.mejs-horizontal-volume-total {
+    background: rgba(50, 50, 50, 0.8);
+    border-radius: 2px;
+    font-size: 1px;
+    height: 8px;
+    left: 0;
+    margin: 0;
+    padding: 0;
+    position: absolute;
+    top: 16px;
+    width: 50px;
+}
+
+.mejs-horizontal-volume-current {
+    background: rgba(255, 255, 255, 0.8);
+    border-radius: 2px;
+    font-size: 1px;
+    height: 100%;
+    left: 0;
+    margin: 0;
+    padding: 0;
+    position: absolute;
+    top: 0;
+    width: 100%;
+}
+
+.mejs-horizontal-volume-handle {
+    display: none;
+}
+
+/* End: Mute/Volume */
+
+/* Start: Track (Captions and Chapters) */
+.mejs-captions-button,
+.mejs-chapters-button {
+    position: relative;
+}
+
+.mejs-captions-button > button {
+    background-position: -140px 0;
+}
+
+.mejs-chapters-button > button {
+    background-position: -180px 0;
+}
+
+.mejs-captions-button > .mejs-captions-selector,
+.mejs-chapters-button > .mejs-chapters-selector {
+    background: rgba(50, 50, 50, 0.7);
+    border: solid 1px transparent;
+    border-radius: 0;
+    bottom: 100%;
+    margin-right: -43px;
+    overflow: hidden;
+    padding: 0;
+    position: absolute;
+    right: 50%;
+    visibility: visible;
+    width: 86px;
+}
+
+.mejs-chapters-button > .mejs-chapters-selector {
+    margin-right: -55px;
+    width: 110px;
+}
+
+.mejs-captions-selector-list,
+.mejs-chapters-selector-list {
+    list-style-type: none !important;
+    margin: 0;
+    overflow: hidden;
+    padding: 0;
+}
+
+.mejs-captions-selector-list-item,
+.mejs-chapters-selector-list-item {
+    color: #fff;
+    cursor: pointer;
+    display: block;
+    list-style-type: none !important;
+    margin: 0 0 6px;
+    overflow: hidden;
+    padding: 0 10px;
+}
+
+.mejs-captions-selector-list-item:hover,
+.mejs-chapters-selector-list-item:hover {
+    background-color: rgb(200, 200, 200) !important;
+    background-color: rgba(255, 255, 255, 0.4) !important;
+}
+
+.mejs-captions-selector-input,
+.mejs-chapters-selector-input {
+    clear: both;
+    float: left;
+    left: -1000px;
+    margin: 3px 3px 0 5px;
+    position: absolute;
+}
+
+.mejs-captions-selector-label,
+.mejs-chapters-selector-label {
+    cursor: pointer;
+    float: left;
+    font-size: 10px;
+    line-height: 15px;
+    padding: 4px 0 0;
+}
+
+.mejs-captions-selected,
+.mejs-chapters-selected {
+    color: rgba(33, 248, 248, 1);
+}
+
+.mejs-captions-translations {
+    font-size: 10px;
+    margin: 0 0 5px;
+}
+
+.mejs-captions-layer {
+    bottom: 0;
+    color: #fff;
+    font-size: 16px;
+    left: 0;
+    line-height: 20px;
+    position: absolute;
+    text-align: center;
+}
+
+.mejs-captions-layer a {
+    color: #fff;
+    text-decoration: underline;
+}
+
+.mejs-captions-layer[lang=ar] {
+    font-size: 20px;
+    font-weight: normal;
+}
+
+.mejs-captions-position {
+    bottom: 15px;
+    left: 0;
+    position: absolute;
+    width: 100%;
+}
+
+.mejs-captions-position-hover {
+    bottom: 35px;
+}
+
+.mejs-captions-text,
+.mejs-captions-text * {
+    background: rgba(20, 20, 20, 0.5);
+    box-shadow: 5px 0 0 rgba(20, 20, 20, 0.5), -5px 0 0 rgba(20, 20, 20, 0.5);
+    padding: 0;
+    white-space: pre-wrap;
+}
+
+.mejs-container.mejs-hide-cues video::-webkit-media-text-track-container {
+    display: none;
+}
+
+/* End: Track (Captions and Chapters) */
+
+/* Start: Error */
+.mejs-overlay-error {
+    position: relative;
+}
+.mejs-overlay-error > img {
+    left: 0;
+    position: absolute;
+    top: 0;
+    z-index: -1;
+}
+.mejs-cannotplay,
+.mejs-cannotplay a {
+    color: #fff;
+    font-size: 0.8em;
+}
+
+.mejs-cannotplay {
+    position: relative;
+}
+
+.mejs-cannotplay p,
+.mejs-cannotplay a {
+    display: inline-block;
+    padding: 0 15px;
+    width: 100%;
+}
+/* End: Error */

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
app/Resources/public/assets/mediaelement/build/mediaelementplayer-legacy.min.css


+ 614 - 850
app/Resources/public/assets/mediaelement/build/mediaelementplayer.css

@@ -1,1007 +1,771 @@
-.mejs-offscreen{
-/* Accessibility: hide screen reader texts (and prefer "top" for RTL languages).  Reference: http://blog.rrwd.nl/2015/04/04/the-screen-reader-text-class-why-and-how/ */
-	clip: rect(1px 1px 1px 1px); /* IE6, IE7 - no likey commas */
-	clip: rect(1px, 1px, 1px, 1px); /* IE8-IE11 - we likey commas, no support for clip-path */
-	clip-path: polygon(0px 0px, 0px 0px,0px 0px, 0px 0px);
-	position: absolute !important;
-	height: 1px;
-	width: 1px;
-	overflow: hidden;
+/* Accessibility: hide screen reader texts (and prefer "top" for RTL languages).
+Reference: http://blog.rrwd.nl/2015/04/04/the-screen-reader-text-class-why-and-how/ */
+.mejs__offscreen {
+    border: 0;
+    clip: rect( 1px, 1px, 1px, 1px );
+    -webkit-clip-path: inset( 50% );
+            clip-path: inset( 50% );
+    height: 1px;
+    margin: -1px;
+    overflow: hidden;
+    padding: 0;
+    position: absolute;
+    width: 1px;
+    word-wrap: normal;
 }
 
-.mejs-container {
-	position: relative;
-	background: #000;
-	font-family: "Helvetica", Arial, serif;
-	text-align: left;
-	vertical-align: top;
-	text-indent: 0;
+.mejs__container {
+    background: #000;
+    box-sizing: border-box;
+    font-family: 'Helvetica', Arial, serif;
+    position: relative;
+    text-align: left;
+    text-indent: 0;
+    vertical-align: top;
 }
 
-.mejs-fill-container,.mejs-fill-container .mejs-container{
-    	width: 100%;
-    	height: 100%;
+.mejs__container * {
+    box-sizing: border-box;
 }
 
-.mejs-fill-container{
-    	overflow: hidden;
+/* Hide native play button and control bar from iOS to favor plugin button */
+.mejs__container video::-webkit-media-controls,
+.mejs__container video::-webkit-media-controls-panel,
+.mejs__container video::-webkit-media-controls-panel-container,
+.mejs__container video::-webkit-media-controls-start-playback-button {
+    -webkit-appearance: none;
+    display: none !important;
 }
 
-.mejs-container:focus {
-	outline: none;
+.mejs__fill-container,
+.mejs__fill-container .mejs__container {
+    height: 100%;
+    width: 100%;
 }
 
-.me-plugin {
-	position: absolute;
+.mejs__fill-container {
+    background: transparent;
+    margin: 0 auto;
+    overflow: hidden;
+    position: relative;
 }
 
-.mejs-embed, .mejs-embed body {
-	width: 100%;
-	height: 100%;
-	margin: 0;
-	padding: 0;
-	background: #000;
-	overflow: hidden;
+.mejs__container:focus {
+    outline: none;
 }
 
-.mejs-fullscreen {
-	/* set it to not show scroll bars so 100% will work */
-	overflow: hidden !important;
+.mejs__iframe-overlay {
+    height: 100%;
+    position: absolute;
+    width: 100%;
 }
 
-.mejs-container-fullscreen {
-	position: fixed;
-	left: 0;
-	top: 0;
-	right: 0;
-	bottom: 0;
-	overflow: hidden;
-	z-index: 1000;
+.mejs__embed,
+.mejs__embed body {
+    background: #000;
+    height: 100%;
+    margin: 0;
+    overflow: hidden;
+    padding: 0;
+    width: 100%;
 }
-.mejs-container-fullscreen .mejs-mediaelement,
-.mejs-container-fullscreen video {
-	width: 100%;
-	height: 100%;
+
+.mejs__fullscreen {
+    overflow: hidden !important;
+}
+
+.mejs__container-fullscreen {
+    bottom: 0;
+    left: 0;
+    overflow: hidden;
+    position: fixed;
+    right: 0;
+    top: 0;
+    z-index: 1000;
 }
 
-.mejs-clear {
-	clear: both;
+.mejs__container-fullscreen .mejs__mediaelement,
+.mejs__container-fullscreen video {
+    height: 100% !important;
+    width: 100% !important;
 }
 
 /* Start: LAYERS */
-.mejs-background {
-	position: absolute;
-	top: 0;
-	left: 0;
+.mejs__background {
+    left: 0;
+    position: absolute;
+    top: 0;
 }
 
-.mejs-mediaelement {
-	position: absolute;
-	top: 0;
-	left: 0;
-	width: 100%;
-	height: 100%;
+.mejs__mediaelement {
+    height: 100%;
+    left: 0;
+    position: absolute;
+    top: 0;
+    width: 100%;
+    z-index: 0;
 }
 
-.mejs-poster {
-	position: absolute;
-	top: 0;
-	left: 0;
-	background-size: contain ;
-	background-position: 50% 50% ;
-	background-repeat: no-repeat ;
+.mejs__poster {
+    background-position: 50% 50%;
+    background-repeat: no-repeat;
+    background-size: cover;
+    left: 0;
+    position: absolute;
+    top: 0;
+    z-index: 1;
 }
-:root .mejs-poster img {
-	display: none ;
+
+:root .mejs__poster-img {
+    display: none;
 }
 
-.mejs-poster img {
-	border: 0;
-	padding: 0;
+.mejs__poster-img {
+    border: 0;
+    padding: 0;
 }
 
-.mejs-overlay {
-	position: absolute;
-	top: 0;
-	left: 0;
+.mejs__overlay {
+    -webkit-box-align: center;
+    -webkit-align-items: center;
+        -ms-flex-align: center;
+            align-items: center;
+    display: -webkit-box;
+    display: -webkit-flex;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-pack: center;
+    -webkit-justify-content: center;
+        -ms-flex-pack: center;
+            justify-content: center;
+    left: 0;
+    position: absolute;
+    top: 0;
 }
 
-.mejs-overlay-play {
-	cursor: pointer;
+.mejs__layer {
+    z-index: 1;
 }
 
-.mejs-overlay-button {
-	position: absolute;
-	top: 50%;
-	left: 50%;
-	width: 100px;
-	height: 100px;
-	margin: -50px 0 0 -50px;
-	background: url("bigplay.svg") no-repeat;
+.mejs__overlay-play {
+    cursor: pointer;
 }
 
-.no-svg .mejs-overlay-button {
-	background-image: url("bigplay.png");
+.mejs__overlay-button {
+    background: url('mejs-controls.svg') no-repeat;
+    background-position: 0 -39px;
+    height: 80px;
+    width: 80px;
 }
 
-.mejs-overlay:hover .mejs-overlay-button {
-	background-position: 0 -100px ;
+.mejs__overlay:hover > .mejs__overlay-button {
+    background-position: -80px -39px;
+}
+
+.mejs__overlay-loading {
+    height: 80px;
+    width: 80px;
+}
+
+.mejs__overlay-loading-bg-img {
+    -webkit-animation: mejs__loading-spinner 1s linear infinite;
+            animation: mejs__loading-spinner 1s linear infinite;
+    background: transparent url('mejs-controls.svg') -160px -40px no-repeat;
+    display: block;
+    height: 80px;
+    width: 80px;
+    z-index: 1;
 }
 
-.mejs-overlay-loading {
-	position: absolute;
-	top: 50%;
-	left: 50%;
-	width: 80px;
-	height: 80px;
-	margin: -40px 0 0 -40px;
-	background: #333;
-	background: url("background.png");
-	background: rgba(0, 0, 0, 0.9);
-	background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50,50,50,0.9)), to(rgba(0,0,0,0.9)));
-	background: -webkit-linear-gradient(top, rgba(50,50,50,0.9), rgba(0,0,0,0.9));
-	background: -moz-linear-gradient(top, rgba(50,50,50,0.9), rgba(0,0,0,0.9));
-	background: -o-linear-gradient(top, rgba(50,50,50,0.9), rgba(0,0,0,0.9));
-	background: -ms-linear-gradient(top, rgba(50,50,50,0.9), rgba(0,0,0,0.9));
-	background: linear-gradient(rgba(50,50,50,0.9), rgba(0,0,0,0.9));
+@-webkit-keyframes mejs__loading-spinner {
+    100% {
+        -webkit-transform: rotate(360deg);
+                transform: rotate(360deg);
+    }
 }
 
-.mejs-overlay-loading span {
-	display: block;
-	width: 80px;
-	height: 80px;
-	background: transparent url("loading.gif") 50% 50% no-repeat;
+@keyframes mejs__loading-spinner {
+    100% {
+        -webkit-transform: rotate(360deg);
+                transform: rotate(360deg);
+    }
 }
 
 /* End: LAYERS */
 
 /* Start: CONTROL BAR */
-.mejs-container .mejs-controls {
-	position: absolute;
-	list-style-type: none;
-	margin: 0;
-	padding: 0;
-	bottom: 0;
-	left: 0;
-	background: url("background.png");
-	background: rgba(0, 0, 0, 0.7);
-	background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50,50,50,0.7)), to(rgba(0,0,0,0.7)));
-	background: -webkit-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7));
-	background: -moz-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7));
-	background: -o-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7));
-	background: -ms-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7));
-	background: linear-gradient(rgba(50,50,50,0.7), rgba(0,0,0,0.7));
-	height: 30px;
-	width: 100%;
-}
-.mejs-container .mejs-controls  div {
-	list-style-type: none;
-	background-image: none;
-	display: block;
-	float: left;
-	margin: 0;
-	padding: 0;
-	width: 26px;
-	height: 26px;
-	font-size: 11px;
-	line-height: 11px;
-	font-family: "Helvetica", Arial, serif;
-	border: 0;
-}
-
-.mejs-controls .mejs-button button {
-	cursor: pointer;
-	display: block;
-	font-size: 0;
-	line-height: 0;
-	text-decoration: none;
-	margin: 7px 5px;
-	padding: 0;
-	position: absolute;
-	height: 16px;
-	width: 16px;
-	border: 0;
-	background: transparent url("controls.svg") no-repeat;
-}
-
-.no-svg .mejs-controls .mejs-button button {
-	background-image: url("controls.png");
-}
-
-	/* :focus for accessibility */
-.mejs-controls .mejs-button button:focus {
-	outline: dotted 1px #999;
+.mejs__controls {
+    bottom: 0;
+    display: -webkit-box;
+    display: -webkit-flex;
+    display: -ms-flexbox;
+    display: flex;
+    height: 40px;
+    left: 0;
+    list-style-type: none;
+    margin: 0;
+    padding: 0 10px;
+    position: absolute;
+    width: 100%;
+    z-index: 3;
+}
+
+.mejs__controls:not([style*='display: none']) {
+    background: rgba(255, 0, 0, 0.7);
+    background: -webkit-linear-gradient(transparent, rgba(0, 0, 0, 0.35));
+    background: linear-gradient(transparent, rgba(0, 0, 0, 0.35));
+}
+
+.mejs__button,
+.mejs__time,
+.mejs__time-rail {
+    font-size: 10px;
+    height: 40px;
+    line-height: 10px;
+    margin: 0;
+    width: 32px;
+}
+
+.mejs__button > button {
+    background: transparent url('mejs-controls.svg');
+    border: 0;
+    cursor: pointer;
+    display: block;
+    font-size: 0;
+    height: 20px;
+    line-height: 0;
+    margin: 10px 6px;
+    overflow: hidden;
+    padding: 0;
+    position: absolute;
+    text-decoration: none;
+    width: 20px;
+}
+
+/* :focus for accessibility */
+.mejs__button > button:focus {
+    outline: dotted 1px #999;
+}
+
+.mejs__container-keyboard-inactive a,
+.mejs__container-keyboard-inactive a:focus,
+.mejs__container-keyboard-inactive button,
+.mejs__container-keyboard-inactive button:focus,
+.mejs__container-keyboard-inactive [role=slider],
+.mejs__container-keyboard-inactive [role=slider]:focus {
+    outline: 0;
 }
 
 /* End: CONTROL BAR */
 
 /* Start: Time (Current / Duration) */
-.mejs-container .mejs-controls .mejs-time {
-	color: #fff;
-	display: block;
-	height: 17px;
-	width: auto;
-	padding: 10px 3px 0 3px ;
-	overflow: hidden;
-	text-align: center;
-	-moz-box-sizing: content-box;
-	-webkit-box-sizing: content-box;
-	box-sizing: content-box;
-}
-
-.mejs-container .mejs-controls .mejs-time a {
-	color: #fff;
-	font-size: 11px;
-	line-height: 12px;
-	display: block;
-	float: left;
-	margin: 1px 2px 0 0;
-	width: auto;
+.mejs__time {
+    box-sizing: content-box;
+    color: #fff;
+    font-size: 11px;
+    font-weight: bold;
+    height: 24px;
+    overflow: hidden;
+    padding: 16px 6px 0;
+    text-align: center;
+    width: auto;
 }
+
 /* End: Time (Current / Duration) */
 
 /* Start: Play/Pause/Stop */
-.mejs-controls .mejs-play button {
-	background-position: 0 0;
+.mejs__play > button {
+    background-position: 0 0;
 }
 
-.mejs-controls .mejs-pause button {
-	background-position: 0 -16px;
+.mejs__pause > button {
+    background-position: -20px 0;
 }
 
-.mejs-controls .mejs-stop button {
-	background-position: -112px 0;
+.mejs__replay > button {
+    background-position: -160px 0;
 }
-/* Start: Play/Pause/Stop */
+
+/* End: Play/Pause/Stop */
 
 /* Start: Progress Bar */
-.mejs-controls div.mejs-time-rail {
-	direction: ltr;
-	width: 200px;
-	padding-top: 5px;
-}
-
-.mejs-controls .mejs-time-rail span, .mejs-controls .mejs-time-rail a {
-	display: block;
-	position: absolute;
-	width: 180px;
-	height: 10px;
-	-webkit-border-radius: 2px;
-	-moz-border-radius: 2px;
-	border-radius: 2px;
-	cursor: pointer;
-}
-
-.mejs-controls .mejs-time-rail .mejs-time-total {
-	margin: 5px;
-	background: #333;
-	background: rgba(50,50,50,0.8);
-	background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(30,30,30,0.8)), to(rgba(60,60,60,0.8)));
-	background: -webkit-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8));
-	background: -moz-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8));
-	background: -o-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8));
-	background: -ms-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8));
-	background: linear-gradient(rgba(30,30,30,0.8), rgba(60,60,60,0.8));
-}
-
-.mejs-controls .mejs-time-rail .mejs-time-buffering {
-	width: 100%;
-	background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-	background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-	background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-	background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-	background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-	background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-	-webkit-background-size: 15px 15px;
-	-moz-background-size: 15px 15px;
-	-o-background-size: 15px 15px;
-	background-size: 15px 15px;
-	-webkit-animation: buffering-stripes 2s linear infinite;
-	-moz-animation: buffering-stripes 2s linear infinite;
-	-ms-animation: buffering-stripes 2s linear infinite;
-	-o-animation: buffering-stripes 2s linear infinite;
-	animation: buffering-stripes 2s linear infinite;
-}
-
-@-webkit-keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} }
-@-moz-keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} }
-@-ms-keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} }
-@-o-keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} }
-@keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} }
-
-.mejs-controls .mejs-time-rail .mejs-time-loaded {
-	background: #3caac8;
-	background: rgba(60,170,200,0.8);
-	background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(44,124,145,0.8)), to(rgba(78,183,212,0.8)));
-	background: -webkit-linear-gradient(top, rgba(44,124,145,0.8), rgba(78,183,212,0.8));
-	background: -moz-linear-gradient(top, rgba(44,124,145,0.8), rgba(78,183,212,0.8));
-	background: -o-linear-gradient(top, rgba(44,124,145,0.8), rgba(78,183,212,0.8));
-	background: -ms-linear-gradient(top, rgba(44,124,145,0.8), rgba(78,183,212,0.8));
-	background: linear-gradient(rgba(44,124,145,0.8), rgba(78,183,212,0.8));
-	width: 0;
-}
-
-.mejs-controls .mejs-time-rail .mejs-time-current {
-	background: #fff;
-	background: rgba(255,255,255,0.8);
-	background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255,255,255,0.9)), to(rgba(200,200,200,0.8)));
-	background: -webkit-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8));
-	background: -moz-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8));
-	background: -o-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8));
-	background: -ms-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8));
-	background: linear-gradient(rgba(255,255,255,0.9), rgba(200,200,200,0.8));
-	width: 0;
-}
-
-.mejs-controls .mejs-time-rail .mejs-time-handle {
-	display: none;
-	position: absolute;
-	margin: 0;
-	width: 10px;
-	background: #fff;
-	-webkit-border-radius: 5px;
-	-moz-border-radius: 5px;
-	border-radius: 5px;
-	cursor: pointer;
-	border: solid 2px #333;
-	top: -2px;
-	text-align: center;
-}
-
-.mejs-controls .mejs-time-rail .mejs-time-float {
-	position: absolute;
-	display: none;
-	background: #eee;
-	width: 36px;
-	height: 17px;
-	border: solid 1px #333;
-	top: -26px;
-	margin-left: -18px;
-	text-align: center;
-	color: #111;
-}
-
-.mejs-controls .mejs-time-rail .mejs-time-float-current {
-	margin: 2px;
-	width: 30px;
-	display: block;
-	text-align: center;
-	left: 0;
-}
-
-.mejs-controls .mejs-time-rail .mejs-time-float-corner {
-	position: absolute;
-	display: block;
-	width: 0;
-	height: 0;
-	line-height: 0;
-	border: solid 5px #eee;
-	border-color: #eee transparent transparent transparent;
-	-webkit-border-radius: 0;
-	-moz-border-radius: 0;
-	border-radius: 0;
-	top: 15px;
-	left: 13px;
-}
-
-.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float {
-	width: 48px;
-}
-
-.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float-current {
-	width: 44px;
-}
-
-.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float-corner {
-	left: 18px;
-}
-
-/*
-.mejs-controls .mejs-time-rail:hover .mejs-time-handle {
-	visibility:visible;
-}
-*/
-/* End: Progress Bar */
+.mejs__time-rail {
+    direction: ltr;
+    -webkit-box-flex: 1;
+    -webkit-flex-grow: 1;
+        -ms-flex-positive: 1;
+            flex-grow: 1;
+    height: 40px;
+    margin: 0 10px;
+    padding-top: 10px;
+    position: relative;
+}
+
+.mejs__time-total,
+.mejs__time-buffering,
+.mejs__time-loaded,
+.mejs__time-current,
+.mejs__time-float,
+.mejs__time-hovered,
+.mejs__time-float-current,
+.mejs__time-float-corner,
+.mejs__time-marker {
+    border-radius: 2px;
+    cursor: pointer;
+    display: block;
+    height: 10px;
+    position: absolute;
+}
 
-/* Start: Fullscreen */
-.mejs-controls .mejs-fullscreen-button button {
-	background-position: -32px 0;
+.mejs__time-total {
+    background: rgba(255, 255, 255, 0.3);
+    margin: 5px 0 0;
+    width: 100%;
 }
 
-.mejs-controls .mejs-unfullscreen button {
-	background-position: -32px -16px;
+.mejs__time-buffering {
+    -webkit-animation: buffering-stripes 2s linear infinite;
+            animation: buffering-stripes 2s linear infinite;
+    background: -webkit-linear-gradient(135deg, rgba(255, 255, 255, 0.4) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.4) 50%, rgba(255, 255, 255, 0.4) 75%, transparent 75%, transparent);
+    background: linear-gradient(-45deg, rgba(255, 255, 255, 0.4) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.4) 50%, rgba(255, 255, 255, 0.4) 75%, transparent 75%, transparent);
+    background-size: 15px 15px;
+    width: 100%;
 }
-/* End: Fullscreen */
 
+@-webkit-keyframes buffering-stripes {
+    from {
+        background-position: 0 0;
+    }
+    to {
+        background-position: 30px 0;
+    }
+}
 
-/* Start: Mute/Volume */
-.mejs-controls .mejs-volume-button {
-}
-
-.mejs-controls .mejs-mute button {
-	background-position: -16px -16px;
-}
-
-.mejs-controls .mejs-unmute button {
-	background-position: -16px 0;
-}
-
-.mejs-controls .mejs-volume-button {
-	position: relative;
-}
-
-.mejs-controls .mejs-volume-button .mejs-volume-slider {
-	display: none;
-	height: 115px;
-	width: 25px;
-	background: url("background.png");
-	background: rgba(50, 50, 50, 0.7);
-	-webkit-border-radius: 0;
-	-moz-border-radius: 0;
-	border-radius: 0;
-	top: -115px;
-	left: 0;
-	z-index: 1;
-	position: absolute;
-	margin: 0;
-}
-
-.mejs-controls .mejs-volume-button:hover {
-	-webkit-border-radius: 0 0 4px 4px;
-	-moz-border-radius: 0 0 4px 4px;
-	border-radius: 0 0 4px 4px;
-}
-
-/*
-.mejs-controls .mejs-volume-button:hover .mejs-volume-slider {
-	display: block;
-}
-*/
-
-.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-total {
-	position: absolute;
-	left: 11px;
-	top: 8px;
-	width: 2px;
-	height: 100px;
-	background: #ddd;
-	background: rgba(255, 255, 255, 0.5);
-	margin: 0;
-}
-
-.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-current {
-	position: absolute;
-	left: 11px;
-	top: 8px;
-	width: 2px;
-	height: 100px;
-	background: #ddd;
-	background: rgba(255, 255, 255, 0.9);
-	margin: 0;
-}
-
-.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-handle {
-	position: absolute;
-	left: 4px;
-	top: -3px;
-	width: 16px;
-	height: 6px;
-	background: #ddd;
-	background: rgba(255, 255, 255, 0.9);
-	cursor: N-resize;
-	-webkit-border-radius: 1px;
-	-moz-border-radius: 1px;
-	border-radius: 1px;
-	margin: 0;
-}
-
-/* horizontal version */
-.mejs-controls a.mejs-horizontal-volume-slider {
-	height: 26px;
-	width: 56px;
-	position: relative;
-    display: block;
-    float: left;
-    vertical-align: middle;
+@keyframes buffering-stripes {
+    from {
+        background-position: 0 0;
+    }
+    to {
+        background-position: 30px 0;
+    }
 }
 
-.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total {
-	position: absolute;
-	left: 0;
-	top: 11px;
-	width: 50px;
-	height: 8px;
-	margin: 0;
-	padding: 0;
-	font-size: 1px;
-	-webkit-border-radius: 2px;
-	-moz-border-radius: 2px;
-	border-radius: 2px;
-	background: #333;
-	background: rgba(50,50,50,0.8);
-	background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(30,30,30,0.8)), to(rgba(60,60,60,0.8)));
-	background: -webkit-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8));
-	background: -moz-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8));
-	background: -o-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8));
-	background: -ms-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8));
-	background: linear-gradient(rgba(30,30,30,0.8), rgba(60,60,60,0.8));
-}
-
-.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current {
-	position: absolute;
-	left: 0;
-	top: 11px;
-	width: 50px;
-	height: 8px;
-	margin: 0;
-	padding: 0;
-	font-size: 1px;
-	-webkit-border-radius: 2px;
-	-moz-border-radius: 2px;
-	border-radius: 2px;
-	background: #fff;
-	background: rgba(255,255,255,0.8);
-	background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255,255,255,0.9)), to(rgba(200,200,200,0.8)));
-	background: -webkit-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8));
-	background: -moz-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8));
-	background: -o-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8));
-	background: -ms-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8));
-	background: linear-gradient(rgba(255,255,255,0.9), rgba(200,200,200,0.8));
-}
-
-.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-handle {
-	display: none;
+.mejs__time-loaded {
+    background: rgba(255, 255, 255, 0.3);
 }
 
-/* End: Mute/Volume */
+.mejs__time-current,
+.mejs__time-handle-content {
+    background: rgba(255, 255, 255, 0.9);
+}
 
-/* Start: Track (Captions and Chapters) */
-.mejs-controls .mejs-captions-button {
-	position: relative;
-}
-
-.mejs-controls .mejs-captions-button button {
-	background-position: -48px 0;
-}
-.mejs-controls .mejs-captions-button .mejs-captions-selector {
-	visibility: hidden;
-	position: absolute;
-	bottom: 26px;
-	right: -51px;
-	width: 85px;
-	height: 100px;
-	background: url("background.png");
-	background: rgba(50,50,50,0.7);
-	border: solid 1px transparent;
-	padding: 10px 10px 0 10px;
-	overflow: hidden;
-	-webkit-border-radius: 0;
-	-moz-border-radius: 0;
-	border-radius: 0;
-}
-
-.mejs-controls .mejs-captions-button:hover  .mejs-captions-selector {
-	visibility: visible;
-}
-
-.mejs-controls .mejs-captions-button .mejs-captions-selector ul {
-	margin: 0;
-	padding: 0;
-	display: block;
-	list-style-type: none !important;
-	overflow: hidden;
-}
-
-.mejs-controls .mejs-captions-button .mejs-captions-selector ul li {
-	margin: 0 0 6px 0;
-	padding: 0;
-	list-style-type: none !important;
-	display: block;
-	color: #fff;
-	overflow: hidden;
-}
-
-.mejs-controls .mejs-captions-button .mejs-captions-selector ul li input {
-	clear: both;
-	float: left;
-	margin: 3px 3px 0 5px;
-}
-
-.mejs-controls .mejs-captions-button .mejs-captions-selector ul li label {
-	width: 55px;
-	float: left;
-	padding: 4px 0 0 0;
-	line-height: 15px;
-	font-family: "Helvetica", Arial, serif;
-	font-size: 10px;
-}
-
-.mejs-controls .mejs-captions-button .mejs-captions-translations {
-	font-size: 10px;
-	margin: 0 0 5px 0;
-}
-
-.mejs-chapters {
-	position: absolute;
-	top: 0;
-	left: 0;
-	border-right: solid 1px #fff;
-	width: 10000px;
-	z-index: 1;
-}
-
-.mejs-chapters .mejs-chapter {
-	position: absolute;
-	float: left;
-	background: #222;
-	background: rgba(0, 0, 0, 0.7);
-	background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50,50,50,0.7)), to(rgba(0,0,0,0.7)));
-	background: -webkit-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7));
-	background: -moz-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7));
-	background: -o-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7));
-	background: -ms-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7));
-	background: linear-gradient(rgba(50,50,50,0.7), rgba(0,0,0,0.7));
-	filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, startColorstr=#323232,endColorstr=#000000);
-	overflow: hidden;
-	border: 0;
-}
-
-.mejs-chapters .mejs-chapter .mejs-chapter-block {
-	font-size: 11px;
-	color: #fff;
-	padding: 5px;
-	display: block;
-	border-right: solid 1px #333;
-	border-bottom: solid 1px #333;
-	cursor: pointer;
-}
-
-.mejs-chapters .mejs-chapter .mejs-chapter-block-last {
-	border-right: none;
-}
-
-.mejs-chapters .mejs-chapter .mejs-chapter-block:hover {
-	background: #666;
-	background: rgba(102,102,102, 0.7);
-	background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(102,102,102,0.7)), to(rgba(50,50,50,0.6)));
-	background: -webkit-linear-gradient(top, rgba(102,102,102,0.7), rgba(50,50,50,0.6));
-	background: -moz-linear-gradient(top, rgba(102,102,102,0.7), rgba(50,50,50,0.6));
-	background: -o-linear-gradient(top, rgba(102,102,102,0.7), rgba(50,50,50,0.6));
-	background: -ms-linear-gradient(top, rgba(102,102,102,0.7), rgba(50,50,50,0.6));
-	background: linear-gradient(rgba(102,102,102,0.7), rgba(50,50,50,0.6));
-	filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, startColorstr=#666666,endColorstr=#323232);
-}
+.mejs__time-hovered {
+    background: rgba(255, 255, 255, 0.5);
+    z-index: 10;
+}
 
-.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-title {
-	font-size: 12px;
-	font-weight: bold;
-	display: block;
-	white-space: nowrap;
-	text-overflow: ellipsis;
-	margin: 0 0 3px 0;
-	line-height: 12px;
+.mejs__time-hovered.negative {
+    background: rgba(0, 0, 0, 0.2);
 }
 
-.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-timespan {
-	font-size: 12px;
-	line-height: 12px;
-	margin: 3px 0 4px 0;
-	display: block;
-	white-space: nowrap;
-	text-overflow: ellipsis;
+.mejs__time-current,
+.mejs__time-buffering,
+.mejs__time-loaded,
+.mejs__time-hovered {
+    left: 0;
+    -webkit-transform: scaleX(0);
+        -ms-transform: scaleX(0);
+            transform: scaleX(0);
+    -webkit-transform-origin: 0 0;
+        -ms-transform-origin: 0 0;
+            transform-origin: 0 0;
+    -webkit-transition: 0.15s ease-in all;
+    transition: 0.15s ease-in all;
+    width: 100%;
 }
 
-.mejs-captions-layer {
-	position: absolute;
-	bottom: 0;
-	left: 0;
-	text-align:center;
-	line-height: 20px;
-	font-size: 16px;
-	color: #fff;
+.mejs__time-buffering {
+    -webkit-transform: scaleX(1);
+        -ms-transform: scaleX(1);
+            transform: scaleX(1);
 }
 
-.mejs-captions-layer  a {
-	color: #fff;
-	text-decoration: underline;
+.mejs__time-hovered {
+    -webkit-transition: height 0.1s cubic-bezier(0.44, 0, 1, 1);
+    transition: height 0.1s cubic-bezier(0.44, 0, 1, 1);
 }
 
-.mejs-captions-layer[lang=ar] {
-	font-size: 20px;
-	font-weight: normal;
-}
-
-.mejs-captions-position {
-	position: absolute;
-	width: 100%;
-	bottom: 15px;
-	left: 0;
-}
-
-.mejs-captions-position-hover {
-	bottom: 35px;
-}
-
-.mejs-captions-text {
-	padding: 0;
-	background: url("background.png");
-	background: rgba(20, 20, 20, 0.5);
-	white-space: pre-wrap;
-	-webkit-box-shadow: 5px 0 0 rgba(20, 20, 20, 0.5), -5px 0 0 rgba(20, 20, 20, 0.5);
-	box-shadow: 5px 0 0 rgba(20, 20, 20, 0.5), -5px 0 0 rgba(20, 20, 20, 0.5);
+.mejs__time-hovered.no-hover {
+    -webkit-transform: scaleX(0) !important;
+        -ms-transform: scaleX(0) !important;
+            transform: scaleX(0) !important;
 }
-/* End: Track (Captions and Chapters) */
 
-/* Start: Error */
-.me-cannotplay {
+.mejs__time-handle,
+.mejs__time-handle-content {
+    border: 4px solid transparent;
+    cursor: pointer;
+    left: 0;
+    position: absolute;
+    -webkit-transform: translateX(0);
+        -ms-transform: translateX(0);
+            transform: translateX(0);
+    z-index: 11;
 }
 
-.me-cannotplay a {
-	color: #fff;
-	font-weight: bold;
+.mejs__time-handle-content {
+    border: 4px solid rgba(255, 255, 255, 0.9);
+    border-radius: 50%;
+    height: 10px;
+    left: -7px;
+    top: -4px;
+    -webkit-transform: scale(0);
+        -ms-transform: scale(0);
+            transform: scale(0);
+    width: 10px;
+}
+
+.mejs__time-rail:hover .mejs__time-handle-content,
+.mejs__time-rail .mejs__time-handle-content:focus,
+.mejs__time-rail .mejs__time-handle-content:active {
+    -webkit-transform: scale(1);
+        -ms-transform: scale(1);
+            transform: scale(1);
+}
+
+.mejs__time-float {
+    background: #eee;
+    border: solid 1px #333;
+    bottom: 100%;
+    color: #111;
+    display: none;
+    height: 17px;
+    margin-bottom: 9px;
+    position: absolute;
+    text-align: center;
+    -webkit-transform: translateX(-50%);
+        -ms-transform: translateX(-50%);
+            transform: translateX(-50%);
+    width: 36px;
 }
 
-.me-cannotplay span {
-	padding: 15px;
-	display: block;
+.mejs__time-float-current {
+    display: block;
+    left: 0;
+    margin: 2px;
+    text-align: center;
+    width: 30px;
 }
-/* End: Error */
 
+.mejs__time-float-corner {
+    border: solid 5px #eee;
+    border-color: #eee transparent transparent;
+    border-radius: 0;
+    display: block;
+    height: 0;
+    left: 50%;
+    line-height: 0;
+    position: absolute;
+    top: 100%;
+    -webkit-transform: translateX(-50%);
+        -ms-transform: translateX(-50%);
+            transform: translateX(-50%);
+    width: 0;
+}
 
-/* Start: Loop */
-.mejs-controls .mejs-loop-off button {
-	background-position: -64px -16px;
+.mejs__long-video .mejs__time-float {
+    margin-left: -23px;
+    width: 64px;
 }
 
-.mejs-controls .mejs-loop-on button {
-	background-position: -64px 0;
+.mejs__long-video .mejs__time-float-current {
+    width: 60px;
 }
 
-/* End: Loop */
+.mejs__broadcast {
+    color: #fff;
+    height: 10px;
+    position: absolute;
+    top: 15px;
+    width: 100%;
+}
+
+/* End: Progress Bar */
 
-/* Start: backlight */
-.mejs-controls .mejs-backlight-off button {
-	background-position: -80px -16px;
+/* Start: Fullscreen */
+.mejs__fullscreen-button > button {
+    background-position: -80px 0;
 }
 
-.mejs-controls .mejs-backlight-on button {
-	background-position: -80px 0;
+.mejs__unfullscreen > button {
+    background-position: -100px 0;
 }
-/* End: backlight */
 
-/* Start: Picture Controls */
-.mejs-controls .mejs-picturecontrols-button {
-	background-position: -96px 0;
+/* End: Fullscreen */
+
+/* Start: Mute/Volume */
+.mejs__mute > button {
+    background-position: -60px 0;
 }
-/* End: Picture Controls */
 
+.mejs__unmute > button {
+    background-position: -40px 0;
+}
+
+.mejs__volume-button {
+    position: relative;
+}
+
+.mejs__volume-button > .mejs__volume-slider {
+    background: rgba(50, 50, 50, 0.7);
+    border-radius: 0;
+    bottom: 100%;
+    display: none;
+    height: 115px;
+    left: 50%;
+    margin: 0;
+    position: absolute;
+    -webkit-transform: translateX(-50%);
+        -ms-transform: translateX(-50%);
+            transform: translateX(-50%);
+    width: 25px;
+    z-index: 1;
+}
 
-/* context menu */
-.mejs-contextmenu {
-	position: absolute;
-	width: 150px;
-	padding: 10px;
-	border-radius: 4px;
-	top: 0;
-	left: 0;
-	background: #fff;
-	border: solid 1px #999;
-	z-index: 1001; /* make sure it shows on fullscreen */
+.mejs__volume-button:hover {
+    border-radius: 0 0 4px 4px;
 }
-.mejs-contextmenu .mejs-contextmenu-separator {
-	height: 1px;
-	font-size: 0;
-	margin: 5px 6px;
-	background: #333;
+
+.mejs__volume-total {
+    background: rgba(255, 255, 255, 0.5);
+    height: 100px;
+    left: 50%;
+    margin: 0;
+    position: absolute;
+    top: 8px;
+    -webkit-transform: translateX(-50%);
+        -ms-transform: translateX(-50%);
+            transform: translateX(-50%);
+    width: 2px;
 }
 
-.mejs-contextmenu .mejs-contextmenu-item {
-	font-family: "Helvetica", Arial, serif;
-	font-size: 12px;
-	padding: 4px 6px;
-	cursor: pointer;
-	color: #333;
+.mejs__volume-current {
+    background: rgba(255, 255, 255, 0.9);
+    left: 0;
+    margin: 0;
+    position: absolute;
+    width: 100%;
 }
-.mejs-contextmenu .mejs-contextmenu-item:hover {
-	background: #2C7C91;
-	color: #fff;
+
+.mejs__volume-handle {
+    background: rgba(255, 255, 255, 0.9);
+    border-radius: 1px;
+    cursor: ns-resize;
+    height: 6px;
+    left: 50%;
+    position: absolute;
+    -webkit-transform: translateX(-50%);
+        -ms-transform: translateX(-50%);
+            transform: translateX(-50%);
+    width: 16px;
 }
 
-/* Start: Source Chooser */
-.mejs-controls .mejs-sourcechooser-button {
-	position: relative;
+.mejs__horizontal-volume-slider {
+    display: block;
+    height: 36px;
+    position: relative;
+    vertical-align: middle;
+    width: 56px;
 }
 
-.mejs-controls .mejs-sourcechooser-button button {
-	background-position: -128px 0;
+.mejs__horizontal-volume-total {
+    background: rgba(50, 50, 50, 0.8);
+    border-radius: 2px;
+    font-size: 1px;
+    height: 8px;
+    left: 0;
+    margin: 0;
+    padding: 0;
+    position: absolute;
+    top: 16px;
+    width: 50px;
 }
 
-.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector {
-	position: absolute;
-	bottom: 26px;
-	right: -10px;
-	width: 130px;
-	height: 100px;
-	background: url("background.png");
-	background: rgba(50,50,50,0.7);
-	border: solid 1px transparent;
-	padding: 10px;
-	overflow: hidden;
-	-webkit-border-radius: 0;
-	-moz-border-radius: 0;
-	border-radius: 0;
+.mejs__horizontal-volume-current {
+    background: rgba(255, 255, 255, 0.8);
+    border-radius: 2px;
+    font-size: 1px;
+    height: 100%;
+    left: 0;
+    margin: 0;
+    padding: 0;
+    position: absolute;
+    top: 0;
+    width: 100%;
 }
 
-.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul {
-	margin: 0;
-	padding: 0;
-	display: block;
-	list-style-type: none !important;
-	overflow: hidden;
+.mejs__horizontal-volume-handle {
+    display: none;
 }
 
-.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li {
-	margin: 0 0 6px 0;
-	padding: 0;
-	list-style-type: none !important;
-	display: block;
-	color: #fff;
-	overflow: hidden;
+/* End: Mute/Volume */
+
+/* Start: Track (Captions and Chapters) */
+.mejs__captions-button,
+.mejs__chapters-button {
+    position: relative;
 }
 
-.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li input {
-	clear: both;
-	float: left;
-	margin: 3px 3px 0 5px;
+.mejs__captions-button > button {
+    background-position: -140px 0;
 }
 
-.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li label {
-	width: 100px;
-	float: left;
-	padding: 4px 0 0 0;
-	line-height: 15px;
-	font-family: "Helvetica", Arial, serif;
-	font-size: 10px;
-}
-/* End: Source Chooser */
-
-/* Start: Postroll */
-.mejs-postroll-layer {
-	position: absolute;
-	bottom: 0;
-	left: 0;
-	width: 100%;
-	height: 100%;
-	background: url("background.png");
-	background: rgba(50,50,50,0.7);
-	z-index: 1000;
-	overflow: hidden;
-}
-.mejs-postroll-layer-content {
-	width: 100%;
-	height: 100%;
-}
-.mejs-postroll-close {
-	position: absolute;
-	right: 0;
-	top: 0;
-	background: url("background.png");
-	background: rgba(50,50,50,0.7);
-	color: #fff;
-	padding: 4px;
-	z-index: 100;
-	cursor: pointer;
+.mejs__chapters-button > button {
+    background-position: -180px 0;
 }
-/* End: Postroll */
 
+.mejs__captions-button > .mejs__captions-selector,
+.mejs__chapters-button > .mejs__chapters-selector {
+    background: rgba(50, 50, 50, 0.7);
+    border: solid 1px transparent;
+    border-radius: 0;
+    bottom: 100%;
+    margin-right: -43px;
+    overflow: hidden;
+    padding: 0;
+    position: absolute;
+    right: 50%;
+    visibility: visible;
+    width: 86px;
+}
 
-/* Start: Speed */
-div.mejs-speed-button {
-	width: 46px !important;
-	position: relative;
+.mejs__chapters-button > .mejs__chapters-selector {
+    margin-right: -55px;
+    width: 110px;
 }
 
-.mejs-controls .mejs-button.mejs-speed-button button {
-	background: transparent;
-	width: 36px;
-	font-size: 11px;
-	line-height: normal;
-	color: #ffffff;
+.mejs__captions-selector-list,
+.mejs__chapters-selector-list {
+    list-style-type: none !important;
+    margin: 0;
+    overflow: hidden;
+    padding: 0;
 }
 
-.mejs-controls .mejs-speed-button .mejs-speed-selector {
-	display: none;
-	position: absolute;
-	top: -100px;
-	left: -10px;
-	width: 60px;
-	height: 100px;
-	background: url("background.png");
-	background: rgba(50, 50, 50, 0.7);
-	border: solid 1px transparent;
-	padding: 0;
-	overflow: hidden;
-	-webkit-border-radius: 0;
-	-moz-border-radius: 0;
-	border-radius: 0;
+.mejs__captions-selector-list-item,
+.mejs__chapters-selector-list-item {
+    color: #fff;
+    cursor: pointer;
+    display: block;
+    list-style-type: none !important;
+    margin: 0 0 6px;
+    overflow: hidden;
+    padding: 0 10px;
 }
 
+.mejs__captions-selector-list-item:hover,
+.mejs__chapters-selector-list-item:hover {
+    background-color: rgb(200, 200, 200) !important;
+    background-color: rgba(255, 255, 255, 0.4) !important;
+}
 
-.mejs-controls .mejs-speed-button:hover > .mejs-speed-selector {
-	display: block;
+.mejs__captions-selector-input,
+.mejs__chapters-selector-input {
+    clear: both;
+    float: left;
+    left: -1000px;
+    margin: 3px 3px 0 5px;
+    position: absolute;
 }
 
-.mejs-controls .mejs-speed-button .mejs-speed-selector ul li label.mejs-speed-selected {
-	color: rgba(33, 248, 248, 1);
+.mejs__captions-selector-label,
+.mejs__chapters-selector-label {
+    cursor: pointer;
+    float: left;
+    font-size: 10px;
+    line-height: 15px;
+    padding: 4px 0 0;
 }
 
-.mejs-controls .mejs-speed-button .mejs-speed-selector ul {
-	margin: 0;
-	padding: 0;
-	display: block;
-	list-style-type: none !important;
-	overflow: hidden;
+.mejs__captions-selected,
+.mejs__chapters-selected {
+    color: rgba(33, 248, 248, 1);
 }
 
-.mejs-controls .mejs-speed-button .mejs-speed-selector ul li {
-	margin: 0 0 6px 0;
-	padding: 0 10px;
-	list-style-type: none !important;
-	display: block;
-	color: #fff;
-	overflow: hidden;
+.mejs__captions-translations {
+    font-size: 10px;
+    margin: 0 0 5px;
 }
 
-.mejs-controls .mejs-speed-button .mejs-speed-selector ul li input {
-	clear: both;
-	float: left;
-	margin: 3px 3px 0 5px;
-	display: none;
+.mejs__captions-layer {
+    bottom: 0;
+    color: #fff;
+    font-size: 16px;
+    left: 0;
+    line-height: 20px;
+    position: absolute;
+    text-align: center;
 }
 
-.mejs-controls .mejs-speed-button .mejs-speed-selector ul li label {
-	width: 60px;
-	float: left;
-	padding: 4px 0 0 0;
-	line-height: 15px;
-	font-family: "Helvetica", Arial, serif;
-	font-size: 11px;
-	color: white;
-	margin-left: 5px;
-	cursor: pointer;
+.mejs__captions-layer a {
+    color: #fff;
+    text-decoration: underline;
 }
 
-.mejs-controls .mejs-speed-button .mejs-speed-selector ul li:hover {
-	background-color: rgb(200, 200, 200) !important;
-	background-color: rgba(255,255,255,.4) !important;
+.mejs__captions-layer[lang=ar] {
+    font-size: 20px;
+    font-weight: normal;
 }
-/* End: Speed */
 
-/* Start: Jump Forward */
+.mejs__captions-position {
+    bottom: 15px;
+    left: 0;
+    position: absolute;
+    width: 100%;
+}
 
-.mejs-controls .mejs-button.mejs-jump-forward-button {
-	background: transparent url("jumpforward.png") no-repeat 3px 3px;
+.mejs__captions-position-hover {
+    bottom: 35px;
 }
-.mejs-controls .mejs-button.mejs-jump-forward-button button {
-	background: transparent;
-	font-size: 9px;
-	line-height: normal;
-	color: #ffffff;
+
+.mejs__captions-text,
+.mejs__captions-text * {
+    background: rgba(20, 20, 20, 0.5);
+    box-shadow: 5px 0 0 rgba(20, 20, 20, 0.5), -5px 0 0 rgba(20, 20, 20, 0.5);
+    padding: 0;
+    white-space: pre-wrap;
 }
 
-/* End: Jump Forward */
+.mejs__container.mejs__hide-cues video::-webkit-media-text-track-container {
+    display: none;
+}
 
-/* Start: Skip Back */
+/* End: Track (Captions and Chapters) */
 
-.mejs-controls .mejs-button.mejs-skip-back-button {
-	background: transparent url("skipback.png") no-repeat 3px 3px;
+/* Start: Error */
+.mejs__overlay-error {
+    position: relative;
+}
+.mejs__overlay-error > img {
+    left: 0;
+    position: absolute;
+    top: 0;
+    z-index: -1;
 }
-.mejs-controls .mejs-button.mejs-skip-back-button button {
-	background: transparent;
-	font-size: 9px;
-	line-height: normal;
-	color: #ffffff;
+.mejs__cannotplay,
+.mejs__cannotplay a {
+    color: #fff;
+    font-size: 0.8em;
 }
 
-/* End: Skip Back */
+.mejs__cannotplay {
+    position: relative;
+}
 
+.mejs__cannotplay p,
+.mejs__cannotplay a {
+    display: inline-block;
+    padding: 0 15px;
+    width: 100%;
+}
+/* End: Error */

+ 0 - 4213
app/Resources/public/assets/mediaelement/build/mediaelementplayer.js

@@ -1,4213 +0,0 @@
-/*!
- *
- * MediaElementPlayer
- * http://mediaelementjs.com/
- *
- * Creates a controller bar for HTML5 <video> add <audio> tags
- * using jQuery and MediaElement.js (HTML5 Flash/Silverlight wrapper)
- *
- * Copyright 2010-2013, John Dyer (http://j.hn/)
- * License: MIT
- *
- */
-if (typeof jQuery != 'undefined') {
-	mejs.$ = jQuery;
-} else if (typeof Zepto != 'undefined') {
-	mejs.$ = Zepto;
-
-	// define `outerWidth` method which has not been realized in Zepto
-	Zepto.fn.outerWidth = function(includeMargin) {
-		var width = $(this).width();
-		if (includeMargin) {
-			width += parseInt($(this).css('margin-right'), 10);
-			width += parseInt($(this).css('margin-left'), 10);
-		}
-		return width
-	}
-
-} else if (typeof ender != 'undefined') {
-	mejs.$ = ender;
-}
-(function ($) {
-
-	// default player values
-	mejs.MepDefaults = {
-		// url to poster (to fix iOS 3.x)
-		poster: '',
-		// When the video is ended, we can show the poster.
-		showPosterWhenEnded: false,
-		// default if the <video width> is not specified
-		defaultVideoWidth: 480,
-		// default if the <video height> is not specified
-		defaultVideoHeight: 270,
-		// if set, overrides <video width>
-		videoWidth: -1,
-		// if set, overrides <video height>
-		videoHeight: -1,
-		// default if the user doesn't specify
-		defaultAudioWidth: 400,
-		// default if the user doesn't specify
-		defaultAudioHeight: 30,
-		// default amount to move back when back key is pressed
-		defaultSeekBackwardInterval: function(media) {
-			return (media.duration * 0.05);
-		},
-		// default amount to move forward when forward key is pressed
-		defaultSeekForwardInterval: function(media) {
-			return (media.duration * 0.05);
-		},
-		// set dimensions via JS instead of CSS
-		setDimensions: true,
-		// width of audio player
-		audioWidth: -1,
-		// height of audio player
-		audioHeight: -1,
-		// initial volume when the player starts (overrided by user cookie)
-		startVolume: 0.8,
-		// useful for <audio> player loops
-		loop: false,
-		// rewind to beginning when media ends
-		autoRewind: true,
-		// resize to media dimensions
-		enableAutosize: true,
-		/*
-		 * Time format to use. Default: 'mm:ss'
-		 * Supported units:
-		 *   h: hour
-		 *   m: minute
-		 *   s: second
-		 *   f: frame count
-		 * When using 'hh', 'mm', 'ss' or 'ff' we always display 2 digits.
-		 * If you use 'h', 'm', 's' or 'f' we display 1 digit if possible.
-		 *
-		 * Example to display 75 seconds:
-		 * Format 'mm:ss': 01:15
-		 * Format 'm:ss': 1:15
-		 * Format 'm:s': 1:15
-		 */
-		timeFormat: '',
-		// forces the hour marker (##:00:00)
-		alwaysShowHours: false,
-		// show framecount in timecode (##:00:00:00)
-		showTimecodeFrameCount: false,
-		// used when showTimecodeFrameCount is set to true
-		framesPerSecond: 25,
-		// automatically calculate the width of the progress bar based on the sizes of other elements
-		autosizeProgress : true,
-		// Hide controls when playing and mouse is not over the video
-		alwaysShowControls: false,
-		// Display the video control
-		hideVideoControlsOnLoad: false,
-		// Enable click video element to toggle play/pause
-		clickToPlayPause: true,
-		// Time in ms to hide controls
-		controlsTimeoutDefault: 1500,
-		// Time in ms to trigger the timer when mouse moves
-		controlsTimeoutMouseEnter: 2500,
-		// Time in ms to trigger the timer when mouse leaves
-		controlsTimeoutMouseLeave: 1000,
-		// force iPad's native controls
-		iPadUseNativeControls: false,
-		// force iPhone's native controls
-		iPhoneUseNativeControls: false,
-		// force Android's native controls
-		AndroidUseNativeControls: false,
-		// features to show
-		features: ['playpause','current','progress','duration','tracks','volume','fullscreen'],
-		// only for dynamic
-		isVideo: true,
-		// stretching modes (auto, fill, responsive, none)
-		stretching: 'auto',
-		// turns keyboard support on and off for this instance
-		enableKeyboard: true,
-		// when this player starts, it will pause other players
-		pauseOtherPlayers: true,
-		// array of keyboard actions such as play pause
-		keyActions: [
-				{
-						keys: [
-								32, // SPACE
-								179 // GOOGLE play/pause button
-								 ],
-						action: function(player, media, key, event) {
-
-							if (!mejs.MediaFeatures.isFirefox) {
-								if (media.paused || media.ended) {
-									media.play();
-								} else {
-									media.pause();
-								}
-							}
-						}
-				},
-				{
-						keys: [38], // UP
-						action: function(player, media, key, event) {
-								player.container.find('.mejs-volume-slider').css('display','block');
-								if (player.isVideo) {
-										player.showControls();
-										player.startControlsTimer();
-								}
-
-								var newVolume = Math.min(media.volume + 0.1, 1);
-								media.setVolume(newVolume);
-						}
-				},
-				{
-						keys: [40], // DOWN
-						action: function(player, media, key, event) {
-								player.container.find('.mejs-volume-slider').css('display','block');
-								if (player.isVideo) {
-										player.showControls();
-										player.startControlsTimer();
-								}
-
-								var newVolume = Math.max(media.volume - 0.1, 0);
-								media.setVolume(newVolume);
-						}
-				},
-				{
-						keys: [
-								37, // LEFT
-								227 // Google TV rewind
-						],
-						action: function(player, media, key, event) {
-								if (!isNaN(media.duration) && media.duration > 0) {
-										if (player.isVideo) {
-												player.showControls();
-												player.startControlsTimer();
-										}
-
-										// 5%
-										var newTime = Math.max(media.currentTime - player.options.defaultSeekBackwardInterval(media), 0);
-										media.setCurrentTime(newTime);
-								}
-						}
-				},
-				{
-						keys: [
-								39, // RIGHT
-								228 // Google TV forward
-						],
-						action: function(player, media, key, event) {
-								if (!isNaN(media.duration) && media.duration > 0) {
-										if (player.isVideo) {
-												player.showControls();
-												player.startControlsTimer();
-										}
-
-										// 5%
-										var newTime = Math.min(media.currentTime + player.options.defaultSeekForwardInterval(media), media.duration);
-										media.setCurrentTime(newTime);
-								}
-						}
-				},
-				{
-						keys: [70], // F
-						action: function(player, media, key, event) {
-								if (typeof player.enterFullScreen != 'undefined') {
-										if (player.isFullScreen) {
-												player.exitFullScreen();
-										} else {
-												player.enterFullScreen();
-										}
-								}
-						}
-				},
-				{
-						keys: [77], // M
-						action: function(player, media, key, event) {
-								player.container.find('.mejs-volume-slider').css('display','block');
-								if (player.isVideo) {
-										player.showControls();
-										player.startControlsTimer();
-								}
-								if (player.media.muted) {
-										player.setMuted(false);
-								} else {
-										player.setMuted(true);
-								}
-						}
-				}
-		]
-	};
-
-	mejs.mepIndex = 0;
-
-	mejs.players = {};
-
-	// wraps a MediaElement object in player controls
-	mejs.MediaElementPlayer = function(node, o) {
-		// enforce object, even without "new" (via John Resig)
-		if ( !(this instanceof mejs.MediaElementPlayer) ) {
-			return new mejs.MediaElementPlayer(node, o);
-		}
-
-		var t = this;
-
-		// these will be reset after the MediaElement.success fires
-		t.$media = t.$node = $(node);
-		t.node = t.media = t.$media[0];
-
-		if(!t.node) {
-			return;
-		}
-
-		// check for existing player
-		if (typeof t.node.player != 'undefined') {
-			return t.node.player;
-		}
-
-
-		// try to get options from data-mejsoptions
-		if (typeof o == 'undefined') {
-			o = t.$node.data('mejsoptions');
-		}
-
-		// extend default options
-		t.options = $.extend({},mejs.MepDefaults,o);
-
-		if (!t.options.timeFormat) {
-			// Generate the time format according to options
-			t.options.timeFormat = 'mm:ss';
-			if (t.options.alwaysShowHours) {
-				t.options.timeFormat = 'hh:mm:ss';
-			}
-			if (t.options.showTimecodeFrameCount) {
-				t.options.timeFormat += ':ff';
-			}
-		}
-
-		mejs.Utility.calculateTimeFormat(0, t.options, t.options.framesPerSecond || 25);
-
-		// unique ID
-		t.id = 'mep_' + mejs.mepIndex++;
-
-		// add to player array (for focus events)
-		mejs.players[t.id] = t;
-
-		// start up
-		t.init();
-
-		return t;
-	};
-
-	// actual player
-	mejs.MediaElementPlayer.prototype = {
-
-		hasFocus: false,
-
-		controlsAreVisible: true,
-
-		init: function() {
-
-			var
-				t = this,
-				mf = mejs.MediaFeatures,
-				// options for MediaElement (shim)
-				meOptions = $.extend(true, {}, t.options, {
-					success: function(media, domNode) { t.meReady(media, domNode); },
-					error: function(e) { t.handleError(e);}
-				}),
-				tagName = t.media.tagName.toLowerCase();
-
-			t.isDynamic = (tagName !== 'audio' && tagName !== 'video');
-
-			if (t.isDynamic) {
-				// get video from src or href?
-				t.isVideo = t.options.isVideo;
-			} else {
-				t.isVideo = (tagName !== 'audio' && t.options.isVideo);
-			}
-
-			// use native controls in iPad, iPhone, and Android
-			if ((mf.isiPad && t.options.iPadUseNativeControls) || (mf.isiPhone && t.options.iPhoneUseNativeControls)) {
-
-				// add controls and stop
-				t.$media.attr('controls', 'controls');
-
-				// attempt to fix iOS 3 bug
-				//t.$media.removeAttr('poster');
-								// no Issue found on iOS3 -ttroxell
-
-				// override Apple's autoplay override for iPads
-				if (mf.isiPad && t.media.getAttribute('autoplay') !== null) {
-					t.play();
-				}
-
-			} else if (mf.isAndroid && t.options.AndroidUseNativeControls) {
-
-				// leave default player
-
-			} else if (t.isVideo || (!t.isVideo && t.options.features.length)) {
-
-				// DESKTOP: use MediaElementPlayer controls
-
-				// remove native controls
-				t.$media.removeAttr('controls');
-				var videoPlayerTitle = t.isVideo ?
-					mejs.i18n.t('mejs.video-player') : mejs.i18n.t('mejs.audio-player');
-				// insert description for screen readers
-				$('<span class="mejs-offscreen">' + videoPlayerTitle + '</span>').insertBefore(t.$media);
-				// build container
-				t.container =
-					$('<div id="' + t.id + '" class="mejs-container ' + (mejs.MediaFeatures.svgAsImg ? 'svg' : 'no-svg') +
-					  '" tabindex="0" role="application" aria-label="' + videoPlayerTitle + '">'+
-						'<div class="mejs-inner">'+
-							'<div class="mejs-mediaelement"></div>'+
-							'<div class="mejs-layers"></div>'+
-							'<div class="mejs-controls"></div>'+
-							'<div class="mejs-clear"></div>'+
-						'</div>' +
-					'</div>')
-					.addClass(t.$media[0].className)
-					.insertBefore(t.$media)
-					.focus(function ( e ) {
-						if( !t.controlsAreVisible && !t.hasFocus && t.controlsEnabled) {
-							t.showControls(true);
-							// In versions older than IE11, the focus causes the playbar to be displayed
-							// if user clicks on the Play/Pause button in the control bar once it attempts
-							// to hide it
-							if (!t.hasMsNativeFullScreen) {
-								// If e.relatedTarget appears before container, send focus to play button,
-								// else send focus to last control button.
-								var btnSelector = '.mejs-playpause-button > button';
-
-								if (mejs.Utility.isNodeAfter(e.relatedTarget, t.container[0])) {
-									btnSelector = '.mejs-controls .mejs-button:last-child > button';
-								}
-
-								var button = t.container.find(btnSelector);
-								button.focus();
-							}
-						}
-					});
-
-				// When no elements in controls, hide bar completely
-				if (!t.options.features.length) {
-					t.container.css('background', 'transparent').find('.mejs-controls').hide();
-				}
- 
-				if (t.isVideo && t.options.stretching === 'fill' && !t.container.parent('mejs-fill-container').length) {
-					// outer container
-					t.outerContainer = t.$media.parent();
-					t.container.wrap('<div class="mejs-fill-container"/>');
-				}
-
-				// add classes for user and content
-				t.container.addClass(
-					(mf.isAndroid ? 'mejs-android ' : '') +
-					(mf.isiOS ? 'mejs-ios ' : '') +
-					(mf.isiPad ? 'mejs-ipad ' : '') +
-					(mf.isiPhone ? 'mejs-iphone ' : '') +
-					(t.isVideo ? 'mejs-video ' : 'mejs-audio ')
-				);
-
-
-				// move the <video/video> tag into the right spot
-				t.container.find('.mejs-mediaelement').append(t.$media);
-
-				// needs to be assigned here, after iOS remap
-				t.node.player = t;
-
-				// find parts
-				t.controls = t.container.find('.mejs-controls');
-				t.layers = t.container.find('.mejs-layers');
-
-				// determine the size
-
-				/* size priority:
-					(1) videoWidth (forced),
-					(2) style="width;height;"
-					(3) width attribute,
-					(4) defaultVideoWidth (for unspecified cases)
-				*/
-
-				var tagType = (t.isVideo ? 'video' : 'audio'),
-					capsTagName = tagType.substring(0,1).toUpperCase() + tagType.substring(1);
-
-
-
-				if (t.options[tagType + 'Width'] > 0 || t.options[tagType + 'Width'].toString().indexOf('%') > -1) {
-					t.width = t.options[tagType + 'Width'];
-				} else if (t.media.style.width !== '' && t.media.style.width !== null) {
-					t.width = t.media.style.width;
-				} else if (t.media.getAttribute('width') !== null) {
-					t.width = t.$media.attr('width');
-				} else {
-					t.width = t.options['default' + capsTagName + 'Width'];
-				}
-
-				if (t.options[tagType + 'Height'] > 0 || t.options[tagType + 'Height'].toString().indexOf('%') > -1) {
-					t.height = t.options[tagType + 'Height'];
-				} else if (t.media.style.height !== '' && t.media.style.height !== null) {
-					t.height = t.media.style.height;
-				} else if (t.$media[0].getAttribute('height') !== null) {
-					t.height = t.$media.attr('height');
-				} else {
-					t.height = t.options['default' + capsTagName + 'Height'];
-				}
-
-				// set the size, while we wait for the plugins to load below
-				t.setPlayerSize(t.width, t.height);
-
-				// create MediaElementShim
-				meOptions.pluginWidth = t.width;
-				meOptions.pluginHeight = t.height;
-			}
-			// Hide media completely for audio that doesn't have any features
-			else if (!t.isVideo && !t.options.features.length) {
-				t.$media.hide();
-			}
-
-			// create MediaElement shim
-			mejs.MediaElement(t.$media[0], meOptions);
-
-			if (typeof(t.container) !== 'undefined' && t.options.features.length && t.controlsAreVisible) {
-				// controls are shown when loaded
-				t.container.trigger('controlsshown');
-			}
-		},
-
-		showControls: function(doAnimation) {
-			var t = this;
-
-			doAnimation = typeof doAnimation == 'undefined' || doAnimation;
-
-			if (t.controlsAreVisible)
-				return;
-
-			if (doAnimation) {
-				t.controls
-					.removeClass('mejs-offscreen')
-					.stop(true, true).fadeIn(200, function() {
-						t.controlsAreVisible = true;
-						t.container.trigger('controlsshown');
-					});
-
-				// any additional controls people might add and want to hide
-				t.container.find('.mejs-control')
-					.removeClass('mejs-offscreen')
-					.stop(true, true).fadeIn(200, function() {t.controlsAreVisible = true;});
-
-			} else {
-				t.controls
-					.removeClass('mejs-offscreen')
-					.css('display','block');
-
-				// any additional controls people might add and want to hide
-				t.container.find('.mejs-control')
-					.removeClass('mejs-offscreen')
-					.css('display','block');
-
-				t.controlsAreVisible = true;
-				t.container.trigger('controlsshown');
-			}
-
-			t.setControlsSize();
-
-		},
-
-		hideControls: function(doAnimation) {
-			var t = this;
-
-			doAnimation = typeof doAnimation == 'undefined' || doAnimation;
-
-			if (!t.controlsAreVisible || t.options.alwaysShowControls || t.keyboardAction || t.media.paused || t.media.ended)
-				return;
-
-			if (doAnimation) {
-				// fade out main controls
-				t.controls.stop(true, true).fadeOut(200, function() {
-					$(this)
-						.addClass('mejs-offscreen')
-						.css('display','block');
-
-					t.controlsAreVisible = false;
-					t.container.trigger('controlshidden');
-				});
-
-				// any additional controls people might add and want to hide
-				t.container.find('.mejs-control').stop(true, true).fadeOut(200, function() {
-					$(this)
-						.addClass('mejs-offscreen')
-						.css('display','block');
-				});
-			} else {
-
-				// hide main controls
-				t.controls
-					.addClass('mejs-offscreen')
-					.css('display','block');
-
-				// hide others
-				t.container.find('.mejs-control')
-					.addClass('mejs-offscreen')
-					.css('display','block');
-
-				t.controlsAreVisible = false;
-				t.container.trigger('controlshidden');
-			}
-		},
-
-		controlsTimer: null,
-
-		startControlsTimer: function(timeout) {
-
-			var t = this;
-
-			timeout = typeof timeout != 'undefined' ? timeout : t.options.controlsTimeoutDefault;
-
-			t.killControlsTimer('start');
-
-			t.controlsTimer = setTimeout(function() {
-				//
-				t.hideControls();
-				t.killControlsTimer('hide');
-			}, timeout);
-		},
-
-		killControlsTimer: function(src) {
-
-			var t = this;
-
-			if (t.controlsTimer !== null) {
-				clearTimeout(t.controlsTimer);
-				delete t.controlsTimer;
-				t.controlsTimer = null;
-			}
-		},
-
-		controlsEnabled: true,
-
-		disableControls: function() {
-			var t= this;
-
-			t.killControlsTimer();
-			t.hideControls(false);
-			this.controlsEnabled = false;
-		},
-
-		enableControls: function() {
-			var t= this;
-
-			t.showControls(false);
-
-			t.controlsEnabled = true;
-		},
-
-		// Sets up all controls and events
-		meReady: function(media, domNode) {
-			
-			var
-				t = this,
-				mf = mejs.MediaFeatures,
-				autoplayAttr = domNode.getAttribute('autoplay'),
-				autoplay = !(typeof autoplayAttr == 'undefined' || autoplayAttr === null || autoplayAttr === 'false'),
-				featureIndex,
-				feature;
-
-			// make sure it can't create itself again if a plugin reloads
-			if (t.created) {
-				return;
-			} else {
-				t.created = true;
-			}
-
-			t.media = media;
-			t.domNode = domNode;
-
-			if (!(mf.isAndroid && t.options.AndroidUseNativeControls) && !(mf.isiPad && t.options.iPadUseNativeControls) && !(mf.isiPhone && t.options.iPhoneUseNativeControls)) {
-
-				// In the event that no features are specified for audio,
-				// create only MediaElement instance rather than
-				// doing all the work to create a full player
-				if (!t.isVideo && !t.options.features.length) {
-
-					// force autoplay for HTML5
-					if (autoplay && media.pluginType == 'native') {
-						t.play();
-					}
-
-
-					if (t.options.success) {
-
-						if (typeof t.options.success == 'string') {
-							window[t.options.success](t.media, t.domNode, t);
-						} else {
-							t.options.success(t.media, t.domNode, t);
-						}
-					}
-
-					return;
-				}
-
-				// two built in features
-				t.buildposter(t, t.controls, t.layers, t.media);
-				t.buildkeyboard(t, t.controls, t.layers, t.media);
-				t.buildoverlays(t, t.controls, t.layers, t.media);
-
-				// grab for use by features
-				t.findTracks();
-
-				// add user-defined features/controls
-				for (featureIndex in t.options.features) {
-					feature = t.options.features[featureIndex];
-					if (t['build' + feature]) {
-						try {
-							t['build' + feature](t, t.controls, t.layers, t.media);
-						} catch (e) {
-							// TODO: report control error
-							//throw e;
-							
-							
-						}
-					}
-				}
-
-				t.container.trigger('controlsready');
-
-				// reset all layers and controls
-				t.setPlayerSize(t.width, t.height);
-				t.setControlsSize();
-
-
-				// controls fade
-				if (t.isVideo) {
-
-					if (mejs.MediaFeatures.hasTouch && !t.options.alwaysShowControls) {
-
-						// for touch devices (iOS, Android)
-						// show/hide without animation on touch
-
-						t.$media.bind('touchstart', function() {
-
-							// toggle controls
-							if (t.controlsAreVisible) {
-								t.hideControls(false);
-							} else {
-								if (t.controlsEnabled) {
-									t.showControls(false);
-								}
-							}
-						});
-
-					} else {
-
-						// create callback here since it needs access to current
-						// MediaElement object
-						t.clickToPlayPauseCallback = function() {
-							//
-
-							if (t.options.clickToPlayPause) {
-								if (t.media.paused) {
-									t.play();
-								} else {
-									t.pause();
-								}
-
-								var button = t.$media.closest('.mejs-container').find('.mejs-overlay-button'),
-									pressed = button.attr('aria-pressed');
-								button.attr('aria-pressed', !pressed);
-							}
-						};
-
-						// click to play/pause
-						t.media.addEventListener('click', t.clickToPlayPauseCallback, false);
-
-						// show/hide controls
-						t.container
-							.bind('mouseenter', function () {
-								if (t.controlsEnabled) {
-									if (!t.options.alwaysShowControls ) {
-										t.killControlsTimer('enter');
-										t.showControls();
-										t.startControlsTimer(t.options.controlsTimeoutMouseEnter);
-									}
-								}
-							})
-							.bind('mousemove', function() {
-								if (t.controlsEnabled) {
-									if (!t.controlsAreVisible) {
-										t.showControls();
-									}
-									if (!t.options.alwaysShowControls) {
-										t.startControlsTimer(t.options.controlsTimeoutMouseEnter);
-									}
-								}
-							})
-							.bind('mouseleave', function () {
-								if (t.controlsEnabled) {
-									if (!t.media.paused && !t.options.alwaysShowControls) {
-										t.startControlsTimer(t.options.controlsTimeoutMouseLeave);
-									}
-								}
-							});
-					}
-
-					if(t.options.hideVideoControlsOnLoad) {
-						t.hideControls(false);
-					}
-
-					// check for autoplay
-					if (autoplay && !t.options.alwaysShowControls) {
-						t.hideControls();
-					}
-
-					// resizer
-					if (t.options.enableAutosize) {
-						t.media.addEventListener('loadedmetadata', function(e) {
-							// if the <video height> was not set and the options.videoHeight was not set
-							// then resize to the real dimensions
-							if (t.options.videoHeight <= 0 && t.domNode.getAttribute('height') === null && !isNaN(e.target.videoHeight)) {
-								t.setPlayerSize(e.target.videoWidth, e.target.videoHeight);
-								t.setControlsSize();
-								t.media.setVideoSize(e.target.videoWidth, e.target.videoHeight);
-							}
-						}, false);
-					}
-				}
-
-				// EVENTS
-
-				// FOCUS: when a video starts playing, it takes focus from other players (possibly pausing them)
-				t.media.addEventListener('play', function() {
-					var playerIndex;
-
-					// go through all other players
-					for (playerIndex in mejs.players) {
-						var p = mejs.players[playerIndex];
-						if (p.id != t.id && t.options.pauseOtherPlayers && !p.paused && !p.ended) {
-							p.pause();
-						}
-						p.hasFocus = false;
-					}
-
-					t.hasFocus = true;
-				},false);
-
-
-				// ended for all
-				t.media.addEventListener('ended', function (e) {
-					if(t.options.autoRewind) {
-						try{
-							t.media.setCurrentTime(0);
-							// Fixing an Android stock browser bug, where "seeked" isn't fired correctly after ending the video and jumping to the beginning
-							window.setTimeout(function(){
-								$(t.container).find('.mejs-overlay-loading').parent().hide();
-							}, 20);
-						} catch (exp) {
-
-						}
-					}
-					if (t.media.pluginType === 'youtube') {
-						t.media.stop();
-					} else {
-						t.media.pause();
-					}
-
-					if (t.setProgressRail) {
-						t.setProgressRail();
-					}
-					if (t.setCurrentRail) {
-						t.setCurrentRail();
-					}
-
-					if (t.options.loop) {
-						t.play();
-					} else if (!t.options.alwaysShowControls && t.controlsEnabled) {
-						t.showControls();
-					}
-				}, false);
-
-				// resize on the first play
-				t.media.addEventListener('loadedmetadata', function() {
-
-					mejs.Utility.calculateTimeFormat(t.duration, t.options, t.options.framesPerSecond || 25);
-
-					if (t.updateDuration) {
-						t.updateDuration();
-					}
-					if (t.updateCurrent) {
-						t.updateCurrent();
-					}
-
-					if (!t.isFullScreen) {
-						t.setPlayerSize(t.width, t.height);
-						t.setControlsSize();
-					}
-				}, false);
-
-				// Only change the time format when necessary
-				var duration = null;
-				t.media.addEventListener('timeupdate',function() {
-					if (duration !== this.duration) {
-						duration = this.duration;
-						mejs.Utility.calculateTimeFormat(duration, t.options, t.options.framesPerSecond || 25);
-						
-						// make sure to fill in and resize the controls (e.g., 00:00 => 01:13:15
-						if (t.updateDuration) {
-							t.updateDuration();
-						}
-						if (t.updateCurrent) {
-							t.updateCurrent();
-						}
-						t.setControlsSize();
-						
-					}
-				}, false);
-
-				t.container.focusout(function (e) {
-					if( e.relatedTarget ) { //FF is working on supporting focusout https://bugzilla.mozilla.org/show_bug.cgi?id=687787
-						var $target = $(e.relatedTarget);
-						if (t.keyboardAction && $target.parents('.mejs-container').length === 0) {
-							t.keyboardAction = false;
-							if (t.isVideo && !t.options.alwaysShowControls) {
-								t.hideControls(true);
-							}
-
-						}
-					}
-				});
-
-				// webkit has trouble doing this without a delay
-				setTimeout(function () {
-					t.setPlayerSize(t.width, t.height);
-					t.setControlsSize();
-				}, 50);
-
-				// adjust controls whenever window sizes (used to be in fullscreen only)
-				t.globalBind('resize', function() {
-
-					// don't resize for fullscreen mode
-					if ( !(t.isFullScreen || (mejs.MediaFeatures.hasTrueNativeFullScreen && document.webkitIsFullScreen)) ) {
-						t.setPlayerSize(t.width, t.height);
-					}
-
-					// always adjust controls
-					t.setControlsSize();
-				});
-
-				// This is a work-around for a bug in the YouTube iFrame player, which means
-				//	we can't use the play() API for the initial playback on iOS or Android;
-				//	user has to start playback directly by tapping on the iFrame.
-				if (t.media.pluginType == 'youtube' && ( mf.isiOS || mf.isAndroid ) ) {
-					t.container.find('.mejs-overlay-play').hide();
-					t.container.find('.mejs-poster').hide();
-				}
-			}
-
-			// force autoplay for HTML5
-			if (autoplay && media.pluginType == 'native') {
-				t.play();
-			}
-
-
-			if (t.options.success) {
-
-				if (typeof t.options.success == 'string') {
-					window[t.options.success](t.media, t.domNode, t);
-				} else {
-					t.options.success(t.media, t.domNode, t);
-				}
-			}
-		},
-
-		handleError: function(e) {
-			var t = this;
-
-			if (t.controls) {
-				t.controls.hide();
-			}
-
-			// Tell user that the file cannot be played
-			if (t.options.error) {
-				t.options.error(e);
-			}
-		},
-
-		setPlayerSize: function(width,height) {
-			var t = this;
-
-			if( !t.options.setDimensions ) {
-				return false;
-			}
-
-			if (typeof width != 'undefined') {
-				t.width = width;
-			}
-
-			if (typeof height != 'undefined') {
-				t.height = height;
-			}
- 
-			// check stretching modes
-			switch (t.options.stretching) {
-				case 'fill':
-					// The 'fill' effect only makes sense on video; for audio we will set the dimensions
-					if (t.isVideo) {
-						this.setFillMode();
-					} else {
-						this.setDimensions(t.width, t.height);
-					}
-					break;
-				case 'responsive':
-					this.setResponsiveMode();
-					break;
-				case 'none':
-					this.setDimensions(t.width, t.height);
-					break;
-				// This is the 'auto' mode
-				default:
-					if (this.hasFluidMode() === true) {
-						this.setResponsiveMode();
-					} else {
-						this.setDimensions(t.width, t.height);
-					}
-					break;
-			}
-		},
- 
-		hasFluidMode: function() {
-			var t = this;
-	 
-			// detect 100% mode - use currentStyle for IE since css() doesn't return percentages
-			return (t.height.toString().indexOf('%') > 0 || (t.$node.css('max-width') !== 'none' && t.$node.css('max-width') !== 't.width') || (t.$node[0].currentStyle && t.$node[0].currentStyle.maxWidth === '100%'));
-		},
- 
-		setResponsiveMode: function() {
-			var t = this;
-		
-			// do we have the native dimensions yet?
-			var nativeWidth = (function() {
-				if (t.isVideo) {
-					if (t.media.videoWidth && t.media.videoWidth > 0) {
-						return t.media.videoWidth;
-					} else if (t.media.getAttribute('width') !== null) {
-						return t.media.getAttribute('width');
-					} else {
-						return t.options.defaultVideoWidth;
-					}
-				} else {
-					return t.options.defaultAudioWidth;
-				}
-			})();
-		
-			var nativeHeight = (function() {
-				if (t.isVideo) {
-					if (t.media.videoHeight && t.media.videoHeight > 0) {
-						return t.media.videoHeight;
-					} else if (t.media.getAttribute('height') !== null) {
-						return t.media.getAttribute('height');
-					} else {
-						return t.options.defaultVideoHeight;
-					}
-				} else {
-					return t.options.defaultAudioHeight;
-				}
-			})();
-		
-			var parentWidth = t.container.parent().closest(':visible').width(),
-			parentHeight = t.container.parent().closest(':visible').height(),
-			newHeight = t.isVideo || !t.options.autosizeProgress ? parseInt(parentWidth * nativeHeight/nativeWidth, 10) : nativeHeight;
-			
-			// When we use percent, the newHeight can't be calculated so we get the container height
-			if (isNaN(newHeight) || ( parentHeight !== 0 && newHeight > parentHeight && parentHeight > nativeHeight)) {
-				newHeight = parentHeight;
-			}
-		
-			if (t.container.parent().length > 0 && t.container.parent()[0].tagName.toLowerCase() === 'body') { // && t.container.siblings().count == 0) {
-				parentWidth = $(window).width();
-				newHeight = $(window).height();
-			}
-		
-			if ( newHeight && parentWidth ) {
-			
-				// set outer container size
-				t.container
-					.width(parentWidth)
-					.height(newHeight);
-				
-				// set native <video> or <audio> and shims
-				t.$media.add(t.container.find('.mejs-shim'))
-					.width('100%')
-					.height('100%');
-				
-				// if shim is ready, send the size to the embeded plugin
-				if (t.isVideo) {
-					if (t.media.setVideoSize) {
-						t.media.setVideoSize(parentWidth, newHeight);
-					}
-				}
-		
-				// set the layers
-				t.layers.children('.mejs-layer')
-					.width('100%')
-					.height('100%');
-			}
-		},
- 
-		setFillMode: function() {
-			var t = this,
-				parent = t.outerContainer;
- 
-			if (!parent.width()) {
-				parent.height(t.$media.width());
-			}
- 
-			if (!parent.height()) {
-				parent.height(t.$media.height());
-			}
- 
-			var parentWidth = parent.width(),
-				parentHeight = parent.height();
-			
-			t.setDimensions('100%', '100%');
-			
-			// This prevents an issue when displaying poster
-			t.container.find('.mejs-poster img').css('display', 'block');
-			
-			targetElement = t.container.find('object, embed, iframe, video');
-			
-			// calculate new width and height
-			var initHeight = t.height,
-				initWidth = t.width,
-				// scale to the target width
-				scaleX1 = parentWidth,
-				scaleY1 = (initHeight * parentWidth) / initWidth,
-				// scale to the target height
-				scaleX2 = (initWidth * parentHeight) / initHeight,
-				scaleY2 = parentHeight,
-				// now figure out which one we should use
-				bScaleOnWidth = !(scaleX2 > parentWidth),
-				finalWidth = bScaleOnWidth ? Math.floor(scaleX1) : Math.floor(scaleX2),
-				finalHeight = bScaleOnWidth ? Math.floor(scaleY1) : Math.floor(scaleY2);
-			
-			if (bScaleOnWidth) {
-				targetElement.height(finalHeight).width(parentWidth);
-				if (t.media.setVideoSize) {
-					t.media.setVideoSize(parentWidth, finalHeight);
-				}
-			} else {
-				targetElement.height(parentHeight).width(finalWidth);
-				if (t.media.setVideoSize) {
-					t.media.setVideoSize(finalWidth, parentHeight);
-				}
-			}
-			
-			targetElement.css({
-				'margin-left': Math.floor((parentWidth - finalWidth) / 2),
-				'margin-top': 0
-			});
-		},
-	 
-		setDimensions: function(width, height) {
-			var t = this;
-			
-			t.container
-				.width(width)
-				.height(height);
-			
-			t.layers.children('.mejs-layer')
-				.width(width)
-				.height(height);
-		},
-
-		setControlsSize: function() {
-			var t = this,
-				usedWidth = 0,
-				railWidth = 0,
-				rail = t.controls.find('.mejs-time-rail'),
-				total = t.controls.find('.mejs-time-total'),
-				others = rail.siblings(),
-				lastControl = others.last(),
-				lastControlPosition = null,
-				avoidAutosizeProgress = t.options && !t.options.autosizeProgress;
-
-			// skip calculation if hidden
-			if (!t.container.is(':visible') || !rail.length || !rail.is(':visible')) {
-				return;
-			}
-
-			// allow the size to come from custom CSS
-			if (avoidAutosizeProgress) {
-				// Also, frontends devs can be more flexible
-				// due the opportunity of absolute positioning.
-				railWidth = parseInt(rail.css('width'), 10);
-			}
-
-			// attempt to autosize
-			if (railWidth === 0 || !railWidth) {
-
-				// find the size of all the other controls besides the rail
-				others.each(function() {
-					var $this = $(this);
-					if ($this.css('position') != 'absolute' && $this.is(':visible')) {
-						usedWidth += $(this).outerWidth(true);
-					}
-				});
-
-				// fit the rail into the remaining space
-				railWidth = t.controls.width() - usedWidth - (rail.outerWidth(true) - rail.width());
-			}
-
-			// resize the rail,
-			// but then check if the last control (say, the fullscreen button) got pushed down
-			// this often happens when zoomed
-			do {
-				// outer area
-				// we only want to set an inline style with the width of the rail
-				// if we're trying to autosize.
-				if (!avoidAutosizeProgress) {
-					rail.width(railWidth);
-				}
-
-				// dark space
-				total.width(railWidth - (total.outerWidth(true) - total.width()));
-
-				if (lastControl.css('position') != 'absolute') {
-					lastControlPosition = lastControl.length ? lastControl.position() : null;
-					railWidth--;
-				}
-			} while (lastControlPosition !== null && lastControlPosition.top.toFixed(2) > 0 && railWidth > 0);
-
-			t.container.trigger('controlsresize');
-		},
-
-
-		buildposter: function(player, controls, layers, media) {
-			var t = this,
-				poster =
-				$('<div class="mejs-poster mejs-layer">' +
-				'</div>')
-					.appendTo(layers),
-				posterUrl = player.$media.attr('poster');
-
-			// prioriy goes to option (this is useful if you need to support iOS 3.x (iOS completely fails with poster)
-			if (player.options.poster !== '') {
-				posterUrl = player.options.poster;
-			}
-
-			// second, try the real poster
-			if ( posterUrl ) {
-				t.setPoster(posterUrl);
-			} else {
-				poster.hide();
-			}
-
-			media.addEventListener('play',function() {
-				poster.hide();
-			}, false);
-
-			if(player.options.showPosterWhenEnded && player.options.autoRewind){
-				media.addEventListener('ended',function() {
-					poster.show();
-				}, false);
-			}
-		},
-
-		setPoster: function(url) {
-			var t = this,
-				posterDiv = t.container.find('.mejs-poster'),
-				posterImg = posterDiv.find('img');
-
-			if (posterImg.length === 0) {
-				posterImg = $('<img width="100%" height="100%" alt="" />').appendTo(posterDiv);
-			}
-
-			posterImg.attr('src', url);
-			posterDiv.css({'background-image' : 'url(' + url + ')'});
-		},
-
-		buildoverlays: function(player, controls, layers, media) {
-			var t = this;
-			if (!player.isVideo)
-				return;
-
-			var
-			loading =
-				$('<div class="mejs-overlay mejs-layer">'+
-					'<div class="mejs-overlay-loading"><span></span></div>'+
-				'</div>')
-				.hide() // start out hidden
-				.appendTo(layers),
-			error =
-				$('<div class="mejs-overlay mejs-layer">'+
-					'<div class="mejs-overlay-error"></div>'+
-				'</div>')
-				.hide() // start out hidden
-				.appendTo(layers),
-			// this needs to come last so it's on top
-			bigPlay =
-				$('<div class="mejs-overlay mejs-layer mejs-overlay-play">'+
-					'<div class="mejs-overlay-button" role="button" aria-label="' + mejs.i18n.t('mejs.play') + '" aria-pressed="false"></div>'+
-				'</div>')
-				.appendTo(layers)
-				.bind('click', function() {	 // Removed 'touchstart' due issues on Samsung Android devices where a tap on bigPlay started and immediately stopped the video
-					if (t.options.clickToPlayPause) {
-						if (media.paused) {
-							media.play();
-						}
-
-						var button = $(this).find('.mejs-overlay-button'),
-							pressed = button.attr('aria-pressed');
-						button.attr('aria-pressed', !!pressed);
-					}
-				});
-
-			/*
-			if (mejs.MediaFeatures.isiOS || mejs.MediaFeatures.isAndroid) {
-				bigPlay.remove();
-				loading.remove();
-			}
-			*/
-
-
-			// show/hide big play button
-			media.addEventListener('play',function() {
-				bigPlay.hide();
-				loading.hide();
-				controls.find('.mejs-time-buffering').hide();
-				error.hide();
-			}, false);
-
-			media.addEventListener('playing', function() {
-				bigPlay.hide();
-				loading.hide();
-				controls.find('.mejs-time-buffering').hide();
-				error.hide();
-			}, false);
-
-			media.addEventListener('seeking', function() {
-				loading.show();
-				controls.find('.mejs-time-buffering').show();
-			}, false);
-
-			media.addEventListener('seeked', function() {
-				loading.hide();
-				controls.find('.mejs-time-buffering').hide();
-			}, false);
-
-			media.addEventListener('pause',function() {
-				if (!mejs.MediaFeatures.isiPhone) {
-					bigPlay.show();
-				}
-			}, false);
-
-			media.addEventListener('waiting', function() {
-				loading.show();
-				controls.find('.mejs-time-buffering').show();
-			}, false);
-
-
-			// show/hide loading
-			media.addEventListener('loadeddata',function() {
-				// for some reason Chrome is firing this event
-				//if (mejs.MediaFeatures.isChrome && media.getAttribute && media.getAttribute('preload') === 'none')
-				//	return;
-
-				loading.show();
-				controls.find('.mejs-time-buffering').show();
-				// Firing the 'canplay' event after a timeout which isn't getting fired on some Android 4.1 devices (https://github.com/johndyer/mediaelement/issues/1305)
-				if (mejs.MediaFeatures.isAndroid) {
-					media.canplayTimeout = window.setTimeout(
-						function() {
-							if (document.createEvent) {
-								var evt = document.createEvent('HTMLEvents');
-								evt.initEvent('canplay', true, true);
-								return media.dispatchEvent(evt);
-							}
-						}, 300
-					);
-				}
-			}, false);
-			media.addEventListener('canplay',function() {
-				loading.hide();
-				controls.find('.mejs-time-buffering').hide();
-				clearTimeout(media.canplayTimeout); // Clear timeout inside 'loadeddata' to prevent 'canplay' to fire twice
-			}, false);
-
-			// error handling
-			media.addEventListener('error',function(e) {
-				t.handleError(e);
-				loading.hide();
-				bigPlay.hide();
-				error.show();
-				error.find('.mejs-overlay-error').html("Error loading this resource");
-			}, false);
-
-			media.addEventListener('keydown', function(e) {
-				t.onkeydown(player, media, e);
-			}, false);
-		},
-
-		buildkeyboard: function(player, controls, layers, media) {
-
-				var t = this;
-
-				t.container.keydown(function () {
-					t.keyboardAction = true;
-				});
-
-				// listen for key presses
-				t.globalBind('keydown', function(event) {
-					player.hasFocus = $(event.target).closest('.mejs-container').length !== 0
-						&& $(event.target).closest('.mejs-container').attr('id') === player.$media.closest('.mejs-container').attr('id');
-					return t.onkeydown(player, media, event);
-				});
-
-
-				// check if someone clicked outside a player region, then kill its focus
-				t.globalBind('click', function(event) {
-					player.hasFocus = $(event.target).closest('.mejs-container').length !== 0;
-				});
-
-		},
-		onkeydown: function(player, media, e) {
-			if (player.hasFocus && player.options.enableKeyboard) {
-				// find a matching key
-				for (var i = 0, il = player.options.keyActions.length; i < il; i++) {
-					var keyAction = player.options.keyActions[i];
-
-					for (var j = 0, jl = keyAction.keys.length; j < jl; j++) {
-						if (e.keyCode == keyAction.keys[j]) {
-							if (typeof(e.preventDefault) == "function") e.preventDefault();
-							keyAction.action(player, media, e.keyCode, e);
-							return false;
-						}
-					}
-				}
-			}
-
-			return true;
-		},
-
-		findTracks: function() {
-			var t = this,
-				tracktags = t.$media.find('track');
-
-			// store for use by plugins
-			t.tracks = [];
-			tracktags.each(function(index, track) {
-
-				track = $(track);
-
-				t.tracks.push({
-					srclang: (track.attr('srclang')) ? track.attr('srclang').toLowerCase() : '',
-					src: track.attr('src'),
-					kind: track.attr('kind'),
-					label: track.attr('label') || '',
-					entries: [],
-					isLoaded: false
-				});
-			});
-		},
-		changeSkin: function(className) {
-			this.container[0].className = 'mejs-container ' + className;
-			this.setPlayerSize(this.width, this.height);
-			this.setControlsSize();
-		},
-		play: function() {
-			this.load();
-			this.media.play();
-		},
-		pause: function() {
-			try {
-				this.media.pause();
-			} catch (e) {}
-		},
-		load: function() {
-			if (!this.isLoaded) {
-				this.media.load();
-			}
-
-			this.isLoaded = true;
-		},
-		setMuted: function(muted) {
-			this.media.setMuted(muted);
-		},
-		setCurrentTime: function(time) {
-			this.media.setCurrentTime(time);
-		},
-		getCurrentTime: function() {
-			return this.media.currentTime;
-		},
-		setVolume: function(volume) {
-			this.media.setVolume(volume);
-		},
-		getVolume: function() {
-			return this.media.volume;
-		},
-		setSrc: function(src) {
-			var
-				t = this;
-
-			// If using YouTube, its API is different to load a specific source
-			if (t.media.pluginType === 'youtube') {
-				var videoId;
-
-				if (typeof src !== 'string') {
-					var i, media;
-
-					for (i=0; i<src.length; i++) {
-						media = src[i];
-						if (this.canPlayType(media.type)) {
-							src = media.src;
-							break;
-						}
-					}
-				}
-
-				// youtu.be url from share button
-				if (src.lastIndexOf('youtu.be') !== -1) {
-					videoId = src.substr(src.lastIndexOf('/') + 1);
-
-					if (videoId.indexOf('?') !== -1) {
-						videoId = videoId.substr(0, videoId.indexOf('?'));
-					}
-
-				} else {
-					// https://www.youtube.com/watch?v=
-					var videoIdMatch = src.match(/[?&]v=([^&#]+)|&|#|$/);
-
-					if (videoIdMatch) {
-						videoId = videoIdMatch[1];
-					}
-				}
-
-				if (t.media.getAttribute('autoplay') !== null) {
-					t.media.pluginApi.loadVideoById(videoId);
-				} else {
-					t.media.pluginApi.cueVideoById(videoId);
-				}
-
-			}
-			else {
-				t.media.setSrc(src);
-			}
-		},
-		remove: function() {
-			var t = this, featureIndex, feature;
-
-			t.container.prev('.mejs-offscreen').remove();
-
-			// invoke features cleanup
-			for (featureIndex in t.options.features) {
-				feature = t.options.features[featureIndex];
-				if (t['clean' + feature]) {
-					try {
-						t['clean' + feature](t);
-					} catch (e) {
-						// TODO: report control error
-						//throw e;
-						//
-						//
-					}
-				}
-			}
-
-			// grab video and put it back in place
-			if (!t.isDynamic) {
-				t.$media.prop('controls', true);
-				// detach events from the video
-				// TODO: detach event listeners better than this;
-				//		 also detach ONLY the events attached by this plugin!
-				t.$node.clone().insertBefore(t.container).show();
-				t.$node.remove();
-			} else {
-				t.$node.insertBefore(t.container);
-			}
-
-			if (t.media.pluginType !== 'native') {
-				t.media.remove();
-			}
-
-			// Remove the player from the mejs.players object so that pauseOtherPlayers doesn't blow up when trying to pause a non existance flash api.
-			delete mejs.players[t.id];
-
-			if (typeof t.container == 'object') {
-				t.container.remove();
-			}
-			t.globalUnbind();
-			delete t.node.player;
-		},
-		rebuildtracks: function(){
-			var t = this;
-			t.findTracks();
-			t.buildtracks(t, t.controls, t.layers, t.media);
-		},
-		resetSize: function(){
-			var t = this;
-			// webkit has trouble doing this without a delay
-			setTimeout(function () {
-				//
-				t.setPlayerSize(t.width, t.height);
-				t.setControlsSize();
-			}, 50);
-		}
-	};
-
-	(function(){
-		var rwindow = /^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/;
-
-		function splitEvents(events, id) {
-			// add player ID as an event namespace so it's easier to unbind them all later
-			var ret = {d: [], w: []};
-			$.each((events || '').split(' '), function(k, v){
-				var eventname = v + '.' + id;
-				if (eventname.indexOf('.') === 0) {
-					ret.d.push(eventname);
-					ret.w.push(eventname);
-				}
-				else {
-					ret[rwindow.test(v) ? 'w' : 'd'].push(eventname);
-				}
-			});
-			ret.d = ret.d.join(' ');
-			ret.w = ret.w.join(' ');
-			return ret;
-		}
-
-		mejs.MediaElementPlayer.prototype.globalBind = function(events, data, callback) {
-			var t = this;
-			var doc = t.node ? t.node.ownerDocument : document;
-
-			events = splitEvents(events, t.id);
-			if (events.d) $(doc).bind(events.d, data, callback);
-			if (events.w) $(window).bind(events.w, data, callback);
-		};
-
-		mejs.MediaElementPlayer.prototype.globalUnbind = function(events, callback) {
-			var t = this;
-			var doc = t.node ? t.node.ownerDocument : document;
-
-			events = splitEvents(events, t.id);
-			if (events.d) $(doc).unbind(events.d, callback);
-			if (events.w) $(window).unbind(events.w, callback);
-		};
-	})();
-
-	// turn into jQuery plugin
-	if (typeof $ != 'undefined') {
-		$.fn.mediaelementplayer = function (options) {
-			if (options === false) {
-				this.each(function () {
-					var player = $(this).data('mediaelementplayer');
-					if (player) {
-						player.remove();
-					}
-					$(this).removeData('mediaelementplayer');
-				});
-			}
-			else {
-				this.each(function () {
-					$(this).data('mediaelementplayer', new mejs.MediaElementPlayer(this, options));
-				});
-			}
-			return this;
-		};
-
-
-		$(document).ready(function() {
-			// auto enable using JSON attribute
-			$('.mejs-player').mediaelementplayer();
-		});
-	}
-
-	// push out to window
-	window.MediaElementPlayer = mejs.MediaElementPlayer;
-
-})(mejs.$);
-
-(function($) {
-
-	$.extend(mejs.MepDefaults, {
-		playText: '',
-		pauseText: ''
-	});
-
-
-	// PLAY/pause BUTTON
-	$.extend(MediaElementPlayer.prototype, {
-		buildplaypause: function(player, controls, layers, media) {
-			var 
-				t = this,
-				op = t.options,
-				playTitle = op.playText ? op.playText : mejs.i18n.t('mejs.play'),
-				pauseTitle = op.pauseText ? op.pauseText : mejs.i18n.t('mejs.pause'),
-				play =
-				$('<div class="mejs-button mejs-playpause-button mejs-play" >' +
-					'<button type="button" aria-controls="' + t.id + '" title="' + playTitle + '" aria-label="' + pauseTitle + '"></button>' +
-				'</div>')
-				.appendTo(controls)
-				.click(function(e) {
-					e.preventDefault();
-				
-					if (media.paused) {
-						media.play();
-					} else {
-						media.pause();
-					}
-					
-					return false;
-				}),
-				play_btn = play.find('button');
-
-
-			function togglePlayPause(which) {
-				if ('play' === which) {
-					play.removeClass('mejs-play').addClass('mejs-pause');
-					play_btn.attr({
-						'title': pauseTitle,
-						'aria-label': pauseTitle
-					});
-				} else {
-					play.removeClass('mejs-pause').addClass('mejs-play');
-					play_btn.attr({
-						'title': playTitle,
-						'aria-label': playTitle
-					});
-				}
-			};
-			togglePlayPause('pse');
-
-
-			media.addEventListener('play',function() {
-				togglePlayPause('play');
-			}, false);
-			media.addEventListener('playing',function() {
-				togglePlayPause('play');
-			}, false);
-
-
-			media.addEventListener('pause',function() {
-				togglePlayPause('pse');
-			}, false);
-			media.addEventListener('paused',function() {
-				togglePlayPause('pse');
-			}, false);
-		}
-	});
-	
-})(mejs.$);
-
-(function($) {
-
-	$.extend(mejs.MepDefaults, {
-		stopText: 'Stop'
-	});
-
-	// STOP BUTTON
-	$.extend(MediaElementPlayer.prototype, {
-		buildstop: function(player, controls, layers, media) {
-			var t = this;
-
-			$('<div class="mejs-button mejs-stop-button mejs-stop">' +
-					'<button type="button" aria-controls="' + t.id + '" title="' + t.options.stopText + '" aria-label="' + t.options.stopText + '"></button>' +
-				'</div>')
-				.appendTo(controls)
-				.click(function() {
-					if (!media.paused) {
-						media.pause();
-					}
-					if (media.currentTime > 0) {
-						media.setCurrentTime(0);
-                        media.pause();
-						controls.find('.mejs-time-current').width('0px');
-						controls.find('.mejs-time-handle').css('left', '0px');
-						controls.find('.mejs-time-float-current').html( mejs.Utility.secondsToTimeCode(0, player.options));
-						controls.find('.mejs-currenttime').html( mejs.Utility.secondsToTimeCode(0, player.options));
-						layers.find('.mejs-poster').show();
-					}
-				});
-		}
-	});
-	
-})(mejs.$);
-
-(function($) {
-
-	$.extend(mejs.MepDefaults, {
-		// Enable tooltip that shows time in progress bar
-		enableProgressTooltip: true,
-		progressHelpText: ''
-	});
-
-	// progress/loaded bar
-	$.extend(MediaElementPlayer.prototype, {
-		buildprogress: function(player, controls, layers, media) {
-
-			var
-				t = this,
-				mouseIsDown = false,
-				mouseIsOver = false,
-				lastKeyPressTime = 0,
-				startedPaused = false,
-				autoRewindInitial = player.options.autoRewind,
-				progressTitle = t.options.progressHelpText ? t.options.progressHelpText : mejs.i18n.t('mejs.time-help-text'),
-				tooltip = player.options.enableProgressTooltip ? '<span class="mejs-time-float">' +
-					'<span class="mejs-time-float-current">00:00</span>' +
-					'<span class="mejs-time-float-corner"></span>' +
-				'</span>' : "";
-
-			$('<div class="mejs-time-rail">' +
-				'<span  class="mejs-time-total mejs-time-slider">' +
-				//'<span class="mejs-offscreen">' + progressTitle + '</span>' +
-					'<span class="mejs-time-buffering"></span>' +
-					'<span class="mejs-time-loaded"></span>' +
-					'<span class="mejs-time-current"></span>' +
-					'<span class="mejs-time-handle"></span>' +
-					 tooltip +
-				'</span>' +
-			'</div>')
-				.appendTo(controls);
-			controls.find('.mejs-time-buffering').hide();
-
-			t.total = controls.find('.mejs-time-total');
-			t.loaded  = controls.find('.mejs-time-loaded');
-			t.current  = controls.find('.mejs-time-current');
-			t.handle  = controls.find('.mejs-time-handle');
-			t.timefloat  = controls.find('.mejs-time-float');
-			t.timefloatcurrent  = controls.find('.mejs-time-float-current');
-			t.slider = controls.find('.mejs-time-slider');
-
-			var handleMouseMove = function (e) {
-
-					var offset = t.total.offset(),
-						width = t.total.width(),
-						percentage = 0,
-						newTime = 0,
-						pos = 0,
-						x;
-
-					// mouse or touch position relative to the object
-					if (e.originalEvent && e.originalEvent.changedTouches) {
-						x = e.originalEvent.changedTouches[0].pageX;
-					} else if (e.changedTouches) { // for Zepto
-						x = e.changedTouches[0].pageX;
-					} else {
-						x = e.pageX;
-					}
-
-					if (media.duration) {
-						if (x < offset.left) {
-							x = offset.left;
-						} else if (x > width + offset.left) {
-							x = width + offset.left;
-						}
-
-						pos = x - offset.left;
-						percentage = (pos / width);
-						newTime = (percentage <= 0.02) ? 0 : percentage * media.duration;
-
-						// seek to where the mouse is
-						if (mouseIsDown && newTime !== media.currentTime) {
-							media.setCurrentTime(newTime);
-						}
-
-						// position floating time box
-						if (!mejs.MediaFeatures.hasTouch) {
-							t.timefloat.css('left', pos);
-							t.timefloatcurrent.html( mejs.Utility.secondsToTimeCode(newTime, player.options) );
-							t.timefloat.show();
-						}
-					}
-				},
-				// Accessibility for slider
-				updateSlider = function (e) {
-
-					var seconds = media.currentTime,
-						timeSliderText = mejs.i18n.t('mejs.time-slider'),
-						time = mejs.Utility.secondsToTimeCode(seconds, player.options),
-						duration = media.duration;
-
-					t.slider.attr({
-						'aria-label': timeSliderText,
-						'aria-valuemin': 0,
-						'aria-valuemax': duration,
-						'aria-valuenow': seconds,
-						'aria-valuetext': time,
-						'role': 'slider',
-						'tabindex': 0
-					});
-
-				},
-				restartPlayer = function () {
-					var now = new Date();
-					if (now - lastKeyPressTime >= 1000) {
-						media.play();
-					}
-				};
-
-			t.slider.bind('focus', function (e) {
-				player.options.autoRewind = false;
-			});
-
-			t.slider.bind('blur', function (e) {
-				player.options.autoRewind = autoRewindInitial;
-			});
-
-			t.slider.bind('keydown', function (e) {
-
-				if ((new Date() - lastKeyPressTime) >= 1000) {
-					startedPaused = media.paused;
-				}
-
-				var keyCode = e.keyCode,
-					duration = media.duration,
-					seekTime = media.currentTime,
-					seekForward  = player.options.defaultSeekForwardInterval(media),
-					seekBackward = player.options.defaultSeekBackwardInterval(media);
-
-				switch (keyCode) {
-					case 37: // left
-					case 40: // Down
-						seekTime -= seekBackward;
-						break;
-					case 39: // Right
-					case 38: // Up
-						seekTime += seekForward;
-						break;
-					case 36: // Home
-						seekTime = 0;
-						break;
-					case 35: // end
-						seekTime = duration;
-						break;
-					case 32: // space
-					case 13: // enter
-						media.paused ? media.play() : media.pause();
-						return;
-					default:
-						return;
-				}
-
-				seekTime = seekTime < 0 ? 0 : (seekTime >= duration ? duration : Math.floor(seekTime));
-				lastKeyPressTime = new Date();
-				if (!startedPaused) {
-					media.pause();
-				}
-
-				if (seekTime < media.duration && !startedPaused) {
-					setTimeout(restartPlayer, 1100);
-				}
-
-				media.setCurrentTime(seekTime);
-
-				e.preventDefault();
-				e.stopPropagation();
-				return false;
-			});
-
-
-			// handle clicks
-			//controls.find('.mejs-time-rail').delegate('span', 'click', handleMouseMove);
-			t.total
-				.bind('mousedown touchstart', function (e) {
-					// only handle left clicks or touch
-					if (e.which === 1 || e.which === 0) {
-						mouseIsDown = true;
-						handleMouseMove(e);
-						t.globalBind('mousemove.dur touchmove.dur', function(e) {
-							handleMouseMove(e);
-						});
-						t.globalBind('mouseup.dur touchend.dur', function (e) {
-							mouseIsDown = false;
-							if (typeof t.timefloat !== 'undefined') {
-								t.timefloat.hide();
-							}
-							t.globalUnbind('.dur');
-						});
-					}
-				})
-				.bind('mouseenter', function(e) {
-					mouseIsOver = true;
-					t.globalBind('mousemove.dur', function(e) {
-						handleMouseMove(e);
-					});
-					if (typeof t.timefloat !== 'undefined' && !mejs.MediaFeatures.hasTouch) {
-						t.timefloat.show();
-					}
-				})
-				.bind('mouseleave',function(e) {
-					mouseIsOver = false;
-					if (!mouseIsDown) {
-						t.globalUnbind('.dur');
-						if (typeof t.timefloat !== 'undefined') {
-							t.timefloat.hide();
-						}
-					}
-				});
-
-			// loading
-			media.addEventListener('progress', function (e) {
-				player.setProgressRail(e);
-				player.setCurrentRail(e);
-			}, false);
-
-			// current time
-			media.addEventListener('timeupdate', function(e) {
-				player.setProgressRail(e);
-				player.setCurrentRail(e);
-				updateSlider(e);
-			}, false);
-
-			t.container.on('controlsresize', function(e) {
-				player.setProgressRail(e);
-				player.setCurrentRail(e);
-			});
-		},
-		setProgressRail: function(e) {
-
-			var
-				t = this,
-				target = (e !== undefined) ? e.target : t.media,
-				percent = null;
-
-			// newest HTML5 spec has buffered array (FF4, Webkit)
-			if (target && target.buffered && target.buffered.length > 0 && target.buffered.end && target.duration) {
-				// account for a real array with multiple values - always read the end of the last buffer
-				percent = target.buffered.end(target.buffered.length - 1) / target.duration;
-			} 
-			// Some browsers (e.g., FF3.6 and Safari 5) cannot calculate target.bufferered.end()
-			// to be anything other than 0. If the byte count is available we use this instead.
-			// Browsers that support the else if do not seem to have the bufferedBytes value and
-			// should skip to there. Tested in Safari 5, Webkit head, FF3.6, Chrome 6, IE 7/8.
-			else if (target && target.bytesTotal !== undefined && target.bytesTotal > 0 && target.bufferedBytes !== undefined) {
-				percent = target.bufferedBytes / target.bytesTotal;
-			}
-			// Firefox 3 with an Ogg file seems to go this way
-			else if (e && e.lengthComputable && e.total !== 0) {
-				percent = e.loaded / e.total;
-			}
-
-			// finally update the progress bar
-			if (percent !== null) {
-				percent = Math.min(1, Math.max(0, percent));
-				// update loaded bar
-				if (t.loaded && t.total) {
-					t.loaded.width(t.total.width() * percent);
-				}
-			}
-		},
-		setCurrentRail: function() {
-
-			var t = this;
-		
-			if (t.media.currentTime !== undefined && t.media.duration) {
-
-				// update bar and handle
-				if (t.total && t.handle) {
-					var 
-						newWidth = Math.round(t.total.width() * t.media.currentTime / t.media.duration),
-						handlePos = newWidth - Math.round(t.handle.outerWidth(true) / 2);
-
-					t.current.width(newWidth);
-					t.handle.css('left', handlePos);
-				}
-			}
-
-		}
-	});
-})(mejs.$);
-
-(function($) {
-	
-	// options
-	$.extend(mejs.MepDefaults, {
-		duration: -1,
-		timeAndDurationSeparator: '<span> | </span>'
-	});
-
-
-	// current and duration 00:00 / 00:00
-	$.extend(MediaElementPlayer.prototype, {
-		buildcurrent: function(player, controls, layers, media) {
-			var t = this;
-			
-			$('<div class="mejs-time" role="timer" aria-live="off">' +
-					'<span class="mejs-currenttime">' + 
-						mejs.Utility.secondsToTimeCode(0, player.options) +
-                    '</span>'+
-				'</div>')
-			.appendTo(controls);
-			
-			t.currenttime = t.controls.find('.mejs-currenttime');
-
-			media.addEventListener('timeupdate',function() {
-				if (t.controlsAreVisible) {
-					player.updateCurrent();
-				}
-
-			}, false);
-		},
-
-
-		buildduration: function(player, controls, layers, media) {
-			var t = this;
-			
-			if (controls.children().last().find('.mejs-currenttime').length > 0) {
-				$(t.options.timeAndDurationSeparator +
-					'<span class="mejs-duration">' + 
-						mejs.Utility.secondsToTimeCode(t.options.duration, t.options) +
-					'</span>')
-					.appendTo(controls.find('.mejs-time'));
-			} else {
-
-				// add class to current time
-				controls.find('.mejs-currenttime').parent().addClass('mejs-currenttime-container');
-				
-				$('<div class="mejs-time mejs-duration-container">'+
-					'<span class="mejs-duration">' + 
-						mejs.Utility.secondsToTimeCode(t.options.duration, t.options) +
-					'</span>' +
-				'</div>')
-				.appendTo(controls);
-			}
-			
-			t.durationD = t.controls.find('.mejs-duration');
-
-			media.addEventListener('timeupdate',function() {
-				if (t.controlsAreVisible) {
-					player.updateDuration();
-				}
-			}, false);
-		},
-		
-		updateCurrent:  function() {
-			var t = this;
-			
-			var currentTime = t.media.currentTime;
-			
-			if (isNaN(currentTime)) {
-				currentTime = 0;
-			}
-
-			if (t.currenttime) {
-				t.currenttime.html(mejs.Utility.secondsToTimeCode(currentTime, t.options));
-			}
-		},
-		
-		updateDuration: function() {
-			var t = this;
-			
-			var duration = t.media.duration;
-			if (t.options.duration > 0) {
-				duration = t.options.duration;
-			}
-			
-			if (isNaN(duration)) {
-				duration = 0;
-			}
-
-			//Toggle the long video class if the video is longer than an hour.
-			t.container.toggleClass("mejs-long-video", duration > 3600);
-			
-			if (t.durationD && duration > 0) {
-				t.durationD.html(mejs.Utility.secondsToTimeCode(duration, t.options));
-			}		
-		}
-	});
-
-})(mejs.$);
-
-(function ($) {
-
-	$.extend(mejs.MepDefaults, {
-		muteText: mejs.i18n.t('mejs.mute-toggle'),
-		allyVolumeControlText: mejs.i18n.t('mejs.volume-help-text'),
-		hideVolumeOnTouchDevices: true,
-
-		audioVolume: 'horizontal',
-		videoVolume: 'vertical'
-	});
-
-	$.extend(MediaElementPlayer.prototype, {
-		buildvolume: function (player, controls, layers, media) {
-
-			// Android and iOS don't support volume controls
-			if ((mejs.MediaFeatures.isAndroid || mejs.MediaFeatures.isiOS) && this.options.hideVolumeOnTouchDevices)
-				return;
-
-			var t = this,
-				mode = (t.isVideo) ? t.options.videoVolume : t.options.audioVolume,
-				mute = (mode == 'horizontal') ?
-
-					// horizontal version
-					$('<div class="mejs-button mejs-volume-button mejs-mute">' +
-						'<button type="button" aria-controls="' + t.id +
-						'" title="' + t.options.muteText +
-						'" aria-label="' + t.options.muteText +
-						'"></button>' +
-						'</div>' +
-						'<a href="javascript:void(0);" class="mejs-horizontal-volume-slider">' + // outer background
-						'<span class="mejs-offscreen">' + t.options.allyVolumeControlText + '</span>' +
-						'<div class="mejs-horizontal-volume-total"></div>' + // line background
-						'<div class="mejs-horizontal-volume-current"></div>' + // current volume
-						'<div class="mejs-horizontal-volume-handle"></div>' + // handle
-						'</a>'
-					)
-					.appendTo(controls) :
-
-					// vertical version
-					$('<div class="mejs-button mejs-volume-button mejs-mute">' +
-						'<button type="button" aria-controls="' + t.id +
-						'" title="' + t.options.muteText +
-						'" aria-label="' + t.options.muteText +
-						'"></button>' +
-						'<a href="javascript:void(0);" class="mejs-volume-slider">' + // outer background
-						'<span class="mejs-offscreen">' + t.options.allyVolumeControlText + '</span>' +
-						'<div class="mejs-volume-total"></div>' + // line background
-						'<div class="mejs-volume-current"></div>' + // current volume
-						'<div class="mejs-volume-handle"></div>' + // handle
-						'</a>' +
-						'</div>')
-					.appendTo(controls),
-				volumeSlider = t.container.find('.mejs-volume-slider, .mejs-horizontal-volume-slider'),
-				volumeTotal = t.container.find('.mejs-volume-total, .mejs-horizontal-volume-total'),
-				volumeCurrent = t.container.find('.mejs-volume-current, .mejs-horizontal-volume-current'),
-				volumeHandle = t.container.find('.mejs-volume-handle, .mejs-horizontal-volume-handle'),
-
-				positionVolumeHandle = function (volume, secondTry) {
-
-					if (!volumeSlider.is(':visible') && typeof secondTry == 'undefined') {
-						volumeSlider.show();
-						positionVolumeHandle(volume, true);
-						volumeSlider.hide();
-						return;
-					}
-
-					// correct to 0-1
-					volume = Math.max(0, volume);
-					volume = Math.min(volume, 1);
-
-					// adjust mute button style
-					if (volume === 0) {
-						mute.removeClass('mejs-mute').addClass('mejs-unmute');
-						mute.children('button').attr('title', mejs.i18n.t('mejs.unmute')).attr('aria-label', mejs.i18n.t('mejs.unmute'));
-					} else {
-						mute.removeClass('mejs-unmute').addClass('mejs-mute');
-						mute.children('button').attr('title', mejs.i18n.t('mejs.mute')).attr('aria-label', mejs.i18n.t('mejs.mute'));
-					}
-
-					// top/left of full size volume slider background
-					var totalPosition = volumeTotal.position();
-					// position slider
-					if (mode == 'vertical') {
-						var
-							// height of the full size volume slider background
-							totalHeight = volumeTotal.height(),
-
-							// the new top position based on the current volume
-							// 70% volume on 100px height == top:30px
-							newTop = totalHeight - (totalHeight * volume);
-
-						// handle
-						volumeHandle.css('top', Math.round(totalPosition.top + newTop - (volumeHandle.height() / 2)));
-
-						// show the current visibility
-						volumeCurrent.height(totalHeight - newTop);
-						volumeCurrent.css('top', totalPosition.top + newTop);
-					} else {
-						var
-							// height of the full size volume slider background
-							totalWidth = volumeTotal.width(),
-
-							// the new left position based on the current volume
-							newLeft = totalWidth * volume;
-
-						// handle
-						volumeHandle.css('left', Math.round(totalPosition.left + newLeft - (volumeHandle.width() / 2)));
-
-						// rezize the current part of the volume bar
-						volumeCurrent.width(Math.round(newLeft));
-					}
-				},
-				handleVolumeMove = function (e) {
-
-					var volume = null,
-						totalOffset = volumeTotal.offset();
-
-					// calculate the new volume based on the moust position
-					if (mode === 'vertical') {
-
-						var
-							railHeight = volumeTotal.height(),
-							newY = e.pageY - totalOffset.top;
-
-						volume = (railHeight - newY) / railHeight;
-
-						// the controls just hide themselves (usually when mouse moves too far up)
-						if (totalOffset.top === 0 || totalOffset.left === 0) {
-							return;
-						}
-
-					} else {
-						var
-							railWidth = volumeTotal.width(),
-							newX = e.pageX - totalOffset.left;
-
-						volume = newX / railWidth;
-					}
-
-					// ensure the volume isn't outside 0-1
-					volume = Math.max(0, volume);
-					volume = Math.min(volume, 1);
-
-					// position the slider and handle
-					positionVolumeHandle(volume);
-
-					// set the media object (this will trigger the volumechanged event)
-					if (volume === 0) {
-						media.setMuted(true);
-					} else {
-						media.setMuted(false);
-					}
-					media.setVolume(volume);
-				},
-				mouseIsDown = false,
-				mouseIsOver = false;
-
-			// SLIDER
-
-			mute
-			.hover(function () {
-				volumeSlider.show();
-				mouseIsOver = true;
-			}, function () {
-				mouseIsOver = false;
-
-				if (!mouseIsDown && mode == 'vertical') {
-					volumeSlider.hide();
-				}
-			});
-
-			var updateVolumeSlider = function (e) {
-
-				var volume = Math.floor(media.volume * 100);
-
-				volumeSlider.attr({
-					'aria-label': mejs.i18n.t('mejs.volume-slider'),
-					'aria-valuemin': 0,
-					'aria-valuemax': 100,
-					'aria-valuenow': volume,
-					'aria-valuetext': volume + '%',
-					'role': 'slider',
-					'tabindex': 0
-				});
-
-			};
-
-			volumeSlider
-			.bind('mouseover', function () {
-				mouseIsOver = true;
-			})
-			.bind('mousedown', function (e) {
-				handleVolumeMove(e);
-				t.globalBind('mousemove.vol', function (e) {
-					handleVolumeMove(e);
-				});
-				t.globalBind('mouseup.vol', function () {
-					mouseIsDown = false;
-					t.globalUnbind('.vol');
-
-					if (!mouseIsOver && mode == 'vertical') {
-						volumeSlider.hide();
-					}
-				});
-				mouseIsDown = true;
-
-				return false;
-			})
-			.bind('keydown', function (e) {
-				var keyCode = e.keyCode;
-				var volume = media.volume;
-				switch (keyCode) {
-					case 38: // Up
-						volume = Math.min(volume + 0.1, 1);
-						break;
-					case 40: // Down
-						volume = Math.max(0, volume - 0.1);
-						break;
-					default:
-						return true;
-				}
-
-				mouseIsDown = false;
-				positionVolumeHandle(volume);
-				media.setVolume(volume);
-				return false;
-			});
-
-			// MUTE button
-			mute.find('button').click(function () {
-				media.setMuted(!media.muted);
-			});
-
-			//Keyboard input
-			mute.find('button').bind('focus', function () {
-				volumeSlider.show();
-			});
-
-			// listen for volume change events from other sources
-			media.addEventListener('volumechange', function (e) {
-				if (!mouseIsDown) {
-					if (media.muted) {
-						positionVolumeHandle(0);
-						mute.removeClass('mejs-mute').addClass('mejs-unmute');
-					} else {
-						positionVolumeHandle(media.volume);
-						mute.removeClass('mejs-unmute').addClass('mejs-mute');
-					}
-				}
-				updateVolumeSlider(e);
-			}, false);
-
-			// mutes the media and sets the volume icon muted if the initial volume is set to 0
-			if (player.options.startVolume === 0) {
-				media.setMuted(true);
-			}
-
-			// shim gets the startvolume as a parameter, but we have to set it on the native <video> and <audio> elements
-			if (media.pluginType === 'native') {
-				media.setVolume(player.options.startVolume);
-			}
-
-			t.container.on('controlsresize', function () {
-				if (media.muted) {
-					positionVolumeHandle(0);
-					mute.removeClass('mejs-mute').addClass('mejs-unmute');
-				} else {
-					positionVolumeHandle(media.volume);
-					mute.removeClass('mejs-unmute').addClass('mejs-mute');
-				}
-			});
-		}
-	});
-
-})(mejs.$);
-
-(function($) {
-
-	$.extend(mejs.MepDefaults, {
-		usePluginFullScreen: true,
-		newWindowCallback: function() { return '';},
-		fullscreenText: ''
-	});
-
-	$.extend(MediaElementPlayer.prototype, {
-
-		isFullScreen: false,
-
-		isNativeFullScreen: false,
-
-		isInIframe: false,
-							
-		// Possible modes
-		// (1) 'native-native' 	HTML5 video  + browser fullscreen (IE10+, etc.)
-		// (2) 'plugin-native' 	plugin video + browser fullscreen (fails in some versions of Firefox)
-		// (3) 'fullwindow' 	Full window (retains all UI)
-		// usePluginFullScreen = true
-		// (4) 'plugin-click' 	Flash 1 - click through with pointer events
-		// (5) 'plugin-hover' 	Flash 2 - hover popup in flash (IE6-8)		
-		fullscreenMode: '',
-
-		buildfullscreen: function(player, controls, layers, media) {
-
-			if (!player.isVideo)
-				return;
-				
-			player.isInIframe = (window.location != window.parent.location);	
-		
-			// detect on start
-			media.addEventListener('loadstart', function() { player.detectFullscreenMode(); });
-				
-			// build button
-			var t = this,
-				hideTimeout = null,
-				fullscreenTitle = t.options.fullscreenText ? t.options.fullscreenText : mejs.i18n.t('mejs.fullscreen'),
-				fullscreenBtn =
-					$('<div class="mejs-button mejs-fullscreen-button">' +
-						'<button type="button" aria-controls="' + t.id + '" title="' + fullscreenTitle + '" aria-label="' + fullscreenTitle + '"></button>' +
-					'</div>')
-					.appendTo(controls)
-					.on('click', function() {
-						
-						// toggle fullscreen
-						var isFullScreen = (mejs.MediaFeatures.hasTrueNativeFullScreen && mejs.MediaFeatures.isFullScreen()) || player.isFullScreen;
-	
-						if (isFullScreen) {
-							player.exitFullScreen();
-						} else {
-							player.enterFullScreen();
-						}
-					})										
-					.on('mouseover', function() {
-						
-						// very old browsers with a plugin
-						if (t.fullscreenMode == 'plugin-hover') {						
-							if (hideTimeout !== null) {
-								clearTimeout(hideTimeout);
-								delete hideTimeout;
-							}
-	
-							var buttonPos = fullscreenBtn.offset(),
-								containerPos = player.container.offset();
-	
-							media.positionFullscreenButton(buttonPos.left - containerPos.left, buttonPos.top - containerPos.top, true);
-						}
-
-					})
-					.on('mouseout', function() {
-
-						if (t.fullscreenMode == 'plugin-hover') {						
-							if (hideTimeout !== null) {
-								clearTimeout(hideTimeout);
-								delete hideTimeout;
-							}
-	
-							hideTimeout = setTimeout(function() {
-								media.hideFullscreenButton();
-							}, 1500);
-						}
-
-					});
-
-					
-
-			player.fullscreenBtn = fullscreenBtn;
-
-			t.globalBind('keydown',function (e) {
-				if (e.keyCode == 27 && ((mejs.MediaFeatures.hasTrueNativeFullScreen && mejs.MediaFeatures.isFullScreen()) || t.isFullScreen)) {
-					player.exitFullScreen();
-				}
-			});
-			
-			t.normalHeight = 0;
-			t.normalWidth = 0;					
-					
-			// setup native fullscreen event
-			if (mejs.MediaFeatures.hasTrueNativeFullScreen) {
-
-				// chrome doesn't alays fire this in an iframe
-				var fullscreenChanged = function(e) {
-					if (player.isFullScreen) {
-						if (mejs.MediaFeatures.isFullScreen()) {
-							player.isNativeFullScreen = true;
-							// reset the controls once we are fully in full screen
-							player.setControlsSize();
-						} else {
-							player.isNativeFullScreen = false;
-							// when a user presses ESC
-							// make sure to put the player back into place
-							player.exitFullScreen();
-						}
-					}
-				};
-
-				player.globalBind(mejs.MediaFeatures.fullScreenEventName, fullscreenChanged);
-			}
-
-		},
-		
-		detectFullscreenMode: function() {
-			
-			var t = this,
-				mode = '',
-				features = mejs.MediaFeatures;
-			
-			if (features.hasTrueNativeFullScreen && t.media.pluginType === 'native') {
-				mode = 'native-native';
-			} else if (features.hasTrueNativeFullScreen && t.media.pluginType !== 'native' && !features.hasFirefoxPluginMovingProblem) {
-				mode = 'plugin-native';					
-			} else if (t.usePluginFullScreen) { 
-				if (mejs.MediaFeatures.supportsPointerEvents) {
-					mode = 'plugin-click';
-					// this needs some special setup
-					t.createPluginClickThrough();				
-				} else { 
-					mode = 'plugin-hover';
-				}
-				
-			} else {
-				mode = 'fullwindow';
-			}
-			
-			
-			t.fullscreenMode = mode;		
-			return mode;
-		},
-		
-		isPluginClickThroughCreated: false,
-		
-		createPluginClickThrough: function() {
-				
-			var t = this;
-			
-			// don't build twice
-			if (t.isPluginClickThroughCreated) {
-				return;
-			}	
-
-			// allows clicking through the fullscreen button and controls down directly to Flash
-
-			/*
-			 When a user puts his mouse over the fullscreen button, we disable the controls so that mouse events can go down to flash (pointer-events)
-			 We then put a divs over the video and on either side of the fullscreen button
-			 to capture mouse movement and restore the controls once the mouse moves outside of the fullscreen button
-			*/
-
-			var fullscreenIsDisabled = false,
-				restoreControls = function() {
-					if (fullscreenIsDisabled) {
-						// hide the hovers
-						for (var i in hoverDivs) {
-							hoverDivs[i].hide();
-						}
-
-						// restore the control bar
-						t.fullscreenBtn.css('pointer-events', '');
-						t.controls.css('pointer-events', '');
-
-						// prevent clicks from pausing video
-						t.media.removeEventListener('click', t.clickToPlayPauseCallback);
-
-						// store for later
-						fullscreenIsDisabled = false;
-					}
-				},
-				hoverDivs = {},
-				hoverDivNames = ['top', 'left', 'right', 'bottom'],
-				i, len,
-				positionHoverDivs = function() {
-					var fullScreenBtnOffsetLeft = fullscreenBtn.offset().left - t.container.offset().left,
-						fullScreenBtnOffsetTop = fullscreenBtn.offset().top - t.container.offset().top,
-						fullScreenBtnWidth = fullscreenBtn.outerWidth(true),
-						fullScreenBtnHeight = fullscreenBtn.outerHeight(true),
-						containerWidth = t.container.width(),
-						containerHeight = t.container.height();
-
-					for (i in hoverDivs) {
-						hoverDivs[i].css({position: 'absolute', top: 0, left: 0}); //, backgroundColor: '#f00'});
-					}
-
-					// over video, but not controls
-					hoverDivs['top']
-						.width( containerWidth )
-						.height( fullScreenBtnOffsetTop );
-
-					// over controls, but not the fullscreen button
-					hoverDivs['left']
-						.width( fullScreenBtnOffsetLeft )
-						.height( fullScreenBtnHeight )
-						.css({top: fullScreenBtnOffsetTop});
-
-					// after the fullscreen button
-					hoverDivs['right']
-						.width( containerWidth - fullScreenBtnOffsetLeft - fullScreenBtnWidth )
-						.height( fullScreenBtnHeight )
-						.css({top: fullScreenBtnOffsetTop,
-							 left: fullScreenBtnOffsetLeft + fullScreenBtnWidth});
-
-					// under the fullscreen button
-					hoverDivs['bottom']
-						.width( containerWidth )
-						.height( containerHeight - fullScreenBtnHeight - fullScreenBtnOffsetTop )
-						.css({top: fullScreenBtnOffsetTop + fullScreenBtnHeight});
-				};
-
-			t.globalBind('resize', function() {
-				positionHoverDivs();
-			});
-
-			for (i = 0, len = hoverDivNames.length; i < len; i++) {
-				hoverDivs[hoverDivNames[i]] = $('<div class="mejs-fullscreen-hover" />').appendTo(t.container).mouseover(restoreControls).hide();
-			}
-
-			// on hover, kill the fullscreen button's HTML handling, allowing clicks down to Flash
-			fullscreenBtn.on('mouseover',function() {
-
-				if (!t.isFullScreen) {
-
-					var buttonPos = fullscreenBtn.offset(),
-						containerPos = player.container.offset();
-
-					// move the button in Flash into place
-					media.positionFullscreenButton(buttonPos.left - containerPos.left, buttonPos.top - containerPos.top, false);
-
-					// allows click through
-					t.fullscreenBtn.css('pointer-events', 'none');
-					t.controls.css('pointer-events', 'none');
-
-					// restore click-to-play
-					t.media.addEventListener('click', t.clickToPlayPauseCallback);
-
-					// show the divs that will restore things
-					for (i in hoverDivs) {
-						hoverDivs[i].show();
-					}
-
-					positionHoverDivs();
-
-					fullscreenIsDisabled = true;
-				}
-
-			});
-
-			// restore controls anytime the user enters or leaves fullscreen
-			media.addEventListener('fullscreenchange', function(e) {
-				t.isFullScreen = !t.isFullScreen;
-				// don't allow plugin click to pause video - messes with
-				// plugin's controls
-				if (t.isFullScreen) {
-					t.media.removeEventListener('click', t.clickToPlayPauseCallback);
-				} else {
-					t.media.addEventListener('click', t.clickToPlayPauseCallback);
-				}
-				restoreControls();
-			});
-
-
-			// the mouseout event doesn't work on the fullscren button, because we already killed the pointer-events
-			// so we use the document.mousemove event to restore controls when the mouse moves outside the fullscreen button
-
-			t.globalBind('mousemove', function(e) {
-
-				// if the mouse is anywhere but the fullsceen button, then restore it all
-				if (fullscreenIsDisabled) {
-
-					var fullscreenBtnPos = fullscreenBtn.offset();
-
-
-					if (e.pageY < fullscreenBtnPos.top || e.pageY > fullscreenBtnPos.top + fullscreenBtn.outerHeight(true) ||
-						e.pageX < fullscreenBtnPos.left || e.pageX > fullscreenBtnPos.left + fullscreenBtn.outerWidth(true)
-						) {
-
-						fullscreenBtn.css('pointer-events', '');
-						t.controls.css('pointer-events', '');
-
-						fullscreenIsDisabled = false;
-					}
-				}
-			});
-
-
-			t.isPluginClickThroughCreated = true;
-		},		
-
-		cleanfullscreen: function(player) {
-			player.exitFullScreen();
-		},
-
-        containerSizeTimeout: null,
-
-		enterFullScreen: function() {
-
-			var t = this;
-
-			if (mejs.MediaFeatures.isiOS && mejs.MediaFeatures.hasiOSFullScreen && typeof t.media.webkitEnterFullscreen === 'function') {
-			    t.media.webkitEnterFullscreen();
-				return;
-			}
-
-			// set it to not show scroll bars so 100% will work
-            $(document.documentElement).addClass('mejs-fullscreen');
-
-			// store sizing
-			t.normalHeight = t.container.height();
-			t.normalWidth = t.container.width();
-
-
-
-			// attempt to do true fullscreen
-			if (t.fullscreenMode === 'native-native' || t.fullscreenMode === 'plugin-native') {
-
-				mejs.MediaFeatures.requestFullScreen(t.container[0]);
-				//return;
-
-				if (t.isInIframe) {
-					// sometimes exiting from fullscreen doesn't work
-					// notably in Chrome <iframe>. Fixed in version 17
-					setTimeout(function checkFullscreen() {
-
-						if (t.isNativeFullScreen) {
-							var percentErrorMargin = 0.002, // 0.2%
-								windowWidth = $(window).width(),
-								screenWidth = screen.width,
-								absDiff = Math.abs(screenWidth - windowWidth),
-								marginError = screenWidth * percentErrorMargin;
-
-							// check if the video is suddenly not really fullscreen
-							if (absDiff > marginError) {
-								// manually exit
-								t.exitFullScreen();
-							} else {
-								// test again
-								setTimeout(checkFullscreen, 500);
-							}
-						}
-						
-					}, 1000);
-				}
-				
-			} else if (t.fullscreeMode == 'fullwindow') {				
-				// move into position
-				
-			}			
-			
-			// make full size
-			t.container
-				.addClass('mejs-container-fullscreen')
-				.width('100%')
-				.height('100%');
-				//.css({position: 'fixed', left: 0, top: 0, right: 0, bottom: 0, overflow: 'hidden', width: '100%', height: '100%', 'z-index': 1000});
-
-			// Only needed for safari 5.1 native full screen, can cause display issues elsewhere
-			// Actually, it seems to be needed for IE8, too
-			//if (mejs.MediaFeatures.hasTrueNativeFullScreen) {
-				t.containerSizeTimeout = setTimeout(function() {
-					t.container.css({width: '100%', height: '100%'});
-					t.setControlsSize();
-				}, 500);
-			//}
-
-			if (t.media.pluginType === 'native') {
-				t.$media
-					.width('100%')
-					.height('100%');
-			} else {
-				t.container.find('.mejs-shim')
-					.width('100%')
-					.height('100%');	
-				
-				setTimeout(function() {
-					var win = $(window),
-						winW = win.width(),
-						winH = win.height();
-							
-					t.media.setVideoSize(winW,winH);			
-				}, 500);
-			}
-
-			t.layers.children('div')
-				.width('100%')
-				.height('100%');
-
-			if (t.fullscreenBtn) {
-				t.fullscreenBtn
-					.removeClass('mejs-fullscreen')
-					.addClass('mejs-unfullscreen');
-			}
-
-			t.setControlsSize();
-			t.isFullScreen = true;
-
-			var zoomFactor = Math.min(screen.width / t.width, screen.height / t.height);
-			t.container.find('.mejs-captions-text').css('font-size', zoomFactor * 100 + '%');
-			t.container.find('.mejs-captions-text').css('line-height', 'normal');
-			t.container.find('.mejs-captions-position').css('bottom', '45px');
-
-			t.container.trigger('enteredfullscreen');
-		},
-
-		exitFullScreen: function() {
-
-			var t = this;
-
-            // Prevent container from attempting to stretch a second time
-            clearTimeout(t.containerSizeTimeout);
-
-			// firefox can't adjust plugins
-			/*
-			if (t.media.pluginType !== 'native' && mejs.MediaFeatures.isFirefox) {
-				t.media.setFullscreen(false);
-				//player.isFullScreen = false;
-				return;
-			}
-			*/
-
-			// come out of native fullscreen
-			if (mejs.MediaFeatures.hasTrueNativeFullScreen && (mejs.MediaFeatures.isFullScreen() || t.isFullScreen)) {
-				mejs.MediaFeatures.cancelFullScreen();
-			}
-
-			// restore scroll bars to document
-            $(document.documentElement).removeClass('mejs-fullscreen');
-
-			t.container
-				.removeClass('mejs-container-fullscreen')
-				.width(t.normalWidth)
-				.height(t.normalHeight);
-
-			if (t.media.pluginType === 'native') {
-				t.$media
-					.width(t.normalWidth)
-					.height(t.normalHeight);
-			} else {
-				t.container.find('.mejs-shim')
-					.width(t.normalWidth)
-					.height(t.normalHeight);
-
-				t.media.setVideoSize(t.normalWidth, t.normalHeight);
-			}
-
-			t.layers.children('div')
-				.width(t.normalWidth)
-				.height(t.normalHeight);
-
-			t.fullscreenBtn
-				.removeClass('mejs-unfullscreen')
-				.addClass('mejs-fullscreen');
-
-			t.setControlsSize();
-			t.isFullScreen = false;
-
-			t.container.find('.mejs-captions-text').css('font-size','');
-			t.container.find('.mejs-captions-text').css('line-height', '');
-			t.container.find('.mejs-captions-position').css('bottom', '');
-
-			t.container.trigger('exitedfullscreen');
-		}
-	});
-
-})(mejs.$);
-
-(function($) {
-
-	// Speed
-	$.extend(mejs.MepDefaults, {
-
-		// We also support to pass object like this:
-		// [{name: 'Slow', value: '0.75'}, {name: 'Normal', value: '1.00'}, ...]
-		speeds: ['2.00', '1.50', '1.25', '1.00', '0.75'],
-
-		defaultSpeed: '1.00',
-		
-		speedChar: 'x'
-
-	});
-
-	$.extend(MediaElementPlayer.prototype, {
-
-		buildspeed: function(player, controls, layers, media) {
-			var t = this;
-
-			if (t.media.pluginType == 'native') {
-				var 
-					speedButton = null,
-					speedSelector = null,
-					playbackSpeed = null,
-					inputId = null;
-
-				var speeds = [];
-				var defaultInArray = false;
-				for (var i=0, len=t.options.speeds.length; i < len; i++) {
-					var s = t.options.speeds[i];
-					if (typeof(s) === 'string'){
-						speeds.push({
-							name: s + t.options.speedChar,
-							value: s
-						});
-						if(s === t.options.defaultSpeed) {
-							defaultInArray = true;
-						}
-					}
-					else {
-						speeds.push(s);
-						if(s.value === t.options.defaultSpeed) {
-							defaultInArray = true;
-						}
-					}
-				}
-
-				if (!defaultInArray) {
-					speeds.push({
-						name: t.options.defaultSpeed + t.options.speedChar,
-						value: t.options.defaultSpeed
-					});
-				}
-
-				speeds.sort(function(a, b) {
-					return parseFloat(b.value) - parseFloat(a.value);
-				});
-
-				var getSpeedNameFromValue = function(value) {
-					for(i=0,len=speeds.length; i <len; i++) {
-						if (speeds[i].value === value) {
-							return speeds[i].name;
-						}
-					}
-				};
-
-				var html = '<div class="mejs-button mejs-speed-button">' +
-							'<button type="button">' + getSpeedNameFromValue(t.options.defaultSpeed) + '</button>' +
-							'<div class="mejs-speed-selector">' +
-							'<ul>';
-
-				for (i = 0, il = speeds.length; i<il; i++) {
-					inputId = t.id + '-speed-' + speeds[i].value;
-					html += '<li>' + 
-								'<input type="radio" name="speed" ' + 
-											'value="' + speeds[i].value + '" ' +
-											'id="' + inputId + '" ' +
-											(speeds[i].value === t.options.defaultSpeed ? ' checked' : '') +
-											' />' +
-								'<label for="' + inputId + '" ' +
-											(speeds[i].value === t.options.defaultSpeed ? ' class="mejs-speed-selected"' : '') +
-											'>' + speeds[i].name + '</label>' +
-							'</li>';
-				}
-				html += '</ul></div></div>';
-
-				speedButton = $(html).appendTo(controls);
-				speedSelector = speedButton.find('.mejs-speed-selector');
-
-				playbackSpeed = t.options.defaultSpeed;
-
-				media.addEventListener('loadedmetadata', function(e) {
-					if (playbackSpeed) {
-						media.playbackRate = parseFloat(playbackSpeed);
-					}
-				}, true);
-
-				speedSelector
-					.on('click', 'input[type="radio"]', function() {
-						var newSpeed = $(this).attr('value');
-						playbackSpeed = newSpeed;
-						media.playbackRate = parseFloat(newSpeed);
-						speedButton.find('button').html(getSpeedNameFromValue(newSpeed));
-						speedButton.find('.mejs-speed-selected').removeClass('mejs-speed-selected');
-						speedButton.find('input[type="radio"]:checked').next().addClass('mejs-speed-selected');
-					});
-				speedButton
-					.one( 'mouseenter focusin', function() {
-						speedSelector
-							.height(
-								speedButton.find('.mejs-speed-selector ul').outerHeight(true) +
-								speedButton.find('.mejs-speed-translations').outerHeight(true))
-							.css('top', (-1 * speedSelector.height()) + 'px');
-					});
-			}
-		}
-	});
-
-})(mejs.$);
-
-(function($) {
-
-	// add extra default options
-	$.extend(mejs.MepDefaults, {
-		// this will automatically turn on a <track>
-		startLanguage: '',
-
-		tracksText: '',
-
-		// By default, no WAI-ARIA live region - don't make a
-		// screen reader speak captions over an audio track.
-		tracksAriaLive: false,
-
-		// option to remove the [cc] button when no <track kind="subtitles"> are present
-		hideCaptionsButtonWhenEmpty: true,
-
-		// If true and we only have one track, change captions to popup
-		toggleCaptionsButtonWhenOnlyOne: false,
-
-		// #id or .class
-		slidesSelector: ''
-	});
-
-	$.extend(MediaElementPlayer.prototype, {
-
-		hasChapters: false,
-
-		cleartracks: function(player, controls, layers, media){
-			if(player) {
-				if(player.captions) player.captions.remove();
-				if(player.chapters) player.chapters.remove();
-				if(player.captionsText) player.captionsText.remove();
-				if(player.captionsButton) player.captionsButton.remove();
-			}
-		},
-		buildtracks: function(player, controls, layers, media) {
-			if (player.tracks.length === 0)
-				return;
-
-			var t = this,
-				attr = t.options.tracksAriaLive ?
-					'role="log" aria-live="assertive" aria-atomic="false"' : '',
-				tracksTitle = t.options.tracksText ? t.options.tracksText : mejs.i18n.t('mejs.captions-subtitles'),
-				i,
-				kind;
-
-			if (t.domNode.textTracks) { // if browser will do native captions, prefer mejs captions, loop through tracks and hide
-				for (i = t.domNode.textTracks.length - 1; i >= 0; i--) {
-					t.domNode.textTracks[i].mode = "hidden";
-				}
-			}
-			t.cleartracks(player, controls, layers, media);
-			player.chapters =
-					$('<div class="mejs-chapters mejs-layer"></div>')
-						.prependTo(layers).hide();
-			player.captions =
-					$('<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position mejs-captions-position-hover" ' +
-					attr + '><span class="mejs-captions-text"></span></div></div>')
-						.prependTo(layers).hide();
-			player.captionsText = player.captions.find('.mejs-captions-text');
-			player.captionsButton =
-					$('<div class="mejs-button mejs-captions-button">'+
-						'<button type="button" aria-controls="' + t.id + '" title="' + tracksTitle + '" aria-label="' + tracksTitle + '"></button>'+
-						'<div class="mejs-captions-selector">'+
-							'<ul>'+
-								'<li>'+
-									'<input type="radio" name="' + player.id + '_captions" id="' + player.id + '_captions_none" value="none" checked="checked" />' +
-									'<label for="' + player.id + '_captions_none">' + mejs.i18n.t('mejs.none') +'</label>'+
-								'</li>'	+
-							'</ul>'+
-						'</div>'+
-					'</div>')
-						.appendTo(controls);
-
-
-			var subtitleCount = 0;
-			for (i=0; i<player.tracks.length; i++) {
-				kind = player.tracks[i].kind;
-				if (kind === 'subtitles' || kind === 'captions') {
-					subtitleCount++;
-				}
-			}
-
-			// if only one language then just make the button a toggle
-			if (t.options.toggleCaptionsButtonWhenOnlyOne && subtitleCount == 1){
-				// click
-				player.captionsButton.on('click',function() {
-					if (player.selectedTrack === null) {
-						lang = player.tracks[0].srclang;
-					} else {
-						lang = 'none';
-					}
-					player.setTrack(lang);
-				});
-			} else {
-				// hover or keyboard focus
-				player.captionsButton.on( 'mouseenter focusin', function() {
-					$(this).find('.mejs-captions-selector').removeClass('mejs-offscreen');
-				})
-
-				// handle clicks to the language radio buttons
-				.on('click','input[type=radio]',function() {
-					lang = this.value;
-					player.setTrack(lang);
-				});
-
-				player.captionsButton.on( 'mouseleave focusout', function() {
-					$(this).find(".mejs-captions-selector").addClass("mejs-offscreen");
-				});
-
-			}
-
-			if (!player.options.alwaysShowControls) {
-				// move with controls
-				player.container
-					.bind('controlsshown', function () {
-						// push captions above controls
-						player.container.find('.mejs-captions-position').addClass('mejs-captions-position-hover');
-
-					})
-					.bind('controlshidden', function () {
-						if (!media.paused) {
-							// move back to normal place
-							player.container.find('.mejs-captions-position').removeClass('mejs-captions-position-hover');
-						}
-					});
-			} else {
-				player.container.find('.mejs-captions-position').addClass('mejs-captions-position-hover');
-			}
-
-			player.trackToLoad = -1;
-			player.selectedTrack = null;
-			player.isLoadingTrack = false;
-
-			// add to list
-			for (i=0; i<player.tracks.length; i++) {
-				kind = player.tracks[i].kind;
-				if (kind === 'subtitles' || kind === 'captions') {
-					player.addTrackButton(player.tracks[i].srclang, player.tracks[i].label);
-				}
-			}
-
-			// start loading tracks
-			player.loadNextTrack();
-
-			media.addEventListener('timeupdate',function() {
-				player.displayCaptions();
-			}, false);
-
-			if (player.options.slidesSelector !== '') {
-				player.slidesContainer = $(player.options.slidesSelector);
-
-				media.addEventListener('timeupdate',function() {
-					player.displaySlides();
-				}, false);
-
-			}
-
-			media.addEventListener('loadedmetadata', function() {
-				player.displayChapters();
-			}, false);
-
-			player.container.hover(
-				function () {
-					// chapters
-					if (player.hasChapters) {
-						player.chapters.removeClass('mejs-offscreen');
-						player.chapters.fadeIn(200).height(player.chapters.find('.mejs-chapter').outerHeight());
-					}
-				},
-				function () {
-					if (player.hasChapters && !media.paused) {
-						player.chapters.fadeOut(200, function() {
-							$(this).addClass('mejs-offscreen');
-							$(this).css('display','block');
-						});
-					}
-				});
-
-			t.container.on('controlsresize', function() {
-				t.adjustLanguageBox();
-			});
-
-			// check for autoplay
-			if (player.node.getAttribute('autoplay') !== null) {
-				player.chapters.addClass('mejs-offscreen');
-			}
-		},
-
-		setTrack: function(lang){
-
-			var t = this,
-				i;
-
-			if (lang == 'none') {
-				t.selectedTrack = null;
-				t.captionsButton.removeClass('mejs-captions-enabled');
-			} else {
-				for (i=0; i<t.tracks.length; i++) {
-					if (t.tracks[i].srclang == lang) {
-						if (t.selectedTrack === null)
-							t.captionsButton.addClass('mejs-captions-enabled');
-						t.selectedTrack = t.tracks[i];
-						t.captions.attr('lang', t.selectedTrack.srclang);
-						t.displayCaptions();
-						break;
-					}
-				}
-			}
-		},
-
-		loadNextTrack: function() {
-			var t = this;
-
-			t.trackToLoad++;
-			if (t.trackToLoad < t.tracks.length) {
-				t.isLoadingTrack = true;
-				t.loadTrack(t.trackToLoad);
-			} else {
-				// add done?
-				t.isLoadingTrack = false;
-
-				t.checkForTracks();
-			}
-		},
-
-		loadTrack: function(index){
-			var
-				t = this,
-				track = t.tracks[index],
-				after = function() {
-
-					track.isLoaded = true;
-
-					t.enableTrackButton(track.srclang, track.label);
-
-					t.loadNextTrack();
-
-				};
-
-
-			if (track.src !== undefined || track.src !== "") {
-				$.ajax({
-					url: track.src,
-					dataType: "text",
-					success: function(d) {
-
-						// parse the loaded file
-						if (typeof d == "string" && (/<tt\s+xml/ig).exec(d)) {
-							track.entries = mejs.TrackFormatParser.dfxp.parse(d);
-						} else {
-							track.entries = mejs.TrackFormatParser.webvtt.parse(d);
-						}
-
-						after();
-
-						if (track.kind == 'chapters') {
-							t.media.addEventListener('play', function() {
-								if (t.media.duration > 0) {
-									t.displayChapters(track);
-								}
-							}, false);
-						}
-
-						if (track.kind == 'slides') {
-							t.setupSlides(track);
-						}
-					},
-					error: function() {
-						t.removeTrackButton(track.srclang);
-						t.loadNextTrack();
-					}
-				});
-			}
-		},
-
-		enableTrackButton: function(lang, label) {
-			var t = this;
-
-			if (label === '') {
-				label = mejs.language.codes[lang] || lang;
-			}
-
-			t.captionsButton
-				.find('input[value=' + lang + ']')
-					.prop('disabled',false)
-				.siblings('label')
-					.html( label );
-
-			// auto select
-			if (t.options.startLanguage == lang) {
-				$('#' + t.id + '_captions_' + lang).prop('checked', true).trigger('click');
-			}
-
-			t.adjustLanguageBox();
-		},
-
-		removeTrackButton: function(lang) {
-			var t = this;
-
-			t.captionsButton.find('input[value=' + lang + ']').closest('li').remove();
-
-			t.adjustLanguageBox();
-		},
-
-		addTrackButton: function(lang, label) {
-			var t = this;
-			if (label === '') {
-				label = mejs.language.codes[lang] || lang;
-			}
-
-			t.captionsButton.find('ul').append(
-				$('<li>'+
-					'<input type="radio" name="' + t.id + '_captions" id="' + t.id + '_captions_' + lang + '" value="' + lang + '" disabled="disabled" />' +
-					'<label for="' + t.id + '_captions_' + lang + '">' + label + ' (loading)' + '</label>'+
-				'</li>')
-			);
-
-			t.adjustLanguageBox();
-
-			// remove this from the dropdownlist (if it exists)
-			t.container.find('.mejs-captions-translations option[value=' + lang + ']').remove();
-		},
-
-		adjustLanguageBox:function() {
-			var t = this;
-			// adjust the size of the outer box
-			t.captionsButton.find('.mejs-captions-selector').height(
-				t.captionsButton.find('.mejs-captions-selector ul').outerHeight(true) +
-				t.captionsButton.find('.mejs-captions-translations').outerHeight(true)
-			);
-		},
-
-		checkForTracks: function() {
-			var
-				t = this,
-				hasSubtitles = false;
-
-			// check if any subtitles
-			if (t.options.hideCaptionsButtonWhenEmpty) {
-				for (var i=0; i<t.tracks.length; i++) {
-					var kind = t.tracks[i].kind;
-					if ((kind === 'subtitles' || kind === 'captions') && t.tracks[i].isLoaded) {
-						hasSubtitles = true;
-						break;
-					}
-				}
-
-				if (!hasSubtitles) {
-					t.captionsButton.hide();
-					t.setControlsSize();
-				}
-			}
-		},
-
-		displayCaptions: function() {
-
-			if (typeof this.tracks == 'undefined')
-				return;
-
-			var
-				t = this,
-				i,
-				track = t.selectedTrack;
-
-			if (track !== null && track.isLoaded) {
-				for (i=0; i<track.entries.times.length; i++) {
-					if (t.media.currentTime >= track.entries.times[i].start && t.media.currentTime <= track.entries.times[i].stop) {
-						// Set the line before the timecode as a class so the cue can be targeted if needed
-						t.captionsText.html(track.entries.text[i]).attr('class', 'mejs-captions-text ' + (track.entries.times[i].identifier || ''));
-						t.captions.show().height(0);
-						return; // exit out if one is visible;
-					}
-				}
-				t.captions.hide();
-			} else {
-				t.captions.hide();
-			}
-		},
-
-		setupSlides: function(track) {
-			var t = this;
-
-			t.slides = track;
-			t.slides.entries.imgs = [t.slides.entries.text.length];
-			t.showSlide(0);
-
-		},
-
-		showSlide: function(index) {
-			if (typeof this.tracks == 'undefined' || typeof this.slidesContainer == 'undefined') {
-				return;
-			}
-
-			var t = this,
-				url = t.slides.entries.text[index],
-				img = t.slides.entries.imgs[index];
-
-			if (typeof img == 'undefined' || typeof img.fadeIn == 'undefined') {
-
-				t.slides.entries.imgs[index] = img = $('<img src="' + url + '">')
-						.on('load', function() {
-							img.appendTo(t.slidesContainer)
-								.hide()
-								.fadeIn()
-								.siblings(':visible')
-									.fadeOut();
-
-						});
-
-			} else {
-
-				if (!img.is(':visible') && !img.is(':animated')) {
-
-					//
-
-					img.fadeIn()
-						.siblings(':visible')
-							.fadeOut();
-				}
-			}
-
-		},
-
-		displaySlides: function() {
-
-			if (typeof this.slides == 'undefined')
-				return;
-
-			var
-				t = this,
-				slides = t.slides,
-				i;
-
-			for (i=0; i<slides.entries.times.length; i++) {
-				if (t.media.currentTime >= slides.entries.times[i].start && t.media.currentTime <= slides.entries.times[i].stop){
-
-					t.showSlide(i);
-
-					return; // exit out if one is visible;
-				}
-			}
-		},
-
-		displayChapters: function() {
-			var
-				t = this,
-				i;
-
-			for (i=0; i<t.tracks.length; i++) {
-				if (t.tracks[i].kind == 'chapters' && t.tracks[i].isLoaded) {
-					t.drawChapters(t.tracks[i]);
-					t.hasChapters = true;
-					break;
-				}
-			}
-		},
-
-		drawChapters: function(chapters) {
-			var
-				t = this,
-				i,
-				dur,
-				//width,
-				//left,
-				percent = 0,
-				usedPercent = 0;
-
-			t.chapters.empty();
-
-			for (i=0; i<chapters.entries.times.length; i++) {
-				dur = chapters.entries.times[i].stop - chapters.entries.times[i].start;
-				percent = Math.floor(dur / t.media.duration * 100);
-				if (percent + usedPercent > 100 || // too large
-					i == chapters.entries.times.length-1 && percent + usedPercent < 100) // not going to fill it in
-					{
-					percent = 100 - usedPercent;
-				}
-				//width = Math.floor(t.width * dur / t.media.duration);
-				//left = Math.floor(t.width * chapters.entries.times[i].start / t.media.duration);
-				//if (left + width > t.width) {
-				//	width = t.width - left;
-				//}
-
-				t.chapters.append( $(
-					'<div class="mejs-chapter" rel="' + chapters.entries.times[i].start + '" style="left: ' + usedPercent.toString() + '%;width: ' + percent.toString() + '%;">' +
-						'<div class="mejs-chapter-block' + ((i==chapters.entries.times.length-1) ? ' mejs-chapter-block-last' : '') + '">' +
-							'<span class="ch-title">' + chapters.entries.text[i] + '</span>' +
-							'<span class="ch-time">' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].start, t.options) + '&ndash;' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].stop, t.options) + '</span>' +
-						'</div>' +
-					'</div>'));
-				usedPercent += percent;
-			}
-
-			t.chapters.find('div.mejs-chapter').click(function() {
-				t.media.setCurrentTime( parseFloat( $(this).attr('rel') ) );
-				if (t.media.paused) {
-					t.media.play();
-				}
-			});
-
-			t.chapters.show();
-		}
-	});
-
-
-
-	mejs.language = {
-		codes:  {
-			af:'Afrikaans',
-			sq:'Albanian',
-			ar:'Arabic',
-			be:'Belarusian',
-			bg:'Bulgarian',
-			ca:'Catalan',
-			zh:'Chinese',
-			'zh-cn':'Chinese Simplified',
-			'zh-tw':'Chinese Traditional',
-			hr:'Croatian',
-			cs:'Czech',
-			da:'Danish',
-			nl:'Dutch',
-			en:'English',
-			et:'Estonian',
-			fl:'Filipino',
-			fi:'Finnish',
-			fr:'French',
-			gl:'Galician',
-			de:'German',
-			el:'Greek',
-			ht:'Haitian Creole',
-			iw:'Hebrew',
-			hi:'Hindi',
-			hu:'Hungarian',
-			is:'Icelandic',
-			id:'Indonesian',
-			ga:'Irish',
-			it:'Italian',
-			ja:'Japanese',
-			ko:'Korean',
-			lv:'Latvian',
-			lt:'Lithuanian',
-			mk:'Macedonian',
-			ms:'Malay',
-			mt:'Maltese',
-			no:'Norwegian',
-			fa:'Persian',
-			pl:'Polish',
-			pt:'Portuguese',
-			// 'pt-pt':'Portuguese (Portugal)',
-			ro:'Romanian',
-			ru:'Russian',
-			sr:'Serbian',
-			sk:'Slovak',
-			sl:'Slovenian',
-			es:'Spanish',
-			sw:'Swahili',
-			sv:'Swedish',
-			tl:'Tagalog',
-			th:'Thai',
-			tr:'Turkish',
-			uk:'Ukrainian',
-			vi:'Vietnamese',
-			cy:'Welsh',
-			yi:'Yiddish'
-		}
-	};
-
-	/*
-	Parses WebVTT format which should be formatted as
-	================================
-	WEBVTT
-
-	1
-	00:00:01,1 --> 00:00:05,000
-	A line of text
-
-	2
-	00:01:15,1 --> 00:02:05,000
-	A second line of text
-
-	===============================
-
-	Adapted from: http://www.delphiki.com/html5/playr
-	*/
-	mejs.TrackFormatParser = {
-		webvtt: {
-			pattern_timecode: /^((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/,
-
-			parse: function(trackText) {
-				var
-					i = 0,
-					lines = mejs.TrackFormatParser.split2(trackText, /\r?\n/),
-					entries = {text:[], times:[]},
-					timecode,
-					text,
-					identifier;
-				for(; i<lines.length; i++) {
-					timecode = this.pattern_timecode.exec(lines[i]);
-
-					if (timecode && i<lines.length) {
-						if ((i - 1) >= 0 && lines[i - 1] !== '') {
-							identifier = lines[i - 1];
-						}
-						i++;
-						// grab all the (possibly multi-line) text that follows
-						text = lines[i];
-						i++;
-						while(lines[i] !== '' && i<lines.length){
-							text = text + '\n' + lines[i];
-							i++;
-						}
-						text = $.trim(text).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>");
-						// Text is in a different array so I can use .join
-						entries.text.push(text);
-						entries.times.push(
-						{
-							identifier: identifier,
-							start: (mejs.Utility.convertSMPTEtoSeconds(timecode[1]) === 0) ? 0.200 : mejs.Utility.convertSMPTEtoSeconds(timecode[1]),
-							stop: mejs.Utility.convertSMPTEtoSeconds(timecode[3]),
-							settings: timecode[5]
-						});
-					}
-					identifier = '';
-				}
-				return entries;
-			}
-		},
-		// Thanks to Justin Capella: https://github.com/johndyer/mediaelement/pull/420
-		dfxp: {
-			parse: function(trackText) {
-				trackText = $(trackText).filter("tt");
-				var
-					i = 0,
-					container = trackText.children("div").eq(0),
-					lines = container.find("p"),
-					styleNode = trackText.find("#" + container.attr("style")),
-					styles,
-					text,
-					entries = {text:[], times:[]};
-
-
-				if (styleNode.length) {
-					var attributes = styleNode.removeAttr("id").get(0).attributes;
-					if (attributes.length) {
-						styles = {};
-						for (i = 0; i < attributes.length; i++) {
-							styles[attributes[i].name.split(":")[1]] = attributes[i].value;
-						}
-					}
-				}
-
-				for(i = 0; i<lines.length; i++) {
-					var style;
-					var _temp_times = {
-						start: null,
-						stop: null,
-						style: null
-					};
-					if (lines.eq(i).attr("begin")) _temp_times.start = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i).attr("begin"));
-					if (!_temp_times.start && lines.eq(i-1).attr("end")) _temp_times.start = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i-1).attr("end"));
-					if (lines.eq(i).attr("end")) _temp_times.stop = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i).attr("end"));
-					if (!_temp_times.stop && lines.eq(i+1).attr("begin")) _temp_times.stop = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i+1).attr("begin"));
-					if (styles) {
-						style = "";
-						for (var _style in styles) {
-							style += _style + ":" + styles[_style] + ";";
-						}
-					}
-					if (style) _temp_times.style = style;
-					if (_temp_times.start === 0) _temp_times.start = 0.200;
-					entries.times.push(_temp_times);
-					text = $.trim(lines.eq(i).html()).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>");
-					entries.text.push(text);
-				}
-				return entries;
-			}
-		},
-		split2: function (text, regex) {
-			// normal version for compliant browsers
-			// see below for IE fix
-			return text.split(regex);
-		}
-	};
-
-	// test for browsers with bad String.split method.
-	if ('x\n\ny'.split(/\n/gi).length != 3) {
-		// add super slow IE8 and below version
-		mejs.TrackFormatParser.split2 = function(text, regex) {
-			var
-				parts = [],
-				chunk = '',
-				i;
-
-			for (i=0; i<text.length; i++) {
-				chunk += text.substring(i,i+1);
-				if (regex.test(chunk)) {
-					parts.push(chunk.replace(regex, ''));
-					chunk = '';
-				}
-			}
-			parts.push(chunk);
-			return parts;
-		};
-	}
-
-})(mejs.$);
-
-// Source Chooser Plugin
-(function($) {
-
-	$.extend(mejs.MepDefaults, {
-		sourcechooserText: ''
-	});
-
-	$.extend(MediaElementPlayer.prototype, {
-		buildsourcechooser: function(player, controls, layers, media) {
-
-			var
-				t = this,
-				sourceTitle = t.options.sourcechooserText ? t.options.sourcechooserText : mejs.i18n.t('mejs.source-chooser'),
-				hoverTimeout
-			;
-
-			player.sourcechooserButton =
-				$('<div class="mejs-button mejs-sourcechooser-button">'+
-						'<button type="button" role="button" aria-haspopup="true" aria-owns="' + t.id + '" title="' + sourceTitle + '" aria-label="' + sourceTitle + '"></button>'+
-						'<div class="mejs-sourcechooser-selector mejs-offscreen" role="menu" aria-expanded="false" aria-hidden="true">'+
-							'<ul>'+
-							'</ul>'+
-						'</div>'+
-					'</div>')
-					.appendTo(controls)
-
-					// hover
-					.hover(function() {
-						clearTimeout(hoverTimeout);
-						player.showSourcechooserSelector();
-					}, function() {
-						var self = $(this);
-						hoverTimeout = setTimeout(function () {
-						player.hideSourcechooserSelector();
-						}, 500);
-					})
-
-					// keyboard menu activation
-					.on('keydown', function (e) {
-						var keyCode = e.keyCode;
-
-						switch (keyCode) {
-							case 32: // space
-								if (!mejs.MediaFeatures.isFirefox) { // space sends the click event in Firefox
-									player.showSourcechooserSelector();
-								}
-								$(this).find('.mejs-sourcechooser-selector')
-									.find('input[type=radio]:checked').first().focus();
-								break;
-							case 13: // enter
-								player.showSourcechooserSelector();
-								$(this).find('.mejs-sourcechooser-selector')
-									.find('input[type=radio]:checked').first().focus();
-								break;
-							case 27: // esc
-								player.hideSourcechooserSelector();
-								$(this).find('button').focus();
-								break;
-							default:
-								return true;
-								}
-							})
-
-					// close menu when tabbing away
-					.on('focusout', mejs.Utility.debounce(function (e) { // Safari triggers focusout multiple times
-						// Firefox does NOT support e.relatedTarget to see which element
-						// just lost focus, so wait to find the next focused element
-						setTimeout(function () {
-							var parent = $(document.activeElement).closest('.mejs-sourcechooser-selector');
-							if (!parent.length) {
-								// focus is outside the control; close menu
-								player.hideSourcechooserSelector();
-							}
-						}, 0);
-					}, 100))
-
-					// handle clicks to the source radio buttons
-					.delegate('input[type=radio]', 'click', function() {
-						// set aria states
-						$(this).attr('aria-selected', true).attr('checked', 'checked');
-						$(this).closest('.mejs-sourcechooser-selector').find('input[type=radio]').not(this).attr('aria-selected', 'false').removeAttr('checked');
-
-						var src = this.value;
-
-						if (media.currentSrc != src) {
-							var currentTime = media.currentTime;
-							var paused = media.paused;
-							media.pause();
-							media.setSrc(src);
-
-							media.addEventListener('loadedmetadata', function(e) {
-								media.currentTime = currentTime;
-							}, true);
-
-							var canPlayAfterSourceSwitchHandler = function(e) {
-								if (!paused) {
-									media.play();
-								}
-								media.removeEventListener("canplay", canPlayAfterSourceSwitchHandler, true);
-							};
-							media.addEventListener('canplay', canPlayAfterSourceSwitchHandler, true);
-							media.load();
-						}
-					})
-
-					// Handle click so that screen readers can toggle the menu
-					.delegate('button', 'click', function (e) {
-						if ($(this).siblings('.mejs-sourcechooser-selector').hasClass('mejs-offscreen')) {
-							player.showSourcechooserSelector();
-							$(this).siblings('.mejs-sourcechooser-selector').find('input[type=radio]:checked').first().focus();
-						} else {
-							player.hideSourcechooserSelector();
-						}
-					});
-
-			// add to list
-			for (var i in this.node.children) {
-				var src = this.node.children[i];
-				if (src.nodeName === 'SOURCE' && (media.canPlayType(src.type) == 'probably' || media.canPlayType(src.type) == 'maybe')) {
-					player.addSourceButton(src.src, src.title, src.type, media.src == src.src);
-				}
-			}
-		},
-
-		addSourceButton: function(src, label, type, isCurrent) {
-			var t = this;
-			if (label === '' || label == undefined) {
-				label = src;
-			}
-			type = type.split('/')[1];
-
-			t.sourcechooserButton.find('ul').append(
-				$('<li>'+
-						'<input type="radio" name="' + t.id + '_sourcechooser" id="' + t.id + '_sourcechooser_' + label + type + '" role="menuitemradio" value="' + src + '" ' + (isCurrent ? 'checked="checked"' : '') + 'aria-selected="' + isCurrent + '"' + ' />'+
-						'<label for="' + t.id + '_sourcechooser_' + label + type + '" aria-hidden="true">' + label + ' (' + type + ')</label>'+
-					'</li>')
-			);
-
-			t.adjustSourcechooserBox();
-
-		},
-
-		adjustSourcechooserBox: function() {
-			var t = this;
-			// adjust the size of the outer box
-			t.sourcechooserButton.find('.mejs-sourcechooser-selector').height(
-				t.sourcechooserButton.find('.mejs-sourcechooser-selector ul').outerHeight(true)
-			);
-		},
-
-		hideSourcechooserSelector: function () {
-			this.sourcechooserButton.find('.mejs-sourcechooser-selector')
-				.addClass('mejs-offscreen')
-				.attr('aria-expanded', 'false')
-				.attr('aria-hidden', 'true')
-				.find('input[type=radio]') // make radios not fucusable
-				.attr('tabindex', '-1');
-		},
-
-		showSourcechooserSelector: function () {
-			this.sourcechooserButton.find('.mejs-sourcechooser-selector')
-				.removeClass('mejs-offscreen')
-				.attr('aria-expanded', 'true')
-				.attr('aria-hidden', 'false')
-				.find('input[type=radio]')
-				.attr('tabindex', '0');
-		}
-	});
-
-})(mejs.$);
-
-/*
-* ContextMenu Plugin
-* 
-*
-*/
-
-(function($) {
-
-$.extend(mejs.MepDefaults,
-	{ 'contextMenuItems': [
-		// demo of a fullscreen option
-		{ 
-			render: function(player) {
-				
-				// check for fullscreen plugin
-				if (typeof player.enterFullScreen == 'undefined')
-					return null;
-			
-				if (player.isFullScreen) {
-					return mejs.i18n.t('mejs.fullscreen-off');
-				} else {
-					return mejs.i18n.t('mejs.fullscreen-on');
-				}
-			},
-			click: function(player) {
-				if (player.isFullScreen) {
-					player.exitFullScreen();
-				} else {
-					player.enterFullScreen();
-				}
-			}
-		}
-		,
-		// demo of a mute/unmute button
-		{ 
-			render: function(player) {
-				if (player.media.muted) {
-					return mejs.i18n.t('mejs.unmute');
-				} else {
-					return mejs.i18n.t('mejs.mute');
-				}
-			},
-			click: function(player) {
-				if (player.media.muted) {
-					player.setMuted(false);
-				} else {
-					player.setMuted(true);
-				}
-			}
-		},
-		// separator
-		{
-			isSeparator: true
-		}
-		,
-		// demo of simple download video
-		{ 
-			render: function(player) {
-				return mejs.i18n.t('mejs.download-video');
-			},
-			click: function(player) {
-				window.location.href = player.media.currentSrc;
-			}
-		}	
-	]}
-);
-
-
-	$.extend(MediaElementPlayer.prototype, {
-		buildcontextmenu: function(player, controls, layers, media) {
-			
-			// create context menu
-			player.contextMenu = $('<div class="mejs-contextmenu"></div>')
-								.appendTo($('body'))
-								.hide();
-			
-			// create events for showing context menu
-			player.container.bind('contextmenu', function(e) {
-				if (player.isContextMenuEnabled) {
-					e.preventDefault();
-					player.renderContextMenu(e.clientX-1, e.clientY-1);
-					return false;
-				}
-			});
-			player.container.bind('click', function() {
-				player.contextMenu.hide();
-			});	
-			player.contextMenu.bind('mouseleave', function() {
-
-				//
-				player.startContextMenuTimer();
-				
-			});		
-		},
-
-		cleancontextmenu: function(player) {
-			player.contextMenu.remove();
-		},
-		
-		isContextMenuEnabled: true,
-		enableContextMenu: function() {
-			this.isContextMenuEnabled = true;
-		},
-		disableContextMenu: function() {
-			this.isContextMenuEnabled = false;
-		},
-		
-		contextMenuTimeout: null,
-		startContextMenuTimer: function() {
-			//
-			
-			var t = this;
-			
-			t.killContextMenuTimer();
-			
-			t.contextMenuTimer = setTimeout(function() {
-				t.hideContextMenu();
-				t.killContextMenuTimer();
-			}, 750);
-		},
-		killContextMenuTimer: function() {
-			var timer = this.contextMenuTimer;
-			
-			//
-			
-			if (timer != null) {				
-				clearTimeout(timer);
-				delete timer;
-				timer = null;
-			}
-		},		
-		
-		hideContextMenu: function() {
-			this.contextMenu.hide();
-		},
-		
-		renderContextMenu: function(x,y) {
-			
-			// alway re-render the items so that things like "turn fullscreen on" and "turn fullscreen off" are always written correctly
-			var t = this,
-				html = '',
-				items = t.options.contextMenuItems;
-			
-			for (var i=0, il=items.length; i<il; i++) {
-				
-				if (items[i].isSeparator) {
-					html += '<div class="mejs-contextmenu-separator"></div>';
-				} else {
-				
-					var rendered = items[i].render(t);
-				
-					// render can return null if the item doesn't need to be used at the moment
-					if (rendered != null) {
-						html += '<div class="mejs-contextmenu-item" data-itemindex="' + i + '" id="element-' + (Math.random()*1000000) + '">' + rendered + '</div>';
-					}
-				}
-			}
-			
-			// position and show the context menu
-			t.contextMenu
-				.empty()
-				.append($(html))
-				.css({top:y, left:x})
-				.show();
-				
-			// bind events
-			t.contextMenu.find('.mejs-contextmenu-item').each(function() {
-							
-				// which one is this?
-				var $dom = $(this),
-					itemIndex = parseInt( $dom.data('itemindex'), 10 ),
-					item = t.options.contextMenuItems[itemIndex];
-				
-				// bind extra functionality?
-				if (typeof item.show != 'undefined')
-					item.show( $dom , t);
-				
-				// bind click action
-				$dom.click(function() {			
-					// perform click action
-					if (typeof item.click != 'undefined')
-						item.click(t);
-					
-					// close
-					t.contextMenu.hide();				
-				});				
-			});	
-			
-			// stop the controls from hiding
-			setTimeout(function() {
-				t.killControlsTimer('rev3');	
-			}, 100);
-						
-		}
-	});
-	
-})(mejs.$);
-(function($) {
-	// skip back button
-
-	$.extend(mejs.MepDefaults, {
-		skipBackInterval: 30,
-		// %1 will be replaced with skipBackInterval in this string
-		skipBackText: ''
-	});
-
-	$.extend(MediaElementPlayer.prototype, {
-		buildskipback: function(player, controls, layers, media) {
-			var
-				t = this,
-				defaultTitle = mejs.i18n.t('mejs.time-skip-back', t.options.skipBackInterval),
-				skipTitle = t.options.skipBackText ? t.options.skipBackText : defaultTitle,
-				// create the loop button
-				loop =
-				$('<div class="mejs-button mejs-skip-back-button">' +
-					'<button type="button" aria-controls="' + t.id + '" title="' + skipTitle + '" aria-label="' + skipTitle + '">' + t.options.skipBackInterval + '</button>' +
-				'</div>')
-				// append it to the toolbar
-				.appendTo(controls)
-				// add a click toggle event
-				.click(function() {
-					media.setCurrentTime(Math.max(media.currentTime - t.options.skipBackInterval, 0));
-					$(this).find('button').blur();
-				});
-		}
-	});
-
-})(mejs.$);
-
-/**
- * Postroll plugin
- */
-(function($) {
-
-	$.extend(mejs.MepDefaults, {
-		postrollCloseText: ''
-	});
-
-	// Postroll
-	$.extend(MediaElementPlayer.prototype, {
-		buildpostroll: function(player, controls, layers, media) {
-			var
-				t = this,
-				postrollTitle = t.options.postrollCloseText ? t.options.postrollCloseText : mejs.i18n.t('mejs.close'),
-				postrollLink = t.container.find('link[rel="postroll"]').attr('href');
-
-			if (typeof postrollLink !== 'undefined') {
-				player.postroll =
-					$('<div class="mejs-postroll-layer mejs-layer"><a class="mejs-postroll-close" onclick="$(this).parent().hide();return false;">' + postrollTitle + '</a><div class="mejs-postroll-layer-content"></div></div>').prependTo(layers).hide();
-
-				t.media.addEventListener('ended', function (e) {
-					$.ajax({
-						dataType: 'html',
-						url: postrollLink,
-						success: function (data, textStatus) {
-							layers.find('.mejs-postroll-layer-content').html(data);
-						}
-					});
-					player.postroll.show();
-				}, false);
-			}
-		}
-	});
-
-})(mejs.$);
-/*
-MediaElement-Markers is a MediaElement.js plugin that lets you add Visual Cues in the progress time rail. 
-This plugin also lets you register a custom callback function that will be called everytime the play position reaches a marker. 
-Marker position and a reference to the MediaElement Player object is passed to the registered callback function for any post processing. Marker color is configurable.
-
-*/
-
-(function ($) {
-    // markers
-
-    $.extend(mejs.MepDefaults, {
-        markerColor: '#E9BC3D', //default marker color
-        markers: [],
-        markerCallback: function () {
-
-        }
-    });
-
-    $.extend(MediaElementPlayer.prototype, {
-        buildmarkers: function (player, controls, layers, media) {
-            var t = this,
-                i = 0,
-                currentPos = -1,
-                currentMarker = -1,
-                lastPlayPos = -1, //Track backward seek
-                lastMarkerCallBack = -1; //Prevents successive firing of callbacks
-
-            for (i = 0; i < player.options.markers.length; ++i) {
-                controls.find('.mejs-time-total').append('<span class="mejs-time-marker"></span>');
-            }
-
-            media.addEventListener('durationchange', function (e) {
-                player.setmarkers(controls);
-            });
-            media.addEventListener('timeupdate', function (e) {
-                currentPos = Math.floor(media.currentTime);
-                if (lastPlayPos > currentPos) {
-                    if (lastMarkerCallBack > currentPos) {
-                        lastMarkerCallBack = -1;
-                    }
-                } else {
-                    lastPlayPos = currentPos;
-                }
-
-                for (i = 0; i < player.options.markers.length; ++i) {
-                    currentMarker = Math.floor(player.options.markers[i]); 
-                    if (currentPos === currentMarker && currentMarker !== lastMarkerCallBack) {
-                        player.options.markerCallback(media, media.currentTime); //Fires the callback function
-                        lastMarkerCallBack = currentMarker;
-                    }
-                }
-
-            }, false);
-
-        },
-        setmarkers: function (controls) {
-            var t = this,
-                i = 0,
-                left;
-
-            for (i = 0; i < t.options.markers.length; ++i) {
-                if (Math.floor(t.options.markers[i]) <= t.media.duration && Math.floor(t.options.markers[i]) >= 0) {
-                    left = 100 * Math.floor(t.options.markers[i]) / t.media.duration;
-                    $(controls.find('.mejs-time-marker')[i]).css({
-                        "width": "1px",
-                        "left": left+"%",
-                        "background": t.options.markerColor
-                    });
-                }
-            }
-
-        }
-    });
-})(mejs.$);

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
app/Resources/public/assets/mediaelement/build/mediaelementplayer.min.css


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 12
app/Resources/public/assets/mediaelement/build/mediaelementplayer.min.js


BIN
app/Resources/public/assets/mediaelement/build/mejs-controls.png


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
app/Resources/public/assets/mediaelement/build/mejs-controls.svg


+ 0 - 289
app/Resources/public/assets/mediaelement/build/mejs-skins.css

@@ -1,289 +0,0 @@
-/* TED player */
-.mejs-container.mejs-ted {
-
-}
-.mejs-ted .mejs-controls {
-	background: #eee;
-	height: 65px;
-}
-
-.mejs-ted .mejs-button,
-.mejs-ted .mejs-time {
-	position: absolute;
-	background: #ddd;
-}
-.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-total {
-	background-color: none;
-	background: url(controls-ted.png) repeat-x 0 -52px;
-	height: 6px;
-}
-.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-buffering {
-	height: 6px;
-}
-.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-loaded {
-	background-color: none;
-	background: url(controls-ted.png) repeat-x 0 -52px;
-	width: 0;
-	height: 6px;
-}
-.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-current {
-	width: 0;
-	height: 6px;
-	background-color: none;
-	background: url(controls-ted.png) repeat-x 0 -59px;
-}
-.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-handle  {
-	display: block;
-	margin: 0;
-	width: 14px;
-	height: 21px;
-	top: -7px;
-	border: 0;
-	background: url(controls-ted.png) no-repeat 0 0;	
-}
-.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-float {	
-	display: none;
-}
-.mejs-ted .mejs-controls .mejs-playpause-button  {
-	top: 29px;
-	left: 9px;
-	width: 49px;
-	height: 28px;
-}
-.mejs-ted .mejs-controls .mejs-playpause-button  button {
-	width: 49px;
-	height: 28px;
-	background: url(controls-ted.png) no-repeat -50px -23px;
-	margin: 0;
-	padding: 0;
-}
-.mejs-ted .mejs-controls .mejs-pause button  {
-	background-position: 0 -23px;
-}
-
-.mejs-ted .mejs-controls .mejs-fullscreen-button  {
-	top: 34px;
-	right: 9px;
-	width: 17px;
-	height: 15px;
-	background : none;
-}
-.mejs-ted .mejs-controls .mejs-fullscreen-button  button {
-	width: 19px;
-	height: 17px;
-	background: transparent url(controls-ted.png) no-repeat 0 -66px;
-	margin: 0;
-	padding: 0;
-}
-.mejs-ted .mejs-controls .mejs-unfullscreen  button {
-	background: transparent url(controls-ted.png) no-repeat -21px -66px;
-	margin: 0;
-	padding: 0;
-}
-.mejs-ted .mejs-controls .mejs-volume-button  {
-	top: 30px;
-	right: 35px;
-	width: 24px;
-	height: 22px;
-}
-.mejs-ted .mejs-controls .mejs-mute button {
-	background: url(controls-ted.png) no-repeat -15px 0;
-	width: 24px;
-	height: 22px;
-	margin: 0;
-	padding: 0;
-}
-.mejs-ted .mejs-controls .mejs-unmute button {
-	background: url(controls-ted.png) no-repeat -40px 0;
-	width: 24px;
-	height: 22px;
-	margin: 0;
-	padding: 0;	
-}
-.mejs-ted  .mejs-controls .mejs-volume-button .mejs-volume-slider {
-	background: #fff;
-	border: solid 1px #aaa;
-	border-width: 1px 1px 0 1px;
-	width: 22px;
-	height: 65px;
-	top: -65px;
-}
-.mejs-ted  .mejs-controls .mejs-volume-button .mejs-volume-total {
-	background: url(controls-ted.png) repeat-y -41px -66px;
-	left: 8px;
-	width: 6px;
-	height: 50px;
-}
-.mejs-ted  .mejs-controls .mejs-volume-button .mejs-volume-current {
-	left: 8px;
-	width: 6px;	
-	background: url(controls-ted.png) repeat-y -48px -66px;
-	height: 50px;
-}
-
-.mejs-ted  .mejs-controls .mejs-volume-button .mejs-volume-handle {
-	display: none;
-}
-
-.mejs-ted .mejs-controls .mejs-time span {
-	color: #333;
-}
-.mejs-ted .mejs-controls .mejs-currenttime-container  {
-	position: absolute;
-	top: 32px;
-	right: 100px;
-	border: solid 1px #999;
-	background: #fff;
-	color: #333;
-	padding-top: 2px;
-	border-radius: 3px;
-	color: #333;
-}
-.mejs-ted .mejs-controls .mejs-duration-container  {
-
-	position: absolute;
-	top: 32px;
-	right: 65px;
-	border: solid 1px #999;
-	background: #fff;
-	color: #333;
-	padding-top: 2px;
-	border-radius: 3px;
-	color: #333;
-}
-
-.mejs-ted .mejs-controls .mejs-time  button{
-	color: #333;
-}
-.mejs-ted .mejs-controls .mejs-captions-button {
-	display: none;
-}
-/* END: TED player */
-
-
-/* WMP player */
-.mejs-container.mejs-wmp {
-
-}
-.mejs-wmp .mejs-controls {
-	background: transparent url(controls-wmp-bg.png) center 16px no-repeat;
-	height: 65px;
-}
-
-.mejs-wmp .mejs-button,
-.mejs-wmp .mejs-time {
-	position: absolute;
-	background: transparent;
-}
-.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-total {
-	background-color: transparent;
-	border: solid 1px #ccc;
-	height: 3px;
-}
-.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-buffering {
-	height: 3px;
-}
-.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-loaded {
-	background-color: rgba(255,255,255,0.3);
-	width: 0;
-	height: 3px;
-}
-.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-current {
-	width: 0;
-	height: 1px;
-	background-color: #014CB6;
-	border: solid 1px #7FC9FA;
-	border-width: 1px 0;
-	border-color: #7FC9FA #fff #619FF2 #fff;
-}
-.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-handle  {
-	display: block;
-	margin: 0;
-	width: 16px;
-	height: 9px;
-	top: -3px;
-	border: 0;
-	background: url(controls-wmp.png) no-repeat 0 -80px;	
-}
-.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-float {	
-	display: none;
-}
-.mejs-wmp .mejs-controls .mejs-playpause-button  {
-	top: 10px;
-	left: 50%;
-	margin: 10px 0 0 -20px;	
-	width: 40px;
-	height: 40px;
-	
-}
-.mejs-wmp .mejs-controls .mejs-playpause-button  button {
-	width: 40px;
-	height: 40px;
-	background: url(controls-wmp.png) no-repeat 0 0;	
-	margin: 0;
-	padding: 0;
-}
-.mejs-wmp .mejs-controls .mejs-pause button  {
-	background-position: 0 -40px;
-}
-
-.mejs-wmp .mejs-controls .mejs-currenttime-container  {
-	position: absolute;
-	top: 25px;
-	left: 50%;
-	margin-left: -93px;
-}
-.mejs-wmp .mejs-controls .mejs-duration-container  {
-	position: absolute;
-	top: 25px;
-	left: 50%;
-	margin-left: -58px;
-}
-
-
-.mejs-wmp .mejs-controls .mejs-volume-button  {
-	top: 32px;
-	right: 50%;
-	margin-right: -55px;
-	width: 20px;
-	height: 15px;
-}
-.mejs-wmp .mejs-controls .mejs-volume-button button {
-	margin: 0;
-	padding: 0;
-	background: url(controls-wmp.png) no-repeat -42px -17px;
-	width: 20px;
-	height: 15px;
-}
-.mejs-wmp .mejs-controls .mejs-unmute button {
-	margin: 0;
-	padding: 0;
-	background: url(controls-wmp.png) no-repeat -42px 0;
-	width: 20px;
-	height: 15px;
-}
-.mejs-wmp .mejs-controls .mejs-volume-button .mejs-volume-slider {
-	background: rgba(102,102,102,0.6);
-}
-
-.mejs-wmp .mejs-controls .mejs-fullscreen-button  {
-	top: 32px;
-	right: 50%;
-	margin-right: -82px;
-	width: 15px;
-	height: 14px;
-}
-.mejs-wmp .mejs-controls .mejs-fullscreen-button  button {
-	margin: 0;
-	padding: 0;
-	background: url(controls-wmp.png) no-repeat -63px 0;
-	width: 15px;
-	height: 14px;
-}
-.mejs-wmp .mejs-controls .mejs-captions-button {
-	display: none;
-}
-/* END: WMP player */
-
-
-

+ 393 - 0
app/Resources/public/assets/mediaelement/build/renderers/dailymotion.js

@@ -0,0 +1,393 @@
+/*!
+ * MediaElement.js
+ * http://www.mediaelementjs.com/
+ *
+ * Wrapper that mimics native HTML5 MediaElement (audio and video)
+ * using a variety of technologies (pure JavaScript, Flash, iframe)
+ *
+ * Copyright 2010-2017, John Dyer (http://j.hn/)
+ * License: MIT
+ *
+ */(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){
+'use strict';
+
+var DailyMotionApi = {
+	isSDKStarted: false,
+
+	isSDKLoaded: false,
+
+	iframeQueue: [],
+
+	enqueueIframe: function enqueueIframe(settings) {
+
+		if (DailyMotionApi.isLoaded) {
+			DailyMotionApi.createIframe(settings);
+		} else {
+			DailyMotionApi.loadIframeApi();
+			DailyMotionApi.iframeQueue.push(settings);
+		}
+	},
+
+	loadIframeApi: function loadIframeApi() {
+		if (!DailyMotionApi.isSDKStarted) {
+			mejs.Utils.loadScript('https://api.dmcdn.net/all.js');
+			DailyMotionApi.isSDKStarted = true;
+		}
+	},
+
+	apiReady: function apiReady() {
+
+		DailyMotionApi.isLoaded = true;
+		DailyMotionApi.isSDKLoaded = true;
+
+		while (DailyMotionApi.iframeQueue.length > 0) {
+			var settings = DailyMotionApi.iframeQueue.pop();
+
+			DM.init({
+				apiKey: settings.apiKey,
+				status: settings.status,
+				cookie: settings.cookie
+			});
+
+			DailyMotionApi.createIframe(settings);
+		}
+	},
+
+	createIframe: function createIframe(settings) {
+
+		var player = DM.player(settings.container, {
+			height: settings.height || '100%',
+			width: settings.width || '100%',
+			video: settings.videoId,
+			params: Object.assign({ api: true }, settings.params),
+			origin: location.host
+		});
+
+		player.addEventListener('apiready', function () {
+			window['__ready__' + settings.id](player, { paused: true, ended: false });
+		});
+	},
+
+	getDailyMotionId: function getDailyMotionId(url) {
+		var parts = url.split('/'),
+		    lastPart = parts[parts.length - 1],
+		    dashParts = lastPart.split('_');
+
+		return dashParts[0];
+	}
+};
+
+var DailyMotionIframeRenderer = {
+	name: 'dailymotion_iframe',
+	options: {
+		prefix: 'dailymotion_iframe',
+		dailymotion: {
+			width: '100%',
+			height: '100%',
+			params: {
+				autoplay: false,
+				chromeless: 1,
+				info: 0,
+				logo: 0,
+				related: 0
+			},
+			apiKey: null,
+			status: true,
+			cookie: true
+		}
+	},
+
+	canPlayType: function canPlayType(type) {
+		return ~['video/dailymotion', 'video/x-dailymotion'].indexOf(type.toLowerCase());
+	},
+
+	create: function create(mediaElement, options, mediaFiles) {
+
+		var dm = {},
+		    apiStack = [],
+		    readyState = 4;
+
+		var events = void 0,
+		    dmPlayer = null,
+		    dmIframe = null;
+
+		dm.options = options;
+		dm.id = mediaElement.id + '_' + options.prefix;
+		dm.mediaElement = mediaElement;
+
+		var props = mejs.html5media.properties,
+		    assignGettersSetters = function assignGettersSetters(propName) {
+
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+			dm['get' + capName] = function () {
+				if (dmPlayer !== null) {
+					var value = null;
+
+					switch (propName) {
+						case 'currentTime':
+							return dmPlayer.currentTime;
+						case 'duration':
+							return isNaN(dmPlayer.duration) ? 0 : dmPlayer.duration;
+						case 'volume':
+							return dmPlayer.volume;
+						case 'paused':
+							return dmPlayer.paused;
+						case 'ended':
+							return dmPlayer.ended;
+						case 'muted':
+							return dmPlayer.muted;
+						case 'buffered':
+							var percentLoaded = dmPlayer.bufferedTime,
+							    duration = dmPlayer.duration;
+							return {
+								start: function start() {
+									return 0;
+								},
+								end: function end() {
+									return percentLoaded / duration;
+								},
+								length: 1
+							};
+						case 'src':
+							return mediaElement.originalNode.getAttribute('src');
+						case 'readyState':
+							return readyState;
+					}
+
+					return value;
+				} else {
+					return null;
+				}
+			};
+
+			dm['set' + capName] = function (value) {
+				if (dmPlayer !== null) {
+					switch (propName) {
+						case 'src':
+							var url = typeof value === 'string' ? value : value[0].src;
+							dmPlayer.load(DailyMotionApi.getDailyMotionId(url));
+							break;
+						case 'currentTime':
+							dmPlayer.seek(value);
+							break;
+						case 'muted':
+							dmPlayer.setMuted(value);
+							setTimeout(function () {
+								var event = mejs.Utils.createEvent('volumechange', dm);
+								mediaElement.dispatchEvent(event);
+							}, 50);
+							break;
+						case 'volume':
+							dmPlayer.setVolume(value);
+							setTimeout(function () {
+								var event = mejs.Utils.createEvent('volumechange', dm);
+								mediaElement.dispatchEvent(event);
+							}, 50);
+							break;
+						case 'readyState':
+							var event = mejs.Utils.createEvent('canplay', dm);
+							mediaElement.dispatchEvent(event);
+							break;
+						default:
+							
+							break;
+					}
+				} else {
+					apiStack.push({ type: 'set', propName: propName, value: value });
+				}
+			};
+		};
+
+		for (var i = 0, total = props.length; i < total; i++) {
+			assignGettersSetters(props[i]);
+		}
+
+		var methods = mejs.html5media.methods,
+		    assignMethods = function assignMethods(methodName) {
+			dm[methodName] = function () {
+				if (dmPlayer !== null) {
+					switch (methodName) {
+						case 'play':
+							return dmPlayer.play();
+						case 'pause':
+							return dmPlayer.pause();
+						case 'load':
+							return null;
+					}
+				} else {
+					apiStack.push({ type: 'call', methodName: methodName });
+				}
+			};
+		};
+
+		for (var _i = 0, _total = methods.length; _i < _total; _i++) {
+			assignMethods(methods[_i]);
+		}
+
+		window['__ready__' + dm.id] = function (_dmPlayer) {
+
+			mediaElement.dmPlayer = dmPlayer = _dmPlayer;
+
+			if (apiStack.length) {
+				for (var _i2 = 0, _total2 = apiStack.length; _i2 < _total2; _i2++) {
+
+					var stackItem = apiStack[_i2];
+
+					if (stackItem.type === 'set') {
+						var propName = stackItem.propName,
+						    capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+						dm['set' + capName](stackItem.value);
+					} else if (stackItem.type === 'call') {
+						dm[stackItem.methodName]();
+					}
+				}
+			}
+
+			dmIframe = document.getElementById(dm.id);
+
+			events = ['mouseover', 'mouseout'];
+			var assignEvents = function assignEvents(e) {
+				var event = mejs.Utils.createEvent(e.type, dm);
+				mediaElement.dispatchEvent(event);
+			};
+
+			for (var _i3 = 0, _total3 = events.length; _i3 < _total3; _i3++) {
+				dmIframe.addEventListener(events[_i3], assignEvents, false);
+			}
+
+			if (mediaElement.originalNode.muted) {
+				dmPlayer.setMuted(true);
+				dmPlayer.setVolume(0);
+			}
+
+			events = mejs.html5media.events;
+			events = events.concat(['click', 'mouseover', 'mouseout']);
+			var assignNativeEvents = function assignNativeEvents(eventName) {
+				if (eventName !== 'ended') {
+					dmPlayer.addEventListener(eventName, function (e) {
+						var event = mejs.Utils.createEvent(e.type, dmPlayer);
+						mediaElement.dispatchEvent(event);
+					});
+				}
+			};
+
+			for (var _i4 = 0, _total4 = events.length; _i4 < _total4; _i4++) {
+				assignNativeEvents(events[_i4]);
+			}
+
+			dmPlayer.addEventListener('ad_start', function () {
+				var event = mejs.Utils.createEvent('play', dmPlayer);
+				mediaElement.dispatchEvent(event);
+
+				event = mejs.Utils.createEvent('progress', dmPlayer);
+				mediaElement.dispatchEvent(event);
+
+				event = mejs.Utils.createEvent('timeupdate', dmPlayer);
+				mediaElement.dispatchEvent(event);
+			});
+			dmPlayer.addEventListener('ad_timeupdate', function () {
+				var event = mejs.Utils.createEvent('timeupdate', dmPlayer);
+				mediaElement.dispatchEvent(event);
+			});
+			dmPlayer.addEventListener('ad_pause', function () {
+				var event = mejs.Utils.createEvent('pause', dmPlayer);
+				mediaElement.dispatchEvent(event);
+			});
+			dmPlayer.addEventListener('ad_end', function () {
+				var event = mejs.Utils.createEvent('ended', dmPlayer);
+				mediaElement.dispatchEvent(event);
+			});
+			dmPlayer.addEventListener('start', function () {
+				if (mediaElement.originalNode.muted) {
+					dmPlayer.setMuted(true);
+				}
+			});
+			dmPlayer.addEventListener('video_start', function () {
+				var event = mejs.Utils.createEvent('play', dmPlayer);
+				mediaElement.dispatchEvent(event);
+			});
+			dmPlayer.addEventListener('ad_timeupdate', function () {
+				var event = mejs.Utils.createEvent('timeupdate', dmPlayer);
+				mediaElement.dispatchEvent(event);
+			});
+			dmPlayer.addEventListener('video_end', function () {
+				var event = mejs.Utils.createEvent('ended', dmPlayer);
+				mediaElement.dispatchEvent(event);
+
+				if (mediaElement.originalNode.getAttribute('loop')) {
+					dmPlayer.play();
+				}
+			});
+
+			var initEvents = ['rendererready', 'loadedmetadata', 'loadeddata', 'canplay'];
+
+			for (var _i5 = 0, _total5 = initEvents.length; _i5 < _total5; _i5++) {
+				var event = mejs.Utils.createEvent(initEvents[_i5], dm);
+				mediaElement.dispatchEvent(event);
+			}
+		};
+
+		var dmContainer = document.createElement('div');
+		dmContainer.id = dm.id;
+		mediaElement.appendChild(dmContainer);
+		if (mediaElement.originalNode) {
+			dmContainer.style.width = mediaElement.originalNode.style.width;
+			dmContainer.style.height = mediaElement.originalNode.style.height;
+		}
+		mediaElement.originalNode.style.display = 'none';
+
+		var videoId = DailyMotionApi.getDailyMotionId(mediaFiles[0].src),
+		    dmSettings = Object.assign({
+			id: dm.id,
+			container: dmContainer,
+			videoId: videoId
+		}, dm.options.dailymotion);
+
+		if (mediaElement.originalNode.autoplay) {
+			dmSettings.params.autoplay = true;
+		}
+		if (mediaElement.originalNode.muted) {
+			dmSettings.params.mute = true;
+		}
+
+		DailyMotionApi.enqueueIframe(dmSettings);
+
+		dm.hide = function () {
+			dm.pause();
+			if (dmIframe) {
+				dmIframe.style.display = 'none';
+			}
+		};
+		dm.show = function () {
+			if (dmIframe) {
+				dmIframe.style.display = '';
+			}
+		};
+		dm.setSize = function (width, height) {
+			if (dmIframe) {
+				dmIframe.width = width;
+				dmIframe.height = height;
+			}
+		};
+		dm.destroy = function () {
+			dmPlayer.destroy();
+		};
+
+		return dm;
+	}
+};
+
+mejs.Utils.typeChecks.push(function (url) {
+	return (/\/\/((www\.)?dailymotion\.com|dai\.ly)/i.test(url) ? 'video/x-dailymotion' : null
+	);
+});
+
+window.dmAsyncInit = function () {
+	DailyMotionApi.apiReady();
+};
+
+mejs.Renderers.add(DailyMotionIframeRenderer);
+
+},{}]},{},[1]);

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 11 - 0
app/Resources/public/assets/mediaelement/build/renderers/dailymotion.min.js


+ 347 - 0
app/Resources/public/assets/mediaelement/build/renderers/facebook.js

@@ -0,0 +1,347 @@
+/*!
+ * MediaElement.js
+ * http://www.mediaelementjs.com/
+ *
+ * Wrapper that mimics native HTML5 MediaElement (audio and video)
+ * using a variety of technologies (pure JavaScript, Flash, iframe)
+ *
+ * Copyright 2010-2017, John Dyer (http://j.hn/)
+ * License: MIT
+ *
+ */(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){
+'use strict';
+
+var FacebookRenderer = {
+	name: 'facebook',
+	options: {
+		prefix: 'facebook',
+		facebook: {
+			appId: '',
+			xfbml: true,
+			version: 'v2.10'
+		}
+	},
+
+	canPlayType: function canPlayType(type) {
+		return ~['video/facebook', 'video/x-facebook'].indexOf(type.toLowerCase());
+	},
+
+	create: function create(mediaElement, options, mediaFiles) {
+
+		var fbWrapper = {},
+		    apiStack = [],
+		    eventHandler = {},
+		    readyState = 4,
+		    autoplay = mediaElement.originalNode.autoplay;
+
+		var poster = '',
+		    src = '',
+		    paused = true,
+		    ended = false,
+		    hasStartedPlaying = false,
+		    fbApi = null,
+		    fbDiv = null;
+
+		if (mejs.Features.isiPhone && mediaElement.originalNode.getAttribute('poster')) {
+			poster = mediaElement.originalNode.getAttribute('poster');
+			mediaElement.originalNode.removeAttribute('poster');
+		}
+
+		options = Object.assign(options, mediaElement.options);
+		fbWrapper.options = options;
+		fbWrapper.id = mediaElement.id + '_' + options.prefix;
+		fbWrapper.mediaElement = mediaElement;
+
+		var props = mejs.html5media.properties,
+		    assignGettersSetters = function assignGettersSetters(propName) {
+
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+			fbWrapper['get' + capName] = function () {
+
+				if (fbApi !== null) {
+					var value = null;
+
+					switch (propName) {
+						case 'currentTime':
+							return fbApi.getCurrentPosition();
+						case 'duration':
+							return fbApi.getDuration();
+						case 'volume':
+							return fbApi.getVolume();
+						case 'paused':
+							return paused;
+						case 'ended':
+							return ended;
+						case 'muted':
+							return fbApi.isMuted();
+						case 'buffered':
+							return {
+								start: function start() {
+									return 0;
+								},
+								end: function end() {
+									return 0;
+								},
+								length: 1
+							};
+						case 'src':
+							return src;
+						case 'readyState':
+							return readyState;
+					}
+
+					return value;
+				} else {
+					return null;
+				}
+			};
+
+			fbWrapper['set' + capName] = function (value) {
+
+				if (fbApi !== null) {
+
+					switch (propName) {
+						case 'src':
+							var url = typeof value === 'string' ? value : value[0].src;
+
+							fbDiv.remove();
+							createFacebookEmbed(url, options.facebook);
+
+							FB.XFBML.parse();
+
+							if (autoplay) {
+								fbApi.play();
+							}
+
+							break;
+						case 'currentTime':
+							fbApi.seek(value);
+							break;
+						case 'muted':
+							if (value) {
+								fbApi.mute();
+							} else {
+								fbApi.unmute();
+							}
+							setTimeout(function () {
+								var event = mejs.Utils.createEvent('volumechange', fbWrapper);
+								mediaElement.dispatchEvent(event);
+							}, 50);
+							break;
+						case 'volume':
+							fbApi.setVolume(value);
+							setTimeout(function () {
+								var event = mejs.Utils.createEvent('volumechange', fbWrapper);
+								mediaElement.dispatchEvent(event);
+							}, 50);
+							break;
+						case 'readyState':
+							var event = mejs.Utils.createEvent('canplay', fbWrapper);
+							mediaElement.dispatchEvent(event);
+							break;
+						default:
+							
+							break;
+					}
+				} else {
+					apiStack.push({ type: 'set', propName: propName, value: value });
+				}
+			};
+		};
+
+		for (var i = 0, total = props.length; i < total; i++) {
+			assignGettersSetters(props[i]);
+		}
+
+		var methods = mejs.html5media.methods,
+		    assignMethods = function assignMethods(methodName) {
+			fbWrapper[methodName] = function () {
+				if (fbApi !== null) {
+					switch (methodName) {
+						case 'play':
+							return fbApi.play();
+						case 'pause':
+							return fbApi.pause();
+						case 'load':
+							return null;
+					}
+				} else {
+					apiStack.push({ type: 'call', methodName: methodName });
+				}
+			};
+		};
+
+		for (var _i = 0, _total = methods.length; _i < _total; _i++) {
+			assignMethods(methods[_i]);
+		}
+
+		function sendEvents(events) {
+			for (var _i2 = 0, _total2 = events.length; _i2 < _total2; _i2++) {
+				var event = mejs.Utils.createEvent(events[_i2], fbWrapper);
+				mediaElement.dispatchEvent(event);
+			}
+		}
+
+		function createFacebookEmbed(url, config) {
+			src = url;
+
+			fbDiv = document.createElement('div');
+			fbDiv.id = fbWrapper.id;
+			fbDiv.className = "fb-video";
+			fbDiv.setAttribute("data-href", url);
+			fbDiv.setAttribute("data-allowfullscreen", "true");
+			fbDiv.setAttribute("data-controls", "false");
+
+			mediaElement.originalNode.parentNode.insertBefore(fbDiv, mediaElement.originalNode);
+			mediaElement.originalNode.style.display = 'none';
+
+			window.fbAsyncInit = function () {
+
+				FB.init(config);
+
+				FB.Event.subscribe('xfbml.ready', function (msg) {
+
+					if (msg.type === 'video') {
+
+						fbApi = msg.instance;
+
+						var fbIframe = fbDiv.getElementsByTagName('iframe')[0],
+						    width = fbIframe.offsetWidth,
+						    height = fbIframe.offsetHeight,
+						    events = ['mouseover', 'mouseout'],
+						    assignEvents = function assignEvents(e) {
+							var event = mejs.Utils.createEvent(e.type, fbWrapper);
+							mediaElement.dispatchEvent(event);
+						};
+
+						fbWrapper.setSize(width, height);
+
+						if (autoplay) {
+							fbApi.play();
+						}
+
+						for (var _i3 = 0, _total3 = events.length; _i3 < _total3; _i3++) {
+							fbIframe.addEventListener(events[_i3], assignEvents, false);
+						}
+
+						var fbEvents = ['startedPlaying', 'paused', 'finishedPlaying', 'startedBuffering', 'finishedBuffering'];
+						for (var _i4 = 0, _total4 = fbEvents.length; _i4 < _total4; _i4++) {
+							var event = fbEvents[_i4],
+							    handler = eventHandler[event];
+							if (handler !== undefined && handler !== null && !mejs.Utils.isObjectEmpty(handler) && typeof handler.removeListener === 'function') {
+								handler.removeListener(event);
+							}
+						}
+
+						if (apiStack.length) {
+							for (var _i5 = 0, _total5 = apiStack.length; _i5 < _total5; _i5++) {
+
+								var stackItem = apiStack[_i5];
+
+								if (stackItem.type === 'set') {
+									var propName = stackItem.propName,
+									    capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+									fbWrapper['set' + capName](stackItem.value);
+								} else if (stackItem.type === 'call') {
+									fbWrapper[stackItem.methodName]();
+								}
+							}
+						}
+
+						sendEvents(['rendererready', 'loadeddata', 'canplay', 'progress', 'loadedmetadata', 'timeupdate']);
+
+						var timer = void 0;
+
+						eventHandler.startedPlaying = fbApi.subscribe('startedPlaying', function () {
+							if (!hasStartedPlaying) {
+								hasStartedPlaying = true;
+							}
+							paused = false;
+							ended = false;
+							sendEvents(['play', 'playing', 'timeupdate']);
+
+							timer = setInterval(function () {
+								fbApi.getCurrentPosition();
+								sendEvents(['timeupdate']);
+							}, 250);
+						});
+						eventHandler.paused = fbApi.subscribe('paused', function () {
+							paused = true;
+							ended = false;
+							sendEvents(['pause']);
+						});
+						eventHandler.finishedPlaying = fbApi.subscribe('finishedPlaying', function () {
+							paused = true;
+							ended = true;
+
+							sendEvents(['ended']);
+							clearInterval(timer);
+							timer = null;
+						});
+						eventHandler.startedBuffering = fbApi.subscribe('startedBuffering', function () {
+							sendEvents(['progress', 'timeupdate']);
+						});
+						eventHandler.finishedBuffering = fbApi.subscribe('finishedBuffering', function () {
+							sendEvents(['progress', 'timeupdate']);
+						});
+					}
+				});
+			};
+
+			mejs.Utils.loadScript('https://connect.facebook.net/en_US/sdk.js');
+		}
+
+		if (mediaFiles.length > 0) {
+			createFacebookEmbed(mediaFiles[0].src, fbWrapper.options.facebook);
+		}
+
+		fbWrapper.hide = function () {
+			fbWrapper.stopInterval();
+			fbWrapper.pause();
+			if (fbDiv) {
+				fbDiv.style.display = 'none';
+			}
+		};
+		fbWrapper.show = function () {
+			if (fbDiv) {
+				fbDiv.style.display = '';
+			}
+		};
+		fbWrapper.setSize = function (width) {
+			if (fbApi !== null && !isNaN(width)) {
+				fbDiv.style.width = width;
+			}
+		};
+		fbWrapper.destroy = function () {
+			if (poster) {
+				mediaElement.originalNode.setAttribute('poster', poster);
+			}
+		};
+
+		fbWrapper.interval = null;
+
+		fbWrapper.startInterval = function () {
+			fbWrapper.interval = setInterval(function () {
+				var event = mejs.Utils.createEvent('timeupdate', fbWrapper);
+				mediaElement.dispatchEvent(event);
+			}, 250);
+		};
+		fbWrapper.stopInterval = function () {
+			if (fbWrapper.interval) {
+				clearInterval(fbWrapper.interval);
+			}
+		};
+
+		return fbWrapper;
+	}
+};
+
+mejs.Utils.typeChecks.push(function (url) {
+	return ~url.toLowerCase().indexOf('//www.facebook') ? 'video/x-facebook' : null;
+});
+
+mejs.Renderers.add(FacebookRenderer);
+
+},{}]},{},[1]);

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 11 - 0
app/Resources/public/assets/mediaelement/build/renderers/facebook.min.js


+ 306 - 0
app/Resources/public/assets/mediaelement/build/renderers/soundcloud.js

@@ -0,0 +1,306 @@
+/*!
+ * MediaElement.js
+ * http://www.mediaelementjs.com/
+ *
+ * Wrapper that mimics native HTML5 MediaElement (audio and video)
+ * using a variety of technologies (pure JavaScript, Flash, iframe)
+ *
+ * Copyright 2010-2017, John Dyer (http://j.hn/)
+ * License: MIT
+ *
+ */(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){
+'use strict';
+
+var SoundCloudApi = {
+
+	promise: null,
+
+	load: function load(settings) {
+
+		if (typeof SC !== 'undefined') {
+			SoundCloudApi._createPlayer(settings);
+		} else {
+			SoundCloudApi.promise = SoundCloudApi.promise || mejs.Utils.loadScript('https://w.soundcloud.com/player/api.js');
+			SoundCloudApi.promise.then(function () {
+				SoundCloudApi._createPlayer(settings);
+			});
+		}
+	},
+
+	_createPlayer: function _createPlayer(settings) {
+		var player = SC.Widget(settings.iframe);
+		window['__ready__' + settings.id](player);
+	}
+};
+
+var SoundCloudIframeRenderer = {
+	name: 'soundcloud_iframe',
+	options: {
+		prefix: 'soundcloud_iframe'
+	},
+
+	canPlayType: function canPlayType(type) {
+		return ~['video/soundcloud', 'video/x-soundcloud'].indexOf(type.toLowerCase());
+	},
+
+	create: function create(mediaElement, options, mediaFiles) {
+		var sc = {},
+		    apiStack = [],
+		    readyState = 4,
+		    autoplay = mediaElement.originalNode.autoplay;
+
+		var duration = 0,
+		    currentTime = 0,
+		    bufferedTime = 0,
+		    volume = 1,
+		    muted = false,
+		    paused = true,
+		    ended = false,
+		    scPlayer = null,
+		    scIframe = null;
+
+		sc.options = options;
+		sc.id = mediaElement.id + '_' + options.prefix;
+		sc.mediaElement = mediaElement;
+
+		var props = mejs.html5media.properties,
+		    assignGettersSetters = function assignGettersSetters(propName) {
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+			sc['get' + capName] = function () {
+				if (scPlayer !== null) {
+					var value = null;
+
+					switch (propName) {
+						case 'currentTime':
+							return currentTime;
+						case 'duration':
+							return duration;
+						case 'volume':
+							return volume;
+						case 'paused':
+							return paused;
+						case 'ended':
+							return ended;
+						case 'muted':
+							return muted;
+						case 'buffered':
+							return {
+								start: function start() {
+									return 0;
+								},
+								end: function end() {
+									return bufferedTime * duration;
+								},
+								length: 1
+							};
+						case 'src':
+							return scIframe ? scIframe.src : '';
+						case 'readyState':
+							return readyState;
+					}
+					return value;
+				} else {
+					return null;
+				}
+			};
+
+			sc['set' + capName] = function (value) {
+				if (scPlayer !== null) {
+					switch (propName) {
+						case 'src':
+							var url = typeof value === 'string' ? value : value[0].src;
+							scPlayer.load(url);
+							if (autoplay) {
+								scPlayer.play();
+							}
+							break;
+						case 'currentTime':
+							scPlayer.seekTo(value * 1000);
+							break;
+						case 'muted':
+							if (value) {
+								scPlayer.setVolume(0);
+							} else {
+								scPlayer.setVolume(1);
+							}
+							setTimeout(function () {
+								var event = mejs.Utils.createEvent('volumechange', sc);
+								mediaElement.dispatchEvent(event);
+							}, 50);
+							break;
+						case 'volume':
+							scPlayer.setVolume(value);
+							setTimeout(function () {
+								var event = mejs.Utils.createEvent('volumechange', sc);
+								mediaElement.dispatchEvent(event);
+							}, 50);
+							break;
+						case 'readyState':
+							var event = mejs.Utils.createEvent('canplay', sc);
+							mediaElement.dispatchEvent(event);
+							break;
+
+						default:
+							
+							break;
+					}
+				} else {
+					apiStack.push({ type: 'set', propName: propName, value: value });
+				}
+			};
+		};
+
+		for (var i = 0, total = props.length; i < total; i++) {
+			assignGettersSetters(props[i]);
+		}
+
+		var methods = mejs.html5media.methods,
+		    assignMethods = function assignMethods(methodName) {
+			sc[methodName] = function () {
+				if (scPlayer !== null) {
+					switch (methodName) {
+						case 'play':
+							return scPlayer.play();
+						case 'pause':
+							return scPlayer.pause();
+						case 'load':
+							return null;
+					}
+				} else {
+					apiStack.push({ type: 'call', methodName: methodName });
+				}
+			};
+		};
+
+		for (var _i = 0, _total = methods.length; _i < _total; _i++) {
+			assignMethods(methods[_i]);
+		}
+
+		window['__ready__' + sc.id] = function (_scPlayer) {
+
+			mediaElement.scPlayer = scPlayer = _scPlayer;
+
+			if (autoplay) {
+				scPlayer.play();
+			}
+
+			if (apiStack.length) {
+				for (var _i2 = 0, _total2 = apiStack.length; _i2 < _total2; _i2++) {
+
+					var stackItem = apiStack[_i2];
+
+					if (stackItem.type === 'set') {
+						var propName = stackItem.propName,
+						    capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+						sc['set' + capName](stackItem.value);
+					} else if (stackItem.type === 'call') {
+						sc[stackItem.methodName]();
+					}
+				}
+			}
+
+			scPlayer.bind(SC.Widget.Events.PLAY_PROGRESS, function () {
+				paused = false;
+				ended = false;
+				scPlayer.getPosition(function (_currentTime) {
+					currentTime = _currentTime / 1000;
+					var event = mejs.Utils.createEvent('timeupdate', sc);
+					mediaElement.dispatchEvent(event);
+				});
+			});
+			scPlayer.bind(SC.Widget.Events.PAUSE, function () {
+				paused = true;
+				var event = mejs.Utils.createEvent('pause', sc);
+				mediaElement.dispatchEvent(event);
+			});
+			scPlayer.bind(SC.Widget.Events.PLAY, function () {
+				paused = false;
+				ended = false;
+				var event = mejs.Utils.createEvent('play', sc);
+				mediaElement.dispatchEvent(event);
+			});
+			scPlayer.bind(SC.Widget.Events.FINISHED, function () {
+				paused = false;
+				ended = true;
+				var event = mejs.Utils.createEvent('ended', sc);
+				mediaElement.dispatchEvent(event);
+			});
+			scPlayer.bind(SC.Widget.Events.READY, function () {
+				scPlayer.getDuration(function (_duration) {
+					duration = _duration / 1000;
+					var event = mejs.Utils.createEvent('loadedmetadata', sc);
+					mediaElement.dispatchEvent(event);
+				});
+			});
+			scPlayer.bind(SC.Widget.Events.LOAD_PROGRESS, function () {
+				scPlayer.getDuration(function (loadProgress) {
+					if (duration > 0) {
+						bufferedTime = duration * loadProgress;
+						var event = mejs.Utils.createEvent('progress', sc);
+						mediaElement.dispatchEvent(event);
+					}
+				});
+				scPlayer.getDuration(function (_duration) {
+					duration = _duration;
+
+					var event = mejs.Utils.createEvent('loadedmetadata', sc);
+					mediaElement.dispatchEvent(event);
+				});
+			});
+
+			var initEvents = ['rendererready', 'loadeddata', 'loadedmetadata', 'canplay'];
+			for (var _i3 = 0, _total3 = initEvents.length; _i3 < _total3; _i3++) {
+				var event = mejs.Utils.createEvent(initEvents[_i3], sc);
+				mediaElement.dispatchEvent(event);
+			}
+		};
+
+		scIframe = document.createElement('iframe');
+		scIframe.id = sc.id;
+		scIframe.width = 10;
+		scIframe.height = 10;
+		scIframe.frameBorder = 0;
+		scIframe.style.visibility = 'hidden';
+		scIframe.src = mediaFiles[0].src;
+		scIframe.scrolling = 'no';
+
+		mediaElement.appendChild(scIframe);
+		mediaElement.originalNode.style.display = 'none';
+
+		var scSettings = {
+			iframe: scIframe,
+			id: sc.id
+		};
+
+		SoundCloudApi.load(scSettings);
+
+		sc.setSize = function () {};
+		sc.hide = function () {
+			sc.pause();
+			if (scIframe) {
+				scIframe.style.display = 'none';
+			}
+		};
+		sc.show = function () {
+			if (scIframe) {
+				scIframe.style.display = '';
+			}
+		};
+		sc.destroy = function () {
+			scPlayer.destroy();
+		};
+
+		return sc;
+	}
+};
+
+mejs.Utils.typeChecks.push(function (url) {
+	return (/\/\/(w\.)?soundcloud.com/i.test(url) ? 'video/x-soundcloud' : null
+	);
+});
+
+mejs.Renderers.add(SoundCloudIframeRenderer);
+
+},{}]},{},[1]);

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 11 - 0
app/Resources/public/assets/mediaelement/build/renderers/soundcloud.min.js


+ 374 - 0
app/Resources/public/assets/mediaelement/build/renderers/twitch.js

@@ -0,0 +1,374 @@
+/*!
+ * MediaElement.js
+ * http://www.mediaelementjs.com/
+ *
+ * Wrapper that mimics native HTML5 MediaElement (audio and video)
+ * using a variety of technologies (pure JavaScript, Flash, iframe)
+ *
+ * Copyright 2010-2017, John Dyer (http://j.hn/)
+ * License: MIT
+ *
+ */(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){
+'use strict';
+
+var TwitchApi = {
+
+	promise: null,
+
+	load: function load(settings) {
+		if (typeof Twitch !== 'undefined') {
+			TwitchApi.promise = new Promise(function (resolve) {
+				resolve();
+			}).then(function () {
+				TwitchApi._createPlayer(settings);
+			});
+		} else {
+			TwitchApi.promise = TwitchApi.promise || mejs.Utils.loadScript('https://player.twitch.tv/js/embed/v1.js');
+			TwitchApi.promise.then(function () {
+				TwitchApi._createPlayer(settings);
+			});
+		}
+	},
+
+	_createPlayer: function _createPlayer(settings) {
+		var player = new Twitch.Player(settings.id, settings);
+		window['__ready__' + settings.id](player);
+	},
+
+	getTwitchId: function getTwitchId(url) {
+		var twitchId = '';
+
+		if (url.indexOf('?') > 0) {
+			twitchId = TwitchApi.getTwitchIdFromParam(url);
+			if (twitchId === '') {
+				twitchId = TwitchApi.getTwitchIdFromUrl(url);
+			}
+		} else {
+			twitchId = TwitchApi.getTwitchIdFromUrl(url);
+		}
+
+		return twitchId;
+	},
+
+	getTwitchIdFromParam: function getTwitchIdFromParam(url) {
+		if (url === undefined || url === null || !url.trim().length) {
+			return null;
+		}
+
+		var parts = url.split('?'),
+		    parameters = parts[1].split('&');
+
+		var twitchId = '';
+
+		for (var i = 0, total = parameters.length; i < total; i++) {
+			var paramParts = parameters[i].split('=');
+			if (~paramParts[0].indexOf('channel=')) {
+				twitchId = paramParts[1];
+				break;
+			} else if (~paramParts[0].indexOf('video=')) {
+				twitchId = 'v' + paramParts[1];
+				break;
+			}
+		}
+
+		return twitchId;
+	},
+
+	getTwitchIdFromUrl: function getTwitchIdFromUrl(url) {
+		if (url === undefined || url === null || !url.trim().length) {
+			return null;
+		}
+
+		var parts = url.split('?');
+		url = parts[0];
+		var id = url.substring(url.lastIndexOf('/') + 1);
+		return (/^\d+$/i.test(id) !== null ? 'v' + id : id
+		);
+	},
+
+	getTwitchType: function getTwitchType(id) {
+		return (/^v\d+/i.test(id) !== null ? 'video' : 'channel'
+		);
+	}
+};
+
+var TwitchIframeRenderer = {
+	name: 'twitch_iframe',
+	options: {
+		prefix: 'twitch_iframe'
+	},
+
+	canPlayType: function canPlayType(type) {
+		return ~['video/twitch', 'video/x-twitch'].indexOf(type.toLowerCase());
+	},
+
+	create: function create(mediaElement, options, mediaFiles) {
+		var twitch = {},
+		    apiStack = [],
+		    readyState = 4,
+		    twitchId = TwitchApi.getTwitchId(mediaFiles[0].src);
+
+		var twitchPlayer = null,
+		    paused = true,
+		    ended = false,
+		    hasStartedPlaying = false,
+		    volume = 1,
+		    duration = Infinity,
+		    time = 0;
+
+		twitch.options = options;
+		twitch.id = mediaElement.id + '_' + options.prefix;
+		twitch.mediaElement = mediaElement;
+
+		var props = mejs.html5media.properties,
+		    assignGettersSetters = function assignGettersSetters(propName) {
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+			twitch['get' + capName] = function () {
+				if (twitchPlayer !== null) {
+					var value = null;
+
+					switch (propName) {
+						case 'currentTime':
+							time = twitchPlayer.getCurrentTime();
+							return time;
+						case 'duration':
+							duration = twitchPlayer.getDuration();
+							return duration;
+						case 'volume':
+							volume = twitchPlayer.getVolume();
+							return volume;
+						case 'paused':
+							paused = twitchPlayer.isPaused();
+							return paused;
+						case 'ended':
+							ended = twitchPlayer.getEnded();
+							return ended;
+						case 'muted':
+							return twitchPlayer.getMuted();
+						case 'buffered':
+							return {
+								start: function start() {
+									return 0;
+								},
+								end: function end() {
+									return 0;
+								},
+								length: 1
+							};
+						case 'src':
+							return TwitchApi.getTwitchType(twitchId) === 'channel' ? twitchPlayer.getChannel() : twitchPlayer.getVideo();
+						case 'readyState':
+							return readyState;
+					}
+
+					return value;
+				} else {
+					return null;
+				}
+			};
+
+			twitch['set' + capName] = function (value) {
+				if (twitchPlayer !== null) {
+					switch (propName) {
+						case 'src':
+							var url = typeof value === 'string' ? value : value[0].src,
+							    videoId = TwitchApi.getTwitchId(url);
+
+							if (TwitchApi.getTwitchType(twitchId) === 'channel') {
+								twitchPlayer.setChannel(videoId);
+							} else {
+								twitchPlayer.setVideo(videoId);
+							}
+							break;
+						case 'currentTime':
+							twitchPlayer.seek(value);
+							setTimeout(function () {
+								var event = mejs.Utils.createEvent('timeupdate', twitch);
+								mediaElement.dispatchEvent(event);
+							}, 50);
+							break;
+						case 'muted':
+							twitchPlayer.setMuted(value);
+							setTimeout(function () {
+								var event = mejs.Utils.createEvent('volumechange', twitch);
+								mediaElement.dispatchEvent(event);
+							}, 50);
+							break;
+						case 'volume':
+							volume = value;
+							twitchPlayer.setVolume(value);
+							setTimeout(function () {
+								var event = mejs.Utils.createEvent('volumechange', twitch);
+								mediaElement.dispatchEvent(event);
+							}, 50);
+							break;
+						case 'readyState':
+							var event = mejs.Utils.createEvent('canplay', twitch);
+							mediaElement.dispatchEvent(event);
+							break;
+						default:
+							
+							break;
+					}
+				} else {
+					apiStack.push({ type: 'set', propName: propName, value: value });
+				}
+			};
+		};
+
+		for (var i = 0, total = props.length; i < total; i++) {
+			assignGettersSetters(props[i]);
+		}
+
+		var methods = mejs.html5media.methods,
+		    assignMethods = function assignMethods(methodName) {
+			twitch[methodName] = function () {
+				if (twitchPlayer !== null) {
+					switch (methodName) {
+						case 'play':
+							paused = false;
+							return twitchPlayer.play();
+						case 'pause':
+							paused = true;
+							return twitchPlayer.pause();
+						case 'load':
+							return null;
+					}
+				} else {
+					apiStack.push({ type: 'call', methodName: methodName });
+				}
+			};
+		};
+
+		for (var _i = 0, _total = methods.length; _i < _total; _i++) {
+			assignMethods(methods[_i]);
+		}
+
+		function sendEvents(events) {
+			for (var _i2 = 0, _total2 = events.length; _i2 < _total2; _i2++) {
+				var event = mejs.Utils.createEvent(events[_i2], twitch);
+				mediaElement.dispatchEvent(event);
+			}
+		}
+
+		window['__ready__' + twitch.id] = function (_twitchPlayer) {
+			mediaElement.twitchPlayer = twitchPlayer = _twitchPlayer;
+
+			if (apiStack.length) {
+				for (var _i3 = 0, _total3 = apiStack.length; _i3 < _total3; _i3++) {
+					var stackItem = apiStack[_i3];
+
+					if (stackItem.type === 'set') {
+						var propName = stackItem.propName,
+						    capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+						twitch['set' + capName](stackItem.value);
+					} else if (stackItem.type === 'call') {
+						twitch[stackItem.methodName]();
+					}
+				}
+			}
+
+			var twitchIframe = document.getElementById(twitch.id).firstChild;
+			twitchIframe.style.width = '100%';
+			twitchIframe.style.height = '100%';
+
+			var events = ['mouseover', 'mouseout'],
+			    assignEvents = function assignEvents(e) {
+				var event = createEvent(e.type, twitch);
+				mediaElement.dispatchEvent(event);
+			};
+
+			for (var _i4 = 0, _total4 = events.length; _i4 < _total4; _i4++) {
+				twitchIframe.addEventListener(events[_i4], assignEvents, false);
+			}
+
+			var timer = void 0;
+
+			twitchPlayer.addEventListener('ready', function () {
+				paused = false;
+				ended = false;
+				sendEvents(['rendererready', 'loadedmetadata', 'loadeddata', 'canplay']);
+			});
+			twitchPlayer.addEventListener('play', function () {
+				if (!hasStartedPlaying) {
+					hasStartedPlaying = true;
+				}
+				paused = false;
+				ended = false;
+				sendEvents(['play', 'playing', 'progress']);
+
+				timer = setInterval(function () {
+					twitchPlayer.getCurrentTime();
+					sendEvents(['timeupdate']);
+				}, 250);
+			});
+			twitchPlayer.addEventListener('pause', function () {
+				paused = true;
+				ended = false;
+				if (!twitchPlayer.getEnded()) {
+					sendEvents(['pause']);
+				}
+			});
+			twitchPlayer.addEventListener('ended', function () {
+				paused = true;
+				ended = true;
+				sendEvents(['ended']);
+				clearInterval(timer);
+				hasStartedPlaying = false;
+				timer = null;
+			});
+		};
+
+		var height = mediaElement.originalNode.height,
+		    width = mediaElement.originalNode.width,
+		    twitchContainer = document.createElement('div'),
+		    type = TwitchApi.getTwitchType(twitchId),
+		    twitchSettings = {
+			id: twitch.id,
+			width: width,
+			height: height,
+			playsinline: false,
+			autoplay: mediaElement.originalNode.autoplay,
+			muted: mediaElement.originalNode.muted
+		};
+
+		twitchSettings[type] = twitchId;
+		twitchContainer.id = twitch.id;
+		twitchContainer.style.width = '100%';
+		twitchContainer.style.height = '100%';
+
+		mediaElement.originalNode.parentNode.insertBefore(twitchContainer, mediaElement.originalNode);
+		mediaElement.originalNode.style.display = 'none';
+		mediaElement.originalNode.autoplay = false;
+
+		twitch.setSize = function (width, height) {
+			if (TwitchApi !== null && !isNaN(width) && !isNaN(height)) {
+				twitchContainer.setAttribute('width', width);
+				twitchContainer.setAttribute('height', height);
+			}
+		};
+		twitch.hide = function () {
+			twitch.pause();
+			twitchContainer.style.display = 'none';
+		};
+		twitch.show = function () {
+			twitchContainer.style.display = '';
+		};
+		twitch.destroy = function () {};
+
+		TwitchApi.load(twitchSettings);
+
+		return twitch;
+	}
+};
+
+mejs.Utils.typeChecks.push(function (url) {
+	return (/\/\/(www|player).twitch.tv/i.test(url) ? 'video/x-twitch' : null
+	);
+});
+
+mejs.Renderers.add(TwitchIframeRenderer);
+
+},{}]},{},[1]);

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 11 - 0
app/Resources/public/assets/mediaelement/build/renderers/twitch.min.js


+ 405 - 0
app/Resources/public/assets/mediaelement/build/renderers/vimeo.js

@@ -0,0 +1,405 @@
+/*!
+ * MediaElement.js
+ * http://www.mediaelementjs.com/
+ *
+ * Wrapper that mimics native HTML5 MediaElement (audio and video)
+ * using a variety of technologies (pure JavaScript, Flash, iframe)
+ *
+ * Copyright 2010-2017, John Dyer (http://j.hn/)
+ * License: MIT
+ *
+ */(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){
+'use strict';
+
+var VimeoApi = {
+
+	promise: null,
+
+	load: function load(settings) {
+
+		if (typeof Vimeo !== 'undefined') {
+			VimeoApi._createPlayer(settings);
+		} else {
+			VimeoApi.promise = VimeoApi.promise || mejs.Utils.loadScript('https://player.vimeo.com/api/player.js');
+			VimeoApi.promise.then(function () {
+				VimeoApi._createPlayer(settings);
+			});
+		}
+	},
+
+	_createPlayer: function _createPlayer(settings) {
+		var player = new Vimeo.Player(settings.iframe);
+		window['__ready__' + settings.id](player);
+	},
+
+	getVimeoId: function getVimeoId(url) {
+		if (url === undefined || url === null) {
+			return null;
+		}
+
+		var parts = url.split('?');
+		url = parts[0];
+		return parseInt(url.substring(url.lastIndexOf('/') + 1));
+	}
+};
+
+var vimeoIframeRenderer = {
+
+	name: 'vimeo_iframe',
+	options: {
+		prefix: 'vimeo_iframe'
+	},
+
+	canPlayType: function canPlayType(type) {
+		return ~['video/vimeo', 'video/x-vimeo'].indexOf(type.toLowerCase());
+	},
+
+	create: function create(mediaElement, options, mediaFiles) {
+		var apiStack = [],
+		    vimeo = {},
+		    readyState = 4;
+
+		var paused = true,
+		    volume = 1,
+		    oldVolume = volume,
+		    currentTime = 0,
+		    bufferedTime = 0,
+		    ended = false,
+		    duration = 0,
+		    vimeoPlayer = null,
+		    url = '';
+
+		vimeo.options = options;
+		vimeo.id = mediaElement.id + '_' + options.prefix;
+		vimeo.mediaElement = mediaElement;
+
+		var errorHandler = function errorHandler(error, target) {
+			var event = mejs.Utils.createEvent('error', target);
+			event.message = error.name + ': ' + error.message;
+			mediaElement.dispatchEvent(event);
+		};
+
+		var props = mejs.html5media.properties,
+		    assignGettersSetters = function assignGettersSetters(propName) {
+
+			var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+			vimeo['get' + capName] = function () {
+				if (vimeoPlayer !== null) {
+					var value = null;
+
+					switch (propName) {
+						case 'currentTime':
+							return currentTime;
+
+						case 'duration':
+							return duration;
+
+						case 'volume':
+							return volume;
+						case 'muted':
+							return volume === 0;
+						case 'paused':
+							return paused;
+						case 'ended':
+							return ended;
+
+						case 'src':
+							vimeoPlayer.getVideoUrl().then(function (_url) {
+								url = _url;
+							});
+
+							return url;
+						case 'buffered':
+							return {
+								start: function start() {
+									return 0;
+								},
+								end: function end() {
+									return bufferedTime * duration;
+								},
+								length: 1
+							};
+						case 'readyState':
+							return readyState;
+					}
+					return value;
+				} else {
+					return null;
+				}
+			};
+
+			vimeo['set' + capName] = function (value) {
+				if (vimeoPlayer !== null) {
+					switch (propName) {
+						case 'src':
+							var _url2 = typeof value === 'string' ? value : value[0].src,
+							    videoId = VimeoApi.getVimeoId(_url2);
+
+							vimeoPlayer.loadVideo(videoId).then(function () {
+								if (mediaElement.originalNode.autoplay) {
+									vimeoPlayer.play();
+								}
+							}).catch(function (error) {
+								errorHandler(error, vimeo);
+							});
+							break;
+						case 'currentTime':
+							vimeoPlayer.setCurrentTime(value).then(function () {
+								currentTime = value;
+								setTimeout(function () {
+									var event = mejs.Utils.createEvent('timeupdate', vimeo);
+									mediaElement.dispatchEvent(event);
+								}, 50);
+							}).catch(function (error) {
+								errorHandler(error, vimeo);
+							});
+							break;
+						case 'volume':
+							vimeoPlayer.setVolume(value).then(function () {
+								volume = value;
+								oldVolume = volume;
+								setTimeout(function () {
+									var event = mejs.Utils.createEvent('volumechange', vimeo);
+									mediaElement.dispatchEvent(event);
+								}, 50);
+							}).catch(function (error) {
+								errorHandler(error, vimeo);
+							});
+							break;
+						case 'loop':
+							vimeoPlayer.setLoop(value).catch(function (error) {
+								errorHandler(error, vimeo);
+							});
+							break;
+						case 'muted':
+							if (value) {
+								vimeoPlayer.setVolume(0).then(function () {
+									volume = 0;
+									setTimeout(function () {
+										var event = mejs.Utils.createEvent('volumechange', vimeo);
+										mediaElement.dispatchEvent(event);
+									}, 50);
+								}).catch(function (error) {
+									errorHandler(error, vimeo);
+								});
+							} else {
+								vimeoPlayer.setVolume(oldVolume).then(function () {
+									volume = oldVolume;
+									setTimeout(function () {
+										var event = mejs.Utils.createEvent('volumechange', vimeo);
+										mediaElement.dispatchEvent(event);
+									}, 50);
+								}).catch(function (error) {
+									errorHandler(error, vimeo);
+								});
+							}
+							break;
+						case 'readyState':
+							var event = mejs.Utils.createEvent('canplay', vimeo);
+							mediaElement.dispatchEvent(event);
+							break;
+						default:
+							
+							break;
+					}
+				} else {
+					apiStack.push({ type: 'set', propName: propName, value: value });
+				}
+			};
+		};
+
+		for (var i = 0, total = props.length; i < total; i++) {
+			assignGettersSetters(props[i]);
+		}
+
+		var methods = mejs.html5media.methods,
+		    assignMethods = function assignMethods(methodName) {
+			vimeo[methodName] = function () {
+				if (vimeoPlayer !== null) {
+					switch (methodName) {
+						case 'play':
+							paused = false;
+							return vimeoPlayer.play();
+						case 'pause':
+							paused = true;
+							return vimeoPlayer.pause();
+						case 'load':
+							return null;
+					}
+				} else {
+					apiStack.push({ type: 'call', methodName: methodName });
+				}
+			};
+		};
+
+		for (var _i = 0, _total = methods.length; _i < _total; _i++) {
+			assignMethods(methods[_i]);
+		}
+
+		window['__ready__' + vimeo.id] = function (_vimeoPlayer) {
+
+			mediaElement.vimeoPlayer = vimeoPlayer = _vimeoPlayer;
+
+			if (apiStack.length) {
+				for (var _i2 = 0, _total2 = apiStack.length; _i2 < _total2; _i2++) {
+					var stackItem = apiStack[_i2];
+
+					if (stackItem.type === 'set') {
+						var propName = stackItem.propName,
+						    capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
+
+						vimeo['set' + capName](stackItem.value);
+					} else if (stackItem.type === 'call') {
+						vimeo[stackItem.methodName]();
+					}
+				}
+			}
+
+			var vimeoIframe = document.getElementById(vimeo.id);
+			var events = void 0;
+
+			events = ['mouseover', 'mouseout'];
+
+			var assignEvents = function assignEvents(e) {
+				var event = mejs.Utils.createEvent(e.type, vimeo);
+				mediaElement.dispatchEvent(event);
+			};
+
+			for (var _i3 = 0, _total3 = events.length; _i3 < _total3; _i3++) {
+				vimeoIframe.addEventListener(events[_i3], assignEvents, false);
+			}
+
+			vimeoPlayer.on('loaded', function () {
+				vimeoPlayer.getDuration().then(function (loadProgress) {
+					duration = loadProgress;
+					if (duration > 0) {
+						bufferedTime = duration * loadProgress;
+						if (mediaElement.originalNode.autoplay) {
+							paused = false;
+							ended = false;
+							var event = mejs.Utils.createEvent('play', vimeo);
+							mediaElement.dispatchEvent(event);
+						}
+					}
+				}).catch(function (error) {
+					errorHandler(error, vimeo);
+				});
+			});
+			vimeoPlayer.on('progress', function () {
+				vimeoPlayer.getDuration().then(function (loadProgress) {
+					duration = loadProgress;
+
+					if (duration > 0) {
+						bufferedTime = duration * loadProgress;
+						if (mediaElement.originalNode.autoplay) {
+							var initEvent = mejs.Utils.createEvent('play', vimeo);
+							mediaElement.dispatchEvent(initEvent);
+						}
+					}
+
+					var event = mejs.Utils.createEvent('progress', vimeo);
+					mediaElement.dispatchEvent(event);
+				}).catch(function (error) {
+					errorHandler(error, vimeo);
+				});
+			});
+			vimeoPlayer.on('timeupdate', function () {
+				vimeoPlayer.getCurrentTime().then(function (seconds) {
+					currentTime = seconds;
+
+					var event = mejs.Utils.createEvent('timeupdate', vimeo);
+					mediaElement.dispatchEvent(event);
+				}).catch(function (error) {
+					errorHandler(error, vimeo);
+				});
+			});
+			vimeoPlayer.on('play', function () {
+				paused = false;
+				ended = false;
+				var event = mejs.Utils.createEvent('play', vimeo);
+				mediaElement.dispatchEvent(event);
+			});
+			vimeoPlayer.on('pause', function () {
+				paused = true;
+				ended = false;
+
+				var event = mejs.Utils.createEvent('pause', vimeo);
+				mediaElement.dispatchEvent(event);
+			});
+			vimeoPlayer.on('ended', function () {
+				paused = false;
+				ended = true;
+
+				var event = mejs.Utils.createEvent('ended', vimeo);
+				mediaElement.dispatchEvent(event);
+			});
+
+			events = ['rendererready', 'loadedmetadata', 'loadeddata', 'canplay'];
+
+			for (var _i4 = 0, _total4 = events.length; _i4 < _total4; _i4++) {
+				var event = mejs.Utils.createEvent(events[_i4], vimeo);
+				mediaElement.dispatchEvent(event);
+			}
+		};
+
+		var height = mediaElement.originalNode.height,
+		    width = mediaElement.originalNode.width,
+		    vimeoContainer = document.createElement('iframe'),
+		    standardUrl = 'https://player.vimeo.com/video/' + VimeoApi.getVimeoId(mediaFiles[0].src);
+
+		var queryArgs = ~mediaFiles[0].src.indexOf('?') ? '?' + mediaFiles[0].src.slice(mediaFiles[0].src.indexOf('?') + 1) : '';
+		if (queryArgs && mediaElement.originalNode.autoplay && queryArgs.indexOf('autoplay') === -1) {
+			queryArgs += '&autoplay=1';
+		}
+		if (queryArgs && mediaElement.originalNode.loop && queryArgs.indexOf('loop') === -1) {
+			queryArgs += '&loop=1';
+		}
+
+		vimeoContainer.setAttribute('id', vimeo.id);
+		vimeoContainer.setAttribute('width', width);
+		vimeoContainer.setAttribute('height', height);
+		vimeoContainer.setAttribute('frameBorder', '0');
+		vimeoContainer.setAttribute('src', '' + standardUrl + queryArgs);
+		vimeoContainer.setAttribute('webkitallowfullscreen', '');
+		vimeoContainer.setAttribute('mozallowfullscreen', '');
+		vimeoContainer.setAttribute('allowfullscreen', '');
+
+		mediaElement.originalNode.parentNode.insertBefore(vimeoContainer, mediaElement.originalNode);
+		mediaElement.originalNode.style.display = 'none';
+
+		VimeoApi.load({
+			iframe: vimeoContainer,
+			id: vimeo.id
+		});
+
+		vimeo.hide = function () {
+			vimeo.pause();
+			if (vimeoPlayer) {
+				vimeoContainer.style.display = 'none';
+			}
+		};
+		vimeo.setSize = function (width, height) {
+			vimeoContainer.setAttribute('width', width);
+			vimeoContainer.setAttribute('height', height);
+		};
+		vimeo.show = function () {
+			if (vimeoPlayer) {
+				vimeoContainer.style.display = '';
+			}
+		};
+
+		vimeo.destroy = function () {};
+
+		return vimeo;
+	}
+};
+
+mejs.Utils.typeChecks.push(function (url) {
+	return (/(\/\/player\.vimeo|vimeo\.com)/i.test(url) ? 'video/x-vimeo' : null
+	);
+});
+
+mejs.Renderers.add(vimeoIframeRenderer);
+
+},{}]},{},[1]);

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 11 - 0
app/Resources/public/assets/mediaelement/build/renderers/vimeo.min.js


BIN
app/Resources/public/assets/mediaelement/build/silverlightmediaelement.xap


BIN
app/Resources/public/assets/mediaelement/build/skipback.png


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 647 - 242
app/Resources/public/assets/mediaelement/changelog.md


+ 1 - 1
bower.json

@@ -16,7 +16,7 @@
     "bootstrap-daterangepicker": "2.1.*",
     "ckeditor": "*",
     "jquery-timeago": "1.4.*",
-    "mediaelement": "2.*",
+    "mediaelement": "4.*",
     "modernizr": "2.8.*",
     "jqueryui-timepicker-addon": "1.5.*",
     "image-map-resizer": "0.5.*",

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio